UmlGraphDoc now supports Javascript-collapsible UML diagrams.

(Franz Wilhelmstoetter)
This commit is contained in:
Diomidis Spinellis 2008-08-27 10:07:48 +00:00
parent 5da653bbf8
commit 39a280a00f
8 changed files with 77 additions and 18 deletions

3
TODO
View File

@ -1,5 +1,8 @@
$Id$
Add in UmlGraphDoc support for showing package dependencies.
See http://java.dzone.com/articles/reverse-engineer-source-code-u#comment-6124
Add link to MoinMoin sequence to deriv.xml
Yves Bossel: If I may do some suggestions:

View File

@ -101,3 +101,12 @@
Institution="OMG Inc.",
Address="Needham, MA"
}
@Misc{Mir08,
Title="Reverse-engineer Source Code into UML Diagrams",
Month=aug,
Year=2008,
URL="http://java.dzone.com/articles/reverse-engineer-source-code-u",
Note="Available online \url{http://java.dzone.com/articles/reverse-engineer-source-code-u}",
Author="Meera Subbarao"
}

View File

@ -124,6 +124,10 @@ a view definition. Only the class diagram specified by this view will be generat
</dd>
<dt>-views</dt><dd>Generate a class diagram for every view found in the source path.
</dd>
<dt>-collapsible</dt><dd>Enhance the javadoc HTML files containing UML diagrams
with Javascript that provides a link for showing the (initially collapsed)
diagrams.
</dd>
<dt>-inferrel</dt><dd>Try to automatically infer relationships between classes by inspecting
field values. See the class diagram inference chapter for further details. Disabled by default.
</dd>

View File

@ -6,6 +6,14 @@
<dt>Version 5.1 Under development </dt><dd>
<ul>
<li> Active classes now appear with a double vertical border, following UML2.</li>
<li> New class diagram options <code>-nodesep</code> and <code>-ranksep</code>,
which allow fine control of the generated diagram layout.
(patch submitted by Trustin Lee).
</li>
<li> A class's title will appear as a tooltip in image files that support this
feature
(patch submitted by Anthony Callegaro).
</li>
<li>
Nested class hyperlinks to Javadoc documentation now work correctly
(patch submitted by David P. Caldwell).

View File

@ -118,6 +118,7 @@ public class Options implements Cloneable, OptionProvider {
String guilClose = "&#187;"; // &raquo; \u00bb
boolean inferRelationships;
boolean inferDependencies;
boolean collapsibleDiagrams;
RelationPattern contextRelationPattern;
boolean useImports;
Visibility inferDependencyVisibility;
@ -175,6 +176,7 @@ public class Options implements Cloneable, OptionProvider {
contextRelationPattern = new RelationPattern(RelationDirection.BOTH);
inferRelationships = false;
inferDependencies = false;
collapsibleDiagrams = false;
inferDependencyVisibility = Visibility.PRIVATE;
inferDepInPackage = false;
useImports = false;
@ -466,6 +468,10 @@ public class Options implements Cloneable, OptionProvider {
}
} else if(opt[0].equals("-!inferdepvis")) {
inferDependencyVisibility = Visibility.PRIVATE;
} else if(opt[0].equals("-collapsible")) {
collapsibleDiagrams = true;
} else if(opt[0].equals("-!collapsible")) {
collapsibleDiagrams = false;
} else if(opt[0].equals("-inferdep")) {
inferDependencies = true;
} else if(opt[0].equals("-!inferdep")) {

View File

@ -93,7 +93,7 @@ public class UmlGraphDoc {
OptionProvider view = new PackageView(outputFolder, packageDoc, root, opt);
UmlGraph.buildGraph(root, view, packageDoc);
runGraphviz(outputFolder, packageDoc.name(), packageDoc.name(), root);
alterHtmlDocs(outputFolder, packageDoc.name(), packageDoc.name(),
alterHtmlDocs(opt, outputFolder, packageDoc.name(), packageDoc.name(),
"package-summary.html", Pattern.compile("</H2>"), root);
}
}
@ -112,7 +112,7 @@ public class UmlGraphDoc {
view.setContextCenter(classDoc);
UmlGraph.buildGraph(root, view, classDoc);
runGraphviz(outputFolder, classDoc.containingPackage().name(), classDoc.name(), root);
alterHtmlDocs(outputFolder, classDoc.containingPackage().name(), classDoc.name(),
alterHtmlDocs(opt, outputFolder, classDoc.containingPackage().name(), classDoc.name(),
classDoc.name() + ".html", Pattern.compile("(Class|Interface|Enum) " + classDoc.name() + ".*") , root);
}
}
@ -151,11 +151,35 @@ public class UmlGraphDoc {
}
}
//Format string for the uml image div tag.
private static final String UML_DIV_TAG =
"<div align=\"center\">" +
"<img src=\"%1$s.png\" alt=\"Package class diagram package %1$s\" usemap=\"#G\" border=0/>" +
"</div>";
//Format string for the java script tag.
private static final String EXPANDABLE_UML =
"<script type=\"text/javascript\">\n" +
"function show() {\n" +
" document.getElementById(\"uml\").innerHTML = \n" +
" \'<a style=\"font-family:monospace\" href=\"javascript:hide()\">%3$s</a>\' +\n" +
" \'%1$s\';\n" +
"}\n" +
"function hide() {\n" +
" document.getElementById(\"uml\").innerHTML = \n" +
" \'<a style=\"font-family:monospace\" href=\"javascript:show()\">%2$s</a>\' ;\n" +
"}\n" +
"</script>\n" +
"<div id=\"uml\" >\n" +
" <a href=\"javascript:show()\">\n" +
" <a style=\"font-family:monospace\" href=\"javascript:show()\">%2$s</a> \n" +
"</div>";
/**
* Takes an HTML file, looks for the first instance of the specified insertion point, and
* inserts the diagram image reference and a client side map in that point.
*/
private static void alterHtmlDocs(String outputFolder, String packageName, String className,
private static void alterHtmlDocs(Options opt, String outputFolder, String packageName, String className,
String htmlFileName, Pattern insertPointPattern, RootDoc root) throws IOException {
// setup files
File output = new File(outputFolder, packageName.replace(".", "/"));
@ -186,9 +210,11 @@ public class UmlGraphDoc {
insertClientSideMap(mapFile, writer);
else
root.printWarning("Could not find map file " + mapFile);
writer.write("<div align=\"center\"><img src=\"" + className
+ ".png\" alt=\"Package class diagram package " + className
+ "\" usemap=\"#G\" border=0/></a></div>");
String tag = String.format(UML_DIV_TAG, className);
if (opt.collapsibleDiagrams)
tag = String.format(EXPANDABLE_UML, tag, "Show UML class diagram", "Hide UML class diagram");
writer.write(tag);
writer.newLine();
}
}
@ -239,5 +265,4 @@ public class UmlGraphDoc {
}
return ".";
}
}

