Merge branch 'master' of github.com:dspinellis/UMLGraph

This commit is contained in:
Diomidis Spinellis 2019-03-25 22:17:17 +02:00
commit 09576db5ae
72 changed files with 1897 additions and 2580 deletions

View File

@ -2,15 +2,14 @@
[![Build Status](https://travis-ci.org/dspinellis/UMLGraph.svg?branch=master)](https://travis-ci.org/dspinellis/UMLGraph) [![Build Status](https://travis-ci.org/dspinellis/UMLGraph.svg?branch=master)](https://travis-ci.org/dspinellis/UMLGraph)
*UMLGraph* allows the declarative specification and drawing of *UMLGraph* allows the declarative specification and drawing of UML diagrams.
UML diagrams.
You can browse the system's documentation You can browse the system's documentation
through [this link](http://www.spinellis.gr/umlgraph/doc/index.html), through [this link](http://www.spinellis.gr/umlgraph/doc/index.html),
or print it through [this link](http://www.spinellis.gr/umlgraph/doc/indexw.html). or print it through [this link](http://www.spinellis.gr/umlgraph/doc/indexw.html).
To install the elements required to run *UMLGraph*, simply copy In order to run *UMLGraph*, you need to have [GraphViz](https://www.graphviz.org/)
the contents of the *lib* directory to a location consistent with installed in your system path. On most Linux distributions, this can be easily
your installation's conventions (for example to `/usr/local/lib`). installed using the regular package manager.
To compile the Java doclet from the source code run *ant* on the To compile the Java doclet from the source code run *ant* on the
*build.xml* file. *build.xml* file.
@ -19,3 +18,52 @@ If you change the source code, you can run regression tests by
executing *ant test*. executing *ant test*.
Visit the project's [home page](http://www.spinellis.gr/umlgraph) for more information. Visit the project's [home page](http://www.spinellis.gr/umlgraph) for more information.
## Compatibility
Currently, only Java 8 is supported by the Doclet.
In Java 9 the JavaDoc Doclet API changed substantially, and the doclet therefore
needs to be largely rewritten.
Sorry, this has not happened yet - volunteers for this task are welcome.
## Development versions
In order to use development versions, you can use [JitPack](https://jitpack.io/#dspinellis/UMLGraph/master-SNAPSHOT).
Note that as this is compiled on demand, you may sometimes see a "Read timed out" when the package is recompiled,
and it should be fine a few seconds later. And because the master branch can change any time, you may want to use
a versioned snapshot instead (see the Jitpack documentation for details).
**Gradle**:
```
repositories { maven { url 'https://jitpack.io' } }
configurations { umlgraph }
dependencies { umlgraph 'com.github.dspinellis:UMLGraph:master-SNAPSHOT' }
javadoc {
doclet = 'org.umlgraph.doclet.UmlGraphDoc'
docletpath = configurations.umlgraph.files.asType(List)
tags("hidden:X", "opt:X", "has:X", "navhas:X", "assoc:X", "navassoc:X",
"composed:X", "navcomposed:X", "stereotype:X", "depend:X")
}
```
**Maven**:
```
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
...
<dependency>
<groupId>com.github.dspinellis</groupId>
<artifactId>UMLGraph</artifactId>
<version>master-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
```
**Jar download**: <https://jitpack.io/com/github/dspinellis/UMLGraph/master-SNAPSHOT/UMLGraph-master-SNAPSHOT.jar>

2
TODO
View File

@ -1,5 +1,3 @@
When UMLGraph 2.29 comes out use <i></i> for italic fonts?
http://stackoverflow.com/questions/8609546/umlgraph-not-automatic-integrated-in-javadoc http://stackoverflow.com/questions/8609546/umlgraph-not-automatic-integrated-in-javadoc
Support for all UML diagrams: state, use-case, etc. Support for all UML diagrams: state, use-case, etc.

View File

@ -64,6 +64,14 @@
<!-- import environment variables --> <!-- import environment variables -->
<property environment="env"/> <property environment="env"/>
<target name="clean">
<delete dir="${build}"/>
<delete dir="${lib}"/>
<delete dir="testdata/dot-out"/>
<delete dir="${javadoc}"/>
<delete dir="${dist}/lib"/>
</target>
<target name="init"> <target name="init">
<!-- Create the time stamp --> <!-- Create the time stamp -->
<tstamp/> <tstamp/>
@ -119,36 +127,44 @@ class Version { public static String VERSION = "${VERSION}";}
<target name="test" depends="compile,testcompile" <target name="test" depends="compile,testcompile"
description="run the regression tests" > description="run the regression tests" >
<java classname="org.umlgraph.test.BasicTest" fork="true"> <!-- postpone failures, so we get to see the pngs -->
<classpath> <java classname="org.umlgraph.test.BasicTest" fork="true" resultproperty="BasicTest.exit">
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/> <classpath>
<pathelement location="${build}"/> <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${lib}/UmlGraph.jar"/> <pathelement location="${build}"/>
</classpath> <pathelement location="${lib}/UmlGraph.jar"/>
</java> </classpath>
<java classname="org.umlgraph.test.UmlDocTest" fork="true"> </java>
<classpath> <java classname="org.umlgraph.test.UmlDocTest" fork="true" resultproperty="UmlDocTest.exit">
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/> <classpath>
<pathelement location="${build}"/> <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${lib}/UmlGraph.jar"/> <pathelement location="${build}"/>
</classpath> <pathelement location="${lib}/UmlGraph.jar"/>
</java> </classpath>
</java>
<apply executable="dot" dest="${testout}" parallel="false"> <apply executable="dot" dest="${testout}" parallel="false">
<arg value="-Tpng"/> <arg value="-Tpng"/>
<arg value="-o"/> <arg value="-o"/>
<targetfile/> <targetfile/>
<srcfile/> <srcfile/>
<fileset dir="${testout}" includes="*.dot"/> <fileset dir="${testout}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/> <mapper type="glob" from="*.dot" to="*.png"/>
</apply> </apply>
<apply executable="dot" dest="${testref}" parallel="false"> <apply executable="dot" dest="${testref}" parallel="false">
<arg value="-Tpng"/> <arg value="-Tpng"/>
<arg value="-o"/> <arg value="-o"/>
<targetfile/> <targetfile/>
<srcfile/> <srcfile/>
<fileset dir="${testref}" includes="*.dot"/> <fileset dir="${testref}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/> <mapper type="glob" from="*.dot" to="*.png"/>
</apply> </apply>
<!-- postponed failure, so we get to see the pngs -->
<fail message="BasicTest failed">
<condition><not><equals arg1="0" arg2="${BasicTest.exit}"/></not></condition>
</fail>
<fail message="UmlDocTest failed">
<condition><not><equals arg1="0" arg2="${UmlDocTest.exit}"/></not></condition>
</fail>
</target> </target>
<target name="javadocs" depends="compile"> <target name="javadocs" depends="compile">

View File

@ -31,7 +31,7 @@ class SetTopController implements URLStreamHandler {
void connect() {} void connect() {}
} }
/** @depend - <friend> - SetTopController */ /** @depend - &lt;friend&gt; - SetTopController */
class ChannelIterator {} class ChannelIterator {}
interface URLStreamHandler { interface URLStreamHandler {

View File

@ -20,8 +20,8 @@ class UMLOptions {}
class Person { class Person {
House[] houses; House[] houses;
List<Dog> dogs; List&lt;Dog&gt; dogs;
public Room getFavouriteRoom(House house) {} public Room getFavouriteRoom(House house) {}
} }
@ -29,7 +29,7 @@ class Person {
* @opt inferreltype composed * @opt inferreltype composed
*/ */
class House { class House {
Map<String, Room> nameRoomMap; Map&lt;String, Room&gt; nameRoomMap;
} }
class Room {} class Room {}
@ -37,7 +37,6 @@ class Room {}
class Dog { class Dog {
Person owner; Person owner;
} }
</fmtcode> </fmtcode>
</td><td> </td><td>
<img src="infer.png" alt="UML diagram with relationship inference" /> <img src="infer.png" alt="UML diagram with relationship inference" />

View File

@ -93,18 +93,18 @@ clean:
build/%.dot : %.java build/%.dot : %.java
mkdir -p $(dir $@) mkdir -p $(dir $@)
$(jd) $(jd_flags) $(detailed_flags) -output $@ $< $(jd) $(jd_flags) $(detailed_flags) -output $@ $&lt;
build/%-small.dot : %.java build/%-small.dot : %.java
mkdir -p $(dir $@) mkdir -p $(dir $@)
$(jd) $(jd_flags) -output $@ $< $(jd) $(jd_flags) -output $@ $&lt;
%.png : %.dot %.png : %.dot
dot -Nheight=0.2 -Elabelfontcolor=DarkSlateBlue -Elabelfontsize=8 -Tpng -o $@ $< dot -Nheight=0.2 -Elabelfontcolor=DarkSlateBlue -Elabelfontsize=8 -Tpng -o $@ $&lt;
build/%.png : %.fig build/%.png : %.fig
mkdir -p $(dir $@) mkdir -p $(dir $@)
fig2dev -L png -S 4 $< $@ fig2dev -L png -S 4 $&lt; $@
dot: $(dot_files) dot: $(dot_files)
@ -112,7 +112,7 @@ png: $(png_files)
build/%.png : %.png build/%.png : %.png
mkdir -p $(dir $@) mkdir -p $(dir $@)
cp $< $@ cp $&lt; $@
# Example usage: # Example usage:
# make debug-java_files # make debug-java_files

View File

@ -30,7 +30,7 @@ async(); message(S,W,"liftReceiver"); sync();
active(S); active(S);
message(W,S,"setDialTone()"); message(W,S,"setDialTone()");
async(); message(S,W,"*dialDigit(d)"); sync(); async(); message(S,W,"*dialDigit(d)"); sync();
lconstraint(W,"{dialing.executionTime < 30s}"); lconstraint(W,"{dialing.executionTime &lt; 30s}");
active(W); active(W);
message(W,W,"routeCalls(s,n)"); message(W,W,"routeCalls(s,n)");
inactive(W); inactive(W);

View File

@ -13,6 +13,10 @@ this works well with <code>-qualify -postfixpackage</code> (and <code>-!qualifyG
To get the old <code>-qualify</code> behavior, you need to add <code>-qualifyGenerics</code>, To get the old <code>-qualify</code> behavior, you need to add <code>-qualifyGenerics</code>,
the default is off, and it will not inherit from <code>-qualify</code>.</li> the default is off, and it will not inherit from <code>-qualify</code>.</li>
<li>Better handling of complex names with generics and inner classes such as <code>pkg.Outer&lt;T&gt;.Inner</code>.</li> <li>Better handling of complex names with generics and inner classes such as <code>pkg.Outer&lt;T&gt;.Inner</code>.</li>
<li>Use &lt;i&gt; tags for italic, because the old font naming approach does not work with SVG anymore.
Replace <code>-nodefontabstractname</code> and <code>-nodefontclassabstractname</code>
with a simple flag <code>-nodefontabstractitalic</code> instead.</li>
<li>Added <code>-hideprivateinner</code> to hide all private inner classes.</li>
</ul> </ul>
</dd> </dd>

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,6 @@
package org.umlgraph.doclet; package org.umlgraph.doclet;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -32,7 +31,7 @@ import java.util.Map;
class ClassInfo { class ClassInfo {
private static int classNumber; private static int classNumber;
/** Alias name for the class */ /** Alias name for the class */
String name; final String name;
/** True if the class class node has been printed */ /** True if the class class node has been printed */
boolean nodePrinted; boolean nodePrinted;
/** True if the class class node is hidden */ /** True if the class class node is hidden */
@ -44,10 +43,9 @@ class ClassInfo {
*/ */
Map<String, RelationPattern> relatedClasses = new HashMap<String, RelationPattern>(); Map<String, RelationPattern> relatedClasses = new HashMap<String, RelationPattern>();
ClassInfo(boolean p, boolean h) { ClassInfo(boolean h) {
nodePrinted = p;
hidden = h; hidden = h;
name = "c" + (new Integer(classNumber)).toString(); name = "c" + classNumber;
classNumber++; classNumber++;
} }

View File

@ -67,9 +67,9 @@ public class ContextMatcher implements ClassMatcher {
this.root = root; this.root = root;
this.keepParentHide = keepParentHide; this.keepParentHide = keepParentHide;
opt = (Options) options.clone(); opt = (Options) options.clone();
opt.setOption(new String[] { "-!hide" }); opt.setOption(new String[] { "!hide" });
opt.setOption(new String[] { "-!attributes" }); opt.setOption(new String[] { "!attributes" });
opt.setOption(new String[] { "-!operations" }); opt.setOption(new String[] { "!operations" });
this.cg = new ClassGraphHack(root, opt); this.cg = new ClassGraphHack(root, opt);
setContextCenter(pattern); setContextCenter(pattern);
@ -97,26 +97,23 @@ public class ContextMatcher implements ClassMatcher {
/** /**
* Adds the specified class to the internal class graph along with its * Adds the specified class to the internal class graph along with its
* relations and depencies, eventually inferring them, according to the * relations and dependencies, eventually inferring them, according to the
* Options specified for this matcher * Options specified for this matcher
* @param cd * @param cd
*/ */
private void addToGraph(ClassDoc cd) { private void addToGraph(ClassDoc cd) {
// avoid adding twice the same class, but don't rely on cg.getClassInfo // avoid adding twice the same class, but don't rely on cg.getClassInfo
// since there // since there are other ways to add a classInfor than printing the class
// are other ways to add a classInfor than printing the class
if (visited.contains(cd.toString())) if (visited.contains(cd.toString()))
return; return;
visited.add(cd.toString()); visited.add(cd.toString());
cg.printClass(cd, false); cg.printClass(cd, false);
cg.printRelations(cd); cg.printRelations(cd);
if (opt.inferRelationships) { if (opt.inferRelationships)
cg.printInferredRelations(cd); cg.printInferredRelations(cd);
} if (opt.inferDependencies)
if (opt.inferDependencies) {
cg.printInferredDependencies(cd); cg.printInferredDependencies(cd);
}
} }
/** /**
@ -144,10 +141,8 @@ public class ContextMatcher implements ClassMatcher {
return true; return true;
for (ClassDoc mcd : matched) { for (ClassDoc mcd : matched) {
String mcName = mcd.toString(); RelationPattern rp = cg.getClassInfo(mcd, true).getRelation(name);
ClassInfo ciMatched = cg.getClassInfo(mcName); if (rp != null && opt.contextRelationPattern.matchesOne(rp))
RelationPattern rp = ciMatched.getRelation(name);
if (ciMatched != null && rp != null && opt.contextRelationPattern.matchesOne(rp))
return true; return true;
} }
return false; return false;

View File

@ -26,7 +26,7 @@ public class ContextView implements OptionProvider {
private Options hideOptions; private Options hideOptions;
private Options centerOptions; private Options centerOptions;
private Options packageOptions; private Options packageOptions;
private static final String[] HIDE_OPTIONS = new String[] { "-hide" }; private static final String[] HIDE_OPTIONS = new String[] { "hide" };
public ContextView(String outputFolder, ClassDoc cd, RootDoc root, Options parent) public ContextView(String outputFolder, ClassDoc cd, RootDoc root, Options parent)
throws IOException { throws IOException {
@ -42,7 +42,7 @@ public class ContextView implements OptionProvider {
this.packageOptions.showQualified = false; this.packageOptions.showQualified = false;
this.myGlobalOptions = parent.getGlobalOptions(); this.myGlobalOptions = parent.getGlobalOptions();
this.myGlobalOptions.setOption(new String[] { "-output", outputPath }); this.myGlobalOptions.setOption(new String[] { "output", outputPath });
this.myGlobalOptions.setOption(HIDE_OPTIONS); this.myGlobalOptions.setOption(HIDE_OPTIONS);
this.hideOptions = parent.getGlobalOptions(); this.hideOptions = parent.getGlobalOptions();
@ -52,7 +52,7 @@ public class ContextView implements OptionProvider {
this.centerOptions.nodeFillColor = "lemonChiffon"; this.centerOptions.nodeFillColor = "lemonChiffon";
this.centerOptions.showQualified = false; this.centerOptions.showQualified = false;
this.matcher = new ContextMatcher(root, Pattern.compile(cd.qualifiedName()), this.matcher = new ContextMatcher(root, Pattern.compile(Pattern.quote(cd.toString())),
myGlobalOptions, true); myGlobalOptions, true);
} }
@ -61,8 +61,8 @@ public class ContextView implements OptionProvider {
this.cd = contextCenter; this.cd = contextCenter;
String outputPath = cd.containingPackage().name().replace('.', '/') + "/" + cd.name() String outputPath = cd.containingPackage().name().replace('.', '/') + "/" + cd.name()
+ ".dot"; + ".dot";
this.myGlobalOptions.setOption(new String[] { "-output", outputPath }); this.myGlobalOptions.setOption(new String[] { "output", outputPath });
matcher.setContextCenter(Pattern.compile(cd.toString())); matcher.setContextCenter(Pattern.compile(Pattern.quote(cd.toString())));
} }
public String getDisplayName() { public String getDisplayName() {
@ -91,7 +91,7 @@ public class ContextView implements OptionProvider {
} }
public Options getOptionsFor(String name) { public Options getOptionsFor(String name) {
Options opt; Options opt;
if (!matcher.matches(name)) if (!matcher.matches(name))
opt = hideOptions; opt = hideOptions;
else if (name.equals(cd.name())) else if (name.equals(cd.name()))

View File

@ -0,0 +1,101 @@
package org.umlgraph.doclet;
/**
* Class to represent a font for graphviz.
* <p>
* This is a fairly complicated model, because it is rather an API into graphviz
* formatting strings rather than a standalone thing. <p Some fonts (edge, node,
* abstract) are set on the top level elements, whereas others (class name, tag,
* package) are inserted as {@code <font>} tags, and these can be omitted if not
* set. Inheritance of properties then happens in graphviz.
*
* @author Erich Schubert
*/
public enum Font {
/** Edge label font */
EDGE, //
/** Node basic */
NODE, //
/** Normal operation font */
NORMAL, //
/** Abstract operation font */
ABSTRACT, //
/** Class name. Inherits from null. */
CLASS, //
/** Class name of abstract classes (usually italic) */
CLASS_ABSTRACT, //
/** Package names Inherits from null. */
PACKAGE, //
/** Tags Inherits from null. */
TAG;
public static final String DEFAULT_FONT;
// Static initialization of further values.
static {
// use an appropriate font depending on the current operating system
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
DEFAULT_FONT = "Arial";
} else {
DEFAULT_FONT = "Helvetica"; // TODO: can we use just "sans"?
}
}
/**
* Wraps the text with the appropriate font according to the specified font type
*
* @param opt Options
* @param text Text to wrap
* @return Wrapped text
*/
public String wrap(Options opt, String text) {
if (text.isEmpty() || this == NORMAL)
return text;
String face = null;
double size = -1;
boolean italic = false;
switch (this) {
case EDGE:
case NODE:
// Not used with the wrap function.
throw new UnsupportedOperationException();
case ABSTRACT:
italic = opt.nodeFontAbstractItalic;
case NORMAL:
break;
case CLASS_ABSTRACT:
italic = opt.nodeFontAbstractItalic;
case CLASS:
face = opt.nodeFontClassName;
size = opt.nodeFontClassSize;
break;
case PACKAGE:
face = opt.nodeFontPackageName;
size = opt.nodeFontPackageSize;
break;
case TAG:
face = opt.nodeFontTagName;
size = opt.nodeFontTagSize;
break;
}
if (face == null && size < 0 && !italic)
return text;
StringBuilder buf = new StringBuilder(text.length() + 100);
if (face != null || size > 0) {
buf.append("<font");
if (face != null)
buf.append(" face=\"").append(face).append('"');
if (size > 0)
buf.append(" point-size=\"").append(size).append('"');
buf.append('>');
}
if (italic)
buf.append("<i>");
buf.append(text);
if (italic)
buf.append("</i>");
if (face != null || size > 0)
buf.append("</font>");
return buf.toString();
}
}

View File

@ -26,23 +26,17 @@ public class InterfaceMatcher implements ClassMatcher {
// for each interface, recurse, since classes and interfaces // for each interface, recurse, since classes and interfaces
// are treated the same in the doclet API // are treated the same in the doclet API
for (ClassDoc iface : cd.interfaces()) { for (ClassDoc iface : cd.interfaces())
if(matches(iface)) if(matches(iface))
return true; return true;
}
// recurse on supeclass, if available // recurse on supeclass, if available
if(cd.superclass() != null) return cd.superclass() == null ? false : matches(cd.superclass());
return matches(cd.superclass());
return false;
} }
public boolean matches(String name) { public boolean matches(String name) {
ClassDoc cd = root.classNamed(name); ClassDoc cd = root.classNamed(name);
if(cd == null) return cd == null ? false : matches(cd);
return false;
return matches(cd);
} }
} }

View File

@ -48,69 +48,54 @@ import com.sun.javadoc.Tag;
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a> * @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a>
*/ */
public class Options implements Cloneable, OptionProvider { public class Options implements Cloneable, OptionProvider {
// dot's font platform dependence workaround
private static String defaultFont;
private static String defaultItalicFont;
// reused often, especially in UmlGraphDoc, worth creating just once and reusing // reused often, especially in UmlGraphDoc, worth creating just once and reusing
private static final Pattern allPattern = Pattern.compile(".*"); private static final Pattern allPattern = Pattern.compile(".*");
protected static final String DEFAULT_EXTERNAL_APIDOC = "http://docs.oracle.com/javase/7/docs/api/"; protected static final String DEFAULT_EXTERNAL_APIDOC = "http://docs.oracle.com/javase/7/docs/api/";
static {
// use an appropriate font depending on the current operating system
// (on windows graphviz is unable to locate "Helvetica-Oblique"
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
defaultFont = "arial";
defaultItalicFont = "arial italic";
} else {
defaultFont = "Helvetica";
defaultItalicFont = "Helvetica-Oblique";
}
}
// instance fields // instance fields
List<Pattern> hidePatterns; List<Pattern> hidePatterns = new ArrayList<Pattern>();
List<Pattern> includePatterns; List<Pattern> includePatterns = new ArrayList<Pattern>();
boolean showQualified; boolean showQualified = false;
boolean showQualifiedGenerics; boolean showQualifiedGenerics = false;
boolean showAttributes; boolean hideGenerics = false;
boolean showEnumerations; boolean showAttributes = false;
boolean showEnumConstants; boolean showEnumerations = false;
boolean showOperations; boolean showEnumConstants = false;
boolean showConstructors; boolean showOperations = false;
boolean showVisibility; boolean showConstructors = false;
boolean showVisibility = false;
boolean horizontal; boolean horizontal;
boolean showType; boolean showType = false;
boolean showComment; boolean showComment = false;
boolean autoSize; boolean autoSize = true;
String edgeFontName; String edgeFontName = Font.DEFAULT_FONT;
String edgeFontColor; String edgeFontColor = "black";
String edgeColor; String edgeColor = "black";
double edgeFontSize; double edgeFontSize = 10;
String nodeFontName; String nodeFontName = Font.DEFAULT_FONT;
String nodeFontAbstractName; boolean nodeFontAbstractItalic = true;
String nodeFontColor; String nodeFontColor = "black";
double nodeFontSize; double nodeFontSize = 10;
String nodeFillColor; String nodeFillColor = null;
double nodeFontClassSize; double nodeFontClassSize = -1;
String nodeFontClassName; String nodeFontClassName = null;
String nodeFontClassAbstractName; double nodeFontTagSize = -1;
double nodeFontTagSize; String nodeFontTagName = null;
String nodeFontTagName; double nodeFontPackageSize = -1;
double nodeFontPackageSize; String nodeFontPackageName = null;
String nodeFontPackageName; Shape shape = Shape.CLASS;
Shape shape; String bgColor = null;
String bgColor; public String outputFileName = "graph.dot";
public String outputFileName; String outputEncoding = "ISO-8859-1"; // TODO: default to UTF-8 now?
String outputEncoding; Map<Pattern, String> apiDocMap = new HashMap<Pattern, String>();
Map<Pattern, String> apiDocMap; String apiDocRoot = null;
String apiDocRoot; boolean postfixPackage = false;
boolean postfixPackage; boolean useGuillemot = true;
boolean useGuillemot; boolean findViews = false;
boolean findViews; String viewName = null;
String viewName; double nodeSep = 0.25;
double nodeSep; double rankSep = 0.5;
double rankSep; public String outputDirectory = null;
public String outputDirectory;
/* /*
* Numeric values are preferable to symbolic here. * Numeric values are preferable to symbolic here.
* Symbolic reportedly fail on MacOSX, and also are * Symbolic reportedly fail on MacOSX, and also are
@ -120,81 +105,28 @@ public class Options implements Cloneable, OptionProvider {
String guilOpen = "&#171;"; // &laquo; \u00ab String guilOpen = "&#171;"; // &laquo; \u00ab
/** Guillemot right (close) */ /** Guillemot right (close) */
String guilClose = "&#187;"; // &raquo; \u00bb String guilClose = "&#187;"; // &raquo; \u00bb
boolean inferRelationships; boolean inferRelationships = false;
boolean inferDependencies; boolean inferDependencies = false;
boolean collapsibleDiagrams; boolean collapsibleDiagrams = false;
RelationPattern contextRelationPattern; RelationPattern contextRelationPattern = new RelationPattern(RelationDirection.BOTH);
boolean useImports; boolean useImports = false;
Visibility inferDependencyVisibility; Visibility inferDependencyVisibility = Visibility.PRIVATE;
boolean inferDepInPackage; boolean inferDepInPackage = false;
RelationType inferRelationshipType; RelationType inferRelationshipType = RelationType.NAVASSOC;
private List<Pattern> collPackages; private List<Pattern> collPackages = new ArrayList<Pattern>();
boolean compact; boolean compact = false;
boolean hidePrivateInner = false;
// internal option, used by UMLDoc to generate relative links between classes // internal option, used by UMLDoc to generate relative links between classes
boolean relativeLinksForSourcePackages; boolean relativeLinksForSourcePackages = false;
// internal option, used by UMLDoc to force strict matching on the class names // internal option, used by UMLDoc to force strict matching on the class names
// and avoid problems with packages in the template declaration making UmlGraph hide // and avoid problems with packages in the template declaration making UmlGraph hide
// classes outside of them (for example, class gr.spinellis.Foo<T extends java.io.Serializable> // classes outside of them (for example, class gr.spinellis.Foo<T extends java.io.Serializable>
// would have been hidden by the hide pattern "java.*" // would have been hidden by the hide pattern "java.*"
// TODO: consider making this standard behaviour // TODO: consider making this standard behaviour
boolean strictMatching; boolean strictMatching = false;
String dotExecutable; String dotExecutable = "dot";
Options() { Options() {
showQualified = false;
showQualifiedGenerics = false;
showAttributes = false;
showEnumConstants = false;
showOperations = false;
showVisibility = false;
showEnumerations = false;
showConstructors = false;
showType = false;
autoSize = true;
showComment = false;
edgeFontName = defaultFont;
edgeFontColor = "black";
edgeColor = "black";
edgeFontSize = 10;
nodeFontColor = "black";
nodeFontName = defaultFont;
nodeFontAbstractName = defaultItalicFont;
nodeFontSize = 10;
nodeFontClassSize = -1;
nodeFontClassName = null;
nodeFontClassAbstractName = null;
nodeFontTagSize = -1;
nodeFontTagName = null;
nodeFontPackageSize = -1;
nodeFontPackageName = null;
nodeFillColor = null;
bgColor = null;
shape = new Shape();
outputFileName = "graph.dot";
outputDirectory= null;
outputEncoding = "ISO-8859-1";
hidePatterns = new ArrayList<Pattern>();
includePatterns = new ArrayList<Pattern>();
apiDocMap = new HashMap<Pattern, String>();
apiDocRoot = null;
postfixPackage = false;
useGuillemot = true;
findViews = false;
viewName = null;
contextRelationPattern = new RelationPattern(RelationDirection.BOTH);
inferRelationships = false;
inferDependencies = false;
collapsibleDiagrams = false;
inferDependencyVisibility = Visibility.PRIVATE;
inferDepInPackage = false;
useImports = false;
inferRelationshipType = RelationType.NAVASSOC;
collPackages = new ArrayList<Pattern>();
compact = false;
relativeLinksForSourcePackages = false;
nodeSep = 0.25;
rankSep = 0.5;
dotExecutable = "dot";
} }
@Override @Override
@ -203,7 +135,7 @@ public class Options implements Cloneable, OptionProvider {
try { try {
clone = (Options) super.clone(); clone = (Options) super.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
// Should not happen throw new RuntimeException("Cannot clone?!?", e); // Should not happen
} }
// deep clone the hide and collection patterns // deep clone the hide and collection patterns
clone.hidePatterns = new ArrayList<Pattern>(hidePatterns); clone.hidePatterns = new ArrayList<Pattern>(hidePatterns);
@ -223,6 +155,34 @@ public class Options implements Cloneable, OptionProvider {
showVisibility = true; showVisibility = true;
showType = true; showType = true;
} }
/**
* Match strings, ignoring leading <tt>-</tt>, <tt>-!</tt>, and <tt>!</tt>.
*
* @param given Given string
* @param expect Expected string
* @return {@code true} on success
*/
protected static boolean matchOption(String given, String expect) {
return matchOption(given, expect, false);
}
/**
* Match strings, ignoring leading <tt>-</tt>, <tt>-!</tt>, and <tt>!</tt>.
*
* @param given Given string
* @param expect Expected string
* @param negative May be negative
* @return {@code true} on success
*/
protected static boolean matchOption(String given, String expect, boolean negative) {
int begin = 0, end = given.length();
if (begin < end && given.charAt(begin) == '-')
++begin;
if (negative && begin < end && given.charAt(begin) == '!')
++begin;
return expect.length() == end - begin && expect.regionMatches(0, given, begin, end - begin);
}
/** /**
* Return the number of arguments associated with the specified option. * Return the number of arguments associated with the specified option.
@ -230,65 +190,67 @@ public class Options implements Cloneable, OptionProvider {
* Will return 0 if the option is not supported. * Will return 0 if the option is not supported.
*/ */
public static int optionLength(String option) { public static int optionLength(String option) {
if(option.equals("-qualify") || option.equals("-!qualify") || if(matchOption(option, "qualify", true) ||
option.equals("-horizontal") || option.equals("-!horizontal") || matchOption(option, "qualifyGenerics", true) ||
option.equals("-attributes") || option.equals("-!attributes") || matchOption(option, "hideGenerics", true) ||
option.equals("-enumconstants") || option.equals("-!enumconstants") || matchOption(option, "horizontal", true) ||
option.equals("-operations") || option.equals("-!operations") || matchOption(option, "all") ||
option.equals("-enumerations") || option.equals("-!enumerations") || matchOption(option, "attributes", true) ||
option.equals("-constructors") || option.equals("-!constructors") || matchOption(option, "enumconstants", true) ||
option.equals("-visibility") || option.equals("-!visibility") || matchOption(option, "operations", true) ||
option.equals("-types") || option.equals("-!types") || matchOption(option, "enumerations", true) ||
option.equals("-autosize") || option.equals("-!autosize") || matchOption(option, "constructors", true) ||
option.equals("-commentname") || option.equals("-!commentname") || matchOption(option, "visibility", true) ||
option.equals("-all") || matchOption(option, "types", true) ||
option.equals("-postfixpackage") || matchOption(option, "autosize", true) ||
option.equals("-noguillemot") || matchOption(option, "commentname", true) ||
option.equals("-views") || matchOption(option, "nodefontabstractitalic", true) ||
option.equals("-inferrel") || matchOption(option, "postfixpackage", true) ||
option.equals("-useimports") || matchOption(option, "noguillemot", true) ||
option.equals("-collapsible") || matchOption(option, "views", true) ||
option.equals("-inferdep") || matchOption(option, "inferrel", true) ||
option.equals("-inferdepinpackage") || matchOption(option, "useimports", true) ||
option.equals("-compact")) matchOption(option, "collapsible", true) ||
matchOption(option, "inferdep", true) ||
matchOption(option, "inferdepinpackage", true) ||
matchOption(option, "hideprivateinner", true) ||
matchOption(option, "compact", true))
return 1; return 1;
else if(option.equals("-nodefillcolor") || else if(matchOption(option, "nodefillcolor") ||
option.equals("-nodefontcolor") || matchOption(option, "nodefontcolor") ||
option.equals("-nodefontsize") || matchOption(option, "nodefontsize") ||
option.equals("-nodefontname") || matchOption(option, "nodefontname") ||
option.equals("-nodefontabstractname") || matchOption(option, "nodefontclasssize") ||
option.equals("-nodefontclasssize") || matchOption(option, "nodefontclassname") ||
option.equals("-nodefontclassname") || matchOption(option, "nodefonttagsize") ||
option.equals("-nodefontclassabstractname") || matchOption(option, "nodefonttagname") ||
option.equals("-nodefonttagsize") || matchOption(option, "nodefontpackagesize") ||
option.equals("-nodefonttagname") || matchOption(option, "nodefontpackagename") ||
option.equals("-nodefontpackagesize") || matchOption(option, "edgefontcolor") ||
option.equals("-nodefontpackagename") || matchOption(option, "edgecolor") ||
option.equals("-edgefontcolor") || matchOption(option, "edgefontsize") ||
option.equals("-edgecolor") || matchOption(option, "edgefontname") ||
option.equals("-edgefontsize") || matchOption(option, "shape") ||
option.equals("-edgefontname") || matchOption(option, "output") ||
option.equals("-shape") || matchOption(option, "outputencoding") ||
option.equals("-output") || matchOption(option, "bgcolor") ||
option.equals("-outputencoding") || matchOption(option, "hide") ||
option.equals("-bgcolor") || matchOption(option, "include") ||
option.equals("-hide") || matchOption(option, "apidocroot") ||
option.equals("-include") || matchOption(option, "apidocmap") ||
option.equals("-apidocroot") || matchOption(option, "d") ||
option.equals("-apidocmap") || matchOption(option, "view") ||
option.equals("-d") || matchOption(option, "inferreltype") ||
option.equals("-view") || matchOption(option, "inferdepvis") ||
option.equals("-inferreltype") || matchOption(option, "collpackages") ||
option.equals("-inferdepvis") || matchOption(option, "nodesep") ||
option.equals("-collpackages") || matchOption(option, "ranksep") ||
option.equals("-nodesep") || matchOption(option, "dotexecutable") ||
option.equals("-ranksep") || matchOption(option, "link"))
option.equals("-dotexecutable") ||
option.equals("-link"))
return 2; return 2;
else if(option.equals("-contextPattern") || else if(matchOption(option, "contextPattern") ||
option.equals("-linkoffline")) matchOption(option, "linkoffline"))
return 3; return 3;
else else
return 0; return 0;
@ -296,247 +258,168 @@ public class Options implements Cloneable, OptionProvider {
/** Set the options based on a single option and its arguments */ /** Set the options based on a single option and its arguments */
void setOption(String[] opt) { void setOption(String[] opt) {
if(!opt[0].equals("-hide") && optionLength(opt[0]) > opt.length) { if(!matchOption(opt[0], "hide") && optionLength(opt[0]) > opt.length) {
System.err.println("Skipping option '" + opt[0] + "', missing argument"); System.err.println("Skipping option '" + opt[0] + "', missing argument");
return; return;
} }
boolean dash = opt[0].length() > 1 && opt[0].charAt(0) == '-';
boolean positive = !(opt[0].length() > 1 && opt[0].charAt(dash ? 1 : 0) == '!');
if(opt[0].equals("-qualify")) { if(matchOption(opt[0], "qualify", true)) {
showQualified = true; showQualified = positive;
} else if (opt[0].equals("-!qualify")) { } else if(matchOption(opt[0], "qualifyGenerics", true)) {
showQualified = false; showQualifiedGenerics = positive;
} else if(opt[0].equals("-qualifyGenerics")) { } else if(matchOption(opt[0], "hideGenerics", true)) {
showQualifiedGenerics = true; hideGenerics = positive;
} else if (opt[0].equals("-!qualifyGenerics")) { } else if(matchOption(opt[0], "horizontal", true)) {
showQualifiedGenerics = false; horizontal = positive;
} else if(opt[0].equals("-horizontal")) { } else if(matchOption(opt[0], "attributes", true)) {
horizontal = true; showAttributes = positive;
} else if (opt[0].equals("-!horizontal")) { } else if(matchOption(opt[0], "enumconstants", true)) {
horizontal = false; showEnumConstants = positive;
} else if(opt[0].equals("-attributes")) { } else if(matchOption(opt[0], "operations", true)) {
showAttributes = true; showOperations = positive;
} else if (opt[0].equals("-!attributes")) { } else if(matchOption(opt[0], "enumerations", true)) {
showAttributes = false; showEnumerations = positive;
} else if(opt[0].equals("-enumconstants")) { } else if(matchOption(opt[0], "constructors", true)) {
showEnumConstants = true; showConstructors = positive;
} else if (opt[0].equals("-!enumconstants")) { } else if(matchOption(opt[0], "visibility", true)) {
showEnumConstants = false; showVisibility = positive;
} else if(opt[0].equals("-operations")) { } else if(matchOption(opt[0], "types", true)) {
showOperations = true; showType = positive;
} else if (opt[0].equals("-!operations")) { } else if(matchOption(opt[0], "autoSize", true)) {
showOperations = false; autoSize = positive;
} else if(opt[0].equals("-enumerations")) { } else if(matchOption(opt[0], "commentname", true)) {
showEnumerations = true; showComment = positive;
} else if (opt[0].equals("-!enumerations")) { } else if(matchOption(opt[0], "all")) {
showEnumerations = false;
} else if(opt[0].equals("-constructors")) {
showConstructors = true;
} else if (opt[0].equals("-!constructors")) {
showConstructors = false;
} else if(opt[0].equals("-visibility")) {
showVisibility = true;
} else if (opt[0].equals("-!visibility")) {
showVisibility = false;
} else if(opt[0].equals("-types")) {
showType = true;
} else if (opt[0].equals("-!types")) {
showType = false;
} else if(opt[0].equals("-autoSize")) {
autoSize = true;
} else if (opt[0].equals("-!autoSize")) {
autoSize = false;
} else if(opt[0].equals("-commentname")) {
showComment = true;
} else if (opt[0].equals("-!commentname")) {
showComment = false;
} else if(opt[0].equals("-all")) {
setAll(); setAll();
} else if(opt[0].equals("-bgcolor")) { } else if(matchOption(opt[0], "bgcolor", true)) {
bgColor = opt[1]; bgColor = positive ? opt[1] : null;
} else if (opt[0].equals("-!bgcolor")) { } else if(matchOption(opt[0], "edgecolor", true)) {
bgColor = null; edgeColor = positive ? opt[1] : "black";
} else if(opt[0].equals("-edgecolor")) { } else if(matchOption(opt[0], "edgefontcolor", true)) {
edgeColor = opt[1]; edgeFontColor = positive ? opt[1] : "black";
} else if (opt[0].equals("-!edgecolor")) { } else if(matchOption(opt[0], "edgefontname", true)) {
edgeColor = "black"; edgeFontName = positive ? opt[1] : Font.DEFAULT_FONT;
} else if(opt[0].equals("-edgefontcolor")) { } else if(matchOption(opt[0], "edgefontsize", true)) {
edgeFontColor = opt[1]; edgeFontSize = positive ? Double.parseDouble(opt[1]) : 10;
} else if (opt[0].equals("-!edgefontcolor")) { } else if(matchOption(opt[0], "nodefontcolor", true)) {
edgeFontColor = "black"; nodeFontColor = positive ? opt[1] : "black";
} else if(opt[0].equals("-edgefontname")) { } else if(matchOption(opt[0], "nodefontname", true)) {
edgeFontName = opt[1]; nodeFontName = positive ? opt[1] : Font.DEFAULT_FONT;
} else if (opt[0].equals("-!edgefontname")) { } else if(matchOption(opt[0], "nodefontabstractitalic", true)) {
edgeFontName = defaultFont; nodeFontAbstractItalic = positive;
} else if(opt[0].equals("-edgefontsize")) { } else if(matchOption(opt[0], "nodefontsize", true)) {
edgeFontSize = Integer.parseInt(opt[1]); nodeFontSize = positive ? Double.parseDouble(opt[1]) : 10;
} else if (opt[0].equals("-!edgefontsize")) { } else if(matchOption(opt[0], "nodefontclassname", true)) {
edgeFontSize = 10; nodeFontClassName = positive ? opt[1] : null;
} else if(opt[0].equals("-nodefontcolor")) { } else if(matchOption(opt[0], "nodefontclasssize", true)) {
nodeFontColor = opt[1]; nodeFontClassSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if (opt[0].equals("-!nodefontcolor")) { } else if(matchOption(opt[0], "nodefonttagname", true)) {
nodeFontColor = "black"; nodeFontTagName = positive ? opt[1] : null;
} else if(opt[0].equals("-nodefontname")) { } else if(matchOption(opt[0], "nodefonttagsize", true)) {
nodeFontName = opt[1]; nodeFontTagSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if (opt[0].equals("-!nodefontname")) { } else if(matchOption(opt[0], "nodefontpackagename", true)) {
nodeFontName = defaultFont; nodeFontPackageName = positive ? opt[1] : null;
} else if(opt[0].equals("-nodefontabstractname")) { } else if(matchOption(opt[0], "nodefontpackagesize", true)) {
nodeFontAbstractName = opt[1]; nodeFontPackageSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if (opt[0].equals("-!nodefontabstractname")) { } else if(matchOption(opt[0], "nodefillcolor", true)) {
nodeFontAbstractName = defaultItalicFont; nodeFillColor = positive ? opt[1] : null;
} else if(opt[0].equals("-nodefontsize")) { } else if(matchOption(opt[0], "shape", true)) {
nodeFontSize = Integer.parseInt(opt[1]); shape = positive ? Shape.of(opt[1]) : Shape.CLASS;
} else if (opt[0].equals("-!nodefontsize")) { } else if(matchOption(opt[0], "output", true)) {
nodeFontSize = 10; outputFileName = positive ? opt[1] : "graph.dot";
} else if(opt[0].equals("-nodefontclassname")) { } else if(matchOption(opt[0], "outputencoding", true)) {
nodeFontClassName = opt[1]; outputEncoding = positive ? opt[1] : "ISO-8859-1";
} else if (opt[0].equals("-!nodefontclassname")) { } else if(matchOption(opt[0], "hide", true)) {
nodeFontClassName = null; if (positive) {
} else if(opt[0].equals("-nodefontclassabstractname")) { if (opt.length == 1) {
nodeFontClassAbstractName = opt[1]; hidePatterns.clear();
} else if (opt[0].equals("-!nodefontclassabstractname")) { hidePatterns.add(allPattern);
nodeFontClassAbstractName = null; } else {
} else if(opt[0].equals("-nodefontclasssize")) { try {
nodeFontClassSize = Integer.parseInt(opt[1]); hidePatterns.add(Pattern.compile(opt[1]));
} else if (opt[0].equals("-!nodefontclasssize")) { } catch (PatternSyntaxException e) {
nodeFontClassSize = -1; System.err.println("Skipping invalid pattern " + opt[1]);
} else if(opt[0].equals("-nodefonttagname")) { }
nodeFontTagName = opt[1]; }
} else if (opt[0].equals("-!nodefonttagname")) { } else
nodeFontTagName = null;
} else if(opt[0].equals("-nodefonttagsize")) {
nodeFontTagSize = Integer.parseInt(opt[1]);
} else if (opt[0].equals("-!nodefonttagsize")) {
nodeFontTagSize = -1;
} else if(opt[0].equals("-nodefontpackagename")) {
nodeFontPackageName = opt[1];
} else if (opt[0].equals("-!nodefontpackagename")) {
nodeFontPackageName = null;
} else if(opt[0].equals("-nodefontpackagesize")) {
nodeFontPackageSize = Integer.parseInt(opt[1]);
} else if (opt[0].equals("-!nodefontpackagesize")) {
nodeFontPackageSize = -1;
} else if(opt[0].equals("-nodefillcolor")) {
nodeFillColor = opt[1];
} else if (opt[0].equals("-!nodefillcolor")) {
nodeFillColor = null;
} else if(opt[0].equals("-shape")) {
shape = new Shape(opt[1]);
} else if (opt[0].equals("-!shape")) {
shape = new Shape();
} else if(opt[0].equals("-output")) {
outputFileName = opt[1];
} else if (opt[0].equals("-!output")) {
outputFileName = "graph.dot";
} else if(opt[0].equals("-outputencoding")) {
outputEncoding = opt[1];
} else if (opt[0].equals("-!outputencoding")) {
outputEncoding = "ISO-8859-1";
} else if(opt[0].equals("-hide")) {
if(opt.length == 1) {
hidePatterns.clear(); hidePatterns.clear();
hidePatterns.add(allPattern); } else if(matchOption(opt[0], "include", true)) {
} else { if (positive) {
try { try {
hidePatterns.add(Pattern.compile(opt[1])); includePatterns.add(Pattern.compile(opt[1]));
} catch (PatternSyntaxException e) { } catch (PatternSyntaxException e) {
System.err.println("Skipping invalid pattern " + opt[1]); System.err.println("Skipping invalid pattern " + opt[1]);
} }
} } else
} else if (opt[0].equals("-!hide")) { includePatterns.clear();
hidePatterns.clear(); } else if(matchOption(opt[0], "apidocroot", true)) {
} else if(opt[0].equals("-include")) { apiDocRoot = positive ? fixApiDocRoot(opt[1]) : null;
try { } else if(matchOption(opt[0], "apidocmap", true)) {
includePatterns.add(Pattern.compile(opt[1])); if (positive)
} catch (PatternSyntaxException e) { setApiDocMapFile(opt[1]);
System.err.println("Skipping invalid pattern " + opt[1]); else
} apiDocMap.clear();
} else if (opt[0].equals("-!include")) { } else if(matchOption(opt[0], "noguillemot", true)) {
includePatterns.clear(); guilOpen = positive ? "&lt;&lt;" : "\u00ab";
} else if(opt[0].equals("-apidocroot")) { guilClose = positive ? "&gt;&gt;" : "\u00bb";
apiDocRoot = fixApiDocRoot(opt[1]); } else if (matchOption(opt[0], "view", true)) {
} else if (opt[0].equals("-!apidocroot")) { viewName = positive ? opt[1] : null;
apiDocRoot = null; } else if (matchOption(opt[0], "views", true)) {
} else if(opt[0].equals("-apidocmap")) { findViews = positive;
setApiDocMapFile(opt[1]); } else if (matchOption(opt[0], "d", true)) {
} else if (opt[0].equals("-!apidocmap")) { outputDirectory = positive ? opt[1] : null;
apiDocMap.clear(); } else if(matchOption(opt[0], "inferrel", true)) {
} else if(opt[0].equals("-noguillemot")) { inferRelationships = positive;
guilOpen = "&lt;&lt;"; } else if(matchOption(opt[0], "inferreltype", true)) {
guilClose = "&gt;&gt;"; if (positive) {
} else if (opt[0].equals("-!noguillemot")) {
guilOpen = "\u00ab";
guilClose = "\u00bb";
} else if (opt[0].equals("-view")) {
viewName = opt[1];
} else if (opt[0].equals("-!view")) {
viewName = null;
} else if (opt[0].equals("-views")) {
findViews = true;
} else if (opt[0].equals("-!views")) {
findViews = false;
} else if (opt[0].equals("-d")) {
outputDirectory = opt[1];
} else if (opt[0].equals("-!d")) {
outputDirectory = null;
} else if(opt[0].equals("-inferrel")) {
inferRelationships = true;
} else if(opt[0].equals("-!inferrel")) {
inferRelationships = false;
} else if(opt[0].equals("-inferreltype")) {
try { try {
inferRelationshipType = RelationType.valueOf(opt[1].toUpperCase()); inferRelationshipType = RelationType.valueOf(opt[1].toUpperCase());
} catch(IllegalArgumentException e) { } catch(IllegalArgumentException e) {
System.err.println("Unknown association type " + opt[1]); System.err.println("Unknown association type " + opt[1]);
} }
} else if(opt[0].equals("-!inferreltype")) { } else
inferRelationshipType = RelationType.NAVASSOC; inferRelationshipType = RelationType.NAVASSOC;
} else if(opt[0].equals("-inferdepvis")) { } else if(matchOption(opt[0], "inferdepvis", true)) {
try { if (positive) {
Visibility vis = Visibility.valueOf(opt[1].toUpperCase()); try {
inferDependencyVisibility = vis; Visibility vis = Visibility.valueOf(opt[1].toUpperCase());
} catch(IllegalArgumentException e) { inferDependencyVisibility = vis;
System.err.println("Ignoring invalid visibility specification for " + } catch(IllegalArgumentException e) {
"dependency inference: " + opt[1]); System.err.println("Ignoring invalid visibility specification for " +
} "dependency inference: " + opt[1]);
} else if(opt[0].equals("-!inferdepvis")) { }
inferDependencyVisibility = Visibility.PRIVATE; } else
} else if(opt[0].equals("-collapsible")) { inferDependencyVisibility = Visibility.PRIVATE;
collapsibleDiagrams = true; } else if(matchOption(opt[0], "collapsible", true)) {
} else if(opt[0].equals("-!collapsible")) { collapsibleDiagrams = positive;
collapsibleDiagrams = false; } else if(matchOption(opt[0], "inferdep", true)) {
} else if(opt[0].equals("-inferdep")) { inferDependencies = positive;
inferDependencies = true; } else if(matchOption(opt[0], "inferdepinpackage", true)) {
} else if(opt[0].equals("-!inferdep")) { inferDepInPackage = positive;
inferDependencies = false; } else if (matchOption(opt[0], "hideprivateinner", true)) {
} else if(opt[0].equals("-inferdepinpackage")) { hidePrivateInner = positive;
inferDepInPackage = true; } else if(matchOption(opt[0], "useimports", true)) {
} else if(opt[0].equals("-!inferdepinpackage")) { useImports = positive;
inferDepInPackage = false; } else if (matchOption(opt[0], "collpackages", true)) {
} else if(opt[0].equals("-useimports")) { if (positive) {
useImports = true; try {
} else if(opt[0].equals("-!useimports")) { collPackages.add(Pattern.compile(opt[1]));
useImports = false; } catch (PatternSyntaxException e) {
} else if (opt[0].equals("-collpackages")) { System.err.println("Skipping invalid pattern " + opt[1]);
try { }
collPackages.add(Pattern.compile(opt[1])); } else
} catch (PatternSyntaxException e) { collPackages.clear();
System.err.println("Skipping invalid pattern " + opt[1]); } else if (matchOption(opt[0], "compact", true)) {
} compact = positive;
} else if (opt[0].equals("-!collpackages")) { } else if (matchOption(opt[0], "postfixpackage", true)) {
collPackages.clear(); postfixPackage = positive;
} else if (opt[0].equals("-compact")) { } else if (matchOption(opt[0], "link")) {
compact = true;
} else if (opt[0].equals("-!compact")) {
compact = false;
} else if (opt[0].equals("-postfixpackage")) {
postfixPackage = true;
} else if (opt[0].equals("-!postfixpackage")) {
postfixPackage = false;
} else if (opt[0].equals("-link")) {
addApiDocRoots(opt[1]); addApiDocRoots(opt[1]);
} else if (opt[0].equals("-linkoffline")) { } else if (matchOption(opt[0], "linkoffline")) {
addApiDocRootsOffline(opt[1], opt[2]); addApiDocRootsOffline(opt[1], opt[2]);
} else if(opt[0].equals("-contextPattern")) { } else if(matchOption(opt[0], "contextPattern")) {
RelationDirection d; RelationType rt; RelationDirection d; RelationType rt;
try { try {
d = RelationDirection.valueOf(opt[2].toUpperCase()); d = RelationDirection.valueOf(opt[2].toUpperCase());
@ -550,27 +433,22 @@ public class Options implements Cloneable, OptionProvider {
} }
} else if (opt[0].equals("-nodesep")) { } else if (matchOption(opt[0], "nodesep", true)) {
try { try {
nodeSep = Double.parseDouble(opt[1]); nodeSep = positive ? Double.parseDouble(opt[1]) : 0.25;
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
System.err.println("Skipping invalid nodesep " + opt[1]); System.err.println("Skipping invalid nodesep " + opt[1]);
} }
} else if (opt[0].equals("-!nodesep")) { } else if (matchOption(opt[0], "ranksep", true)) {
nodeSep = 0.25;
} else if (opt[0].equals("-ranksep")) {
try { try {
rankSep = Double.parseDouble(opt[1]); rankSep = positive ? Double.parseDouble(opt[1]) : 0.5;
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
System.err.println("Skipping invalid ranksep " + opt[1]); System.err.println("Skipping invalid ranksep " + opt[1]);
} }
} else if (opt[0].equals("-!ranksep")) { } else if (matchOption(opt[0], "dotexecutable")) {
rankSep = 0.5; dotExecutable = opt[1];
} else if (opt[0].equals("-dotexecutable")) {
dotExecutable = opt[1];
} else } else
; // Do nothing, javadoc will handle the option or complain, if ; // Do nothing, javadoc will handle the option or complain, if needed.
// needed.
} }
/** /**
@ -642,11 +520,10 @@ public class Options implements Cloneable, OptionProvider {
userMap.load(is); userMap.load(is);
for (Map.Entry<?, ?> mapEntry : userMap.entrySet()) { for (Map.Entry<?, ?> mapEntry : userMap.entrySet()) {
try { try {
Pattern regex = Pattern.compile((String) mapEntry.getKey());
String thisRoot = (String) mapEntry.getValue(); String thisRoot = (String) mapEntry.getValue();
if (thisRoot != null) { if (thisRoot != null) {
thisRoot = fixApiDocRoot(thisRoot); thisRoot = fixApiDocRoot(thisRoot);
apiDocMap.put(regex, thisRoot); apiDocMap.put(Pattern.compile((String) mapEntry.getKey()), thisRoot);
} else { } else {
System.err.println("No URL for pattern " + mapEntry.getKey()); System.err.println("No URL for pattern " + mapEntry.getKey());
} }
@ -667,7 +544,7 @@ public class Options implements Cloneable, OptionProvider {
* match the class name against the regular expressions specified in the * match the class name against the regular expressions specified in the
* <code>apiDocMap</code>; if a match is found, the associated URL * <code>apiDocMap</code>; if a match is found, the associated URL
* will be returned. * will be returned.
* * <p>
* <b>NOTE:</b> The match order of the match attempts is the one specified by the * <b>NOTE:</b> The match order of the match attempts is the one specified by the
* constructor of the api doc root, so it depends on the order of "-link" and "-apiDocMap" * constructor of the api doc root, so it depends on the order of "-link" and "-apiDocMap"
* parameters. * parameters.
@ -677,9 +554,7 @@ public class Options implements Cloneable, OptionProvider {
apiDocMap.put(Pattern.compile(".*"), DEFAULT_EXTERNAL_APIDOC); apiDocMap.put(Pattern.compile(".*"), DEFAULT_EXTERNAL_APIDOC);
for (Map.Entry<Pattern, String> mapEntry : apiDocMap.entrySet()) { for (Map.Entry<Pattern, String> mapEntry : apiDocMap.entrySet()) {
Pattern regex = mapEntry.getKey(); if (mapEntry.getKey().matcher(className).matches())
Matcher matcher = regex.matcher(className);
if (matcher.matches())
return mapEntry.getValue(); return mapEntry.getValue();
} }
return null; return null;
@ -687,16 +562,15 @@ public class Options implements Cloneable, OptionProvider {
/** Trim and append a file separator to the string */ /** Trim and append a file separator to the string */
private String fixApiDocRoot(String str) { private String fixApiDocRoot(String str) {
String fixed = null; if (str == null)
if (str != null) { return null;
fixed = str.trim(); String fixed = str.trim();
if (fixed.length() > 0) { if (fixed.isEmpty())
if (!File.separator.equals("/")) return "";
fixed = fixed.replace(File.separator.charAt(0), '/'); if (File.separatorChar != '/')
if (!fixed.endsWith("/")) fixed = fixed.replace(File.separatorChar, '/');
fixed = fixed + "/"; if (!fixed.endsWith("/"))
} fixed = fixed + "/";
}
return fixed; return fixed;
} }
@ -712,11 +586,8 @@ public class Options implements Cloneable, OptionProvider {
if (p == null) if (p == null)
return; return;
for (Tag tag : p.tags("opt")) { for (Tag tag : p.tags("opt"))
String[] opt = StringUtil.tokenize(tag.text()); setOption(StringUtil.tokenize(tag.text()));
opt[0] = "-" + opt[0];
setOption(opt);
}
} }
/** /**
@ -731,13 +602,8 @@ public class Options implements Cloneable, OptionProvider {
return true; return true;
Matcher m = hidePattern.matcher(s); Matcher m = hidePattern.matcher(s);
if (strictMatching) { if (strictMatching ? m.matches() : m.find())
if (m.matches()) {
return true;
}
} else if (m.find()) {
return true; return true;
}
} }
return false; return false;
} }
@ -750,13 +616,8 @@ public class Options implements Cloneable, OptionProvider {
public boolean matchesIncludeExpression(String s) { public boolean matchesIncludeExpression(String s) {
for (Pattern includePattern : includePatterns) { for (Pattern includePattern : includePatterns) {
Matcher m = includePattern.matcher(s); Matcher m = includePattern.matcher(s);
if (strictMatching) { if (strictMatching ? m.matches() : m.find())
if (m.matches()) {
return true;
}
} else if (m.find()) {
return true; return true;
}
} }
return false; return false;
} }
@ -769,13 +630,8 @@ public class Options implements Cloneable, OptionProvider {
public boolean matchesCollPackageExpression(String s) { public boolean matchesCollPackageExpression(String s) {
for (Pattern collPattern : collPackages) { for (Pattern collPattern : collPackages) {
Matcher m = collPattern.matcher(s); Matcher m = collPattern.matcher(s);
if (strictMatching) { if (strictMatching ? m.matches() : m.find())
if (m.matches()) {
return true;
}
} else if (m.find()) {
return true; return true;
}
} }
return false; return false;
} }

View File

@ -16,10 +16,9 @@ public class PackageMatcher implements ClassMatcher {
} }
public boolean matches(String name) { public boolean matches(String name) {
for (ClassDoc cd : packageDoc.allClasses()) { for (ClassDoc cd : packageDoc.allClasses())
if (cd.qualifiedName().equals(name)) if (cd.qualifiedName().equals(name))
return true; return true;
}
return false; return false;
} }

View File

@ -17,7 +17,7 @@ import com.sun.javadoc.RootDoc;
*/ */
public class PackageView implements OptionProvider { public class PackageView implements OptionProvider {
private static final String[] HIDE = new String[] { "-hide" }; private static final String[] HIDE = new String[] { "hide" };
private PackageDoc pd; private PackageDoc pd;
private OptionProvider parent; private OptionProvider parent;
private ClassMatcher matcher; private ClassMatcher matcher;
@ -40,7 +40,7 @@ public class PackageView implements OptionProvider {
public Options getGlobalOptions() { public Options getGlobalOptions() {
Options go = parent.getGlobalOptions(); Options go = parent.getGlobalOptions();
go.setOption(new String[] { "-output", outputPath }); go.setOption(new String[] { "output", outputPath });
go.setOption(HIDE); go.setOption(HIDE);
return go; return go;
@ -63,8 +63,8 @@ public class PackageView implements OptionProvider {
boolean inPackage = matcher.matches(cd); boolean inPackage = matcher.matches(cd);
if (inPackage) if (inPackage)
opt.showQualified = false; opt.showQualified = false;
if (!(inPackage || this.opt.matchesIncludeExpression(cd.qualifiedName())) boolean included = inPackage || this.opt.matchesIncludeExpression(cd.qualifiedName());
|| this.opt.matchesHideExpression(cd.qualifiedName())) if (!included || this.opt.matchesHideExpression(cd.qualifiedName()))
opt.setOption(HIDE); opt.setOption(HIDE);
} }
@ -73,8 +73,8 @@ public class PackageView implements OptionProvider {
boolean inPackage = matcher.matches(className); boolean inPackage = matcher.matches(className);
if (inPackage) if (inPackage)
opt.showQualified = false; opt.showQualified = false;
if (!(inPackage || this.opt.matchesIncludeExpression(className)) boolean included = inPackage || this.opt.matchesIncludeExpression(className);
|| this.opt.matchesHideExpression(className)) if (!included || this.opt.matchesHideExpression(className))
opt.setOption(HIDE); opt.setOption(HIDE);
} }

View File

@ -16,7 +16,6 @@
*/ */
package org.umlgraph.doclet; package org.umlgraph.doclet;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.sun.javadoc.ClassDoc; import com.sun.javadoc.ClassDoc;
@ -38,8 +37,7 @@ public class PatternMatcher implements ClassMatcher {
} }
public boolean matches(String name) { public boolean matches(String name) {
Matcher matcher = pattern.matcher(name); return pattern.matcher(name).matches();
return matcher.matches();
} }
} }

View File

@ -13,12 +13,9 @@ public enum RelationDirection {
* @return * @return
*/ */
public RelationDirection sum(RelationDirection d) { public RelationDirection sum(RelationDirection d) {
if (this == NONE) // Handle same and nones first:
return d; return (this == d || d == NONE) ? this : //
this == NONE ? d : BOTH; // They are different and not none.
if ((this == IN && d == OUT) || (this == OUT && d == IN) || this == BOTH || d == BOTH)
return BOTH;
return this;
} }
/** /**
@ -28,10 +25,7 @@ public enum RelationDirection {
* @return * @return
*/ */
public boolean contains(RelationDirection d) { public boolean contains(RelationDirection d) {
if (this == BOTH) return this == BOTH ? true : (d == this);
return true;
else
return d == this;
} }
/** /**
@ -40,12 +34,7 @@ public enum RelationDirection {
* @return * @return
*/ */
public RelationDirection inverse() { public RelationDirection inverse() {
if (this == IN) return this == IN ? OUT : this == OUT ? IN : this;
return OUT;
else if (this == OUT)
return IN;
else
return this;
} }
}; };

View File

@ -1,16 +1,34 @@
package org.umlgraph.doclet; package org.umlgraph.doclet;
/** /**
* The type of relation that links two entities * The type of relation that links two entities, and the graphviz format
* @author wolf
* *
* @author Erich Schubert
*/ */
public enum RelationType { public enum RelationType {
ASSOC(), NAVASSOC(), HAS(), NAVHAS(), COMPOSED(), NAVCOMPOSED(), DEPEND(), EXTENDS(), IMPLEMENTS(); DEPEND("arrowhead=open,style=dashed,weight=0", false), // Weakest
NAVASSOC("arrowhead=open,weight=1", false), //
ASSOC("arrowhead=none,weight=2", false), //
NAVHAS("arrowhead=open,arrowtail=ediamond,dir=both,weight=3", false), //
HAS("arrowhead=none,arrowtail=ediamond,dir=back,weight=4", false), //
NAVCOMPOSED("arrowhead=open,arrowtail=diamond,dir=both,weight=5", false), //
COMPOSED("arrowhead=none,arrowtail=diamond,dir=back,weight=6", false), //
IMPLEMENTS("arrowtail=empty,style=dashed,dir=back,weight=9", true), //
EXTENDS("arrowtail=empty,dir=back,weight=10", true);
/** Lower case version of the label */
public final String lower; public final String lower;
private RelationType() { /** Graphviz style */
this.lower = toString().toLowerCase(); public final String style;
/** Backwards edges with respect to node ranking */
public final boolean backorder;
/** Enum constructors must be private */
private RelationType(String style, boolean backorder) {
this.lower = toString().toLowerCase();
this.style = style;
this.backorder = backorder;
} }
} }

View File

@ -18,80 +18,66 @@
package org.umlgraph.doclet; package org.umlgraph.doclet;
import java.io.IOException; import java.util.HashMap;
import java.io.PrintWriter; import java.util.Locale;
import java.util.ArrayList;
import java.util.List;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.Doc;
import com.sun.javadoc.LanguageVersion;
import com.sun.javadoc.RootDoc;
/** /**
* Properties of node shapes * Properties of node shapes
* *
* @version $Revision$ * @version $Revision$
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a> * @author Erich Schubert
*/ */
public class Shape { public enum Shape {
CLASS(""), //
NOTE(", shape=note"), //
NODE(", shape=box3d"), //
COMPONENT(", shape=component"), //
PACKAGE(", shape=tab"), //
COLLABORATION(", shape=ellipse, style=dashed"), //
USECASE(", shape=ellipse"), //
ACTIVECLASS("");
/** Shape's UMLGraph name */ /** Graphviz style */
private String name; public final String style;
/** Construct a default (class) Shape */ /** Map for valid shape names */
public Shape() { private static final HashMap<String, Shape> index = new HashMap<String, Shape>(16);
name = "class";
}
/** Construct a Shape through the specified UMLGraph name */ /** Initialize the lookup index */
public Shape(String n) { static {
name = n; for (Shape s : Shape.values()) {
if (graphvizAttribute() == null) { index.put(s.name(), s);
System.err.println("Ignoring invalid shape " + n); index.put(s.name().toLowerCase(Locale.ROOT), s);
name = "class";
} }
} }
/** /**
* Return the GraphViz shape name corresponding to the shape * Get the shape from a string. This allows both the uppercase and the lowercase
* name. Prefer this to {{@link #valueOf(String)} which only accepts uppercase.
*
* @param s String
* @return Shape
*/ */
public String graphvizAttribute() { public static Shape of(String s) {
if (name.equals("class")) Shape shp = index.get(s);
return ""; // Default; plaintext if (shp != null)
else if (name.equals("note")) return shp;
return ", shape=note"; System.err.println("Ignoring invalid shape: " + s);
else if (name.equals("node")) return CLASS;
return ", shape=box3d";
else if (name.equals("component"))
return ", shape=component";
else if (name.equals("package"))
return ", shape=tab";
else if (name.equals("collaboration"))
return ", shape=ellipse, style=dashed";
else if (name.equals("usecase"))
return ", shape=ellipse";
else if (name.equals("activeclass"))
return ""; // Default; plaintext
else
return null;
} }
/** Return the shape's GraphViz landing port */ /** Enum constructor, must be private! */
String landingPort() { private Shape(String style) {
if (name.equals("class") || name.equals("activeclass")) this.style = style;
return ":p";
else
return "";
} }
/** Return the table border required for the shape */ /** Return the table border required for the shape */
String extraColumn(int nRows) { public String extraColumn() {
return name.equals("activeclass") ? ("<td rowspan=\"" + nRows + "\"></td>") : ""; return this == Shape.ACTIVECLASS ? ("<td rowspan=\"10\"></td>") : "";
} }
/** Return the cell border required for the shape */ /** Return the cell border required for the shape */
String cellBorder() { public String cellBorder() {
return (name.equals("class") || name.equals("activeclass")) ? "1" : "0"; return this == CLASS || this == ACTIVECLASS ? "1" : "0";
} }
} }

View File

@ -20,9 +20,11 @@
package org.umlgraph.doclet; package org.umlgraph.doclet;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
/** /**
* String utility functions * String utility functions
*
* @version $Revision$ * @version $Revision$
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a> * @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a>
*/ */
@ -62,4 +64,168 @@ class StringUtil {
return r.toArray(new String[0]); return r.toArray(new String[0]);
} }
private final static Pattern ESCAPE_BASIC_XML = Pattern.compile("[&<>]");
/**
* Escape &lt;, &gt;, and &amp; characters in the string with the corresponding
* HTML entity code.
*/
public static String escape(String s) {
if (ESCAPE_BASIC_XML.matcher(s).find()) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < sb.length();) {
switch (sb.charAt(i)) {
case '&':
sb.replace(i, i + 1, "&amp;");
i += "&amp;".length();
break;
case '<':
sb.replace(i, i + 1, "&lt;");
i += "&lt;".length();
break;
case '>':
sb.replace(i, i + 1, "&gt;");
i += "&gt;".length();
break;
default:
i++;
}
}
return sb.toString();
} else
return s;
}
/**
* Convert embedded newlines into HTML line breaks
*/
public static String htmlNewline(String s) {
if (s.indexOf('\n') == -1)
return s;
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < sb.length();) {
if (sb.charAt(i) == '\n') {
sb.replace(i, i + 1, "<br/>");
i += "<br/>".length();
} else
i++;
}
return sb.toString();
}
/**
* Convert &lt; and &gt; characters in the string to the respective guillemot
* characters.
*/
public static String guillemize(Options opt, String s) {
StringBuilder r = new StringBuilder(s);
for (int i = 0; i < r.length();)
switch (r.charAt(i)) {
case '<':
r.replace(i, i + 1, opt.guilOpen);
i += opt.guilOpen.length();
break;
case '>':
r.replace(i, i + 1, opt.guilClose);
i += opt.guilClose.length();
break;
default:
i++;
break;
}
return r.toString();
}
/**
* Wraps a string in Guillemot (or an ASCII substitute) characters.
*
* @param str the <code>String</code> to be wrapped.
* @return the wrapped <code>String</code>.
*/
public static String guilWrap(Options opt, String str) {
return opt.guilOpen + str + opt.guilClose;
}
/** Removes the template specs from a class name. */
public static String removeTemplate(String name) {
int openIdx = name.indexOf('<');
if (openIdx == -1)
return name;
StringBuilder buf = new StringBuilder(name.length());
for (int i = 0, depth = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (c == '<')
depth++;
else if (c == '>')
depth--;
else if (depth == 0)
buf.append(c);
}
return buf.toString();
}
public static String buildRelativePathFromClassNames(String contextPackageName, String classPackageName) {
// path, relative to the root, of the destination class
String[] contextClassPath = contextPackageName.split("\\.");
String[] currClassPath = classPackageName.split("\\.");
// compute relative path between the context and the destination
// ... first, compute common part
int i = 0, e = Math.min(contextClassPath.length, currClassPath.length);
while (i < e && contextClassPath[i].equals(currClassPath[i]))
i++;
// ... go up with ".." to reach the common root
StringBuilder buf = new StringBuilder(classPackageName.length());
for (int j = i; j < contextClassPath.length; j++)
buf.append("../");
// ... go down from the common root to the destination
for (int j = i; j < currClassPath.length; j++)
buf.append(currClassPath[j]).append('/'); // Always use HTML seperators
return buf.toString();
}
/**
* We can't just always use the last dot, because there are inner classes. And
* these may have frequent names. But the prime example is
* {@link java.util.Map.Entry}, which we want to show up as package
* <tt>java.util</tt> and class <tt>Map.Entry</tt>.
* <p>
* Note: this is only a heuristic. We only have the string here, and must assume
* users adhere to Java conventions, of beginning package names with a lowercase
* letter.
*
* @param className
* @return Splitting point (Either referring to a dot, or -1)
*/
public static int splitPackageClass(String className) {
int gen = className.indexOf('<'); // Begin before generics.
int end = gen >= 0 ? gen : className.length();
int start = className.lastIndexOf('.', end);
// No package name special cases:
if (start < 0)
return gen >= 0 || className.isEmpty() ? -1 //
: Character.isLowerCase(className.charAt(0)) ? end : -1;
int split = end;
while (true) {
if (Character.isLowerCase(className.charAt(start + 1)))
return split;
split = start; // Continue, this looks like a class name.
if (start < 0)
return -1;
start = className.lastIndexOf('.', start - 1);
}
}
/**
* Format a double to a string.
* <p>
* Avoids printing "10.0" for exact values like 10.
*
* @param val Value
* @return Formatted value
*/
public static String fmt(double val) {
return val == Math.round(val) ? Long.toString((long) val) : Double.toString(val);
}
} }

View File

@ -25,17 +25,12 @@ public class SubclassMatcher implements ClassMatcher {
return true; return true;
// recurse on supeclass, if available // recurse on supeclass, if available
if(cd.superclass() != null) return cd.superclass() == null ? false : matches(cd.superclass());
return matches(cd.superclass());
return false;
} }
public boolean matches(String name) { public boolean matches(String name) {
ClassDoc cd = root.classNamed(name); ClassDoc cd = root.classNamed(name);
if(cd == null) return cd == null ? false : matches(cd);
return false;
return matches(cd);
} }
} }

View File

@ -84,7 +84,7 @@ public class UmlGraph {
commentOptions = new Options(); commentOptions = new Options();
commentOptions.setOptions(root.options()); commentOptions.setOptions(root.options());
commentOptions.setOptions(findClass(root, "UMLNoteOptions")); commentOptions.setOptions(findClass(root, "UMLNoteOptions"));
commentOptions.shape = new Shape("note"); commentOptions.shape = Shape.NOTE;
Options opt = new Options(); Options opt = new Options();
opt.setOptions(root.options()); opt.setOptions(root.options());
@ -113,14 +113,16 @@ public class UmlGraph {
ClassGraph c = new ClassGraph(root, op, contextDoc); ClassGraph c = new ClassGraph(root, op, contextDoc);
c.prologue(); c.prologue();
for (int i = 0; i < classes.length; i++) for (ClassDoc cd : classes)
c.printClass(classes[i], true); c.printClass(cd, true);
for (int i = 0; i < classes.length; i++) for (ClassDoc cd : classes)
c.printRelations(classes[i]); c.printRelations(cd);
if(opt.inferRelationships) if(opt.inferRelationships)
c.printInferredRelations(classes); for (ClassDoc cd : classes)
c.printInferredRelations(cd);
if(opt.inferDependencies) if(opt.inferDependencies)
c.printInferredDependencies(classes); for (ClassDoc cd : classes)
c.printInferredDependencies(cd);
c.printExtraClasses(root); c.printExtraClasses(root);
c.epilogue(); c.epilogue();

View File

@ -62,12 +62,10 @@ public class UmlGraphDoc {
opt.strictMatching = true; opt.strictMatching = true;
// root.printNotice(opt.toString()); // root.printNotice(opt.toString());
root = new WrappedRootDoc(root);
generatePackageDiagrams(root, opt, outputFolder); generatePackageDiagrams(root, opt, outputFolder);
generateContextDiagrams(root, opt, outputFolder); generateContextDiagrams(root, opt, outputFolder);
} catch(Throwable t) { } catch(Throwable t) {
root.printWarning("Error!"); root.printWarning("Error: " + t.toString());
root.printWarning(t.toString());
t.printStackTrace(); t.printStackTrace();
return false; return false;
} }
@ -117,14 +115,18 @@ public class UmlGraphDoc {
ContextView view = null; ContextView view = null;
for (ClassDoc classDoc : classDocs) { for (ClassDoc classDoc : classDocs) {
if(view == null) try {
view = new ContextView(outputFolder, classDoc, root, opt); if(view == null)
else view = new ContextView(outputFolder, classDoc, root, opt);
view.setContextCenter(classDoc); else
UmlGraph.buildGraph(root, view, classDoc); view.setContextCenter(classDoc);
runGraphviz(opt.dotExecutable, outputFolder, classDoc.containingPackage().name(), classDoc.name(), root); UmlGraph.buildGraph(root, view, classDoc);
alterHtmlDocs(opt, outputFolder, classDoc.containingPackage().name(), classDoc.name(), runGraphviz(opt.dotExecutable, outputFolder, classDoc.containingPackage().name(), classDoc.name(), root);
classDoc.name() + ".html", Pattern.compile(".*(Class|Interface|Enum) " + classDoc.name() + ".*") , root); alterHtmlDocs(opt, outputFolder, classDoc.containingPackage().name(), classDoc.name(),
classDoc.name() + ".html", Pattern.compile(".*(Class|Interface|Enum) " + classDoc.name() + ".*") , root);
} catch (Exception e) {
throw new RuntimeException("Error generating " + classDoc.name(), e);
}
} }
} }

View File

@ -1,4 +1,4 @@
/* Automatically generated file */ /* Automatically generated file */
package org.umlgraph.doclet; package org.umlgraph.doclet;
class Version { public static String VERSION = "R5_7_2-49-ge25953";} class Version { public static String VERSION = "R5_7_2-60-g0e99a6";}

View File

@ -140,36 +140,30 @@ public class View implements OptionProvider {
boolean outputSet = false; boolean outputSet = false;
for (String[] opts : globalOptions) { for (String[] opts : globalOptions) {
if (opts[0].equals("-output")) if (Options.matchOption(opts[0], "output"))
outputSet = true; outputSet = true;
go.setOption(opts); go.setOption(opts);
} }
if (!outputSet) if (!outputSet)
go.setOption(new String[] { "-output", viewDoc.name() + ".dot" }); go.setOption(new String[] { "output", viewDoc.name() + ".dot" });
return go; return go;
} }
public void overrideForClass(Options opt, ClassDoc cd) { public void overrideForClass(Options opt, ClassDoc cd) {
provider.overrideForClass(opt, cd); provider.overrideForClass(opt, cd);
for (ClassMatcher cm : optionOverrides.keySet()) { for (ClassMatcher cm : optionOverrides.keySet())
if(cm.matches(cd)) { if(cm.matches(cd))
for (String[] override : optionOverrides.get(cm)) { for (String[] override : optionOverrides.get(cm))
opt.setOption(override); opt.setOption(override);
}
}
}
} }
public void overrideForClass(Options opt, String className) { public void overrideForClass(Options opt, String className) {
provider.overrideForClass(opt, className); provider.overrideForClass(opt, className);
for (ClassMatcher cm : optionOverrides.keySet()) { for (ClassMatcher cm : optionOverrides.keySet())
if(cm.matches(className)) { if(cm.matches(className))
for (String[] override : optionOverrides.get(cm)) { for (String[] override : optionOverrides.get(cm))
opt.setOption(override); opt.setOption(override);
}
}
}
} }
public String getDisplayName() { public String getDisplayName() {

View File

@ -24,10 +24,15 @@ import com.sun.javadoc.ProgramElementDoc;
* Enumerates the possible visibilities in a Java program. For brevity, package * Enumerates the possible visibilities in a Java program. For brevity, package
* private visibility is referred as PACKAGE. * private visibility is referred as PACKAGE.
* @author wolf * @author wolf
*
*/ */
public enum Visibility { public enum Visibility {
PRIVATE, PACKAGE, PROTECTED, PUBLIC; PRIVATE("- "), PACKAGE("~ "), PROTECTED("# "), PUBLIC("+ ");
final public String symbol;
private Visibility(String symbol) {
this.symbol = symbol;
}
public static Visibility get(ProgramElementDoc doc) { public static Visibility get(ProgramElementDoc doc) {
if (doc.isPrivate()) if (doc.isPrivate())
@ -38,6 +43,5 @@ public enum Visibility {
return PROTECTED; return PROTECTED;
else else
return PUBLIC; return PUBLIC;
} }
} }

View File

@ -1,369 +0,0 @@
/*
* Create a graphviz graph based on the classes in the specified java
* source files.
*
* (C) Copyright 2002-2005 Diomidis Spinellis
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
*/
package org.umlgraph.doclet;
import com.sun.javadoc.AnnotatedType;
import com.sun.javadoc.AnnotationDesc;
import com.sun.javadoc.AnnotationTypeDoc;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.ConstructorDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.PackageDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.ParameterizedType;
import com.sun.javadoc.SeeTag;
import com.sun.javadoc.SourcePosition;
import com.sun.javadoc.Tag;
import com.sun.javadoc.Type;
import com.sun.javadoc.TypeVariable;
import com.sun.javadoc.WildcardType;
/**
* A ClassDoc wrapper that caches answer to the most common requests performed
* by UMLGraph, considerably improving the overall UMLDoc performance (ClassDoc
* computes most of the results for more fine grained information at each call).
* <p>
* Unfortunately this has a side effect, since it breaks the equals() call between
* plain ClassDoc instances and WrappedClassDoc ones, so use it with due care.
* <p>
* In particular, don't provide WrappedClassDoc instances to the standard doclet.
* @author wolf
*
*/
public class WrappedClassDoc implements ClassDoc {
ClassDoc wrapped;
String toString;
String name;
Tag[] tags;
public WrappedClassDoc(ClassDoc wrapped) {
this.wrapped = wrapped;
}
public AnnotationDesc[] annotations() {
return wrapped.annotations();
}
public AnnotationTypeDoc asAnnotationTypeDoc() {
return wrapped.asAnnotationTypeDoc();
}
public ClassDoc asClassDoc() {
return wrapped.asClassDoc();
}
public ParameterizedType asParameterizedType() {
return wrapped.asParameterizedType();
}
public TypeVariable asTypeVariable() {
return wrapped.asTypeVariable();
}
public WildcardType asWildcardType() {
return wrapped.asWildcardType();
}
public String commentText() {
return wrapped.commentText();
}
public int compareTo(Object arg0) {
if (arg0 instanceof WrappedClassDoc) {
WrappedClassDoc other = (WrappedClassDoc) arg0;
return wrapped.compareTo(other.wrapped);
}
return wrapped.compareTo(arg0);
}
public ConstructorDoc[] constructors() {
return wrapped.constructors();
}
public ConstructorDoc[] constructors(boolean arg0) {
return wrapped.constructors(arg0);
}
public ClassDoc containingClass() {
return wrapped.containingClass();
}
public PackageDoc containingPackage() {
return wrapped.containingPackage();
}
public boolean definesSerializableFields() {
return wrapped.definesSerializableFields();
}
public String dimension() {
return wrapped.dimension();
}
public FieldDoc[] enumConstants() {
return wrapped.enumConstants();
}
public FieldDoc[] fields() {
return wrapped.fields();
}
public FieldDoc[] fields(boolean arg0) {
return wrapped.fields(arg0);
}
public ClassDoc findClass(String arg0) {
return wrapped.findClass(arg0);
}
public Tag[] firstSentenceTags() {
return wrapped.firstSentenceTags();
}
public String getRawCommentText() {
return wrapped.getRawCommentText();
}
/** @deprecated */
public @Deprecated ClassDoc[] importedClasses() {
return wrapped.importedClasses();
}
/** @deprecated */
public @Deprecated PackageDoc[] importedPackages() {
return wrapped.importedPackages();
}
public Tag[] inlineTags() {
return wrapped.inlineTags();
}
public ClassDoc[] innerClasses() {
return wrapped.innerClasses();
}
public ClassDoc[] innerClasses(boolean arg0) {
return wrapped.innerClasses(arg0);
}
public ClassDoc[] interfaces() {
return wrapped.interfaces();
}
public Type[] interfaceTypes() {
return wrapped.interfaceTypes();
}
public boolean isAbstract() {
return wrapped.isAbstract();
}
public boolean isAnnotationType() {
return wrapped.isAnnotationType();
}
public boolean isAnnotationTypeElement() {
return wrapped.isAnnotationTypeElement();
}
public boolean isClass() {
return wrapped.isClass();
}
public boolean isConstructor() {
return wrapped.isConstructor();
}
public boolean isEnum() {
return wrapped.isEnum();
}
public boolean isEnumConstant() {
return wrapped.isEnumConstant();
}
public boolean isError() {
return wrapped.isError();
}
public boolean isException() {
return wrapped.isException();
}
public boolean isExternalizable() {
return wrapped.isExternalizable();
}
public boolean isField() {
return wrapped.isField();
}
public boolean isFinal() {
return wrapped.isFinal();
}
public boolean isIncluded() {
return wrapped.isIncluded();
}
public boolean isInterface() {
return wrapped.isInterface();
}
public boolean isMethod() {
return wrapped.isMethod();
}
public boolean isOrdinaryClass() {
return wrapped.isOrdinaryClass();
}
public boolean isPackagePrivate() {
return wrapped.isPackagePrivate();
}
public boolean isPrimitive() {
return wrapped.isPrimitive();
}
public boolean isPrivate() {
return wrapped.isPrivate();
}
public boolean isProtected() {
return wrapped.isProtected();
}
public boolean isPublic() {
return wrapped.isPublic();
}
public boolean isSerializable() {
return wrapped.isSerializable();
}
public boolean isStatic() {
return wrapped.isStatic();
}
public MethodDoc[] methods() {
return wrapped.methods();
}
public MethodDoc[] methods(boolean arg0) {
return wrapped.methods(arg0);
}
public String modifiers() {
return wrapped.modifiers();
}
public int modifierSpecifier() {
return wrapped.modifierSpecifier();
}
public String name() {
if (name == null)
name = wrapped.name();
return name;
}
public SourcePosition position() {
return wrapped.position();
}
public String qualifiedName() {
return wrapped.qualifiedName();
}
public String qualifiedTypeName() {
return wrapped.qualifiedTypeName();
}
public SeeTag[] seeTags() {
return wrapped.seeTags();
}
public FieldDoc[] serializableFields() {
return wrapped.serializableFields();
}
public MethodDoc[] serializationMethods() {
return wrapped.serializationMethods();
}
public void setRawCommentText(String arg0) {
wrapped.setRawCommentText(arg0);
}
public String simpleTypeName() {
return wrapped.simpleTypeName();
}
public boolean subclassOf(ClassDoc arg0) {
return wrapped.subclassOf(arg0);
}
public ClassDoc superclass() {
return wrapped.superclass();
}
public Type superclassType() {
return wrapped.superclassType();
}
public Tag[] tags() {
if (tags == null)
tags = wrapped.tags();
return tags;
}
public Tag[] tags(String arg0) {
return wrapped.tags(arg0);
}
public String toString() {
if (toString == null) {
toString = wrapped.toString();
}
return toString;
}
public String typeName() {
return wrapped.typeName();
}
public TypeVariable[] typeParameters() {
return wrapped.typeParameters();
}
public ParamTag[] typeParamTags() {
return wrapped.typeParamTags();
}
public AnnotatedType asAnnotatedType() {
return wrapped.asAnnotatedType();
}
public Type getElementType() {
return wrapped.getElementType();
}
}

View File

@ -1,191 +0,0 @@
/*
* Create a graphviz graph based on the classes in the specified java
* source files.
*
* (C) Copyright 2002-2005 Diomidis Spinellis
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
*/
package org.umlgraph.doclet;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.PackageDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.SeeTag;
import com.sun.javadoc.SourcePosition;
import com.sun.javadoc.Tag;
/**
* RootDoc wrapper that provides WrappedClassDoc instances instead of plain ClassDoc in order
* to optimize the overall performance of UMLDoc.
* @author wolf
*/
public class WrappedRootDoc implements RootDoc {
RootDoc wrapped;
WrappedClassDoc[] wrappedClassDocs;
public WrappedRootDoc(RootDoc wrapped) {
this.wrapped = wrapped;
ClassDoc[] classes = wrapped.classes();
wrappedClassDocs = new WrappedClassDoc[classes.length];
for (int i = 0; i < classes.length; i++) {
wrappedClassDocs[i] = new WrappedClassDoc(classes[i]);
}
}
public ClassDoc[] classes() {
return wrappedClassDocs;
}
public ClassDoc classNamed(String arg0) {
return wrapped.classNamed(arg0);
}
public String commentText() {
return wrapped.commentText();
}
public int compareTo(Object arg0) {
return wrapped.compareTo(arg0);
}
public Tag[] firstSentenceTags() {
return wrapped.firstSentenceTags();
}
public String getRawCommentText() {
return wrapped.getRawCommentText();
}
public Tag[] inlineTags() {
return wrapped.inlineTags();
}
public boolean isAnnotationType() {
return wrapped.isAnnotationType();
}
public boolean isAnnotationTypeElement() {
return wrapped.isAnnotationTypeElement();
}
public boolean isClass() {
return wrapped.isClass();
}
public boolean isConstructor() {
return wrapped.isConstructor();
}
public boolean isEnum() {
return wrapped.isEnum();
}
public boolean isEnumConstant() {
return wrapped.isEnumConstant();
}
public boolean isError() {
return wrapped.isError();
}
public boolean isException() {
return wrapped.isException();
}
public boolean isField() {
return wrapped.isField();
}
public boolean isIncluded() {
return wrapped.isIncluded();
}
public boolean isInterface() {
return wrapped.isInterface();
}
public boolean isMethod() {
return wrapped.isMethod();
}
public boolean isOrdinaryClass() {
return wrapped.isOrdinaryClass();
}
public String name() {
return wrapped.name();
}
public String[][] options() {
return wrapped.options();
}
public PackageDoc packageNamed(String arg0) {
return wrapped.packageNamed(arg0);
}
public SourcePosition position() {
return wrapped.position();
}
public void printError(SourcePosition arg0, String arg1) {
wrapped.printError(arg0, arg1);
}
public void printError(String arg0) {
wrapped.printError(arg0);
}
public void printNotice(SourcePosition arg0, String arg1) {
wrapped.printNotice(arg0, arg1);
}
public void printNotice(String arg0) {
wrapped.printNotice(arg0);
}
public void printWarning(SourcePosition arg0, String arg1) {
wrapped.printWarning(arg0, arg1);
}
public void printWarning(String arg0) {
wrapped.printWarning(arg0);
}
public SeeTag[] seeTags() {
return wrapped.seeTags();
}
public void setRawCommentText(String arg0) {
wrapped.setRawCommentText(arg0);
}
public ClassDoc[] specifiedClasses() {
return wrapped.specifiedClasses();
}
public PackageDoc[] specifiedPackages() {
return wrapped.specifiedPackages();
}
public Tag[] tags() {
return wrapped.tags();
}
public Tag[] tags(String arg0) {
return wrapped.tags(arg0);
}
}

View File

@ -64,6 +64,7 @@ public class BasicTest {
pw.println(); pw.println();
pw.println(); pw.println();
pw.flush(); pw.flush();
System.exit(differences.size() > 0 ? 1 : 0);
} }
private static void performViewTests(List<String> differences, File outFolder) private static void performViewTests(List<String> differences, File outFolder)

View File

@ -166,16 +166,15 @@ public class DotDiff {
int closedBracketIdx = line.lastIndexOf(']'); int closedBracketIdx = line.lastIndexOf(']');
int arrowIdx = line.indexOf("->"); int arrowIdx = line.indexOf("->");
if (openBrackedIdx < 0 && closedBracketIdx < 0 || line.startsWith("edge") if (openBrackedIdx < 0 && closedBracketIdx < 0 || line.startsWith("edge")
|| line.startsWith("node")) || line.startsWith("node") || line.startsWith("graph"))
extraLines.add(line); extraLines.add(line);
else if (arrowIdx > 0 && arrowIdx < openBrackedIdx) { // that's an arc else if (arrowIdx > 0 && arrowIdx < openBrackedIdx) { // that's an arc
arcLines.add(line); arcLines.add(line);
} else { // that's a node } else { // that's a node
String attributes = line.substring(openBrackedIdx + 1, closedBracketIdx); String attributes = line.substring(openBrackedIdx + 1, closedBracketIdx);
Map<String, String> attMap = parseAttributes(attributes); Map<String, String> attMap = parseAttributes(attributes);
String name = line.substring(0, openBrackedIdx - 1).trim(); String name = trim(line.substring(0, openBrackedIdx - 1));
String label = attMap.get("label"); DotNode node = new DotNode(name, attMap.get("label"), attMap, line);
DotNode node = new DotNode(name, label, attMap, line);
nodes.put(name, node); nodes.put(name, node);
nodeList.add(node); nodeList.add(node);
} }
@ -185,19 +184,21 @@ public class DotDiff {
int closedBracketIdx = line.lastIndexOf(']'); int closedBracketIdx = line.lastIndexOf(']');
String attributes = line.substring(openBrackedIdx + 1, closedBracketIdx); String attributes = line.substring(openBrackedIdx + 1, closedBracketIdx);
String[] names = line.substring(0, openBrackedIdx).split("->"); String[] names = line.substring(0, openBrackedIdx).split("->");
DotNode from = nodes.get(names[0].trim()); DotNode from = nodes.get(names[0] = trim(names[0]));
DotNode to = nodes.get(names[1].trim()); DotNode to = nodes.get(names[1] = trim(names[1]));
if (from == null) { from = from != null ? from : new DotNode(names[0], "", new HashMap<String, String>(), "");
from = new DotNode(names[0], "", new HashMap<String, String>(), ""); to = to != null? to : new DotNode(names[1], "", new HashMap<String, String>(), "");
}
if (to == null) {
to = new DotNode(names[1], "", new HashMap<String, String>(), "");
}
arcs.add(new DotArc(from, to, parseAttributes(attributes), line)); arcs.add(new DotArc(from, to, parseAttributes(attributes), line));
} }
return extraLines; return extraLines;
} }
// Trim space AND port.
private String trim(String name) {
name = name.trim();
return name.endsWith(":p") ? name.substring(0, name.length() - 2) : name;
}
private Map<String, String> parseAttributes(String attributes) throws IOException { private Map<String, String> parseAttributes(String attributes) throws IOException {
Map<String, String> map = new HashMap<String, String>(); Map<String, String> map = new HashMap<String, String>();

View File

@ -148,10 +148,11 @@ public class UmlDocTest {
private static void runDoclet(String[] options) { private static void runDoclet(String[] options) {
pw.print("Run javadoc -doclet " + doclet); pw.print("Run javadoc -doclet " + doclet);
for (String o : options) for (String o : options)
pw.print(o + " "); pw.print(" " + o);
pw.println(); pw.println();
com.sun.tools.javadoc.Main.execute("UMLDoc test", pw, pw, pw, com.sun.tools.javadoc.Main.execute("UMLDoc test", pw, pw, pw,
doclet, options); doclet, options);
System.exit(0);
} }
} }

View File

@ -1,2 +1 @@
*.dot
*.png *.png

View File

@ -5,21 +5,22 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// test.AbstractNode ranksep=0.5;
c1 [label=<<table title="test.AbstractNode" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> AbstractNode </font></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> abstractMethod() </font></td></tr><tr><td align="left" balign="left"> concreteMethod() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // test.AbstractNode
// test.InnerNode c1 [label=<<table title="test.AbstractNode" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> AbstractNode </i></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><i> abstractMethod() </i></td></tr><tr><td align="left" balign="left"> concreteMethod() </td></tr></table></td></tr></table>>];
c2 [label=<<table title="test.InnerNode" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InnerNode </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // test.InnerNode
// test.Leaf c2 [label=<<table title="test.InnerNode" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InnerNode </td></tr></table></td></tr></table>>];
c3 [label=<<table title="test.Leaf" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Leaf </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // test.Leaf
//test.InnerNode extends test.AbstractNode c3 [label=<<table title="test.Leaf" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Leaf </td></tr></table></td></tr></table>>];
c1:p -> c2:p [dir=back,arrowtail=empty]; // test.InnerNode extends test.AbstractNode
// test.InnerNode COMPOSED test.AbstractNode c1 -> c2 [arrowtail=empty,dir=back,weight=10];
c2:p -> c1:p [taillabel="1", label="has", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // test.InnerNode composed test.AbstractNode
//test.Leaf extends test.AbstractNode c2 -> c1 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", label="has", headlabel="*"];
c1:p -> c3:p [dir=back,arrowtail=empty]; // test.Leaf extends test.AbstractNode
c1 -> c3 [arrowtail=empty,dir=back,weight=10];
} }

View File

@ -5,45 +5,46 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// A ranksep=0.5;
c66 [label=<<table title="A" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> first : B </td></tr><tr><td align="left" balign="left"> second : B </td></tr><tr><td align="left" balign="left"> third : C </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // A
// B c66 [label=<<table title="A" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> first : B </td></tr><tr><td align="left" balign="left"> second : B </td></tr><tr><td align="left" balign="left"> third : C </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c67 [label=<<table title="B" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> B </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> doSomething(b : B, c : C) : A </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // B
// C c67 [label=<<table title="B" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> B </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> doSomething(b : B, c : C) : A </td></tr></table></td></tr></table>>];
c68 [label=<<table title="C" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> C </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> collectionOfA : List&lt;A&gt; </td></tr><tr><td align="left" balign="left"> collectionOfB : ArrayList&lt;B&gt; </td></tr><tr><td align="left" balign="left"> mapOfD : Map&lt;String, D&gt; </td></tr><tr><td align="left" balign="left"> childs : C[] </td></tr><tr><td align="left" balign="left"> anOpaqueList : List&lt;&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // C
// MyFunnyList<T, V> c68 [label=<<table title="C" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> C </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> collectionOfA : List&lt;A&gt; </td></tr><tr><td align="left" balign="left"> collectionOfB : ArrayList&lt;B&gt; </td></tr><tr><td align="left" balign="left"> mapOfD : Map&lt;String, D&gt; </td></tr><tr><td align="left" balign="left"> childs : C[] </td></tr><tr><td align="left" balign="left"> anOpaqueList : List&lt;&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c69 [label=<<table title="MyFunnyList" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> MyFunnyList&lt;T, V&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> myField : V </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // MyFunnyList<T, V>
// MyList c69 [label=<<table title="MyFunnyList" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> MyFunnyList&lt;T, V&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> myField : V </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c70 [label=<<table title="MyList" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> MyList </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // MyList
// D c70 [label=<<table title="MyList" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> MyList </td></tr></table></td></tr></table>>];
c71 [label=<<table title="D" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> D </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> anotherListOfA : MyList </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // D
//MyFunnyList<T, V> extends java.util.ArrayList<T> c71 [label=<<table title="D" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> D </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> anotherListOfA : MyList </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c72:p -> c69:p [dir=back,arrowtail=empty]; // MyFunnyList<T, V> extends java.util.ArrayList<T>
//MyList extends MyFunnyList<A, B> c72 -> c69 [arrowtail=empty,dir=back,weight=10];
c69:p -> c70:p [dir=back,arrowtail=empty]; // MyList extends MyFunnyList<A, B>
// A HAS B c69 -> c70 [arrowtail=empty,dir=back,weight=10];
c66:p -> c67:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both]; // A has B
// A HAS C c66 -> c67 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4];
c66:p -> c68:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both]; // A has C
// C NAVASSOC B c66 -> c68 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4];
c68:p -> c67:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // C navassoc B
// C NAVASSOC D c68 -> c67 [arrowhead=open,weight=1,headlabel="*"];
c68:p -> c71:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // C navassoc D
// C NAVASSOC C c68 -> c71 [arrowhead=open,weight=1,headlabel="*"];
c68:p -> c68:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // C navassoc C
// C NAVASSOC java.util.List<E> c68 -> c68 [arrowhead=open,weight=1,headlabel="*"];
c68:p -> c73:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // C navassoc java.util.List<E>
// D NAVASSOC MyList c68 -> c73 [arrowhead=open,weight=1];
c71:p -> c70:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // D navassoc MyList
// B DEPEND A c71 -> c70 [arrowhead=open,weight=1];
c67:p -> c66:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // B depend A
// java.util.List<E> c67 -> c66 [arrowhead=open,style=dashed,weight=0];
c73 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> List&lt;E&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> size() : int </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> isEmpty() : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> contains(arg0 : Object) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> iterator() : Iterator&lt;E&gt; </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> toArray() : Object[] </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> toArray(arg0 : T[]) : T[] </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> add(arg0 : E) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> remove(arg0 : Object) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> containsAll(arg0 : Collection&lt;?&gt;) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> addAll(arg0 : Collection&lt;?&gt;) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> addAll(arg0 : int, arg1 : Collection&lt;?&gt;) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> removeAll(arg0 : Collection&lt;?&gt;) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> retainAll(arg0 : Collection&lt;?&gt;) : boolean </font></td></tr><tr><td align="left" balign="left"> replaceAll(arg0 : UnaryOperator&lt;E&gt;) </td></tr><tr><td align="left" balign="left"> sort(arg0 : Comparator&lt;?&gt;) </td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> clear() </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> equals(arg0 : Object) : boolean </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> hashCode() : int </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> get(arg0 : int) : E </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> set(arg0 : int, arg1 : E) : E </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> add(arg0 : int, arg1 : E) </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> remove(arg0 : int) : E </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> indexOf(arg0 : Object) : int </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> lastIndexOf(arg0 : Object) : int </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> listIterator() : ListIterator&lt;E&gt; </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> listIterator(arg0 : int) : ListIterator&lt;E&gt; </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </font></td></tr><tr><td align="left" balign="left"> spliterator() : Spliterator&lt;E&gt; </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/List.html", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // java.util.List<E>
// java.util.ArrayList<E> c73 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> List&lt;E&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><i> size() : int </i></td></tr><tr><td align="left" balign="left"><i> isEmpty() : boolean </i></td></tr><tr><td align="left" balign="left"><i> contains(arg0 : Object) : boolean </i></td></tr><tr><td align="left" balign="left"><i> iterator() : Iterator&lt;E&gt; </i></td></tr><tr><td align="left" balign="left"><i> toArray() : Object[] </i></td></tr><tr><td align="left" balign="left"><i> toArray(arg0 : T[]) : T[] </i></td></tr><tr><td align="left" balign="left"><i> add(arg0 : E) : boolean </i></td></tr><tr><td align="left" balign="left"><i> remove(arg0 : Object) : boolean </i></td></tr><tr><td align="left" balign="left"><i> containsAll(arg0 : Collection&lt;?&gt;) : boolean </i></td></tr><tr><td align="left" balign="left"><i> addAll(arg0 : Collection&lt;?&gt;) : boolean </i></td></tr><tr><td align="left" balign="left"><i> addAll(arg0 : int, arg1 : Collection&lt;?&gt;) : boolean </i></td></tr><tr><td align="left" balign="left"><i> removeAll(arg0 : Collection&lt;?&gt;) : boolean </i></td></tr><tr><td align="left" balign="left"><i> retainAll(arg0 : Collection&lt;?&gt;) : boolean </i></td></tr><tr><td align="left" balign="left"> replaceAll(arg0 : UnaryOperator&lt;E&gt;) </td></tr><tr><td align="left" balign="left"> sort(arg0 : Comparator&lt;?&gt;) </td></tr><tr><td align="left" balign="left"><i> clear() </i></td></tr><tr><td align="left" balign="left"><i> equals(arg0 : Object) : boolean </i></td></tr><tr><td align="left" balign="left"><i> hashCode() : int </i></td></tr><tr><td align="left" balign="left"><i> get(arg0 : int) : E </i></td></tr><tr><td align="left" balign="left"><i> set(arg0 : int, arg1 : E) : E </i></td></tr><tr><td align="left" balign="left"><i> add(arg0 : int, arg1 : E) </i></td></tr><tr><td align="left" balign="left"><i> remove(arg0 : int) : E </i></td></tr><tr><td align="left" balign="left"><i> indexOf(arg0 : Object) : int </i></td></tr><tr><td align="left" balign="left"><i> lastIndexOf(arg0 : Object) : int </i></td></tr><tr><td align="left" balign="left"><i> listIterator() : ListIterator&lt;E&gt; </i></td></tr><tr><td align="left" balign="left"><i> listIterator(arg0 : int) : ListIterator&lt;E&gt; </i></td></tr><tr><td align="left" balign="left"><i> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </i></td></tr><tr><td align="left" balign="left"> spliterator() : Spliterator&lt;E&gt; </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/List.html"];
c72 [label=<<table title="java.util.ArrayList" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ArrayList&lt;E&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> serialVersionUID : long </td></tr><tr><td align="left" balign="left"> DEFAULT_CAPACITY : int </td></tr><tr><td align="left" balign="left"> EMPTY_ELEMENTDATA : Object[] </td></tr><tr><td align="left" balign="left"> DEFAULTCAPACITY_EMPTY_ELEMENTDATA : Object[] </td></tr><tr><td align="left" balign="left"> elementData : Object[] </td></tr><tr><td align="left" balign="left"> size : int </td></tr><tr><td align="left" balign="left"> MAX_ARRAY_SIZE : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> trimToSize() </td></tr><tr><td align="left" balign="left"> ensureCapacity(arg0 : int) </td></tr><tr><td align="left" balign="left"> ensureCapacityInternal(arg0 : int) </td></tr><tr><td align="left" balign="left"> ensureExplicitCapacity(arg0 : int) </td></tr><tr><td align="left" balign="left"> grow(arg0 : int) </td></tr><tr><td align="left" balign="left"> hugeCapacity(arg0 : int) : int </td></tr><tr><td align="left" balign="left"> size() : int </td></tr><tr><td align="left" balign="left"> isEmpty() : boolean </td></tr><tr><td align="left" balign="left"> contains(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> indexOf(arg0 : Object) : int </td></tr><tr><td align="left" balign="left"> lastIndexOf(arg0 : Object) : int </td></tr><tr><td align="left" balign="left"> clone() : Object </td></tr><tr><td align="left" balign="left"> toArray() : Object[] </td></tr><tr><td align="left" balign="left"> toArray(arg0 : T[]) : T[] </td></tr><tr><td align="left" balign="left"> elementData(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> get(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> set(arg0 : int, arg1 : E) : E </td></tr><tr><td align="left" balign="left"> add(arg0 : E) : boolean </td></tr><tr><td align="left" balign="left"> add(arg0 : int, arg1 : E) </td></tr><tr><td align="left" balign="left"> remove(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> remove(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> fastRemove(arg0 : int) </td></tr><tr><td align="left" balign="left"> clear() </td></tr><tr><td align="left" balign="left"> addAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> addAll(arg0 : int, arg1 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> removeRange(arg0 : int, arg1 : int) </td></tr><tr><td align="left" balign="left"> rangeCheck(arg0 : int) </td></tr><tr><td align="left" balign="left"> rangeCheckForAdd(arg0 : int) </td></tr><tr><td align="left" balign="left"> outOfBoundsMsg(arg0 : int) : String </td></tr><tr><td align="left" balign="left"> removeAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> retainAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> batchRemove(arg0 : Collection&lt;?&gt;, arg1 : boolean) : boolean </td></tr><tr><td align="left" balign="left"> writeObject(arg0 : ObjectOutputStream) </td></tr><tr><td align="left" balign="left"> readObject(arg0 : ObjectInputStream) </td></tr><tr><td align="left" balign="left"> listIterator(arg0 : int) : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> listIterator() : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> iterator() : Iterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subListRangeCheck(arg0 : int, arg1 : int, arg2 : int) </td></tr><tr><td align="left" balign="left"> forEach(arg0 : Consumer&lt;?&gt;) </td></tr><tr><td align="left" balign="left"> spliterator() : Spliterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> removeIf(arg0 : Predicate&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> replaceAll(arg0 : UnaryOperator&lt;E&gt;) </td></tr><tr><td align="left" balign="left"> sort(arg0 : Comparator&lt;?&gt;) </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // java.util.ArrayList<E>
c72 [label=<<table title="java.util.ArrayList" border="0" cellborder="1" cellspacing="0" cellpadding="2" href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ArrayList&lt;E&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> serialVersionUID : long </td></tr><tr><td align="left" balign="left"> DEFAULT_CAPACITY : int </td></tr><tr><td align="left" balign="left"> EMPTY_ELEMENTDATA : Object[] </td></tr><tr><td align="left" balign="left"> DEFAULTCAPACITY_EMPTY_ELEMENTDATA : Object[] </td></tr><tr><td align="left" balign="left"> elementData : Object[] </td></tr><tr><td align="left" balign="left"> size : int </td></tr><tr><td align="left" balign="left"> MAX_ARRAY_SIZE : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> trimToSize() </td></tr><tr><td align="left" balign="left"> ensureCapacity(arg0 : int) </td></tr><tr><td align="left" balign="left"> ensureCapacityInternal(arg0 : int) </td></tr><tr><td align="left" balign="left"> ensureExplicitCapacity(arg0 : int) </td></tr><tr><td align="left" balign="left"> grow(arg0 : int) </td></tr><tr><td align="left" balign="left"> hugeCapacity(arg0 : int) : int </td></tr><tr><td align="left" balign="left"> size() : int </td></tr><tr><td align="left" balign="left"> isEmpty() : boolean </td></tr><tr><td align="left" balign="left"> contains(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> indexOf(arg0 : Object) : int </td></tr><tr><td align="left" balign="left"> lastIndexOf(arg0 : Object) : int </td></tr><tr><td align="left" balign="left"> clone() : Object </td></tr><tr><td align="left" balign="left"> toArray() : Object[] </td></tr><tr><td align="left" balign="left"> toArray(arg0 : T[]) : T[] </td></tr><tr><td align="left" balign="left"> elementData(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> get(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> set(arg0 : int, arg1 : E) : E </td></tr><tr><td align="left" balign="left"> add(arg0 : E) : boolean </td></tr><tr><td align="left" balign="left"> add(arg0 : int, arg1 : E) </td></tr><tr><td align="left" balign="left"> remove(arg0 : int) : E </td></tr><tr><td align="left" balign="left"> remove(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> fastRemove(arg0 : int) </td></tr><tr><td align="left" balign="left"> clear() </td></tr><tr><td align="left" balign="left"> addAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> addAll(arg0 : int, arg1 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> removeRange(arg0 : int, arg1 : int) </td></tr><tr><td align="left" balign="left"> rangeCheck(arg0 : int) </td></tr><tr><td align="left" balign="left"> rangeCheckForAdd(arg0 : int) </td></tr><tr><td align="left" balign="left"> outOfBoundsMsg(arg0 : int) : String </td></tr><tr><td align="left" balign="left"> removeAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> retainAll(arg0 : Collection&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> batchRemove(arg0 : Collection&lt;?&gt;, arg1 : boolean) : boolean </td></tr><tr><td align="left" balign="left"> writeObject(arg0 : ObjectOutputStream) </td></tr><tr><td align="left" balign="left"> readObject(arg0 : ObjectInputStream) </td></tr><tr><td align="left" balign="left"> listIterator(arg0 : int) : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> listIterator() : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> iterator() : Iterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subListRangeCheck(arg0 : int, arg1 : int, arg2 : int) </td></tr><tr><td align="left" balign="left"> forEach(arg0 : Consumer&lt;?&gt;) </td></tr><tr><td align="left" balign="left"> spliterator() : Spliterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> removeIf(arg0 : Predicate&lt;?&gt;) : boolean </td></tr><tr><td align="left" balign="left"> replaceAll(arg0 : UnaryOperator&lt;E&gt;) </td></tr><tr><td align="left" balign="left"> sort(arg0 : Comparator&lt;?&gt;) </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html"];
} }

View File

@ -5,19 +5,20 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Application ranksep=0.5;
c74 [label=<<table title="Application" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Application </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Application
// IrpApplication c74 [label=<<table title="Application" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Application </td></tr></table></td></tr></table>>];
c75 [label=<<table title="IrpApplication" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> IrpApplication </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // IrpApplication
// Main c75 [label=<<table title="IrpApplication" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> IrpApplication </td></tr></table></td></tr></table>>];
c76 [label=<<table title="Main" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Main </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Main
//IrpApplication extends Application c76 [label=<<table title="Main" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Main </td></tr></table></td></tr></table>>];
c74:p -> c75:p [dir=back,arrowtail=empty]; // IrpApplication extends Application
// Main DEPEND IrpApplication c74 -> c75 [arrowtail=empty,dir=back,weight=10];
c76:p -> c75:p [taillabel="", label="&#171;friend&#187;", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // Main depend IrpApplication
c76 -> c75 [arrowhead=open,style=dashed,weight=0,label="&#171;friend&#187;"];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// A ranksep=0.5;
c81 [label=<<table title="A" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // A
// C c81 [label=<<table title="A" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr></table>>];
c83 [label=<<table title="C" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> C </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // C
// A DEPEND C c83 [label=<<table title="C" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> C </td></tr></table></td></tr></table>>];
c81:p -> c83:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // A depend C
c81 -> c83 [arrowhead=open,style=dashed,weight=0];
} }

File diff suppressed because one or more lines are too long

View File

@ -5,43 +5,44 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Root ranksep=0.5;
c90 [label=<<table title="Root" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Root </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Root
// Adapter c90 [label=<<table title="Root" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Root </td></tr></table></td></tr></table>>];
c91 [label=<<table title="Adapter" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Adapter </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Adapter
// Element c91 [label=<<table title="Adapter" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Adapter </td></tr></table></td></tr></table>>];
c92 [label=<<table title="Element" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> Element </font></td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Element
// ObjectType c92 [label=<<table title="Element" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> Element </i></td></tr></table></td></tr></table>>];
c93 [label=<<table title="ObjectType" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ObjectType </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ObjectType
// ObjectMap c93 [label=<<table title="ObjectType" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ObjectType </td></tr></table></td></tr></table>>];
c94 [label=<<table title="ObjectMap" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ObjectMap </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ObjectMap
// Table c94 [label=<<table title="ObjectMap" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ObjectMap </td></tr></table></td></tr></table>>];
c95 [label=<<table title="Table" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Table </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Table
// DataOperation c95 [label=<<table title="Table" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Table </td></tr></table></td></tr></table>>];
c96 [label=<<table title="DataOperation" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> DataOperation </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // DataOperation
// Root ASSOC Adapter c96 [label=<<table title="DataOperation" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> DataOperation </td></tr></table></td></tr></table>>];
c90:p -> c91:p [taillabel="1..1", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Root assoc Adapter
// Root ASSOC ObjectType c90 -> c91 [arrowhead=none,weight=2,taillabel="1..1", headlabel="0..n"];
c90:p -> c93:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Root assoc ObjectType
// Root ASSOC ObjectMap c90 -> c93 [arrowhead=none,weight=2,headlabel="0..n"];
c90:p -> c94:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Root assoc ObjectMap
// Root ASSOC Table c90 -> c94 [arrowhead=none,weight=2,headlabel="0..n"];
c90:p -> c95:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Root assoc Table
// Root ASSOC DataOperation c90 -> c95 [arrowhead=none,weight=2,headlabel="0..n"];
c90:p -> c96:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Root assoc DataOperation
//ObjectType extends Element c90 -> c96 [arrowhead=none,weight=2,headlabel="0..n"];
c92:p -> c93:p [dir=back,arrowtail=empty]; // ObjectType extends Element
//ObjectMap extends Element c92 -> c93 [arrowtail=empty,dir=back,weight=10];
c92:p -> c94:p [dir=back,arrowtail=empty]; // ObjectMap extends Element
// ObjectMap HAS ObjectType c92 -> c94 [arrowtail=empty,dir=back,weight=10];
c94:p -> c93:p [taillabel="1..1", label="", headlabel="1..1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both]; // ObjectMap has ObjectType
//Table extends Element c94 -> c93 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..1", headlabel="1..1"];
c92:p -> c95:p [dir=back,arrowtail=empty]; // Table extends Element
//DataOperation extends Element c92 -> c95 [arrowtail=empty,dir=back,weight=10];
c92:p -> c96:p [dir=back,arrowtail=empty]; // DataOperation extends Element
c92 -> c96 [arrowtail=empty,dir=back,weight=10];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// test.RunnableRef ranksep=0.5;
c98 [label=<<table title="test.RunnableRef" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> RunnableRef </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // test.RunnableRef
// test.RunnableRef DEPEND java.lang.Runnable c98 [label=<<table title="test.RunnableRef" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> RunnableRef </td></tr></table></td></tr></table>>];
c98:p -> c99:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // test.RunnableRef depend java.lang.Runnable
// java.lang.Runnable c98 -> c99 [arrowhead=open,style=dashed,weight=0];
c99 [label=<<table title="java.lang.Runnable" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Runnable </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // java.lang.Runnable
c99 [label=<<table title="java.lang.Runnable" border="0" cellborder="1" cellspacing="0" cellpadding="2" href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Runnable </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html"];
} }

View File

@ -5,23 +5,24 @@
# #
digraph G { digraph G {
edge [fontname="arial",fontsize=10,labelfontname="arial",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="arial",fontsize=10,shape=plaintext]; edge [fontname="arial",fontsize=10,labelfontname="arial",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="arial",fontcolor="black",fontsize=9,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// net.sf.whatever.test.AbstractBase ranksep=0.5;
c112 [label=<<table title="net.sf.whatever.test.AbstractBase" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;base&#187; </td></tr><tr><td align="center" balign="center"><font face="arial"> AbstractBase </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr><tr><td align="right" balign="right"><font face="arial" point-size="6.0"> {since = 1.0} </font></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> field : int </td></tr><tr><td align="right" balign="right"><font face="arial" point-size="6.0"> {since = 1.5} </font></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="9.0"> abstractMethod() </font></td></tr><tr><td align="left" balign="left"> concreteMethod() : int </td></tr></table></td></tr></table>>, URL="null", fontname="arial", fontcolor="black", fontsize=9.0]; // net.sf.whatever.test.AbstractBase
// net.sf.whatever.test.Composite c112 [label=<<table title="net.sf.whatever.test.AbstractBase" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;base&#187; </td></tr><tr><td align="center" balign="center"><font face="arial"> AbstractBase </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr><tr><td align="right" balign="right"><font face="arial" point-size="6.0"> {since = 1.0} </font></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> field : int </td></tr><tr><td align="right" balign="right"><font face="arial" point-size="6.0"> {since = 1.5} </font></td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><i> abstractMethod() </i></td></tr><tr><td align="left" balign="left"> concreteMethod() : int </td></tr></table></td></tr></table>>];
c113 [label=<<table title="net.sf.whatever.test.Composite" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> Composite </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr></table></td></tr></table>>, URL="null", fontname="arial", fontcolor="black", fontsize=9.0]; // net.sf.whatever.test.Composite
// net.sf.whatever.test.Style c113 [label=<<table title="net.sf.whatever.test.Composite" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> Composite </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr></table></td></tr></table>>];
c114 [label=<<table title="net.sf.whatever.test.Style" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> Style </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr></table></td></tr></table>>, URL="null", fontname="arial", fontcolor="black", fontsize=9.0]; // net.sf.whatever.test.Style
//net.sf.whatever.test.Composite extends net.sf.whatever.test.AbstractBase c114 [label=<<table title="net.sf.whatever.test.Style" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> Style </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> net.sf.whatever.test </font></td></tr></table></td></tr></table>>];
c112:p -> c113:p [dir=back,arrowtail=empty]; // net.sf.whatever.test.Composite extends net.sf.whatever.test.AbstractBase
// net.sf.whatever.test.Composite COMPOSED from.Outer.Space.AlienClass c112 -> c113 [arrowtail=empty,dir=back,weight=10];
c113:p -> c115:p [taillabel="1", label="has", headlabel="*", fontname="arial", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // net.sf.whatever.test.Composite composed from.Outer.Space.AlienClass
//net.sf.whatever.test.Style extends net.sf.whatever.test.AbstractBase c113 -> c115 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1",label="has",headlabel="*"];
c112:p -> c114:p [dir=back,arrowtail=empty]; // net.sf.whatever.test.Style extends net.sf.whatever.test.AbstractBase
// from.Outer.Space.AlienClass c112 -> c114 [arrowtail=empty,dir=back,weight=10];
c115[label=<<table title="from.Outer.Space.AlienClass" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/from/Outer/Space/AlienClass.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> AlienClass </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> from.Outer.Space </font></td></tr></table></td></tr></table>>, fontname="arial", fontcolor="black", fontsize=9.0]; // from.Outer.Space.AlienClass
c115[label=<<table title="from.Outer.Space.AlienClass" border="0" cellborder="1" cellspacing="0" cellpadding="2" href="http://docs.oracle.com/javase/7/docs/api/from/Outer.Space.AlienClass.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="arial"> AlienClass </font></td></tr><tr><td align="center" balign="center"><font point-size="8.0"> from.Outer.Space </font></td></tr></table></td></tr></table>>];
} }

View File

@ -5,11 +5,12 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// test.TestHideOp ranksep=0.5;
c117 [label=<<table title="test.TestHideOp" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> TestHideOp </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // test.TestHideOp
c117 [label=<<table title="test.TestHideOp" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> TestHideOp </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
} }

View File

@ -5,27 +5,28 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.invoice.InvoiceItem ranksep=0.5;
c355 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.invoice.Invoice c355 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>];
c356 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Invoice
// gr.spinellis.basic.invoice.Customer c356 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>];
c357 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.product.Product c357 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>];
c358 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c358 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>];
c359 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product c359 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>];
c355:p -> c358:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
// gr.spinellis.basic.invoice.Invoice ASSOC gr.spinellis.basic.invoice.Customer c355 -> c358 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c356:p -> c357:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem c356 -> c357 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c356:p -> c355:p [taillabel="1", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c356 -> c355 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
c358:p -> c359:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c358 -> c359 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,27 +5,28 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.invoice.InvoiceItem ranksep=0.5;
c317 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> product : Product </td></tr><tr><td align="left" balign="left"> quantity : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.invoice.Invoice c317 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> product : Product </td></tr><tr><td align="left" balign="left"> quantity : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c318 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> total : double </td></tr><tr><td align="left" balign="left"> items : InvoiceItem[] </td></tr><tr><td align="left" balign="left"> customer : Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addItem(p : Product, quantity : int) </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Invoice
// gr.spinellis.basic.invoice.Customer c318 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> total : double </td></tr><tr><td align="left" balign="left"> items : InvoiceItem[] </td></tr><tr><td align="left" balign="left"> customer : Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addItem(p : Product, quantity : int) </td></tr></table></td></tr></table>>];
c319 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.product.Product c319 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c320 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr><tr><td align="left" balign="left"> stock : int </td></tr><tr><td align="left" balign="left"> price : double </td></tr><tr><td align="left" balign="left"> category : Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c320 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr><tr><td align="left" balign="left"> stock : int </td></tr><tr><td align="left" balign="left"> price : double </td></tr><tr><td align="left" balign="left"> category : Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c321 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr><tr><td align="left" balign="left"> products : List&lt;&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product c321 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : String </td></tr><tr><td align="left" balign="left"> products : List&lt;&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c317:p -> c320:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
// gr.spinellis.basic.invoice.Invoice ASSOC gr.spinellis.basic.invoice.Customer c317 -> c320 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c318:p -> c319:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem c318 -> c319 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c318:p -> c317:p [taillabel="1", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c318 -> c317 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
c320:p -> c321:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c320 -> c321 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,27 +5,28 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.invoice.InvoiceItem ranksep=0.5;
c279 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> product </td></tr><tr><td align="left" balign="left"> quantity </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=16.0]; // gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.invoice.Invoice c279 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> product </td></tr><tr><td align="left" balign="left"> quantity </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=16.0];
c280 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> total </td></tr><tr><td align="left" balign="left"> items </td></tr><tr><td align="left" balign="left"> customer </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=16.0]; // gr.spinellis.basic.invoice.Invoice
// gr.spinellis.basic.invoice.Customer c280 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> total </td></tr><tr><td align="left" balign="left"> items </td></tr><tr><td align="left" balign="left"> customer </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=16.0];
c281 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=16.0]; // gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.product.Product c281 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=16.0];
c282 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=16.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c282 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=16.0];
c283 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> products </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=16.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product c283 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> products </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=16.0];
c279:p -> c282:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
// gr.spinellis.basic.invoice.Invoice ASSOC gr.spinellis.basic.invoice.Customer c279 -> c282 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c280:p -> c281:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem c280 -> c281 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c280:p -> c279:p [taillabel="1", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c280 -> c279 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
c282:p -> c283:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c282 -> c283 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.product.Product ranksep=0.5;
c244 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c244 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>];
c245 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c245 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>];
c244:p -> c245:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c244 -> c245 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.product.Product ranksep=0.5;
c206 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c206 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="LemonChiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>];
c207 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="brown"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c207 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="brown"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>];
c206:p -> c207:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c206 -> c207 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,31 +5,32 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.invoice.InvoiceItem ranksep=0.5;
c164 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.invoice.Invoice c164 [label=<<table title="gr.spinellis.basic.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>];
c165 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Invoice
// gr.spinellis.basic.invoice.Customer c165 [label=<<table title="gr.spinellis.basic.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>];
c166 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.product.Product c166 [label=<<table title="gr.spinellis.basic.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>];
c167 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c167 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>];
c168 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product c168 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="yellow"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>];
c164:p -> c167:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
// gr.spinellis.basic.invoice.Invoice ASSOC gr.spinellis.basic.invoice.Customer c164 -> c167 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c165:p -> c166:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem c165 -> c166 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c165:p -> c164:p [taillabel="1", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c165 -> c164 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
c167:p -> c168:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
// gr.spinellis.basic.product.Category DEPEND java.util.List<E> c167 -> c168 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
c168:p -> c202:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // gr.spinellis.basic.product.Category depend java.util.List<E>
// java.util.List<E> c168 -> c202 [arrowhead=open,style=dashed,weight=0];
c202 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="gray" href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> List&lt;E&gt; </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/List.html", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // java.util.List<E>
c202 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="gray" href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> List&lt;E&gt; </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/List.html"];
} }

View File

@ -5,39 +5,40 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.context.classes.AClient ranksep=0.5;
c424 [label=<<table title="gr.spinellis.context.classes.AClient" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> AClient </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.AClient
// gr.spinellis.context.classes.ASubclass c424 [label=<<table title="gr.spinellis.context.classes.AClient" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> AClient </td></tr></table></td></tr></table>>];
c426 [label=<<table title="gr.spinellis.context.classes.ASubclass" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ASubclass </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.ASubclass
// gr.spinellis.context.classes.E c426 [label=<<table title="gr.spinellis.context.classes.ASubclass" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ASubclass </td></tr></table></td></tr></table>>];
c427 [label=<<table title="gr.spinellis.context.classes.E" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> E </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.E
// gr.spinellis.context.classes.D c427 [label=<<table title="gr.spinellis.context.classes.E" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> E </td></tr></table></td></tr></table>>];
c429 [label=<<table title="gr.spinellis.context.classes.D" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> D </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.D
// gr.spinellis.context.classes.B c429 [label=<<table title="gr.spinellis.context.classes.D" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> D </td></tr></table></td></tr></table>>];
c432 [label=<<table title="gr.spinellis.context.classes.B" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> B </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.B
// gr.spinellis.context.classes.ABaseClass c432 [label=<<table title="gr.spinellis.context.classes.B" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> B </td></tr></table></td></tr></table>>];
c433 [label=<<table title="gr.spinellis.context.classes.ABaseClass" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ABaseClass </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.ABaseClass
// gr.spinellis.context.classes.A c433 [label=<<table title="gr.spinellis.context.classes.ABaseClass" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ABaseClass </td></tr></table></td></tr></table>>];
c434 [label=<<table title="gr.spinellis.context.classes.A" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.context.classes.A
//gr.spinellis.context.classes.ASubclass extends gr.spinellis.context.classes.A c434 [label=<<table title="gr.spinellis.context.classes.A" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> A </td></tr></table></td></tr></table>>];
c434:p -> c426:p [dir=back,arrowtail=empty]; // gr.spinellis.context.classes.ASubclass extends gr.spinellis.context.classes.A
//gr.spinellis.context.classes.A extends gr.spinellis.context.classes.ABaseClass c434 -> c426 [arrowtail=empty,dir=back,weight=10];
c433:p -> c434:p [dir=back,arrowtail=empty]; // gr.spinellis.context.classes.A extends gr.spinellis.context.classes.ABaseClass
// gr.spinellis.context.classes.D NAVASSOC gr.spinellis.context.classes.A c433 -> c434 [arrowtail=empty,dir=back,weight=10];
c429:p -> c434:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // gr.spinellis.context.classes.D navassoc gr.spinellis.context.classes.A
// gr.spinellis.context.classes.A NAVASSOC gr.spinellis.context.classes.B c429 -> c434 [arrowhead=open,weight=1];
c434:p -> c432:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // gr.spinellis.context.classes.A navassoc gr.spinellis.context.classes.B
// gr.spinellis.context.classes.A NAVASSOC javax.swing.JComponent c434 -> c432 [arrowhead=open,weight=1];
c434:p -> c509:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // gr.spinellis.context.classes.A navassoc javax.swing.JComponent
// gr.spinellis.context.classes.AClient DEPEND gr.spinellis.context.classes.A c434 -> c509 [arrowhead=open,weight=1];
c424:p -> c434:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // gr.spinellis.context.classes.AClient depend gr.spinellis.context.classes.A
// gr.spinellis.context.classes.A DEPEND gr.spinellis.context.classes.E c424 -> c434 [arrowhead=open,style=dashed,weight=0];
c434:p -> c427:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // gr.spinellis.context.classes.A depend gr.spinellis.context.classes.E
// javax.swing.JComponent c434 -> c427 [arrowhead=open,style=dashed,weight=0];
c509 [label=<<table title="javax.swing.JComponent" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> JComponent </font></td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // javax.swing.JComponent
c509 [label=<<table title="javax.swing.JComponent" border="0" cellborder="1" cellspacing="0" cellpadding="2" href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> JComponent </i></td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html"];
} }

View File

@ -5,27 +5,28 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.iface.classes.FarImplementor ranksep=0.5;
c534 [label=<<table title="gr.spinellis.iface.classes.FarImplementor" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> FarImplementor </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.iface.classes.FarImplementor
// gr.spinellis.iface.classes.DirectImplementor c534 [label=<<table title="gr.spinellis.iface.classes.FarImplementor" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> FarImplementor </td></tr></table></td></tr></table>>];
c535 [label=<<table title="gr.spinellis.iface.classes.DirectImplementor" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> DirectImplementor </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.iface.classes.DirectImplementor
// gr.spinellis.iface.classes.SubSubFace c535 [label=<<table title="gr.spinellis.iface.classes.DirectImplementor" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> DirectImplementor </td></tr></table></td></tr></table>>];
c537 [label=<<table title="gr.spinellis.iface.classes.SubSubFace" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> SubSubFace </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.iface.classes.SubSubFace
// gr.spinellis.iface.classes.SubFace c537 [label=<<table title="gr.spinellis.iface.classes.SubSubFace" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> SubSubFace </td></tr></table></td></tr></table>>];
c538 [label=<<table title="gr.spinellis.iface.classes.SubFace" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> SubFace </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.iface.classes.SubFace
// gr.spinellis.iface.classes.Face c538 [label=<<table title="gr.spinellis.iface.classes.SubFace" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> SubFace </td></tr></table></td></tr></table>>];
c539 [label=<<table title="gr.spinellis.iface.classes.Face" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Face </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.iface.classes.Face
//gr.spinellis.iface.classes.FarImplementor implements gr.spinellis.iface.classes.SubSubFace c539 [label=<<table title="gr.spinellis.iface.classes.Face" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Face </td></tr></table></td></tr></table>>];
c537:p -> c534:p [dir=back,arrowtail=empty,style=dashed]; // gr.spinellis.iface.classes.FarImplementor implements gr.spinellis.iface.classes.SubSubFace
//gr.spinellis.iface.classes.DirectImplementor implements gr.spinellis.iface.classes.Face c537 -> c534 [arrowtail=empty,style=dashed,dir=back,weight=9];
c539:p -> c535:p [dir=back,arrowtail=empty,style=dashed]; // gr.spinellis.iface.classes.DirectImplementor implements gr.spinellis.iface.classes.Face
//gr.spinellis.iface.classes.SubSubFace implements gr.spinellis.iface.classes.SubFace c539 -> c535 [arrowtail=empty,style=dashed,dir=back,weight=9];
c538:p -> c537:p [dir=back,arrowtail=empty,style=dashed]; // gr.spinellis.iface.classes.SubSubFace implements gr.spinellis.iface.classes.SubFace
//gr.spinellis.iface.classes.SubFace implements gr.spinellis.iface.classes.Face c538 -> c537 [arrowtail=empty,style=dashed,dir=back,weight=9];
c539:p -> c538:p [dir=back,arrowtail=empty,style=dashed]; // gr.spinellis.iface.classes.SubFace implements gr.spinellis.iface.classes.Face
c539 -> c538 [arrowtail=empty,style=dashed,dir=back,weight=9];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.basic.product.Product ranksep=0.5;
c129 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Product
// gr.spinellis.basic.product.Category c129 [label=<<table title="gr.spinellis.basic.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> stock </td></tr><tr><td align="left" balign="left"> price </td></tr><tr><td align="left" balign="left"> category </td></tr></table></td></tr></table>>];
c130 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> products </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.basic.product.Category
// gr.spinellis.basic.product.Product ASSOC gr.spinellis.basic.product.Category c130 [label=<<table title="gr.spinellis.basic.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name </td></tr><tr><td align="left" balign="left"> products </td></tr></table></td></tr></table>>];
c129:p -> c130:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c129 -> c130 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
} }

View File

@ -5,27 +5,28 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// gr.spinellis.subclass.classes.SubOneTwo ranksep=0.5;
c580 [label=<<table title="gr.spinellis.subclass.classes.SubOneTwo" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOneTwo </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.subclass.classes.SubOneTwo
// gr.spinellis.subclass.classes.SubOneOne c580 [label=<<table title="gr.spinellis.subclass.classes.SubOneTwo" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOneTwo </td></tr></table></td></tr></table>>];
c581 [label=<<table title="gr.spinellis.subclass.classes.SubOneOne" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOneOne </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.subclass.classes.SubOneOne
// gr.spinellis.subclass.classes.SubTwo c581 [label=<<table title="gr.spinellis.subclass.classes.SubOneOne" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOneOne </td></tr></table></td></tr></table>>];
c582 [label=<<table title="gr.spinellis.subclass.classes.SubTwo" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubTwo </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.subclass.classes.SubTwo
// gr.spinellis.subclass.classes.SubOne c582 [label=<<table title="gr.spinellis.subclass.classes.SubTwo" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubTwo </td></tr></table></td></tr></table>>];
c583 [label=<<table title="gr.spinellis.subclass.classes.SubOne" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOne </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.subclass.classes.SubOne
// gr.spinellis.subclass.classes.Super c583 [label=<<table title="gr.spinellis.subclass.classes.SubOne" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SubOne </td></tr></table></td></tr></table>>];
c584 [label=<<table title="gr.spinellis.subclass.classes.Super" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Super </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // gr.spinellis.subclass.classes.Super
//gr.spinellis.subclass.classes.SubOneTwo extends gr.spinellis.subclass.classes.SubOne c584 [label=<<table title="gr.spinellis.subclass.classes.Super" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="lemonchiffon"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Super </td></tr></table></td></tr></table>>];
c583:p -> c580:p [dir=back,arrowtail=empty]; // gr.spinellis.subclass.classes.SubOneTwo extends gr.spinellis.subclass.classes.SubOne
//gr.spinellis.subclass.classes.SubOneOne extends gr.spinellis.subclass.classes.SubOne c583 -> c580 [arrowtail=empty,dir=back,weight=10];
c583:p -> c581:p [dir=back,arrowtail=empty]; // gr.spinellis.subclass.classes.SubOneOne extends gr.spinellis.subclass.classes.SubOne
//gr.spinellis.subclass.classes.SubTwo extends gr.spinellis.subclass.classes.Super c583 -> c581 [arrowtail=empty,dir=back,weight=10];
c584:p -> c582:p [dir=back,arrowtail=empty]; // gr.spinellis.subclass.classes.SubTwo extends gr.spinellis.subclass.classes.Super
//gr.spinellis.subclass.classes.SubOne extends gr.spinellis.subclass.classes.Super c584 -> c582 [arrowtail=empty,dir=back,weight=10];
c584:p -> c583:p [dir=back,arrowtail=empty]; // gr.spinellis.subclass.classes.SubOne extends gr.spinellis.subclass.classes.Super
c584 -> c583 [arrowtail=empty,dir=back,weight=10];
} }

16
testdata/dot-ref/active.dot vendored Normal file
View File

@ -0,0 +1,16 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_2-54-gbca0ce (http://www.spinellis.gr/umlgraph/)
#
digraph G {
graph [fontnames="svg"]
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
nodesep=0.25;
ranksep=0.5;
// Active
c32 [label=<<table title="Active" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td rowspan="10"></td><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Active </td></tr></table></td><td rowspan="10"></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> run() </td></tr></table></td></tr></table>>];
}

View File

@ -5,31 +5,32 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Controller ranksep=0.5;
c5 [label=<<table title="Controller" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Controller </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Controller
// EmbeddedAgent c5 [label=<<table title="Controller" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Controller </td></tr></table></td></tr></table>>];
c6 [label=<<table title="EmbeddedAgent" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> EmbeddedAgent </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // EmbeddedAgent
// PowerManager c6 [label=<<table title="EmbeddedAgent" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> EmbeddedAgent </td></tr></table></td></tr></table>>];
c7 [label=<<table title="PowerManager" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> PowerManager </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // PowerManager
// SetTopController c7 [label=<<table title="PowerManager" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> PowerManager </td></tr></table></td></tr></table>>];
c8 [label=<<table title="SetTopController" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SetTopController </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> authorizationLevel </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> startUp() </td></tr><tr><td align="left" balign="left"> shutDown() </td></tr><tr><td align="left" balign="left"> connect() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // SetTopController
// ChannelIterator c8 [label=<<table title="SetTopController" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SetTopController </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> authorizationLevel </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> startUp() </td></tr><tr><td align="left" balign="left"> shutDown() </td></tr><tr><td align="left" balign="left"> connect() </td></tr></table></td></tr></table>>];
c9 [label=<<table title="ChannelIterator" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ChannelIterator </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ChannelIterator
// URLStreamHandler c9 [label=<<table title="ChannelIterator" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ChannelIterator </td></tr></table></td></tr></table>>];
c10 [label=<<table title="URLStreamHandler" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> URLStreamHandler </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> OpenConnection() </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> parseURL() </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> setURL() </font></td></tr><tr><td align="left" balign="left"><font face="Helvetica-Oblique" point-size="10.0"> toExternalForm() </font></td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // URLStreamHandler
//SetTopController extends Controller c10 [label=<<table title="URLStreamHandler" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> URLStreamHandler </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"><i> OpenConnection() </i></td></tr><tr><td align="left" balign="left"><i> parseURL() </i></td></tr><tr><td align="left" balign="left"><i> setURL() </i></td></tr><tr><td align="left" balign="left"><i> toExternalForm() </i></td></tr></table></td></tr></table>>];
c5:p -> c8:p [dir=back,arrowtail=empty]; // SetTopController extends Controller
//SetTopController extends EmbeddedAgent c5 -> c8 [arrowtail=empty,dir=back,weight=10];
c6:p -> c8:p [dir=back,arrowtail=empty]; // SetTopController extends EmbeddedAgent
//SetTopController implements URLStreamHandler c6 -> c8 [arrowtail=empty,dir=back,weight=10];
c10:p -> c8:p [dir=back,arrowtail=empty,style=dashed]; // SetTopController implements URLStreamHandler
// SetTopController NAVASSOC PowerManager c10 -> c8 [arrowtail=empty,style=dashed,dir=back,weight=9];
c8:p -> c7:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // SetTopController navassoc PowerManager
// ChannelIterator DEPEND SetTopController c8 -> c7 [arrowhead=open,weight=1];
c9:p -> c8:p [taillabel="", label="&#171;friend&#187;", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed]; // ChannelIterator depend SetTopController
c9 -> c8 [arrowhead=open,style=dashed,weight=0,label="&#171;friend&#187;"];
} }

View File

@ -5,20 +5,21 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
rankdir=LR; ranksep=0.5;
// UserGroup rankdir=LR;
c12 [label=<<table title="UserGroup" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UserGroup </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // UserGroup
// User c12 [label=<<table title="UserGroup" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UserGroup </td></tr></table></td></tr></table>>];
c13 [label=<<table title="User" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> User </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // User
// Password c13 [label=<<table title="User" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> User </td></tr></table></td></tr></table>>];
c14 [label=<<table title="Password" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Password </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Password
// UserGroup ASSOC User c14 [label=<<table title="Password" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Password </td></tr></table></td></tr></table>>];
c12:p -> c13:p [taillabel="*", label="", headlabel="*\n\n+user ", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // UserGroup assoc User
// User NAVASSOC Password c12 -> c13 [arrowhead=none,weight=2,taillabel="*", headlabel="*\n\n+user "];
c13:p -> c14:p [taillabel="1\n\n+owner\r", label="", headlabel="*\n\n+key", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // User navassoc Password
c13 -> c14 [arrowhead=open,weight=1,taillabel="1\n\n+owner\r", headlabel="*\n\n+key"];
} }

View File

@ -5,23 +5,24 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Tyre ranksep=0.5;
c15 [label=<<table title="Tyre" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Tyre </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Tyre
// Engine c15 [label=<<table title="Tyre" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Tyre </td></tr></table></td></tr></table>>];
c16 [label=<<table title="Engine" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Engine </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Engine
// Body c16 [label=<<table title="Engine" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Engine </td></tr></table></td></tr></table>>];
c17 [label=<<table title="Body" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Body </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Body
// Car c17 [label=<<table title="Body" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Body </td></tr></table></td></tr></table>>];
c18 [label=<<table title="Car" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Car </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Car
// Car COMPOSED Tyre c18 [label=<<table title="Car" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Car </td></tr></table></td></tr></table>>];
c18:p -> c15:p [taillabel="1", label="", headlabel="4", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // Car composed Tyre
// Car COMPOSED Engine c18 -> c15 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="4"];
c18:p -> c16:p [taillabel="1", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // Car composed Engine
// Car COMPOSED Body c18 -> c16 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="1"];
c18:p -> c17:p [taillabel="1", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // Car composed Body
c18 -> c17 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="1"];
} }

View File

@ -5,53 +5,54 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// HttpResponseBase ranksep=0.5;
c19 [label=<<table title="HttpResponseBase" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> HttpResponseBase </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // HttpResponseBase
// HttpResponseWrapper c19 [label=<<table title="HttpResponseBase" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> HttpResponseBase </td></tr></table></td></tr></table>>];
c20 [label=<<table title="HttpResponseWrapper" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> HttpResponseWrapper </font></td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // HttpResponseWrapper
// HttpResponseFacade c20 [label=<<table title="HttpResponseWrapper" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> HttpResponseWrapper </i></td></tr></table></td></tr></table>>];
c21 [label=<<table title="HttpResponseFacade" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> HttpResponseFacade </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // HttpResponseFacade
// ResponseWrapper c21 [label=<<table title="HttpResponseFacade" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> HttpResponseFacade </td></tr></table></td></tr></table>>];
c22 [label=<<table title="ResponseWrapper" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> ResponseWrapper </font></td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ResponseWrapper
// HttpResponse c22 [label=<<table title="ResponseWrapper" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> ResponseWrapper </i></td></tr></table></td></tr></table>>];
c23 [label=<<table title="HttpResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> HttpResponse </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // HttpResponse
// ResponseBase c23 [label=<<table title="HttpResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> HttpResponse </td></tr></table></td></tr></table>>];
c24 [label=<<table title="ResponseBase" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><font face="Helvetica-Oblique"> ResponseBase </font></td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ResponseBase
// HttpServletResponse c24 [label=<<table title="ResponseBase" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"><i> ResponseBase </i></td></tr></table></td></tr></table>>];
c25 [label=<<table title="HttpServletResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> HttpServletResponse </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // HttpServletResponse
// ResponseFacade c25 [label=<<table title="HttpServletResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> HttpServletResponse </td></tr></table></td></tr></table>>];
c26 [label=<<table title="ResponseFacade" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ResponseFacade </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ResponseFacade
// ServletResponse c26 [label=<<table title="ResponseFacade" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> ResponseFacade </td></tr></table></td></tr></table>>];
c27 [label=<<table title="ServletResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> ServletResponse </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ServletResponse
// Response c27 [label=<<table title="ServletResponse" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> ServletResponse </td></tr></table></td></tr></table>>];
c28 [label=<<table title="Response" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Response </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Response
//HttpResponseBase extends ResponseBase c28 [label=<<table title="Response" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;interface&#187; </td></tr><tr><td align="center" balign="center"> Response </td></tr></table></td></tr></table>>];
c24:p -> c19:p [dir=back,arrowtail=empty]; // HttpResponseBase extends ResponseBase
//HttpResponseBase implements HttpResponse c24 -> c19 [arrowtail=empty,dir=back,weight=10];
c23:p -> c19:p [dir=back,arrowtail=empty,style=dashed]; // HttpResponseBase implements HttpResponse
//HttpResponseBase implements HttpServletResponse c23 -> c19 [arrowtail=empty,style=dashed,dir=back,weight=9];
c25:p -> c19:p [dir=back,arrowtail=empty,style=dashed]; // HttpResponseBase implements HttpServletResponse
//HttpResponseWrapper extends ResponseWrapper c25 -> c19 [arrowtail=empty,style=dashed,dir=back,weight=9];
c22:p -> c20:p [dir=back,arrowtail=empty]; // HttpResponseWrapper extends ResponseWrapper
//HttpResponseWrapper implements HttpResponse c22 -> c20 [arrowtail=empty,dir=back,weight=10];
c23:p -> c20:p [dir=back,arrowtail=empty,style=dashed]; // HttpResponseWrapper implements HttpResponse
//HttpResponseFacade extends ResponseFacade c23 -> c20 [arrowtail=empty,style=dashed,dir=back,weight=9];
c26:p -> c21:p [dir=back,arrowtail=empty]; // HttpResponseFacade extends ResponseFacade
//HttpResponseFacade implements HttpServletResponse c26 -> c21 [arrowtail=empty,dir=back,weight=10];
c25:p -> c21:p [dir=back,arrowtail=empty,style=dashed]; // HttpResponseFacade implements HttpServletResponse
//ResponseWrapper implements Response c25 -> c21 [arrowtail=empty,style=dashed,dir=back,weight=9];
c28:p -> c22:p [dir=back,arrowtail=empty,style=dashed]; // ResponseWrapper implements Response
//HttpResponse implements Response c28 -> c22 [arrowtail=empty,style=dashed,dir=back,weight=9];
c28:p -> c23:p [dir=back,arrowtail=empty,style=dashed]; // HttpResponse implements Response
//ResponseBase implements Response c28 -> c23 [arrowtail=empty,style=dashed,dir=back,weight=9];
c28:p -> c24:p [dir=back,arrowtail=empty,style=dashed]; // ResponseBase implements Response
//ResponseBase implements ServletResponse c28 -> c24 [arrowtail=empty,style=dashed,dir=back,weight=9];
c27:p -> c24:p [dir=back,arrowtail=empty,style=dashed]; // ResponseBase implements ServletResponse
//ResponseFacade implements ServletResponse c27 -> c24 [arrowtail=empty,style=dashed,dir=back,weight=9];
c27:p -> c26:p [dir=back,arrowtail=empty,style=dashed]; // ResponseFacade implements ServletResponse
c27 -> c26 [arrowtail=empty,style=dashed,dir=back,weight=9];
} }

View File

@ -5,19 +5,20 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Person ranksep=0.5;
c30 [label=<<table title="Person" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Person
// Employee c30 [label=<<table title="Person" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person </td></tr></table></td></tr></table>>];
c31 [label=<<table title="Employee" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Employee </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Employee
// Client c31 [label=<<table title="Employee" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Employee </td></tr></table></td></tr></table>>];
c32 [label=<<table title="Client" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Client </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Client
//Employee extends Person c32 [label=<<table title="Client" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor=".13 .9 1"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Client </td></tr></table></td></tr></table>>];
c30:p -> c31:p [dir=back,arrowtail=empty]; // Employee extends Person
//Client extends Person c30 -> c31 [arrowtail=empty,dir=back,weight=10];
c30:p -> c32:p [dir=back,arrowtail=empty]; // Client extends Person
c30 -> c32 [arrowtail=empty,dir=back,weight=10];
} }

View File

@ -5,11 +5,12 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// ActionQueue ranksep=0.5;
c35 [label=<<table title="ActionQueue" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;container&#187; </td></tr><tr><td align="center" balign="center"> ActionQueue </td></tr><tr><td align="right" balign="right"> {version = 3.2} </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> add(a : Action) </td></tr><tr><td align="left" balign="left"> add(a : Action, n : int) </td></tr><tr><td align="right" balign="right"> {version = 1.0} </td></tr><tr><td align="left" balign="left"> remove(n : int) </td></tr><tr><td align="left" balign="left"> &#171;query&#187; </td></tr><tr><td align="left" balign="left"> length() : int </td></tr><tr><td align="left" balign="left"> &#171;helper functions&#187; </td></tr><tr><td align="left" balign="left"> reorder() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // ActionQueue
c35 [label=<<table title="ActionQueue" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;container&#187; </td></tr><tr><td align="center" balign="center"> ActionQueue </td></tr><tr><td align="right" balign="right"> {version = 3.2} </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> add(a : Action) </td></tr><tr><td align="left" balign="left"> add(a : Action, n : int) </td></tr><tr><td align="right" balign="right"> {version = 1.0} </td></tr><tr><td align="left" balign="left"> remove(n : int) </td></tr><tr><td align="left" balign="left"> &#171;query&#187; </td></tr><tr><td align="left" balign="left"> length() : int </td></tr><tr><td align="left" balign="left"> &#171;helper functions&#187; </td></tr><tr><td align="left" balign="left"> reorder() </td></tr></table></td></tr></table>>];
} }

View File

@ -5,25 +5,26 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Serif",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="yellow"];
nodesep=0.25; node [fontname="Serif",fontcolor="black",fontsize=14,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
bgcolor=".7 .9 1"; ranksep=0.5;
bgcolor=".7 .9 1";
// Pixel
c37 [label=<<table title="Pixel" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="#a0a0a0"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Pixel </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> - x : int </td></tr><tr><td align="left" balign="left"> - y : int </td></tr></table></td></tr></table>>, URL="null", fontname="arial", fontcolor="white", fontsize=14.0]; // Pixel
// Red c37 [label=<<table title="Pixel" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="#a0a0a0"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Pixel </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> - x : int </td></tr><tr><td align="left" balign="left"> - y : int </td></tr></table></td></tr></table>>];
c38 [label=<<table title="Red" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="red"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Red </td></tr></table></td></tr></table>>, URL="null", fontname="Serif", fontcolor="black", fontsize=14.0]; // Red
// Green c38 [label=<<table title="Red" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="red"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Red </td></tr></table></td></tr></table>>];
c39 [label=<<table title="Green" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="green"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Green </td></tr></table></td></tr></table>>, URL="null", fontname="Serif", fontcolor="black", fontsize=14.0]; // Green
// Blue c39 [label=<<table title="Green" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="green"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Green </td></tr></table></td></tr></table>>];
c40 [label=<<table title="Blue" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="blue"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Blue </td></tr></table></td></tr></table>>, URL="null", fontname="Serif", fontcolor="black", fontsize=14.0]; // Blue
// Pixel COMPOSED Red c40 [label=<<table title="Blue" border="0" cellborder="1" cellspacing="0" cellpadding="2" bgcolor="blue"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Blue </td></tr></table></td></tr></table>>];
c37:p -> c38:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both]; // Pixel composed Red
// Pixel COMPOSED Green c37 -> c38 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
c37:p -> c39:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both]; // Pixel composed Green
// Pixel COMPOSED Blue c37 -> c39 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
c37:p -> c40:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both]; // Pixel composed Blue
c37 -> c40 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
} }

View File

@ -5,11 +5,12 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Junk ranksep=0.5;
c43 [label=<<table title="Junk" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Junk </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> - value : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + Junk(val : int) </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Junk
c43 [label=<<table title="Junk" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Junk </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> - value : int </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + Junk(val : int) </td></tr></table></td></tr></table>>];
} }

View File

@ -5,15 +5,16 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Person1 ranksep=0.5;
c45 [label=<<table title="Person1" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person1 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ address : String </td></tr><tr><td align="left" balign="left"> ~ name : String </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Person1
// Person2 c45 [label=<<table title="Person1" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person1 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ address : String </td></tr><tr><td align="left" balign="left"> ~ name : String </td></tr></table></td></tr></table>>];
c46 [label=<<table title="Person2" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person2 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ displayName() : String </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Person2
// Person3 c46 [label=<<table title="Person2" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person2 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ displayName() : String </td></tr></table></td></tr></table>>];
c47 [label=<<table title="Person3" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person3 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> address : Address </td></tr><tr><td align="left" balign="left"> name : String </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> displayName() : String </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Person3
c47 [label=<<table title="Person3" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Person3 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> address : Address </td></tr><tr><td align="left" balign="left"> name : String </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> displayName() : String </td></tr></table></td></tr></table>>];
} }

View File

@ -5,13 +5,14 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Base ranksep=0.5;
c48 [label=<<table title="Base" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Base </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Base
// Test2<B extends a.b.Base> c48 [label=<<table title="Base" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Base </td></tr></table></td></tr></table>>];
c49 [label=<<table title="Test2" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Test2&lt;B extends Base&gt; </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Test2<B extends a.b.Base>
c49 [label=<<table title="Test2" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Test2&lt;B extends Base&gt; </td></tr></table></td></tr></table>>];
} }

View File

@ -5,21 +5,22 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// a.b.c.UMLOptions ranksep=0.5;
c50 [label=<<table title="a.b.c.UMLOptions" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UMLOptions </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // a.b.c.UMLOptions
// a.b.c.UserGroup c50 [label=<<table title="a.b.c.UMLOptions" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UMLOptions </td></tr></table></td></tr></table>>];
c51 [label=<<table title="a.b.c.UserGroup" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UserGroup </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // a.b.c.UserGroup
// a.b.c.User c51 [label=<<table title="a.b.c.UserGroup" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> UserGroup </td></tr></table></td></tr></table>>];
c52 [label=<<table title="a.b.c.User" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> User </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // a.b.c.User
// a.b.c.Password c52 [label=<<table title="a.b.c.User" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> User </td></tr></table></td></tr></table>>];
c53 [label=<<table title="a.b.c.Password" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Password </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // a.b.c.Password
// a.b.c.UserGroup ASSOC a.b.c.User c53 [label=<<table title="a.b.c.Password" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Password </td></tr></table></td></tr></table>>];
c51:p -> c52:p [taillabel="*", label="", headlabel="*\n\n+user ", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // a.b.c.UserGroup assoc a.b.c.User
// a.b.c.User NAVASSOC a.b.c.Password c51 -> c52 [arrowhead=none,weight=2,taillabel="*", headlabel="*\n\n+user "];
c52:p -> c53:p [taillabel="1\n\n+owner\r", label="", headlabel="*\n\n+key", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open]; // a.b.c.User navassoc a.b.c.Password
c52 -> c53 [arrowhead=open,weight=1,taillabel="1\n\n+owner\r", headlabel="*\n\n+key"];
} }

View File

@ -5,49 +5,50 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Asset ranksep=0.5;
c55 [label=<<table title="Asset" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Asset </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Asset
// InterestBearingItem c55 [label=<<table title="Asset" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Asset </td></tr></table></td></tr></table>>];
c56 [label=<<table title="InterestBearingItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InterestBearingItem </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // InterestBearingItem
// InsurableItem c56 [label=<<table title="InterestBearingItem" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InterestBearingItem </td></tr></table></td></tr></table>>];
c57 [label=<<table title="InsurableItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InsurableItem </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // InsurableItem
// BankAccount c57 [label=<<table title="InsurableItem" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InsurableItem </td></tr></table></td></tr></table>>];
c58 [label=<<table title="BankAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> BankAccount </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // BankAccount
// RealEstate c58 [label=<<table title="BankAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> BankAccount </td></tr></table></td></tr></table>>];
c59 [label=<<table title="RealEstate" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> RealEstate </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // RealEstate
// Security c59 [label=<<table title="RealEstate" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> RealEstate </td></tr></table></td></tr></table>>];
c60 [label=<<table title="Security" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Security </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Security
// Stock c60 [label=<<table title="Security" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Security </td></tr></table></td></tr></table>>];
c61 [label=<<table title="Stock" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Stock </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Stock
// Bond c61 [label=<<table title="Stock" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Stock </td></tr></table></td></tr></table>>];
c62 [label=<<table title="Bond" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Bond </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Bond
// CheckingAccount c62 [label=<<table title="Bond" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Bond </td></tr></table></td></tr></table>>];
c63 [label=<<table title="CheckingAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> CheckingAccount </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // CheckingAccount
// SavingsAccount c63 [label=<<table title="CheckingAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> CheckingAccount </td></tr></table></td></tr></table>>];
c64 [label=<<table title="SavingsAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SavingsAccount </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // SavingsAccount
//BankAccount extends Asset c64 [label=<<table title="SavingsAccount" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> SavingsAccount </td></tr></table></td></tr></table>>];
c55:p -> c58:p [dir=back,arrowtail=empty]; // BankAccount extends Asset
//BankAccount extends InsurableItem c55 -> c58 [arrowtail=empty,dir=back,weight=10];
c57:p -> c58:p [dir=back,arrowtail=empty]; // BankAccount extends InsurableItem
//BankAccount extends InterestBearingItem c57 -> c58 [arrowtail=empty,dir=back,weight=10];
c56:p -> c58:p [dir=back,arrowtail=empty]; // BankAccount extends InterestBearingItem
//RealEstate extends Asset c56 -> c58 [arrowtail=empty,dir=back,weight=10];
c55:p -> c59:p [dir=back,arrowtail=empty]; // RealEstate extends Asset
//RealEstate extends InsurableItem c55 -> c59 [arrowtail=empty,dir=back,weight=10];
c57:p -> c59:p [dir=back,arrowtail=empty]; // RealEstate extends InsurableItem
//Security extends Asset c57 -> c59 [arrowtail=empty,dir=back,weight=10];
c55:p -> c60:p [dir=back,arrowtail=empty]; // Security extends Asset
//Stock extends Security c55 -> c60 [arrowtail=empty,dir=back,weight=10];
c60:p -> c61:p [dir=back,arrowtail=empty]; // Stock extends Security
//Bond extends Security c60 -> c61 [arrowtail=empty,dir=back,weight=10];
c60:p -> c62:p [dir=back,arrowtail=empty]; // Bond extends Security
//CheckingAccount extends BankAccount c60 -> c62 [arrowtail=empty,dir=back,weight=10];
c58:p -> c63:p [dir=back,arrowtail=empty]; // CheckingAccount extends BankAccount
//SavingsAccount extends BankAccount c58 -> c63 [arrowtail=empty,dir=back,weight=10];
c58:p -> c64:p [dir=back,arrowtail=empty]; // SavingsAccount extends BankAccount
c58 -> c64 [arrowtail=empty,dir=back,weight=10];
} }

View File

@ -5,13 +5,14 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Java5 ranksep=0.5;
c78 [label=<<table title="Java5" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Java5 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ state : Java5.States </td></tr><tr><td align="left" balign="left"> - specifiedPackages : Set&lt;String&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + printAll(args : String[]) </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Java5
// Java5.States c78 [label=<<table title="Java5" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Java5 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ state : Java5.States </td></tr><tr><td align="left" balign="left"> - specifiedPackages : Set&lt;String&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + printAll(args : String[]) </td></tr></table></td></tr></table>>];
c79 [label=<<table title="Java5.States" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;enumeration&#187; </td></tr><tr><td align="center" balign="center"> States </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> start </td></tr><tr><td align="left" balign="left"> dash </td></tr><tr><td align="left" balign="left"> colon </td></tr><tr><td align="left" balign="left"> space </td></tr><tr><td align="left" balign="left"> open </td></tr><tr><td align="left" balign="left"> w </td></tr><tr><td align="left" balign="left"> close </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Java5.States
c79 [label=<<table title="Java5.States" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;enumeration&#187; </td></tr><tr><td align="center" balign="center"> States </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> start </td></tr><tr><td align="left" balign="left"> dash </td></tr><tr><td align="left" balign="left"> colon </td></tr><tr><td align="left" balign="left"> space </td></tr><tr><td align="left" balign="left"> open </td></tr><tr><td align="left" balign="left"> w </td></tr><tr><td align="left" balign="left"> close </td></tr></table></td></tr></table>>];
} }

View File

@ -5,33 +5,34 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// School ranksep=0.5;
c103 [label=<<table title="School" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> School </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> address : String </td></tr><tr><td align="left" balign="left"> phone : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addStudent() </td></tr><tr><td align="left" balign="left"> removeStudent() </td></tr><tr><td align="left" balign="left"> getStudent() </td></tr><tr><td align="left" balign="left"> getAllStudents() </td></tr><tr><td align="left" balign="left"> addDepartment() </td></tr><tr><td align="left" balign="left"> removeDepartment() </td></tr><tr><td align="left" balign="left"> getDepartment() </td></tr><tr><td align="left" balign="left"> getAllDepartments() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // School
// Department c103 [label=<<table title="School" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> School </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> address : String </td></tr><tr><td align="left" balign="left"> phone : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addStudent() </td></tr><tr><td align="left" balign="left"> removeStudent() </td></tr><tr><td align="left" balign="left"> getStudent() </td></tr><tr><td align="left" balign="left"> getAllStudents() </td></tr><tr><td align="left" balign="left"> addDepartment() </td></tr><tr><td align="left" balign="left"> removeDepartment() </td></tr><tr><td align="left" balign="left"> getDepartment() </td></tr><tr><td align="left" balign="left"> getAllDepartments() </td></tr></table></td></tr></table>>];
c104 [label=<<table title="Department" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Department </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addInstructor() </td></tr><tr><td align="left" balign="left"> removeInstructor() </td></tr><tr><td align="left" balign="left"> getInstructor() </td></tr><tr><td align="left" balign="left"> getAllInstructors() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Department
// Student c104 [label=<<table title="Department" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Department </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> addInstructor() </td></tr><tr><td align="left" balign="left"> removeInstructor() </td></tr><tr><td align="left" balign="left"> getInstructor() </td></tr><tr><td align="left" balign="left"> getAllInstructors() </td></tr></table></td></tr></table>>];
c105 [label=<<table title="Student" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Student </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> studentID : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Student
// Course c105 [label=<<table title="Student" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Student </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> studentID : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c106 [label=<<table title="Course" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Course </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> courseID : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Course
// Instructor c106 [label=<<table title="Course" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Course </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr><tr><td align="left" balign="left"> courseID : Number </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c107 [label=<<table title="Instructor" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Instructor </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Instructor
// School HAS Student c107 [label=<<table title="Instructor" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Instructor </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> name : Name </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr></table>>];
c103:p -> c105:p [taillabel="1..*", label="Member", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both]; // School has Student
// School COMPOSED Department c103 -> c105 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..*", label="Member", headlabel="*"];
c103:p -> c104:p [taillabel="1..*", label="Has", headlabel="1..*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both]; // School composed Department
// Department ASSOC Course c103 -> c104 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1..*", label="Has", headlabel="1..*"];
c104:p -> c106:p [taillabel="1..*", label="", headlabel="1..*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Department assoc Course
// Department ASSOC Instructor c104 -> c106 [arrowhead=none,weight=2,taillabel="1..*", headlabel="1..*"];
c104:p -> c107:p [taillabel="0..*", label="", headlabel="0..1 chairperson", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Department assoc Instructor
// Department HAS Instructor c104 -> c107 [arrowhead=none,weight=2,taillabel="0..*", headlabel="0..1 chairperson"];
c104:p -> c107:p [taillabel="1..*", label="AssignedTo", headlabel="1..*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both]; // Department has Instructor
// Student ASSOC Course c104 -> c107 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..*", label="AssignedTo", headlabel="1..*"];
c105:p -> c106:p [taillabel="*", label="Attends", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Student assoc Course
// Instructor ASSOC Course c105 -> c106 [arrowhead=none,weight=2,taillabel="*", label="Attends", headlabel="*"];
c107:p -> c106:p [taillabel="1..*", label="Teaches", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none]; // Instructor assoc Course
c107 -> c106 [arrowhead=none,weight=2,taillabel="1..*", label="Teaches", headlabel="*"];
} }

View File

@ -5,13 +5,14 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Java5 ranksep=0.5;
c109 [label=<<table title="Java5" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Java5 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ state : Java5.States </td></tr><tr><td align="left" balign="left"> + specifiedPackages : Set&lt;String&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + printAll(args : String[]) </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Java5
// Java5.States c109 [label=<<table title="Java5" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Java5 </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> ~ state : Java5.States </td></tr><tr><td align="left" balign="left"> + specifiedPackages : Set&lt;String&gt; </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + printAll(args : String[]) </td></tr></table></td></tr></table>>];
c110 [label=<<table title="Java5.States" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;enumeration&#187; </td></tr><tr><td align="center" balign="center"> States </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> start </td></tr><tr><td align="left" balign="left"> dash </td></tr><tr><td align="left" balign="left"> colon </td></tr><tr><td align="left" balign="left"> space </td></tr><tr><td align="left" balign="left"> open </td></tr><tr><td align="left" balign="left"> w </td></tr><tr><td align="left" balign="left"> close </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Java5.States
c110 [label=<<table title="Java5.States" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> &#171;enumeration&#187; </td></tr><tr><td align="center" balign="center"> States </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> start </td></tr><tr><td align="left" balign="left"> dash </td></tr><tr><td align="left" balign="left"> colon </td></tr><tr><td align="left" balign="left"> space </td></tr><tr><td align="left" balign="left"> open </td></tr><tr><td align="left" balign="left"> w </td></tr><tr><td align="left" balign="left"> close </td></tr></table></td></tr></table>>];
} }

View File

@ -5,11 +5,12 @@
# #
digraph G { digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; graph [fontnames="svg"]
node [fontname="Helvetica",fontsize=10,shape=plaintext]; edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="black"];
nodesep=0.25; node [fontname="Helvetica",fontcolor="black",fontsize=10,shape=plaintext,margin=0,width=0,height=0];
ranksep=0.5; nodesep=0.25;
// Toolbar ranksep=0.5;
c120 [label=<<table title="Toolbar" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Toolbar </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> # currentSelection : Tool </td></tr><tr><td align="left" balign="left"> # toolCount : Integer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + pickItem(i : Integer) </td></tr><tr><td align="left" balign="left"> + addTool(t : Tool) </td></tr><tr><td align="left" balign="left"> + removeTool(i : Integer) </td></tr><tr><td align="left" balign="left"> + getTool() : Tool </td></tr><tr><td align="left" balign="left"> # checkOrphans() </td></tr><tr><td align="left" balign="left"> - compact() </td></tr></table></td></tr></table>>, URL="null", fontname="Helvetica", fontcolor="black", fontsize=10.0]; // Toolbar
c120 [label=<<table title="Toolbar" border="0" cellborder="1" cellspacing="0" cellpadding="2"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Toolbar </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> # currentSelection : Tool </td></tr><tr><td align="left" balign="left"> # toolCount : Integer </td></tr></table></td></tr><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="left" balign="left"> + pickItem(i : Integer) </td></tr><tr><td align="left" balign="left"> + addTool(t : Tool) </td></tr><tr><td align="left" balign="left"> + removeTool(i : Integer) </td></tr><tr><td align="left" balign="left"> + getTool() : Tool </td></tr><tr><td align="left" balign="left"> # checkOrphans() </td></tr><tr><td align="left" balign="left"> - compact() </td></tr></table></td></tr></table>>];
} }

13
testdata/java/active.java vendored Normal file
View File

@ -0,0 +1,13 @@
/**
* Active classes
*
* @opt operations
* @opt shape activeclass
* @hidden
*/
class UMLOptions {}
class Active {
protected int hidden;
public void run() {};
}

View File

@ -1,3 +1,2 @@
class Base {} class Base {}
class Test2<B extends a.b.Base> {} class Test2<B extends Base> {}