View File

@ -7,12 +7,14 @@
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// test.AbstractNode
c99 [label=<<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"><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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c99 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// test.InnerNode
c100 [label=<<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"> InnerNode </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c100 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// test.Leaf
c101 [label=<<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"> Leaf </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c101 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
//test.InnerNode extends test.AbstractNode
c99:p -> c100:p [dir=back,arrowtail=empty];
// test.InnerNode COMPOSED test.AbstractNode

View File

@ -7,18 +7,20 @@
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// A
c113 [label=<<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"> 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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c113 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// B
c114 [label=<<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"> 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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c114 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// C
c115 [label=<<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"> 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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c115 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// MyFunnyList<T, V>
c116 [label=<<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"> 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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c116 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// MyList
c117 [label=<<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"> MyList </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c117 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// D
c118 [label=<<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"> 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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c118 [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>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
//MyFunnyList<T, V> extends java.util.ArrayList<T>
c119:p -> c116:p [dir=back,arrowtail=empty];
//MyList extends MyFunnyList<A, B>
@ -44,8 +46,8 @@ digraph G {
// B DEPEND A
c114:p -> c113:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// java.util.ArrayList<E>
c119 [label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html"><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"> elementData : Object[] </td></tr><tr><td align="left" balign="left"> 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"> 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"> 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"> writeObject(arg0 : ObjectOutputStream) </td></tr><tr><td align="left" balign="left"> readObject(arg0 : ObjectInputStream) </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c119 [label=<<table title="java.util.ArrayList" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html"><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"> elementData : Object[] </td></tr><tr><td align="left" balign="left"> 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"> 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"> 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"> writeObject(arg0 : ObjectOutputStream) </td></tr><tr><td align="left" balign="left"> readObject(arg0 : ObjectInputStream) </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
// java.util.List<E>
c120 [label=<<table border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html"><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"> 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"> iterator() : Iterator&lt;E&gt; </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"> add(arg0 : E) : boolean </td></tr><tr><td align="left" balign="left"> remove(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> containsAll(arg0 : Collection&lt;?&gt;) : boolean </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"> 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"> clear() </td></tr><tr><td align="left" balign="left"> equals(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> hashCode() : int </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 : int, arg1 : E) </td></tr><tr><td align="left" balign="left"> remove(arg0 : int) : E </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"> listIterator() : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> listIterator(arg0 : int) : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
c120 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html"><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"> 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"> iterator() : Iterator&lt;E&gt; </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"> add(arg0 : E) : boolean </td></tr><tr><td align="left" balign="left"> remove(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> containsAll(arg0 : Collection&lt;?&gt;) : boolean </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"> 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"> clear() </td></tr><tr><td align="left" balign="left"> equals(arg0 : Object) : boolean </td></tr><tr><td align="left" balign="left"> hashCode() : int </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 : int, arg1 : E) </td></tr><tr><td align="left" balign="left"> remove(arg0 : int) : E </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"> listIterator() : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> listIterator(arg0 : int) : ListIterator&lt;E&gt; </td></tr><tr><td align="left" balign="left"> subList(arg0 : int, arg1 : int) : List&lt;E&gt; </td></tr></table></td></tr></table>>, fontname="Helvetica", fontcolor="black", fontsize=10.0];
}