Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Alkis Plaskovitis 2019-08-31 17:09:55 +03:00
commit 6ced3aaf1f
115 changed files with 2189 additions and 2811 deletions

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="JDK_LIB/tools.jar"/>
<classpathentry kind="output" path="build"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="src" path="src/test/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="JDK_LIB/tools.jar"/>
<classpathentry kind="output" path="build"/>
</classpath>

10
.travis.yml Normal file
View File

@ -0,0 +1,10 @@
language: java
addons:
apt:
packages:
- graphviz
install: ant
script: ant test

View File

@ -2,7 +2,7 @@ VERSION:=$(shell git describe --abbrev=6 HEAD | sed 's/R//;s/_/./;s/-/./;s/-.*$$
BALL_TAR_GZ=UMLGraph-$(VERSION).tar.gz
ZIPBALL=UMLGraph-$(VERSION).zip
DISTDIR=UMLGraph-$(VERSION)
WEBDIR=$(UH)/dds/pubs/web/home/sw/umlgraph-mirror
WEBDIR=$(UH)/dds/pubs/web/home/umlgraph
DOCLETSRCPATH=src/main/java/org/umlgraph/doclet
DOCLETSRC= \
$(DOCLETSRCPATH)/ClassGraph.java \
@ -65,7 +65,7 @@ test:
ant test
testupdate:
sh tools/testupdate.sh
bash tools/testupdate.sh
# Create only the static HTML pages
static-web:

69
README.md Normal file
View File

@ -0,0 +1,69 @@
# UMLGraph - Declarative Drawing of UML Diagrams
[![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 UML diagrams.
You can browse the system's documentation
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).
In order to run *UMLGraph*, you need to have [GraphViz](https://www.graphviz.org/)
installed in your system path. On most Linux distributions, this can be easily
installed using the regular package manager.
To compile the Java doclet from the source code run *ant* on the
*build.xml* file.
If you change the source code, you can run regression tests by
executing *ant test*.
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>

View File

@ -1,23 +0,0 @@
==UMLGraph - Declarative Drawing of UML Diagrams==
''UMLGraph'' allows the declarative specification and drawing of
UML diagrams.
You can browse the system's documentation
through [http://umlgraph.org/doc/index.html this link],
or print it through [http://umlgraph.org/doc/indexw.html this link].
To install the elements required to run ''UMLGraph'', simply copy
the contents of the ''lib'' directory to a location consistent with
your installation's conventions (for example to /usr/local/lib).
To compile the Java doclet from the source code run ''ant'' on the
''build.xml'' file.
If you change the source code, you can run regression tests by
executing ''ant test''.
Visit the project's [http://www.umlgraph.org home page] for more information.
----
Diomidis Spinellis - November 2005, August 2008, April 2012

View File

@ -1,21 +0,0 @@
UMLGraph - Declarative Drawing of UML Diagrams
UMLGraph allows the declarative specification and drawing of
UML class and sequence diagrams. You can browse the system's
documentation from the doc/index.html page, or print it from
doc/indexw.html.
To install the elements required to run UMLGraph, simply copy
the contents of the lib directory to a location consistent with
your installation's conventions (for example to /usr/local/lib).
To compile the Java doclet from the source code run ant on the
build.xml file.
If you change the source code, you can run regression tests by
executing "ant test".
Project home page: http://www.umlgraph.org
GitHub page: git@github.com:dspinellis/UMLGraph.git
Diomidis Spinellis - November 2005, August 2008, April 2012

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
Support for all UML diagrams: state, use-case, etc.

View File

@ -21,12 +21,12 @@
<macrodef name="gitversion" description="Get git version.">
<attribute name="outputproperty"/>
<sequential>
<echo message="git describe --abbrev=6 => '@{outputproperty}'"/>
<echo message="git rev-parse --short=6 => '@{outputproperty}'"/>
<exec executable="git"
failonerror="true"
outputproperty="@{outputproperty}">
<arg value="describe"/>
<arg value="--abbrev=6"/>
<arg value="rev-parse"/>
<arg value="--short=6"/>
<arg value="HEAD"/>
<redirector>
<outputfilterchain>
@ -64,6 +64,14 @@
<!-- import environment variables -->
<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">
<!-- Create the time stamp -->
<tstamp/>
@ -78,8 +86,8 @@
<target name="version">
<exec executable="git"
outputproperty="VERSION">
<arg value="describe"/>
<arg value="--abbrev=6"/>
<arg value="rev-parse"/>
<arg value="--short=6"/>
<arg value="HEAD"/>
</exec>
<echo>Version is ${VERSION}</echo>
@ -119,36 +127,44 @@ class Version { public static String VERSION = "${VERSION}";}
<target name="test" depends="compile,testcompile"
description="run the regression tests" >
<java classname="org.umlgraph.test.BasicTest" fork="true">
<classpath>
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${build}"/>
<pathelement location="${lib}/UmlGraph.jar"/>
</classpath>
</java>
<java classname="org.umlgraph.test.UmlDocTest" fork="true">
<classpath>
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${build}"/>
<pathelement location="${lib}/UmlGraph.jar"/>
</classpath>
</java>
<!-- postpone failures, so we get to see the pngs -->
<java classname="org.umlgraph.test.BasicTest" fork="true" resultproperty="BasicTest.exit">
<classpath>
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${build}"/>
<pathelement location="${lib}/UmlGraph.jar"/>
</classpath>
</java>
<java classname="org.umlgraph.test.UmlDocTest" fork="true" resultproperty="UmlDocTest.exit">
<classpath>
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
<pathelement location="${build}"/>
<pathelement location="${lib}/UmlGraph.jar"/>
</classpath>
</java>
<apply executable="dot" dest="${testout}" parallel="false">
<arg value="-Tpng"/>
<arg value="-o"/>
<targetfile/>
<srcfile/>
<fileset dir="${testout}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/>
<fileset dir="${testout}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/>
</apply>
<apply executable="dot" dest="${testref}" parallel="false">
<arg value="-Tpng"/>
<arg value="-o"/>
<targetfile/>
<srcfile/>
<fileset dir="${testref}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/>
<fileset dir="${testref}" includes="*.dot"/>
<mapper type="glob" from="*.dot" to="*.png"/>
</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 name="javadocs" depends="compile">
@ -156,6 +172,7 @@ class Version { public static String VERSION = "${VERSION}";}
<doclet name="org.umlgraph.doclet.UmlGraphDoc" path="${lib}/UmlGraph.jar">
<param name="-inferrel"/>
<param name="-inferdep"/>
<param name="-autosize"/>
<param name="-collapsible"/>
<param name="-hide" value="java.*"/>
<param name="-collpackages" value="java.util.*"/>

View File

@ -4,7 +4,7 @@
ROOT=/cygdrive/c
PIC2PLOT=pic2plot
GS=gs
DESTDIR=/dds/pubs/web/home/sw/umlgraph-mirror
DESTDIR=/dds/pubs/web/home/umlgraph
NOTETOOLS=/dds/pubs/Courses/tools
GIF := $(shell sed -n 's/.*<img *src *= *"\([^.]*\.gif\)".*/\1/p' *.xml)
XML := $(wildcard *.xml)

View File

@ -46,6 +46,7 @@ UMLGraph would not be in its current state without their contributions.
<li>Soraya Santana de la Fe</li>
<li>Jonathan R. Santos</li>
<li>Jan Schl&#252;ter</li>
<li>Erich Schubert</li>
<li>Sebastian Setzer</li>
<li>J&#246;rn Guy S&#252;&#223;</li>
<li>Andreas Studer</li>

View File

@ -110,3 +110,14 @@
Note="Available online \url{http://java.dzone.com/articles/reverse-engineer-source-code-u}",
Author="Meera Subbarao"
}
@CONFERENCE{SG16,
author={Seifermann, S. and Groenda, H.},
title={Survey on textual notations for the Unified Modeling Language},
journal={MODELSWARD 2016 - Proceedings of the 4th International Conference on Model-Driven Engineering and Software Development},
year={2016},
pages={28--39},
note={cited By 0},
url={https://www.cooperate-project.de/images/publications/MODELSWARD2016.pdf},
document_type={Conference Paper},
}

View File

@ -72,6 +72,14 @@ Example:
java -jar /usr/jvm/java-1.5.0/lib/UmlGraph.jar -private Simple.java
</fmtcode>
<p />
To generate a diagram of all classes in the package specify as arguments
to the Java invocation the name of the package and the directory where
it resides.
The following example generates a diagram of all UMLGraph classes.
<fmtcode ext="sh">
java -classpath ... org.umlgraph.doclet.UmlGraph -sourcepath src/main/java org.umlgraph.doclet
</fmtcode>
<p />
Specifying some packages before the list of source files will designate
those packages as <em>local</em>.
When you specify a package list,

View File

@ -1,9 +1,10 @@
<?xml version="1.0" ?>
<notes>
A number of options contol the operation of UMLGraph
A number of options control the operation of UMLGraph
class diagram generator.
These can be specified on the command line, and most can also
be specified through javadoc tags within the diagram, affecting all or some elements.
be specified through javadoc <code>@opt</code> tags within the diagram, affecting all or some elements.
Most have a negated version by prefixing an exclamation mark.
<p/>
<h2>What Gets Drawn</h2> <!-- {{{1 -->
<dl>
@ -27,8 +28,12 @@ be specified through javadoc tags within the diagram, affecting all or some elem
in this case it will hide everything (useful in the context of views
to selectively unhide some portions of the graph, see the view chapter for
further details). </dd>
<dt>-include</dt><dd>Match classes to include with a non-anchored match. This is weaker than
the <code>-hide</code> option, but can be used to include classes from foreign packages
in the package view (which would by default filter to only include package members).</dd>
<dt>-operations</dt><dd>Show class operations (Java methods) </dd>
<dt>-qualify</dt><dd>Produce fully-qualified class names. </dd>
<dt>-qualifyGenerics</dt><dd>Use fully-qualified class names in Java generics.</dd>
<dt>-types</dt><dd>Add type information to attributes and operations </dd>
<dt>-view</dt><dd>Specify the fully qualified name of a class that contains
a view definition. Only the class diagram specified by this view will be generated.
@ -39,6 +44,7 @@ be specified through javadoc tags within the diagram, affecting all or some elem
<h2>Visual Appearance</h2> <!-- {{{1 -->
<dl>
<dt>-bgcolor</dt><dd>Specify the graph's background color. </dd>
<dt>-autosize</dt><dd>Fits generated graph to the width of the page/window. Defaults to true. </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>-edgecolor</dt><dd>Specify the color for drawing edges. </dd>
<dt>-edgefontcolor</dt><dd>Specify the font color to use for edge labels. </dd>
@ -77,9 +83,9 @@ be specified through javadoc tags within the diagram, affecting all or some elem
<p />
All colors can be either a symbolic name (e.g. blue),
a tripple specifying hue-saturation-brightness as values 0-1
a triple specifying hue-saturation-brightness as values 0-1
(e.g. ".13 0.9 1"),
or a tripple specifying red-green-blue values as hexadecimal
or a triple specifying red-green-blue values as hexadecimal
digits prefixed by a # (e.g. "#ff8020").
The symbolic color names are derived from the X Windows System;
you can find a complete list in the
@ -182,10 +188,6 @@ When using <em>dot</em> to generate SVG diagrams you should specify
<code>UTF-8</code> as the output encoding, to have guillemots correctly
appearing in the resulting SVG.
</dd>
<dt>-verbose2</dt><dd>Will print on the standard output details regarding
the progress of graph generation.
(Note that -verbose is a javadoc option with a different meaning).
</dd>
</dl>
<!-- Footer {{{1 -->
</notes>

View File

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

View File

@ -1,11 +1,12 @@
<?xml version="1.0" ?>
<notes>
The following was generated by annotating the source code of the
<a href="http://www.sqo-oss.org">SQO-OSS</a> project.
The following was generated by annotating the
<a href="https://github.com/istlab/Alitheia-Core/tree/master/alitheia/core/src/main/java/eu/sqooss/service/db">source code</a> of the
<a href="https://github.com/istlab/Alitheia-Core/">Alitheia Core</a> project.
Georgios Gousios, who created it, wrote:
<blockquote>
<p>
I've used UMLgraph to generate an E-R diagram out of the DAOs we use in SQO-OSS. I've just annotated a few classes with @assoc tags, removed the super class DAObject from all entities with sed, did some tweaking by hand in the .dot output, et voila, an E-R depicting almost 30 classes in less than 30 minutes!
I've used UMLgraph to generate an E-R diagram out of the DAOs we use in Alitheia Core. I've just annotated a few classes with @assoc tags, removed the super class DAObject from all entities with sed, did some tweaking by hand in the .dot output, et voila, an E-R depicting almost 30 classes in less than 30 minutes!
</p>
</blockquote>
<p />

View File

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

View File

@ -61,7 +61,7 @@ class DataOperation extends Element {}
<fmtcode ext="mak">
# Author: Vadim Nasardinov (vadimn@redhat.com)
# Since: 2004-05-26
# See: http://www.spinellis.gr/sw/umlgraph/doc/ceg-mv.html
# See: http://www.spinellis.gr/umlgraph/doc/ceg-mv.html
# Requires: graphviz
# Requires: javadoc
@ -93,18 +93,18 @@ clean:
build/%.dot : %.java
mkdir -p $(dir $@)
$(jd) $(jd_flags) $(detailed_flags) -output $@ $<
$(jd) $(jd_flags) $(detailed_flags) -output $@ $&lt;
build/%-small.dot : %.java
mkdir -p $(dir $@)
$(jd) $(jd_flags) -output $@ $<
$(jd) $(jd_flags) -output $@ $&lt;
%.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
mkdir -p $(dir $@)
fig2dev -L png -S 4 $< $@
fig2dev -L png -S 4 $&lt; $@
dot: $(dot_files)
@ -112,7 +112,7 @@ png: $(png_files)
build/%.png : %.png
mkdir -p $(dir $@)
cp $< $@
cp $&lt; $@
# Example usage:
# make debug-java_files

View File

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

View File

@ -3,6 +3,21 @@
<dl>
<dt>Version 5.7 Under development </dt><dd>
<ul>
<li>The <code>@opt include</code> option can be used to include classes from
foreign packages in the package view (unless hidden with <code>@opt hide</code>).</li>
<li>You can now also use <code>@opt</code> in <code>package-info.java</code>.</li>
<li>Added <code>-qualifyGenerics</code> option to separately control the inclusion of
package names for the class (<code>-qualify</code>) and its generics. In particular
this works well with <code>-qualify -postfixpackage</code> (and <code>-!qualifyGenerics</code>).<br />
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>
<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>
</dd>
<dt>Version 5.6 2012-05-31 </dt><dd>

View File

@ -10,7 +10,7 @@
<name>UMLGraph</name>
<version>${version}</version>
<description>Declarative Drawing of UML Diagrams</description>
<url>http://www.umlgraph.org</url>
<url>http://www.spinellis.gr/umlgraph</url>
<licenses>
<license>

View File

@ -8,7 +8,7 @@
<name>UMLGraph</name>
<version>5.7.3-SNAPSHOT</version>
<description>Declarative Drawing of UML Diagrams</description>
<url>http://www.umlgraph.org</url>
<url>http://www.spinellis.gr/umlgraph</url>
<licenses>
<license>
@ -128,6 +128,7 @@
<docletPath>${project.build.directory}${file.separator}${project.build.finalName}.jar</docletPath>
<additionalparam>-inferrel</additionalparam>
<additionalparam>-inferdep</additionalparam>
<additionalparam>-autosize</additionalparam>
<additionalparam>-collapsible</additionalparam>
<additionalparam>-hide java.*</additionalparam>
<additionalparam>-collpackages</additionalparam>

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -67,9 +67,9 @@ public class ContextMatcher implements ClassMatcher {
this.root = root;
this.keepParentHide = keepParentHide;
opt = (Options) options.clone();
opt.setOption(new String[] { "-!hide" });
opt.setOption(new String[] { "-!attributes" });
opt.setOption(new String[] { "-!operations" });
opt.setOption(new String[] { "!hide" });
opt.setOption(new String[] { "!attributes" });
opt.setOption(new String[] { "!operations" });
this.cg = new ClassGraphHack(root, opt);
setContextCenter(pattern);
@ -97,26 +97,23 @@ public class ContextMatcher implements ClassMatcher {
/**
* 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
* @param cd
*/
private void addToGraph(ClassDoc cd) {
// avoid adding twice the same class, but don't rely on cg.getClassInfo
// since there
// are other ways to add a classInfor than printing the class
// since there are other ways to add a classInfor than printing the class
if (visited.contains(cd.toString()))
return;
visited.add(cd.toString());
cg.printClass(cd, false);
cg.printRelations(cd);
if (opt.inferRelationships) {
if (opt.inferRelationships)
cg.printInferredRelations(cd);
}
if (opt.inferDependencies) {
if (opt.inferDependencies)
cg.printInferredDependencies(cd);
}
}
/**
@ -144,10 +141,8 @@ public class ContextMatcher implements ClassMatcher {
return true;
for (ClassDoc mcd : matched) {
String mcName = mcd.toString();
ClassInfo ciMatched = cg.getClassInfo(mcName);
RelationPattern rp = ciMatched.getRelation(name);
if (ciMatched != null && rp != null && opt.contextRelationPattern.matchesOne(rp))
RelationPattern rp = cg.getClassInfo(mcd, true).getRelation(name);
if (rp != null && opt.contextRelationPattern.matchesOne(rp))
return true;
}
return false;
@ -168,6 +163,7 @@ public class ContextMatcher implements ClassMatcher {
prologue();
}
@Override
public void prologue() throws IOException {
w = new PrintWriter(new DevNullWriter());
}
@ -180,14 +176,17 @@ public class ContextMatcher implements ClassMatcher {
*/
private static class DevNullWriter extends Writer {
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
// nothing to do
}
@Override
public void flush() throws IOException {
// nothing to do
}
@Override
public void close() throws IOException {
// nothing to do
}

View File

@ -26,7 +26,7 @@ public class ContextView implements OptionProvider {
private Options hideOptions;
private Options centerOptions;
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)
throws IOException {
@ -42,7 +42,7 @@ public class ContextView implements OptionProvider {
this.packageOptions.showQualified = false;
this.myGlobalOptions = parent.getGlobalOptions();
this.myGlobalOptions.setOption(new String[] { "-output", outputPath });
this.myGlobalOptions.setOption(new String[] { "output", outputPath });
this.myGlobalOptions.setOption(HIDE_OPTIONS);
this.hideOptions = parent.getGlobalOptions();
@ -52,7 +52,7 @@ public class ContextView implements OptionProvider {
this.centerOptions.nodeFillColor = "lemonChiffon";
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);
}
@ -61,8 +61,8 @@ public class ContextView implements OptionProvider {
this.cd = contextCenter;
String outputPath = cd.containingPackage().name().replace('.', '/') + "/" + cd.name()
+ ".dot";
this.myGlobalOptions.setOption(new String[] { "-output", outputPath });
matcher.setContextCenter(Pattern.compile(cd.toString()));
this.myGlobalOptions.setOption(new String[] { "output", outputPath });
matcher.setContextCenter(Pattern.compile(Pattern.quote(cd.toString())));
}
public String getDisplayName() {
@ -74,8 +74,9 @@ public class ContextView implements OptionProvider {
}
public Options getOptionsFor(ClassDoc cd) {
Options opt;
if (globalOptions.matchesHideExpression(cd.toString()) || !matcher.matches(cd)) {
Options opt;
if (globalOptions.matchesHideExpression(cd.qualifiedName())
|| !(matcher.matches(cd) || globalOptions.matchesIncludeExpression(cd.qualifiedName()))) {
opt = hideOptions;
} else if (cd.equals(this.cd)) {
opt = centerOptions;
@ -90,7 +91,7 @@ public class ContextView implements OptionProvider {
}
public Options getOptionsFor(String name) {
Options opt;
Options opt;
if (!matcher.matches(name))
opt = hideOptions;
else if (name.equals(cd.name()))
@ -103,15 +104,16 @@ public class ContextView implements OptionProvider {
}
public void overrideForClass(Options opt, ClassDoc cd) {
opt.setOptions(cd);
if (opt.matchesHideExpression(cd.toString()) || !matcher.matches(cd))
opt.setOptions(cd);
if (opt.matchesHideExpression(cd.qualifiedName())
|| !(matcher.matches(cd) || opt.matchesIncludeExpression(cd.qualifiedName())))
opt.setOption(HIDE_OPTIONS);
if (cd.equals(this.cd))
opt.nodeFillColor = "lemonChiffon";
}
public void overrideForClass(Options opt, String className) {
if (!matcher.matches(className))
if (!(matcher.matches(className) || opt.matchesIncludeExpression(className)))
opt.setOption(HIDE_OPTIONS);
}

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
// are treated the same in the doclet API
for (ClassDoc iface : cd.interfaces()) {
for (ClassDoc iface : cd.interfaces())
if(matches(iface))
return true;
}
// recurse on supeclass, if available
if(cd.superclass() != null)
return matches(cd.superclass());
return false;
return cd.superclass() == null ? false : matches(cd.superclass());
}
public boolean matches(String name) {
ClassDoc cd = root.classNamed(name);
if(cd == null)
return false;
return matches(cd);
return cd == null ? false : matches(cd);
}
}

View File

@ -29,15 +29,17 @@ import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.Doc;
import com.sun.javadoc.Tag;
/**
@ -46,66 +48,54 @@ import com.sun.javadoc.Tag;
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a>
*/
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
private static final Pattern allPattern = Pattern.compile(".*");
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
Vector<Pattern> hidePatterns;
boolean showQualified;
boolean showAttributes;
boolean showEnumerations;
boolean showEnumConstants;
boolean showOperations;
boolean showConstructors;
boolean showVisibility;
List<Pattern> hidePatterns = new ArrayList<Pattern>();
List<Pattern> includePatterns = new ArrayList<Pattern>();
boolean showQualified = false;
boolean showQualifiedGenerics = false;
boolean hideGenerics = false;
boolean showAttributes = false;
boolean showEnumerations = false;
boolean showEnumConstants = false;
boolean showOperations = false;
boolean showConstructors = false;
boolean showVisibility = false;
boolean horizontal;
boolean showType;
boolean showComment;
String edgeFontName;
String edgeFontColor;
String edgeColor;
double edgeFontSize;
String nodeFontName;
String nodeFontAbstractName;
String nodeFontColor;
double nodeFontSize;
String nodeFillColor;
double nodeFontClassSize;
String nodeFontClassName;
String nodeFontClassAbstractName;
double nodeFontTagSize;
String nodeFontTagName;
double nodeFontPackageSize;
String nodeFontPackageName;
Shape shape;
String bgColor;
public String outputFileName;
String outputEncoding;
Map<Pattern, String> apiDocMap;
String apiDocRoot;
boolean postfixPackage;
boolean useGuillemot;
boolean findViews;
String viewName;
double nodeSep;
double rankSep;
public String outputDirectory;
boolean showType = false;
boolean showComment = false;
boolean autoSize = true;
String edgeFontName = Font.DEFAULT_FONT;
String edgeFontColor = "black";
String edgeColor = "black";
double edgeFontSize = 10;
String nodeFontName = Font.DEFAULT_FONT;
boolean nodeFontAbstractItalic = true;
String nodeFontColor = "black";
double nodeFontSize = 10;
String nodeFillColor = null;
double nodeFontClassSize = -1;
String nodeFontClassName = null;
double nodeFontTagSize = -1;
String nodeFontTagName = null;
double nodeFontPackageSize = -1;
String nodeFontPackageName = null;
Shape shape = Shape.CLASS;
String bgColor = null;
public String outputFileName = "graph.dot";
String outputEncoding = "ISO-8859-1"; // TODO: default to UTF-8 now?
Map<Pattern, String> apiDocMap = new HashMap<Pattern, String>();
String apiDocRoot = null;
boolean postfixPackage = false;
boolean useGuillemot = true;
boolean findViews = false;
String viewName = null;
double nodeSep = 0.25;
double rankSep = 0.5;
public String outputDirectory = null;
/*
* Numeric values are preferable to symbolic here.
* Symbolic reportedly fail on MacOSX, and also are
@ -115,90 +105,42 @@ public class Options implements Cloneable, OptionProvider {
String guilOpen = "&#171;"; // &laquo; \u00ab
/** Guillemot right (close) */
String guilClose = "&#187;"; // &raquo; \u00bb
boolean inferRelationships;
boolean inferDependencies;
boolean collapsibleDiagrams;
RelationPattern contextRelationPattern;
boolean useImports;
Visibility inferDependencyVisibility;
boolean inferDepInPackage;
RelationType inferRelationshipType;
private Vector<Pattern> collPackages;
boolean compact;
boolean inferRelationships = false;
boolean inferDependencies = false;
boolean collapsibleDiagrams = false;
RelationPattern contextRelationPattern = new RelationPattern(RelationDirection.BOTH);
boolean useImports = false;
Visibility inferDependencyVisibility = Visibility.PRIVATE;
boolean inferDepInPackage = false;
RelationType inferRelationshipType = RelationType.NAVASSOC;
private List<Pattern> collPackages = new ArrayList<Pattern>();
boolean compact = false;
boolean hidePrivateInner = false;
// 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
// 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>
// would have been hidden by the hide pattern "java.*"
// TODO: consider making this standard behaviour
boolean strictMatching;
String dotExecutable;
boolean strictMatching = false;
String dotExecutable = "dot";
Options() {
showQualified = false;
showAttributes = false;
showEnumConstants = false;
showOperations = false;
showVisibility = false;
showEnumerations = false;
showConstructors = false;
showType = false;
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 Vector<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 Vector<Pattern>();
compact = false;
relativeLinksForSourcePackages = false;
nodeSep = 0.25;
rankSep = 0.5;
dotExecutable = "dot";
}
public Object clone() {
@Override
public Object clone() {
Options clone = null;
try {
clone = (Options) super.clone();
} catch (CloneNotSupportedException e) {
// Should not happen
throw new RuntimeException("Cannot clone?!?", e); // Should not happen
}
// deep clone the hide and collection patterns
clone.hidePatterns = new Vector<Pattern>(hidePatterns);
clone.collPackages= new Vector<Pattern>(collPackages);
clone.hidePatterns = new ArrayList<Pattern>(hidePatterns);
clone.includePatterns = new ArrayList<Pattern>(includePatterns);
clone.collPackages= new ArrayList<Pattern>(collPackages);
clone.apiDocMap = new HashMap<Pattern, String>(apiDocMap);
return clone;
}
@ -213,6 +155,34 @@ public class Options implements Cloneable, OptionProvider {
showVisibility = 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.
@ -220,63 +190,67 @@ public class Options implements Cloneable, OptionProvider {
* Will return 0 if the option is not supported.
*/
public static int optionLength(String option) {
if(option.equals("-qualify") ||
option.equals("-horizontal") ||
option.equals("-attributes") ||
option.equals("-operations") ||
option.equals("-constructors") ||
option.equals("-visibility") ||
option.equals("-types") ||
option.equals("-commentname") ||
option.equals("-all") ||
option.equals("-postfixpackage") ||
option.equals("-noguillemot") ||
option.equals("-enumconstants") ||
option.equals("-enumerations") ||
option.equals("-views") ||
option.equals("-inferrel") ||
option.equals("-useimports") ||
option.equals("-collapsible") ||
option.equals("-inferdep") ||
option.equals("-inferdepinpackage") ||
option.equals("-compact"))
if(matchOption(option, "qualify", true) ||
matchOption(option, "qualifyGenerics", true) ||
matchOption(option, "hideGenerics", true) ||
matchOption(option, "horizontal", true) ||
matchOption(option, "all") ||
matchOption(option, "attributes", true) ||
matchOption(option, "enumconstants", true) ||
matchOption(option, "operations", true) ||
matchOption(option, "enumerations", true) ||
matchOption(option, "constructors", true) ||
matchOption(option, "visibility", true) ||
matchOption(option, "types", true) ||
matchOption(option, "autosize", true) ||
matchOption(option, "commentname", true) ||
matchOption(option, "nodefontabstractitalic", true) ||
matchOption(option, "postfixpackage", true) ||
matchOption(option, "noguillemot", true) ||
matchOption(option, "views", true) ||
matchOption(option, "inferrel", true) ||
matchOption(option, "useimports", true) ||
matchOption(option, "collapsible", true) ||
matchOption(option, "inferdep", true) ||
matchOption(option, "inferdepinpackage", true) ||
matchOption(option, "hideprivateinner", true) ||
matchOption(option, "compact", true))
return 1;
else if(option.equals("-nodefillcolor") ||
option.equals("-nodefontcolor") ||
option.equals("-nodefontsize") ||
option.equals("-nodefontname") ||
option.equals("-nodefontabstractname") ||
option.equals("-nodefontclasssize") ||
option.equals("-nodefontclassname") ||
option.equals("-nodefontclassabstractname") ||
option.equals("-nodefonttagsize") ||
option.equals("-nodefonttagname") ||
option.equals("-nodefontpackagesize") ||
option.equals("-nodefontpackagename") ||
option.equals("-edgefontcolor") ||
option.equals("-edgecolor") ||
option.equals("-edgefontsize") ||
option.equals("-edgefontname") ||
option.equals("-shape") ||
option.equals("-output") ||
option.equals("-outputencoding") ||
option.equals("-bgcolor") ||
option.equals("-hide") ||
option.equals("-apidocroot") ||
option.equals("-apidocmap") ||
option.equals("-d") ||
option.equals("-view") ||
option.equals("-inferreltype") ||
option.equals("-inferdepvis") ||
option.equals("-collpackages") ||
option.equals("-nodesep") ||
option.equals("-ranksep") ||
option.equals("-dotexecutable") ||
option.equals("-link"))
else if(matchOption(option, "nodefillcolor") ||
matchOption(option, "nodefontcolor") ||
matchOption(option, "nodefontsize") ||
matchOption(option, "nodefontname") ||
matchOption(option, "nodefontclasssize") ||
matchOption(option, "nodefontclassname") ||
matchOption(option, "nodefonttagsize") ||
matchOption(option, "nodefonttagname") ||
matchOption(option, "nodefontpackagesize") ||
matchOption(option, "nodefontpackagename") ||
matchOption(option, "edgefontcolor") ||
matchOption(option, "edgecolor") ||
matchOption(option, "edgefontsize") ||
matchOption(option, "edgefontname") ||
matchOption(option, "shape") ||
matchOption(option, "output") ||
matchOption(option, "outputencoding") ||
matchOption(option, "bgcolor") ||
matchOption(option, "hide") ||
matchOption(option, "include") ||
matchOption(option, "apidocroot") ||
matchOption(option, "apidocmap") ||
matchOption(option, "d") ||
matchOption(option, "view") ||
matchOption(option, "inferreltype") ||
matchOption(option, "inferdepvis") ||
matchOption(option, "collpackages") ||
matchOption(option, "nodesep") ||
matchOption(option, "ranksep") ||
matchOption(option, "dotexecutable") ||
matchOption(option, "link"))
return 2;
else if(option.equals("-contextPattern") ||
option.equals("-linkoffline"))
else if(matchOption(option, "contextPattern") ||
matchOption(option, "linkoffline"))
return 3;
else
return 0;
@ -284,231 +258,168 @@ public class Options implements Cloneable, OptionProvider {
/** Set the options based on a single option and its arguments */
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");
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")) {
showQualified = true;
} else if (opt[0].equals("-!qualify")) {
showQualified = false;
} else if(opt[0].equals("-horizontal")) {
horizontal = true;
} else if (opt[0].equals("-!horizontal")) {
horizontal = false;
} else if(opt[0].equals("-attributes")) {
showAttributes = true;
} else if (opt[0].equals("-!attributes")) {
showAttributes = false;
} else if(opt[0].equals("-enumconstants")) {
showEnumConstants = true;
} else if (opt[0].equals("-!enumconstants")) {
showEnumConstants = false;
} else if(opt[0].equals("-operations")) {
showOperations = true;
} else if (opt[0].equals("-!operations")) {
showOperations = false;
} else if(opt[0].equals("-enumerations")) {
showEnumerations = true;
} else if (opt[0].equals("-!enumerations")) {
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("-commentname")) {
showComment = true;
} else if (opt[0].equals("-!commentname")) {
showComment = false;
} else if(opt[0].equals("-all")) {
if(matchOption(opt[0], "qualify", true)) {
showQualified = positive;
} else if(matchOption(opt[0], "qualifyGenerics", true)) {
showQualifiedGenerics = positive;
} else if(matchOption(opt[0], "hideGenerics", true)) {
hideGenerics = positive;
} else if(matchOption(opt[0], "horizontal", true)) {
horizontal = positive;
} else if(matchOption(opt[0], "attributes", true)) {
showAttributes = positive;
} else if(matchOption(opt[0], "enumconstants", true)) {
showEnumConstants = positive;
} else if(matchOption(opt[0], "operations", true)) {
showOperations = positive;
} else if(matchOption(opt[0], "enumerations", true)) {
showEnumerations = positive;
} else if(matchOption(opt[0], "constructors", true)) {
showConstructors = positive;
} else if(matchOption(opt[0], "visibility", true)) {
showVisibility = positive;
} else if(matchOption(opt[0], "types", true)) {
showType = positive;
} else if(matchOption(opt[0], "autoSize", true)) {
autoSize = positive;
} else if(matchOption(opt[0], "commentname", true)) {
showComment = positive;
} else if(matchOption(opt[0], "all")) {
setAll();
} else if(opt[0].equals("-bgcolor")) {
bgColor = opt[1];
} else if (opt[0].equals("-!bgcolor")) {
bgColor = null;
} else if(opt[0].equals("-edgecolor")) {
edgeColor = opt[1];
} else if (opt[0].equals("-!edgecolor")) {
edgeColor = "black";
} else if(opt[0].equals("-edgefontcolor")) {
edgeFontColor = opt[1];
} else if (opt[0].equals("-!edgefontcolor")) {
edgeFontColor = "black";
} else if(opt[0].equals("-edgefontname")) {
edgeFontName = opt[1];
} else if (opt[0].equals("-!edgefontname")) {
edgeFontName = defaultFont;
} else if(opt[0].equals("-edgefontsize")) {
edgeFontSize = Integer.parseInt(opt[1]);
} else if (opt[0].equals("-!edgefontsize")) {
edgeFontSize = 10;
} else if(opt[0].equals("-nodefontcolor")) {
nodeFontColor = opt[1];
} else if (opt[0].equals("-!nodefontcolor")) {
nodeFontColor = "black";
} else if(opt[0].equals("-nodefontname")) {
nodeFontName = opt[1];
} else if (opt[0].equals("-!nodefontname")) {
nodeFontName = defaultFont;
} else if(opt[0].equals("-nodefontabstractname")) {
nodeFontAbstractName = opt[1];
} else if (opt[0].equals("-!nodefontabstractname")) {
nodeFontAbstractName = defaultItalicFont;
} else if(opt[0].equals("-nodefontsize")) {
nodeFontSize = Integer.parseInt(opt[1]);
} else if (opt[0].equals("-!nodefontsize")) {
nodeFontSize = 10;
} else if(opt[0].equals("-nodefontclassname")) {
nodeFontClassName = opt[1];
} else if (opt[0].equals("-!nodefontclassname")) {
nodeFontClassName = null;
} else if(opt[0].equals("-nodefontclassabstractname")) {
nodeFontClassAbstractName = opt[1];
} else if (opt[0].equals("-!nodefontclassabstractname")) {
nodeFontClassAbstractName = null;
} else if(opt[0].equals("-nodefontclasssize")) {
nodeFontClassSize = Integer.parseInt(opt[1]);
} else if (opt[0].equals("-!nodefontclasssize")) {
nodeFontClassSize = -1;
} else if(opt[0].equals("-nodefonttagname")) {
nodeFontTagName = opt[1];
} else if (opt[0].equals("-!nodefonttagname")) {
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) {
} else if(matchOption(opt[0], "bgcolor", true)) {
bgColor = positive ? opt[1] : null;
} else if(matchOption(opt[0], "edgecolor", true)) {
edgeColor = positive ? opt[1] : "black";
} else if(matchOption(opt[0], "edgefontcolor", true)) {
edgeFontColor = positive ? opt[1] : "black";
} else if(matchOption(opt[0], "edgefontname", true)) {
edgeFontName = positive ? opt[1] : Font.DEFAULT_FONT;
} else if(matchOption(opt[0], "edgefontsize", true)) {
edgeFontSize = positive ? Double.parseDouble(opt[1]) : 10;
} else if(matchOption(opt[0], "nodefontcolor", true)) {
nodeFontColor = positive ? opt[1] : "black";
} else if(matchOption(opt[0], "nodefontname", true)) {
nodeFontName = positive ? opt[1] : Font.DEFAULT_FONT;
} else if(matchOption(opt[0], "nodefontabstractitalic", true)) {
nodeFontAbstractItalic = positive;
} else if(matchOption(opt[0], "nodefontsize", true)) {
nodeFontSize = positive ? Double.parseDouble(opt[1]) : 10;
} else if(matchOption(opt[0], "nodefontclassname", true)) {
nodeFontClassName = positive ? opt[1] : null;
} else if(matchOption(opt[0], "nodefontclasssize", true)) {
nodeFontClassSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if(matchOption(opt[0], "nodefonttagname", true)) {
nodeFontTagName = positive ? opt[1] : null;
} else if(matchOption(opt[0], "nodefonttagsize", true)) {
nodeFontTagSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if(matchOption(opt[0], "nodefontpackagename", true)) {
nodeFontPackageName = positive ? opt[1] : null;
} else if(matchOption(opt[0], "nodefontpackagesize", true)) {
nodeFontPackageSize = positive ? Double.parseDouble(opt[1]) : -1;
} else if(matchOption(opt[0], "nodefillcolor", true)) {
nodeFillColor = positive ? opt[1] : null;
} else if(matchOption(opt[0], "shape", true)) {
shape = positive ? Shape.of(opt[1]) : Shape.CLASS;
} else if(matchOption(opt[0], "output", true)) {
outputFileName = positive ? opt[1] : "graph.dot";
} else if(matchOption(opt[0], "outputencoding", true)) {
outputEncoding = positive ? opt[1] : "ISO-8859-1";
} else if(matchOption(opt[0], "hide", true)) {
if (positive) {
if (opt.length == 1) {
hidePatterns.clear();
hidePatterns.add(allPattern);
} else {
try {
hidePatterns.add(Pattern.compile(opt[1]));
} catch (PatternSyntaxException e) {
System.err.println("Skipping invalid pattern " + opt[1]);
}
}
} else
hidePatterns.clear();
hidePatterns.add(allPattern);
} else {
} else if(matchOption(opt[0], "include", true)) {
if (positive) {
try {
hidePatterns.add(Pattern.compile(opt[1]));
includePatterns.add(Pattern.compile(opt[1]));
} catch (PatternSyntaxException e) {
System.err.println("Skipping invalid pattern " + opt[1]);
}
}
} else if (opt[0].equals("-!hide")) {
hidePatterns.clear();
} else if(opt[0].equals("-apidocroot")) {
apiDocRoot = fixApiDocRoot(opt[1]);
} else if (opt[0].equals("-!apidocroot")) {
apiDocRoot = null;
} else if(opt[0].equals("-apidocmap")) {
setApiDocMapFile(opt[1]);
} else if (opt[0].equals("-!apidocmap")) {
apiDocMap.clear();
} else if(opt[0].equals("-noguillemot")) {
guilOpen = "&lt;&lt;";
guilClose = "&gt;&gt;";
} 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")) {
} else
includePatterns.clear();
} else if(matchOption(opt[0], "apidocroot", true)) {
apiDocRoot = positive ? fixApiDocRoot(opt[1]) : null;
} else if(matchOption(opt[0], "apidocmap", true)) {
if (positive)
setApiDocMapFile(opt[1]);
else
apiDocMap.clear();
} else if(matchOption(opt[0], "noguillemot", true)) {
guilOpen = positive ? "&lt;&lt;" : "\u00ab";
guilClose = positive ? "&gt;&gt;" : "\u00bb";
} else if (matchOption(opt[0], "view", true)) {
viewName = positive ? opt[1] : null;
} else if (matchOption(opt[0], "views", true)) {
findViews = positive;
} else if (matchOption(opt[0], "d", true)) {
outputDirectory = positive ? opt[1] : null;
} else if(matchOption(opt[0], "inferrel", true)) {
inferRelationships = positive;
} else if(matchOption(opt[0], "inferreltype", true)) {
if (positive) {
try {
inferRelationshipType = RelationType.valueOf(opt[1].toUpperCase());
} catch(IllegalArgumentException e) {
System.err.println("Unknown association type " + opt[1]);
}
} else if(opt[0].equals("-!inferreltype")) {
inferRelationshipType = RelationType.NAVASSOC;
} else if(opt[0].equals("-inferdepvis")) {
try {
Visibility vis = Visibility.valueOf(opt[1].toUpperCase());
inferDependencyVisibility = vis;
} catch(IllegalArgumentException e) {
System.err.println("Ignoring invalid visibility specification for " +
"dependency inference: " + opt[1]);
}
} 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")) {
inferDependencies = false;
} else if(opt[0].equals("-inferdepinpackage")) {
inferDepInPackage = true;
} else if(opt[0].equals("-!inferdepinpackage")) {
inferDepInPackage = false;
} else if(opt[0].equals("-useimports")) {
useImports = true;
} else if(opt[0].equals("-!useimports")) {
useImports = false;
} else if (opt[0].equals("-collpackages")) {
try {
collPackages.add(Pattern.compile(opt[1]));
} catch (PatternSyntaxException e) {
System.err.println("Skipping invalid pattern " + opt[1]);
}
} else if (opt[0].equals("-!collpackages")) {
collPackages.clear();
} else if (opt[0].equals("-compact")) {
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")) {
} else
inferRelationshipType = RelationType.NAVASSOC;
} else if(matchOption(opt[0], "inferdepvis", true)) {
if (positive) {
try {
Visibility vis = Visibility.valueOf(opt[1].toUpperCase());
inferDependencyVisibility = vis;
} catch(IllegalArgumentException e) {
System.err.println("Ignoring invalid visibility specification for " +
"dependency inference: " + opt[1]);
}
} else
inferDependencyVisibility = Visibility.PRIVATE;
} else if(matchOption(opt[0], "collapsible", true)) {
collapsibleDiagrams = positive;
} else if(matchOption(opt[0], "inferdep", true)) {
inferDependencies = positive;
} else if(matchOption(opt[0], "inferdepinpackage", true)) {
inferDepInPackage = positive;
} else if (matchOption(opt[0], "hideprivateinner", true)) {
hidePrivateInner = positive;
} else if(matchOption(opt[0], "useimports", true)) {
useImports = positive;
} else if (matchOption(opt[0], "collpackages", true)) {
if (positive) {
try {
collPackages.add(Pattern.compile(opt[1]));
} catch (PatternSyntaxException e) {
System.err.println("Skipping invalid pattern " + opt[1]);
}
} else
collPackages.clear();
} else if (matchOption(opt[0], "compact", true)) {
compact = positive;
} else if (matchOption(opt[0], "postfixpackage", true)) {
postfixPackage = positive;
} else if (matchOption(opt[0], "link")) {
addApiDocRoots(opt[1]);
} else if (opt[0].equals("-linkoffline")) {
} else if (matchOption(opt[0], "linkoffline")) {
addApiDocRootsOffline(opt[1], opt[2]);
} else if(opt[0].equals("-contextPattern")) {
} else if(matchOption(opt[0], "contextPattern")) {
RelationDirection d; RelationType rt;
try {
d = RelationDirection.valueOf(opt[2].toUpperCase());
@ -522,27 +433,22 @@ public class Options implements Cloneable, OptionProvider {
}
} else if (opt[0].equals("-nodesep")) {
} else if (matchOption(opt[0], "nodesep", true)) {
try {
nodeSep = Double.parseDouble(opt[1]);
nodeSep = positive ? Double.parseDouble(opt[1]) : 0.25;
} catch (NumberFormatException e) {
System.err.println("Skipping invalid nodesep " + opt[1]);
}
} else if (opt[0].equals("-!nodesep")) {
nodeSep = 0.25;
} else if (opt[0].equals("-ranksep")) {
} else if (matchOption(opt[0], "ranksep", true)) {
try {
rankSep = Double.parseDouble(opt[1]);
rankSep = positive ? Double.parseDouble(opt[1]) : 0.5;
} catch (NumberFormatException e) {
System.err.println("Skipping invalid ranksep " + opt[1]);
}
} else if (opt[0].equals("-!ranksep")) {
rankSep = 0.5;
} else if (opt[0].equals("-dotexecutable")) {
dotExecutable = opt[1];
} else if (matchOption(opt[0], "dotexecutable")) {
dotExecutable = opt[1];
} else
; // Do nothing, javadoc will handle the option or complain, if
// needed.
; // Do nothing, javadoc will handle the option or complain, if needed.
}
/**
@ -556,7 +462,7 @@ public class Options implements Cloneable, OptionProvider {
try {
URL url = new URL(packageListUrl + "/package-list");
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line = null;
String line;
while((line = br.readLine()) != null) {
line = line + ".";
Pattern pattern = Pattern.compile(line.replace(".", "\\.") + "[^\\.]*");
@ -586,7 +492,7 @@ public class Options implements Cloneable, OptionProvider {
try {
URL url = new URL(packageListUrl + "/package-list");
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line = null;
String line;
while((line = br.readLine()) != null) {
line = line + ".";
Pattern pattern = Pattern.compile(line.replace(".", "\\.") + "[^\\.]*");
@ -614,11 +520,10 @@ public class Options implements Cloneable, OptionProvider {
userMap.load(is);
for (Map.Entry<?, ?> mapEntry : userMap.entrySet()) {
try {
Pattern regex = Pattern.compile((String) mapEntry.getKey());
String thisRoot = (String) mapEntry.getValue();
if (thisRoot != null) {
thisRoot = fixApiDocRoot(thisRoot);
apiDocMap.put(regex, thisRoot);
apiDocMap.put(Pattern.compile((String) mapEntry.getKey()), thisRoot);
} else {
System.err.println("No URL for pattern " + mapEntry.getKey());
}
@ -639,7 +544,7 @@ public class Options implements Cloneable, OptionProvider {
* match the class name against the regular expressions specified in the
* <code>apiDocMap</code>; if a match is found, the associated URL
* will be returned.
*
* <p>
* <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"
* parameters.
@ -649,9 +554,7 @@ public class Options implements Cloneable, OptionProvider {
apiDocMap.put(Pattern.compile(".*"), DEFAULT_EXTERNAL_APIDOC);
for (Map.Entry<Pattern, String> mapEntry : apiDocMap.entrySet()) {
Pattern regex = mapEntry.getKey();
Matcher matcher = regex.matcher(className);
if (matcher.matches())
if (mapEntry.getKey().matcher(className).matches())
return mapEntry.getValue();
}
return null;
@ -659,16 +562,15 @@ public class Options implements Cloneable, OptionProvider {
/** Trim and append a file separator to the string */
private String fixApiDocRoot(String str) {
String fixed = null;
if (str != null) {
fixed = str.trim();
if (fixed.length() > 0) {
if (!File.separator.equals("/"))
fixed = fixed.replace(File.separator.charAt(0), '/');
if (!fixed.endsWith("/"))
fixed = fixed + "/";
}
}
if (str == null)
return null;
String fixed = str.trim();
if (fixed.isEmpty())
return "";
if (File.separatorChar != '/')
fixed = fixed.replace(File.separatorChar, '/');
if (!fixed.endsWith("/"))
fixed = fixed + "/";
return fixed;
}
@ -680,15 +582,12 @@ public class Options implements Cloneable, OptionProvider {
/** Set the options based on the tag elements of the ClassDoc parameter */
public void setOptions(ClassDoc p) {
public void setOptions(Doc p) {
if (p == null)
return;
for (Tag tag : p.tags("opt")) {
String[] opt = StringUtil.tokenize(tag.text());
opt[0] = "-" + opt[0];
setOption(opt);
}
for (Tag tag : p.tags("opt"))
setOption(StringUtil.tokenize(tag.text()));
}
/**
@ -703,32 +602,36 @@ public class Options implements Cloneable, OptionProvider {
return true;
Matcher m = hidePattern.matcher(s);
if (strictMatching) {
if (m.matches()) {
return true;
}
} else if (m.find()) {
if (strictMatching ? m.matches() : m.find())
return true;
}
}
return false;
}
/**
* Check if the supplied string matches an entity specified
* with the -hide parameter.
* with the -include parameter.
* @return true if the string matches.
*/
public boolean matchesIncludeExpression(String s) {
for (Pattern includePattern : includePatterns) {
Matcher m = includePattern.matcher(s);
if (strictMatching ? m.matches() : m.find())
return true;
}
return false;
}
/**
* Check if the supplied string matches an entity specified
* with the -collpackages parameter.
* @return true if the string matches.
*/
public boolean matchesCollPackageExpression(String s) {
for (Pattern collPattern : collPackages) {
Matcher m = collPattern.matcher(s);
if (strictMatching) {
if (m.matches()) {
return true;
}
} else if (m.find()) {
if (strictMatching ? m.matches() : m.find())
return true;
}
}
return false;
}
@ -764,7 +667,7 @@ public class Options implements Cloneable, OptionProvider {
}
public String toString() {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
sb.append("UMLGRAPH OPTIONS\n");
for(Field f : this.getClass().getDeclaredFields()) {
if(!Modifier.isStatic(f.getModifiers())) {

View File

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

View File

@ -17,15 +17,19 @@ import com.sun.javadoc.RootDoc;
*/
public class PackageView implements OptionProvider {
private static final String[] HIDE = new String[] { "hide" };
private PackageDoc pd;
private OptionProvider parent;
private ClassMatcher matcher;
private String outputPath;
private Options opt;
public PackageView(String outputFolder, PackageDoc pd, RootDoc root, OptionProvider parent) {
this.parent = parent;
this.pd = pd;
this.matcher = new PackageMatcher(pd);
this.opt = parent.getGlobalOptions();
this.opt.setOptions(pd);
this.outputPath = pd.name().replace('.', '/') + "/" + pd.name() + ".dot";
}
@ -36,8 +40,8 @@ public class PackageView implements OptionProvider {
public Options getGlobalOptions() {
Options go = parent.getGlobalOptions();
go.setOption(new String[] { "-output", outputPath });
go.setOption(new String[] { "-hide" });
go.setOption(new String[] { "output", outputPath });
go.setOption(HIDE);
return go;
}
@ -56,15 +60,22 @@ public class PackageView implements OptionProvider {
public void overrideForClass(Options opt, ClassDoc cd) {
opt.setOptions(cd);
opt.showQualified = false;
if (!matcher.matches(cd) || parent.getGlobalOptions().matchesHideExpression(cd.name()))
opt.setOption(new String[] { "-hide" });
boolean inPackage = matcher.matches(cd);
if (inPackage)
opt.showQualified = false;
boolean included = inPackage || this.opt.matchesIncludeExpression(cd.qualifiedName());
if (!included || this.opt.matchesHideExpression(cd.qualifiedName()))
opt.setOption(HIDE);
}
public void overrideForClass(Options opt, String className) {
opt.showQualified = false;
if (!matcher.matches(className))
opt.setOption(new String[] { "-hide" });
boolean inPackage = matcher.matches(className);
if (inPackage)
opt.showQualified = false;
boolean included = inPackage || this.opt.matchesIncludeExpression(className);
if (!included || this.opt.matchesHideExpression(className))
opt.setOption(HIDE);
}
}

View File

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

View File

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

View File

@ -1,10 +1,34 @@
package org.umlgraph.doclet;
/**
* The type of relation that links two entities
* @author wolf
* The type of relation that links two entities, and the graphviz format
*
* @author Erich Schubert
*/
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;
/** Graphviz style */
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;
import java.io.IOException;
import java.io.PrintWriter;
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;
import java.util.HashMap;
import java.util.Locale;
/**
* Properties of node shapes
*
* @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 */
private String name;
/** Graphviz style */
public final String style;
/** Construct a default (class) Shape */
public Shape() {
name = "class";
}
/** Map for valid shape names */
private static final HashMap<String, Shape> index = new HashMap<String, Shape>(16);
/** Construct a Shape through the specified UMLGraph name */
public Shape(String n) {
name = n;
if (graphvizAttribute() == null) {
System.err.println("Ignoring invalid shape " + n);
name = "class";
/** Initialize the lookup index */
static {
for (Shape s : Shape.values()) {
index.put(s.name(), s);
index.put(s.name().toLowerCase(Locale.ROOT), s);
}
}
/**
* 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() {
if (name.equals("class"))
return ""; // Default; plaintext
else if (name.equals("note"))
return ", shape=note";
else if (name.equals("node"))
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;
public static Shape of(String s) {
Shape shp = index.get(s);
if (shp != null)
return shp;
System.err.println("Ignoring invalid shape: " + s);
return CLASS;
}
/** Return the shape's GraphViz landing port */
String landingPort() {
if (name.equals("class") || name.equals("activeclass"))
return ":p";
else
return "";
/** Enum constructor, must be private! */
private Shape(String style) {
this.style = style;
}
/** Return the table border required for the shape */
String extraColumn(int nRows) {
return name.equals("activeclass") ? ("<td rowspan=\"" + nRows + "\"></td>") : "";
public String extraColumn() {
return this == Shape.ACTIVECLASS ? ("<td rowspan=\"10\"></td>") : "";
}
/** Return the cell border required for the shape */
String cellBorder() {
return (name.equals("class") || name.equals("activeclass")) ? "1" : "0";
public String cellBorder() {
return this == CLASS || this == ACTIVECLASS ? "1" : "0";
}
}

View File

@ -20,9 +20,11 @@
package org.umlgraph.doclet;
import java.util.*;
import java.util.regex.Pattern;
/**
* String utility functions
*
* @version $Revision$
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a>
*/
@ -62,4 +64,168 @@ class StringUtil {
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;
// recurse on supeclass, if available
if(cd.superclass() != null)
return matches(cd.superclass());
return false;
return cd.superclass() == null ? false : matches(cd.superclass());
}
public boolean matches(String name) {
ClassDoc cd = root.classNamed(name);
if(cd == null)
return false;
return matches(cd);
return cd == null ? false : matches(cd);
}
}

View File

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

View File

@ -62,12 +62,10 @@ public class UmlGraphDoc {
opt.strictMatching = true;
// root.printNotice(opt.toString());
root = new WrappedRootDoc(root);
generatePackageDiagrams(root, opt, outputFolder);
generateContextDiagrams(root, opt, outputFolder);
} catch(Throwable t) {
root.printWarning("Error!");
root.printWarning(t.toString());
root.printWarning("Error: " + t.toString());
t.printStackTrace();
return false;
}
@ -117,14 +115,18 @@ public class UmlGraphDoc {
ContextView view = null;
for (ClassDoc classDoc : classDocs) {
if(view == null)
view = new ContextView(outputFolder, classDoc, root, opt);
else
view.setContextCenter(classDoc);
UmlGraph.buildGraph(root, view, classDoc);
runGraphviz(opt.dotExecutable, outputFolder, classDoc.containingPackage().name(), classDoc.name(), root);
alterHtmlDocs(opt, outputFolder, classDoc.containingPackage().name(), classDoc.name(),
classDoc.name() + ".html", Pattern.compile(".*(Class|Interface|Enum) " + classDoc.name() + ".*") , root);
try {
if(view == null)
view = new ContextView(outputFolder, classDoc, root, opt);
else
view.setContextCenter(classDoc);
UmlGraph.buildGraph(root, view, classDoc);
runGraphviz(opt.dotExecutable, outputFolder, classDoc.containingPackage().name(), 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);
}
}
}
@ -147,7 +149,7 @@ public class UmlGraphDoc {
dotFile.getAbsolutePath()
});
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
String line;
while((line = reader.readLine()) != null)
root.printWarning(line);
int result = p.waitFor();
@ -162,9 +164,14 @@ public class UmlGraphDoc {
//Format string for the uml image div tag.
private static final String UML_DIV_TAG =
"<div align=\"center\">" +
"<object width=\"100%\" height=\"100%\" type=\"image/svg+xml\" data=\"%1$s.svg\" alt=\"Package class diagram package %1$s\" border=0></object>" +
"<object width=\"100%%\" height=\"100%%\" type=\"image/svg+xml\" data=\"%1$s.svg\" alt=\"Package class diagram package %1$s\" border=0></object>" +
"</div>";
private static final String UML_AUTO_SIZED_DIV_TAG =
"<div align=\"center\">" +
"<object type=\"image/svg+xml\" data=\"%1$s.svg\" alt=\"Package class diagram package %1$s\" border=0></object>" +
"</div>";
private static final String EXPANDABLE_UML_STYLE = "font-family: Arial,Helvetica,sans-serif;font-size: 1.5em; display: block; width: 250px; height: 20px; background: #009933; padding: 5px; text-align: center; border-radius: 8px; color: white; font-weight: bold;";
//Format string for the java script tag.
@ -217,12 +224,16 @@ public class UmlGraphDoc {
if (!matched && insertPointPattern.matcher(line).matches()) {
matched = true;
String tag = String.format(UML_DIV_TAG, className);
String tag;
if (opt.autoSize)
tag = String.format(UML_AUTO_SIZED_DIV_TAG, className);
else
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("<!-- UML diagram added by UMLGraph version " +
Version.VERSION +
" (http://www.umlgraph.org/) -->");
" (http://www.spinellis.gr/umlgraph/) -->");
writer.newLine();
writer.write(tag);
writer.newLine();

View File

@ -1,4 +1,4 @@
/* Automatically generated file */
package org.umlgraph.doclet;
class Version { public static String VERSION = "R5_7_2-1-g9039a0";}
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;
for (String[] opts : globalOptions) {
if (opts[0].equals("-output"))
if (Options.matchOption(opts[0], "output"))
outputSet = true;
go.setOption(opts);
}
if (!outputSet)
go.setOption(new String[] { "-output", viewDoc.name() + ".dot" });
go.setOption(new String[] { "output", viewDoc.name() + ".dot" });
return go;
}
public void overrideForClass(Options opt, ClassDoc cd) {
provider.overrideForClass(opt, cd);
for (ClassMatcher cm : optionOverrides.keySet()) {
if(cm.matches(cd)) {
for (String[] override : optionOverrides.get(cm)) {
for (ClassMatcher cm : optionOverrides.keySet())
if(cm.matches(cd))
for (String[] override : optionOverrides.get(cm))
opt.setOption(override);
}
}
}
}
public void overrideForClass(Options opt, String className) {
provider.overrideForClass(opt, className);
for (ClassMatcher cm : optionOverrides.keySet()) {
if(cm.matches(className)) {
for (String[] override : optionOverrides.get(cm)) {
for (ClassMatcher cm : optionOverrides.keySet())
if(cm.matches(className))
for (String[] override : optionOverrides.get(cm))
opt.setOption(override);
}
}
}
}
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
* private visibility is referred as PACKAGE.
* @author wolf
*
*/
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) {
if (doc.isPrivate())
@ -38,6 +43,5 @@ public enum Visibility {
return PROTECTED;
else
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

@ -50,9 +50,6 @@ public class BasicTest {
TestUtils.cleanFolder(outFolder, true);
// don't use windows specific fonts
System.setProperty("os.name", "generic");
// run tests
performBasicTests(differences);
performViewTests(differences, outFolder);
@ -67,6 +64,7 @@ public class BasicTest {
pw.println();
pw.println();
pw.flush();
System.exit(differences.size() > 0 ? 1 : 0);
}
private static void performViewTests(List<String> differences, File outFolder)

View File

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

View File

@ -50,9 +50,6 @@ public class UmlDocTest {
TestUtils.cleanFolder(outFolder, true);
// don't use windows specific fonts
System.setProperty("os.name", "generic");
// run tests
runTest(differences);
if (differences.size() > 0) {
@ -60,6 +57,7 @@ public class UmlDocTest {
for (String className : differences) {
pw.println(className);
}
System.exit(1);
} else {
pw.println("GOOD, all files are structurally equal");
}
@ -150,10 +148,11 @@ public class UmlDocTest {
private static void runDoclet(String[] options) {
pw.print("Run javadoc -doclet " + doclet);
for (String o : options)
pw.print(o + " ");
pw.print(" " + o);
pw.println();
com.sun.tools.javadoc.Main.execute("UMLDoc test", pw, pw, pw,
doclet, options);
System.exit(0);
}
}

View File

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

View File

@ -5,21 +5,22 @@
#
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
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.InnerNode
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.Leaf
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.InnerNode extends test.AbstractNode
c1:p -> c2:p [dir=back,arrowtail=empty];
// test.InnerNode COMPOSED test.AbstractNode
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.Leaf extends test.AbstractNode
c1:p -> c3:p [dir=back,arrowtail=empty];
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;
// test.AbstractNode
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>>];
// test.InnerNode
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>>];
// test.Leaf
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>>];
// test.InnerNode extends test.AbstractNode
c1 -> c2 [arrowtail=empty,dir=back,weight=10];
// test.InnerNode composed test.AbstractNode
c2 -> c1 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", label="has", headlabel="*"];
// test.Leaf extends test.AbstractNode
c1 -> c3 [arrowtail=empty,dir=back,weight=10];
}

View File

@ -1,49 +1,50 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-10-g442559 (http://www.umlgraph.org/)
#
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
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];
// B
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];
// C
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];
// MyFunnyList<T, V>
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];
// MyList
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];
// D
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];
//MyFunnyList<T, V> extends java.util.ArrayList<T>
c72:p -> c69:p [dir=back,arrowtail=empty];
//MyList extends MyFunnyList<A, B>
c69:p -> c70:p [dir=back,arrowtail=empty];
// A HAS B
c66:p -> c67:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both];
// A HAS C
c66:p -> c68:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=ediamond, dir=both];
// C NAVASSOC B
c68:p -> c67:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// C NAVASSOC D
c68:p -> c71:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// C NAVASSOC C
c68:p -> c68:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// C NAVASSOC java.util.List<E>
c68:p -> c73:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// D NAVASSOC MyList
c71:p -> c70:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// B DEPEND A
c67:p -> c66:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// java.util.List<E>
c73 [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"><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://java.sun.com/j2se/1.4.2/docs/api/java/util/List.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" 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"> 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://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
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;
// A
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>>];
// B
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>>];
// C
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>>];
// MyFunnyList<T, V>
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>>];
// MyList
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>>];
// D
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>>];
// MyFunnyList<T, V> extends java.util.ArrayList<T>
c72 -> c69 [arrowtail=empty,dir=back,weight=10];
// MyList extends MyFunnyList<A, B>
c69 -> c70 [arrowtail=empty,dir=back,weight=10];
// A has B
c66 -> c67 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4];
// A has C
c66 -> c68 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4];
// C navassoc B
c68 -> c67 [arrowhead=open,weight=1,headlabel="*"];
// C navassoc D
c68 -> c71 [arrowhead=open,weight=1,headlabel="*"];
// C navassoc C
c68 -> c68 [arrowhead=open,weight=1,headlabel="*"];
// C navassoc java.util.List<E>
c68 -> c73 [arrowhead=open,weight=1];
// D navassoc MyList
c71 -> c70 [arrowhead=open,weight=1];
// B depend A
c67 -> c66 [arrowhead=open,style=dashed,weight=0];
// java.util.List<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"];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Application
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];
// IrpApplication
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];
// Main
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];
//IrpApplication extends Application
c74:p -> c75:p [dir=back,arrowtail=empty];
// Main DEPEND IrpApplication
c76:p -> c75:p [taillabel="", label="&#171;friend&#187;", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
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;
// Application
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>>];
// IrpApplication
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>>];
// Main
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>>];
// IrpApplication extends Application
c74 -> c75 [arrowtail=empty,dir=back,weight=10];
// Main depend IrpApplication
c76 -> c75 [arrowhead=open,style=dashed,weight=0,label="&#171;friend&#187;"];
}

View File

@ -5,15 +5,16 @@
#
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
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];
// C
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];
// A DEPEND C
c81:p -> c83:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
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;
// A
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>>];
// 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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Root
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];
// Adapter
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];
// Element
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];
// ObjectType
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];
// ObjectMap
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];
// 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];
// DataOperation
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];
// Root ASSOC Adapter
c90:p -> c91:p [taillabel="1..1", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Root ASSOC ObjectType
c90:p -> c93:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Root ASSOC ObjectMap
c90:p -> c94:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Root ASSOC Table
c90:p -> c95:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Root ASSOC DataOperation
c90:p -> c96:p [taillabel="", label="", headlabel="0..n", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
//ObjectType extends Element
c92:p -> c93:p [dir=back,arrowtail=empty];
//ObjectMap extends Element
c92:p -> c94:p [dir=back,arrowtail=empty];
// ObjectMap HAS ObjectType
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];
//Table extends Element
c92:p -> c95:p [dir=back,arrowtail=empty];
//DataOperation extends Element
c92:p -> c96:p [dir=back,arrowtail=empty];
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;
// Root
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>>];
// Adapter
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>>];
// Element
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>>];
// ObjectType
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>>];
// ObjectMap
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>>];
// Table
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>>];
// DataOperation
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>>];
// Root assoc Adapter
c90 -> c91 [arrowhead=none,weight=2,taillabel="1..1", headlabel="0..n"];
// Root assoc ObjectType
c90 -> c93 [arrowhead=none,weight=2,headlabel="0..n"];
// Root assoc ObjectMap
c90 -> c94 [arrowhead=none,weight=2,headlabel="0..n"];
// Root assoc Table
c90 -> c95 [arrowhead=none,weight=2,headlabel="0..n"];
// Root assoc DataOperation
c90 -> c96 [arrowhead=none,weight=2,headlabel="0..n"];
// ObjectType extends Element
c92 -> c93 [arrowtail=empty,dir=back,weight=10];
// ObjectMap extends Element
c92 -> c94 [arrowtail=empty,dir=back,weight=10];
// ObjectMap has ObjectType
c94 -> c93 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..1", headlabel="1..1"];
// Table extends Element
c92 -> c95 [arrowtail=empty,dir=back,weight=10];
// DataOperation extends Element
c92 -> c96 [arrowtail=empty,dir=back,weight=10];
}

View File

@ -1,19 +1,20 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_6-9-g37cd34 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-10-g442559 (http://www.umlgraph.org/)
#
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.RunnableRef
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 DEPEND java.lang.Runnable
c98:p -> c99:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// java.lang.Runnable
c99 [label=<<table title="java.lang.Runnable" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.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"> Runnable </td></tr></table></td></tr></table>>, URL="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runnable.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
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;
// test.RunnableRef
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>>];
// test.RunnableRef depend java.lang.Runnable
c98 -> c99 [arrowhead=open,style=dashed,weight=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

@ -1,27 +1,28 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_6-9-g37cd34 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-10-g442559 (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="arial",fontsize=10,labelfontname="arial",labelfontsize=10];
node [fontname="arial",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// net.sf.whatever.test.AbstractBase
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.Composite
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.Style
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.Composite extends net.sf.whatever.test.AbstractBase
c112:p -> c113:p [dir=back,arrowtail=empty];
// net.sf.whatever.test.Composite COMPOSED from.Outer.Space.AlienClass
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.Style extends net.sf.whatever.test.AbstractBase
c112:p -> c114:p [dir=back,arrowtail=empty];
// from.Outer.Space.AlienClass
c115[label=<<table title="from.Outer.Space.AlienClass" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/from/Outer/Space/AlienClass.html"><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];
graph [fontnames="svg"]
edge [fontname="arial",fontsize=10,labelfontname="arial",labelfontsize=10,color="black"];
node [fontname="arial",fontcolor="black",fontsize=9,shape=plaintext,margin=0,width=0,height=0];
nodesep=0.25;
ranksep=0.5;
// net.sf.whatever.test.AbstractBase
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>>];
// net.sf.whatever.test.Composite
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>>];
// net.sf.whatever.test.Style
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>>];
// net.sf.whatever.test.Composite extends net.sf.whatever.test.AbstractBase
c112 -> c113 [arrowtail=empty,dir=back,weight=10];
// net.sf.whatever.test.Composite composed from.Outer.Space.AlienClass
c113 -> c115 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1",label="has",headlabel="*"];
// net.sf.whatever.test.Style extends net.sf.whatever.test.AbstractBase
c112 -> c114 [arrowtail=empty,dir=back,weight=10];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// test.TestHideOp
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];
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;
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.invoice.InvoiceItem
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.Invoice
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.Customer
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.product.Product
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.Category
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.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product
c355:p -> c358: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
c356:p -> c357:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem
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.product.Product ASSOC gr.spinellis.basic.product.Category
c358:p -> c359:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.invoice.InvoiceItem
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>>];
// gr.spinellis.basic.invoice.Invoice
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>>];
// gr.spinellis.basic.invoice.Customer
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>>];
// gr.spinellis.basic.product.Product
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>>];
// gr.spinellis.basic.product.Category
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>>];
// gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
c355 -> c358 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
c356 -> c357 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
c356 -> c355 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.invoice.InvoiceItem
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.Invoice
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.Customer
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.product.Product
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.Category
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.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product
c317:p -> c320: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
c318:p -> c319:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem
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.product.Product ASSOC gr.spinellis.basic.product.Category
c320:p -> c321:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.invoice.InvoiceItem
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>>];
// gr.spinellis.basic.invoice.Invoice
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>>];
// gr.spinellis.basic.invoice.Customer
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>>];
// gr.spinellis.basic.product.Product
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>>];
// gr.spinellis.basic.product.Category
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>>];
// gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
c317 -> c320 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
c318 -> c319 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
c318 -> c317 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.invoice.InvoiceItem
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.Invoice
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.Customer
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.product.Product
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.Category
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.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product
c279:p -> c282: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
c280:p -> c281:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem
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.product.Product ASSOC gr.spinellis.basic.product.Category
c282:p -> c283:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.invoice.InvoiceItem
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];
// gr.spinellis.basic.invoice.Invoice
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];
// gr.spinellis.basic.invoice.Customer
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];
// gr.spinellis.basic.product.Product
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];
// gr.spinellis.basic.product.Category
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];
// gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
c279 -> c282 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
c280 -> c281 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
c280 -> c279 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.product.Product
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.Category
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.Product ASSOC gr.spinellis.basic.product.Category
c244:p -> c245:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.product.Product
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>>];
// 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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.product.Product
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.Category
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.Product ASSOC gr.spinellis.basic.product.Category
c206:p -> c207:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.product.Product
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>>];
// 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>>];
// gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c206 -> c207 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
}

View File

@ -1,35 +1,36 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_6-9-g37cd34 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-10-g442559 (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.invoice.InvoiceItem
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.Invoice
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.Customer
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.product.Product
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.Category
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.invoice.InvoiceItem ASSOC gr.spinellis.basic.product.Product
c164:p -> c167: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
c165:p -> c166:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// gr.spinellis.basic.invoice.Invoice COMPOSED gr.spinellis.basic.invoice.InvoiceItem
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.product.Product ASSOC gr.spinellis.basic.product.Category
c167:p -> c168:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// gr.spinellis.basic.product.Category DEPEND java.util.List<E>
c168:p -> c202:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// java.util.List<E>
c202 [label=<<table title="java.util.List" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="gray" 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></table>>, URL="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
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;
// gr.spinellis.basic.invoice.InvoiceItem
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>>];
// gr.spinellis.basic.invoice.Invoice
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>>];
// gr.spinellis.basic.invoice.Customer
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>>];
// gr.spinellis.basic.product.Product
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>>];
// gr.spinellis.basic.product.Category
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>>];
// gr.spinellis.basic.invoice.InvoiceItem assoc gr.spinellis.basic.product.Product
c164 -> c167 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice assoc gr.spinellis.basic.invoice.Customer
c165 -> c166 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.invoice.Invoice composed gr.spinellis.basic.invoice.InvoiceItem
c165 -> c164 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="*"];
// gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c167 -> c168 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
// gr.spinellis.basic.product.Category depend java.util.List<E>
c168 -> c202 [arrowhead=open,style=dashed,weight=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

@ -1,43 +1,44 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-10-g442559 (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.context.classes.AClient
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.ASubclass
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.E
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.D
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.B
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.ABaseClass
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.A
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.ASubclass extends gr.spinellis.context.classes.A
c434:p -> c426:p [dir=back,arrowtail=empty];
//gr.spinellis.context.classes.A extends gr.spinellis.context.classes.ABaseClass
c433:p -> c434:p [dir=back,arrowtail=empty];
// gr.spinellis.context.classes.D NAVASSOC gr.spinellis.context.classes.A
c429:p -> c434: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
c434:p -> c432:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.context.classes.A NAVASSOC javax.swing.JComponent
c434:p -> c508:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.context.classes.AClient DEPEND gr.spinellis.context.classes.A
c424:p -> c434: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
c434:p -> c427:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// javax.swing.JComponent
c508 [label=<<table title="javax.swing.JComponent" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html"><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://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
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;
// gr.spinellis.context.classes.AClient
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>>];
// gr.spinellis.context.classes.ASubclass
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>>];
// gr.spinellis.context.classes.E
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>>];
// gr.spinellis.context.classes.D
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>>];
// gr.spinellis.context.classes.B
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>>];
// gr.spinellis.context.classes.ABaseClass
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>>];
// 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>>];
// gr.spinellis.context.classes.ASubclass extends gr.spinellis.context.classes.A
c434 -> c426 [arrowtail=empty,dir=back,weight=10];
// gr.spinellis.context.classes.A extends gr.spinellis.context.classes.ABaseClass
c433 -> c434 [arrowtail=empty,dir=back,weight=10];
// gr.spinellis.context.classes.D navassoc gr.spinellis.context.classes.A
c429 -> c434 [arrowhead=open,weight=1];
// gr.spinellis.context.classes.A navassoc gr.spinellis.context.classes.B
c434 -> c432 [arrowhead=open,weight=1];
// gr.spinellis.context.classes.A navassoc javax.swing.JComponent
c434 -> c509 [arrowhead=open,weight=1];
// gr.spinellis.context.classes.AClient depend gr.spinellis.context.classes.A
c424 -> c434 [arrowhead=open,style=dashed,weight=0];
// gr.spinellis.context.classes.A depend gr.spinellis.context.classes.E
c434 -> c427 [arrowhead=open,style=dashed,weight=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

@ -1,31 +1,32 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-20-g09fab1 (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.iface.classes.FarImplementor
c533 [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.DirectImplementor
c534 [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.SubSubFace
c536 [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.SubFace
c537 [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.Face
c538 [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.FarImplementor implements gr.spinellis.iface.classes.SubSubFace
c536:p -> c533:p [dir=back,arrowtail=empty,style=dashed];
//gr.spinellis.iface.classes.DirectImplementor implements gr.spinellis.iface.classes.Face
c538:p -> c534:p [dir=back,arrowtail=empty,style=dashed];
//gr.spinellis.iface.classes.SubSubFace implements gr.spinellis.iface.classes.SubFace
c537:p -> c536:p [dir=back,arrowtail=empty,style=dashed];
//gr.spinellis.iface.classes.SubFace implements gr.spinellis.iface.classes.Face
c538:p -> c537:p [dir=back,arrowtail=empty,style=dashed];
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;
// gr.spinellis.iface.classes.FarImplementor
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>>];
// gr.spinellis.iface.classes.DirectImplementor
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>>];
// gr.spinellis.iface.classes.SubSubFace
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>>];
// gr.spinellis.iface.classes.SubFace
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>>];
// gr.spinellis.iface.classes.Face
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>>];
// gr.spinellis.iface.classes.FarImplementor implements gr.spinellis.iface.classes.SubSubFace
c537 -> c534 [arrowtail=empty,style=dashed,dir=back,weight=9];
// gr.spinellis.iface.classes.DirectImplementor implements gr.spinellis.iface.classes.Face
c539 -> c535 [arrowtail=empty,style=dashed,dir=back,weight=9];
// gr.spinellis.iface.classes.SubSubFace implements gr.spinellis.iface.classes.SubFace
c538 -> c537 [arrowtail=empty,style=dashed,dir=back,weight=9];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.basic.product.Product
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.Category
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.Product ASSOC gr.spinellis.basic.product.Category
c129:p -> c130:p [taillabel="*", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// gr.spinellis.basic.product.Product
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>>];
// 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>>];
// gr.spinellis.basic.product.Product assoc gr.spinellis.basic.product.Category
c129 -> c130 [arrowhead=none,weight=2,taillabel="*", headlabel="1"];
}

View File

@ -1,31 +1,32 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-20-g09fab1 (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.subclass.classes.SubOneTwo
c579 [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.SubOneOne
c580 [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.SubTwo
c581 [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.SubOne
c582 [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.Super
c583 [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.SubOneTwo extends gr.spinellis.subclass.classes.SubOne
c582:p -> c579:p [dir=back,arrowtail=empty];
//gr.spinellis.subclass.classes.SubOneOne extends gr.spinellis.subclass.classes.SubOne
c582:p -> c580:p [dir=back,arrowtail=empty];
//gr.spinellis.subclass.classes.SubTwo extends gr.spinellis.subclass.classes.Super
c583:p -> c581:p [dir=back,arrowtail=empty];
//gr.spinellis.subclass.classes.SubOne extends gr.spinellis.subclass.classes.Super
c583:p -> c582:p [dir=back,arrowtail=empty];
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;
// gr.spinellis.subclass.classes.SubOneTwo
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>>];
// gr.spinellis.subclass.classes.SubOneOne
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>>];
// gr.spinellis.subclass.classes.SubTwo
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>>];
// gr.spinellis.subclass.classes.SubOne
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>>];
// gr.spinellis.subclass.classes.Super
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>>];
// gr.spinellis.subclass.classes.SubOneTwo extends gr.spinellis.subclass.classes.SubOne
c583 -> c580 [arrowtail=empty,dir=back,weight=10];
// gr.spinellis.subclass.classes.SubOneOne extends gr.spinellis.subclass.classes.SubOne
c583 -> c581 [arrowtail=empty,dir=back,weight=10];
// gr.spinellis.subclass.classes.SubTwo extends gr.spinellis.subclass.classes.Super
c584 -> c582 [arrowtail=empty,dir=back,weight=10];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Controller
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];
// EmbeddedAgent
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];
// PowerManager
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];
// SetTopController
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];
// ChannelIterator
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];
// URLStreamHandler
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];
//SetTopController extends Controller
c5:p -> c8:p [dir=back,arrowtail=empty];
//SetTopController extends EmbeddedAgent
c6:p -> c8:p [dir=back,arrowtail=empty];
//SetTopController implements URLStreamHandler
c10:p -> c8:p [dir=back,arrowtail=empty,style=dashed];
// SetTopController NAVASSOC PowerManager
c8:p -> c7:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// ChannelIterator DEPEND SetTopController
c9:p -> c8:p [taillabel="", label="&#171;friend&#187;", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
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;
// Controller
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>>];
// EmbeddedAgent
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>>];
// PowerManager
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>>];
// SetTopController
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>>];
// ChannelIterator
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>>];
// URLStreamHandler
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>>];
// SetTopController extends Controller
c5 -> c8 [arrowtail=empty,dir=back,weight=10];
// SetTopController extends EmbeddedAgent
c6 -> c8 [arrowtail=empty,dir=back,weight=10];
// SetTopController implements URLStreamHandler
c10 -> c8 [arrowtail=empty,style=dashed,dir=back,weight=9];
// SetTopController navassoc PowerManager
c8 -> c7 [arrowhead=open,weight=1];
// ChannelIterator depend SetTopController
c9 -> c8 [arrowhead=open,style=dashed,weight=0,label="&#171;friend&#187;"];
}

View File

@ -5,20 +5,21 @@
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
rankdir=LR;
// UserGroup
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];
// User
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];
// Password
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];
// UserGroup ASSOC User
c12:p -> c13:p [taillabel="*", label="", headlabel="*\n\n+user ", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// User NAVASSOC Password
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];
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;
rankdir=LR;
// UserGroup
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>>];
// User
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>>];
// Password
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>>];
// UserGroup assoc User
c12 -> c13 [arrowhead=none,weight=2,taillabel="*", headlabel="*\n\n+user "];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Tyre
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];
// Engine
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];
// Body
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];
// Car
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 COMPOSED Tyre
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 Engine
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 Body
c18:p -> c17:p [taillabel="1", label="", headlabel="1", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none, arrowtail=diamond, dir=both];
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;
// Tyre
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>>];
// Engine
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>>];
// Body
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>>];
// Car
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>>];
// Car composed Tyre
c18 -> c15 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="4"];
// Car composed Engine
c18 -> c16 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1", headlabel="1"];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// HttpResponseBase
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];
// HttpResponseWrapper
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];
// HttpResponseFacade
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];
// ResponseWrapper
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];
// HttpResponse
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];
// ResponseBase
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];
// HttpServletResponse
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];
// ResponseFacade
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];
// ServletResponse
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];
// Response
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];
//HttpResponseBase extends ResponseBase
c24:p -> c19:p [dir=back,arrowtail=empty];
//HttpResponseBase implements HttpResponse
c23:p -> c19:p [dir=back,arrowtail=empty,style=dashed];
//HttpResponseBase implements HttpServletResponse
c25:p -> c19:p [dir=back,arrowtail=empty,style=dashed];
//HttpResponseWrapper extends ResponseWrapper
c22:p -> c20:p [dir=back,arrowtail=empty];
//HttpResponseWrapper implements HttpResponse
c23:p -> c20:p [dir=back,arrowtail=empty,style=dashed];
//HttpResponseFacade extends ResponseFacade
c26:p -> c21:p [dir=back,arrowtail=empty];
//HttpResponseFacade implements HttpServletResponse
c25:p -> c21:p [dir=back,arrowtail=empty,style=dashed];
//ResponseWrapper implements Response
c28:p -> c22:p [dir=back,arrowtail=empty,style=dashed];
//HttpResponse implements Response
c28:p -> c23:p [dir=back,arrowtail=empty,style=dashed];
//ResponseBase implements Response
c28:p -> c24:p [dir=back,arrowtail=empty,style=dashed];
//ResponseBase implements ServletResponse
c27:p -> c24:p [dir=back,arrowtail=empty,style=dashed];
//ResponseFacade implements ServletResponse
c27:p -> c26:p [dir=back,arrowtail=empty,style=dashed];
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;
// HttpResponseBase
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>>];
// HttpResponseWrapper
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>>];
// HttpResponseFacade
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>>];
// ResponseWrapper
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>>];
// HttpResponse
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>>];
// ResponseBase
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>>];
// HttpServletResponse
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>>];
// ResponseFacade
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>>];
// ServletResponse
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>>];
// Response
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>>];
// HttpResponseBase extends ResponseBase
c24 -> c19 [arrowtail=empty,dir=back,weight=10];
// HttpResponseBase implements HttpResponse
c23 -> c19 [arrowtail=empty,style=dashed,dir=back,weight=9];
// HttpResponseBase implements HttpServletResponse
c25 -> c19 [arrowtail=empty,style=dashed,dir=back,weight=9];
// HttpResponseWrapper extends ResponseWrapper
c22 -> c20 [arrowtail=empty,dir=back,weight=10];
// HttpResponseWrapper implements HttpResponse
c23 -> c20 [arrowtail=empty,style=dashed,dir=back,weight=9];
// HttpResponseFacade extends ResponseFacade
c26 -> c21 [arrowtail=empty,dir=back,weight=10];
// HttpResponseFacade implements HttpServletResponse
c25 -> c21 [arrowtail=empty,style=dashed,dir=back,weight=9];
// ResponseWrapper implements Response
c28 -> c22 [arrowtail=empty,style=dashed,dir=back,weight=9];
// HttpResponse implements Response
c28 -> c23 [arrowtail=empty,style=dashed,dir=back,weight=9];
// ResponseBase implements Response
c28 -> c24 [arrowtail=empty,style=dashed,dir=back,weight=9];
// ResponseBase implements ServletResponse
c27 -> c24 [arrowtail=empty,style=dashed,dir=back,weight=9];
// ResponseFacade implements ServletResponse
c27 -> c26 [arrowtail=empty,style=dashed,dir=back,weight=9];
}

View File

@ -5,19 +5,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;
// Person
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];
// Employee
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];
// Client
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];
//Employee extends Person
c30:p -> c31:p [dir=back,arrowtail=empty];
//Client extends Person
c30:p -> c32:p [dir=back,arrowtail=empty];
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;
// Person
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>>];
// Employee
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>>];
// Client
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>>];
// Employee extends Person
c30 -> c31 [arrowtail=empty,dir=back,weight=10];
// Client extends Person
c30 -> c32 [arrowtail=empty,dir=back,weight=10];
}

View File

@ -5,11 +5,12 @@
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// ActionQueue
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];
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;
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Serif",fontsize=10,shape=plaintext];
nodesep=0.25;
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];
// Red
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];
// Green
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];
// Blue
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];
// Pixel COMPOSED Red
c37:p -> c38:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both];
// Pixel COMPOSED Green
c37:p -> c39:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both];
// Pixel COMPOSED Blue
c37:p -> c40:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="yellow", arrowhead=none, arrowtail=diamond, dir=both];
graph [fontnames="svg"]
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10,color="yellow"];
node [fontname="Serif",fontcolor="black",fontsize=14,shape=plaintext,margin=0,width=0,height=0];
nodesep=0.25;
ranksep=0.5;
bgcolor=".7 .9 1";
// Pixel
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>>];
// Red
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>>];
// Green
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>>];
// Blue
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>>];
// Pixel composed Red
c37 -> c38 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
// Pixel composed Green
c37 -> c39 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
// Pixel composed Blue
c37 -> c40 [arrowhead=none,arrowtail=diamond,dir=back,weight=6];
}

View File

@ -5,11 +5,12 @@
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Junk
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];
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;
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Person1
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];
// Person2
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];
// Person3
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];
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;
// Person1
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>>];
// Person2
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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Base
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];
// Test2<B extends a.b.Base>
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];
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;
// 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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// a.b.c.UMLOptions
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.UserGroup
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.User
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.Password
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.UserGroup ASSOC a.b.c.User
c51:p -> c52:p [taillabel="*", label="", headlabel="*\n\n+user ", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// a.b.c.User NAVASSOC a.b.c.Password
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];
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;
// a.b.c.UMLOptions
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>>];
// a.b.c.UserGroup
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>>];
// a.b.c.User
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>>];
// a.b.c.Password
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>>];
// a.b.c.UserGroup assoc a.b.c.User
c51 -> c52 [arrowhead=none,weight=2,taillabel="*", headlabel="*\n\n+user "];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Asset
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];
// InterestBearingItem
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];
// InsurableItem
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];
// BankAccount
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];
// RealEstate
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];
// Security
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];
// Stock
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];
// Bond
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];
// CheckingAccount
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];
// SavingsAccount
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];
//BankAccount extends Asset
c55:p -> c58:p [dir=back,arrowtail=empty];
//BankAccount extends InsurableItem
c57:p -> c58:p [dir=back,arrowtail=empty];
//BankAccount extends InterestBearingItem
c56:p -> c58:p [dir=back,arrowtail=empty];
//RealEstate extends Asset
c55:p -> c59:p [dir=back,arrowtail=empty];
//RealEstate extends InsurableItem
c57:p -> c59:p [dir=back,arrowtail=empty];
//Security extends Asset
c55:p -> c60:p [dir=back,arrowtail=empty];
//Stock extends Security
c60:p -> c61:p [dir=back,arrowtail=empty];
//Bond extends Security
c60:p -> c62:p [dir=back,arrowtail=empty];
//CheckingAccount extends BankAccount
c58:p -> c63:p [dir=back,arrowtail=empty];
//SavingsAccount extends BankAccount
c58:p -> c64:p [dir=back,arrowtail=empty];
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;
// Asset
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>>];
// InterestBearingItem
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>>];
// InsurableItem
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>>];
// BankAccount
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>>];
// RealEstate
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>>];
// Security
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>>];
// Stock
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>>];
// Bond
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>>];
// CheckingAccount
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>>];
// SavingsAccount
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>>];
// BankAccount extends Asset
c55 -> c58 [arrowtail=empty,dir=back,weight=10];
// BankAccount extends InsurableItem
c57 -> c58 [arrowtail=empty,dir=back,weight=10];
// BankAccount extends InterestBearingItem
c56 -> c58 [arrowtail=empty,dir=back,weight=10];
// RealEstate extends Asset
c55 -> c59 [arrowtail=empty,dir=back,weight=10];
// RealEstate extends InsurableItem
c57 -> c59 [arrowtail=empty,dir=back,weight=10];
// Security extends Asset
c55 -> c60 [arrowtail=empty,dir=back,weight=10];
// Stock extends Security
c60 -> c61 [arrowtail=empty,dir=back,weight=10];
// Bond extends Security
c60 -> c62 [arrowtail=empty,dir=back,weight=10];
// CheckingAccount extends BankAccount
c58 -> c63 [arrowtail=empty,dir=back,weight=10];
// SavingsAccount extends BankAccount
c58 -> c64 [arrowtail=empty,dir=back,weight=10];
}

View File

@ -5,13 +5,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;
// Java5
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.States
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];
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;
// Java5
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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// School
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];
// Department
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];
// Student
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];
// Course
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];
// Instructor
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];
// School HAS Student
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 COMPOSED Department
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];
// Department ASSOC Course
c104:p -> c106:p [taillabel="1..*", label="", headlabel="1..*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Department ASSOC Instructor
c104:p -> c107:p [taillabel="0..*", label="", headlabel="0..1 chairperson", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Department HAS Instructor
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];
// Student ASSOC Course
c105:p -> c106:p [taillabel="*", label="Attends", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
// Instructor ASSOC Course
c107:p -> c106:p [taillabel="1..*", label="Teaches", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=none];
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;
// School
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>>];
// Department
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>>];
// Student
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>>];
// Course
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>>];
// Instructor
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>>];
// School has Student
c103 -> c105 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..*", label="Member", headlabel="*"];
// School composed Department
c103 -> c104 [arrowhead=none,arrowtail=diamond,dir=back,weight=6,taillabel="1..*", label="Has", headlabel="1..*"];
// Department assoc Course
c104 -> c106 [arrowhead=none,weight=2,taillabel="1..*", headlabel="1..*"];
// Department assoc Instructor
c104 -> c107 [arrowhead=none,weight=2,taillabel="0..*", headlabel="0..1 chairperson"];
// Department has Instructor
c104 -> c107 [arrowhead=none,arrowtail=ediamond,dir=back,weight=4,taillabel="1..*", label="AssignedTo", headlabel="1..*"];
// Student assoc Course
c105 -> c106 [arrowhead=none,weight=2,taillabel="*", label="Attends", headlabel="*"];
// Instructor assoc Course
c107 -> c106 [arrowhead=none,weight=2,taillabel="1..*", label="Teaches", headlabel="*"];
}

View File

@ -5,13 +5,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;
// Java5
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.States
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];
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;
// Java5
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>>];
// 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 {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// Toolbar
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];
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;
// 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 Test2<B extends a.b.Base> {}
class Test2<B extends Base> {}

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>All Classes</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>All Classes</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>Constant Field Values</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>Deprecated List</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -1,7 +1,7 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-11-g86574a (http://www.umlgraph.org/)
#
digraph G {
@ -10,14 +10,14 @@ digraph G {
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.invoice.Invoice
c33 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c33 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Customer
c34 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Customer.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c34 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Customer.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.Customer
c33:p -> c34:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.invoice.Customer NAVASSOC java.lang.String
c34:p -> c44:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// java.lang.String
c44 [label=<<table title="java.lang.String" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> String </td></tr><tr><td align="center" balign="center"> java.lang </td></tr></table></td></tr></table>>, URL="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c44 [label=<<table title="java.lang.String" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> String </td></tr><tr><td align="center" balign="center"> java.lang </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
}

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>Customer</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>
@ -87,16 +87,8 @@
<div class="header">
<div class="subTitle">gr.spinellis.invoice</div>
<h2 title="Class Customer" class="title">Class Customer</h2>
<map id="G" name="G">
<area shape="rect" id="node1_0" href="./Invoice.html" title="gr.spinellis.invoice.Invoice" alt="" coords="25,16,85,43"/>
<area shape="rect" id="node1" href="./Invoice.html" title="&lt;TABLE&gt;" alt="" coords="14,5,95,53"/>
<area shape="rect" id="node2_1" href="./Customer.html" title="gr.spinellis.invoice.Customer" alt="" coords="16,112,93,139"/>
<area shape="rect" id="node2" href="./Customer.html" title="&lt;TABLE&gt;" alt="" coords="5,101,104,149"/>
<area shape="rect" id="node3_2" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html" title="java.lang.String" alt="" coords="19,203,90,247"/>
<area shape="rect" id="node3" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html" title="&lt;TABLE&gt;" alt="" coords="9,198,101,253"/>
</map>
<!-- UML diagram added by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/) -->
<div align="center"><img src="Customer.png" alt="Package class diagram package Customer" usemap="#G" border=0/></div>
<!-- UML diagram added by UMLGraph version R5_7_2-25-gc0b796 (http://www.spinellis.gr/umlgraph/) -->
<div align="center"><object type="image/svg+xml" data="Customer.svg" alt="Package class diagram package Customer" border=0></object></div>
</div>
<div class="contentContainer">
<ul class="inheritance">

View File

@ -1,7 +1,7 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-11-g86574a (http://www.umlgraph.org/)
#
digraph G {
@ -10,13 +10,13 @@ digraph G {
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.invoice.InvoiceItem
c45 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./InvoiceItem.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c45 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./InvoiceItem.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice
c46 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Invoice.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c46 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Invoice.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Customer
c47 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Customer.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c47 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Customer.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.product.Product
c48 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="../product/Product.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr><tr><td align="center" balign="center"> gr.spinellis.product </td></tr></table></td></tr></table>>, URL="../product/Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c48 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="../product/Product.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr><tr><td align="center" balign="center"> gr.spinellis.product </td></tr></table></td></tr></table>>, URL="../product/Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.InvoiceItem NAVASSOC gr.spinellis.product.Product
c45:p -> c48:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.InvoiceItem
@ -28,6 +28,6 @@ digraph G {
// gr.spinellis.invoice.Invoice DEPEND gr.spinellis.product.Product
c46:p -> c48:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open, style=dashed];
// java.util.Date
c50 [label=<<table title="java.util.Date" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Date </td></tr><tr><td align="center" balign="center"> java.util </td></tr></table></td></tr></table>>, URL="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c50 [label=<<table title="java.util.Date" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/util/Date.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Date </td></tr><tr><td align="center" balign="center"> java.util </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/util/Date.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
}

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>Invoice</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>
@ -93,20 +93,8 @@ var activeTableTab = "activeTableTab";
<div class="header">
<div class="subTitle">gr.spinellis.invoice</div>
<h2 title="Class Invoice" class="title">Class Invoice</h2>
<map id="G" name="G">
<area shape="rect" id="node1_0" href="./InvoiceItem.html" title="gr.spinellis.invoice.InvoiceItem" alt="" coords="16,116,101,143"/>
<area shape="rect" id="node1" href="./InvoiceItem.html" title="&lt;TABLE&gt;" alt="" coords="5,105,112,153"/>
<area shape="rect" id="node4_1" href="../product/Product.html" title="gr.spinellis.product.Product" alt="" coords="101,211,230,255"/>
<area shape="rect" id="node4" href="../product/Product.html" title="&lt;TABLE&gt;" alt="" coords="90,206,241,261"/>
<area shape="rect" id="node2_2" href="./Invoice.html" title="gr.spinellis.invoice.Invoice" alt="" coords="198,16,258,43"/>
<area shape="rect" id="node2" href="./Invoice.html" title="&lt;TABLE&gt;" alt="" coords="187,5,269,53"/>
<area shape="rect" id="node3_3" href="./Customer.html" title="gr.spinellis.invoice.Customer" alt="" coords="147,116,224,143"/>
<area shape="rect" id="node3" href="./Customer.html" title="&lt;TABLE&gt;" alt="" coords="136,105,235,153"/>
<area shape="rect" id="node5_4" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html" title="java.util.Date" alt="" coords="320,107,384,151"/>
<area shape="rect" id="node5" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html" title="&lt;TABLE&gt;" alt="" coords="309,102,395,157"/>
</map>
<!-- UML diagram added by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/) -->
<div align="center"><img src="Invoice.png" alt="Package class diagram package Invoice" usemap="#G" border=0/></div>
<!-- UML diagram added by UMLGraph version R5_7_2-25-gc0b796 (http://www.spinellis.gr/umlgraph/) -->
<div align="center"><object type="image/svg+xml" data="Invoice.svg" alt="Package class diagram package Invoice" border=0></object></div>
</div>
<div class="contentContainer">
<ul class="inheritance">

View File

@ -1,7 +1,7 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-11-g86574a (http://www.umlgraph.org/)
#
digraph G {
@ -10,11 +10,11 @@ digraph G {
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.invoice.InvoiceItem
c51 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./InvoiceItem.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c51 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./InvoiceItem.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice
c52 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c52 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.product.Product
c54 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="../product/Product.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr><tr><td align="center" balign="center"> gr.spinellis.product </td></tr></table></td></tr></table>>, URL="../product/Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c54 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="../product/Product.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr><tr><td align="center" balign="center"> gr.spinellis.product </td></tr></table></td></tr></table>>, URL="../product/Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.InvoiceItem NAVASSOC gr.spinellis.product.Product
c51:p -> c54:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.InvoiceItem

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>InvoiceItem</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>
@ -87,16 +87,8 @@
<div class="header">
<div class="subTitle">gr.spinellis.invoice</div>
<h2 title="Class InvoiceItem" class="title">Class InvoiceItem</h2>
<map id="G" name="G">
<area shape="rect" id="node1_0" href="./InvoiceItem.html" title="gr.spinellis.invoice.InvoiceItem" alt="" coords="16,112,101,139"/>
<area shape="rect" id="node1" href="./InvoiceItem.html" title="&lt;TABLE&gt;" alt="" coords="5,101,112,149"/>
<area shape="rect" id="node3_1" href="../product/Product.html" title="gr.spinellis.product.Product" alt="" coords="39,203,169,247"/>
<area shape="rect" id="node3" href="../product/Product.html" title="&lt;TABLE&gt;" alt="" coords="29,198,179,253"/>
<area shape="rect" id="node2_2" href="./Invoice.html" title="gr.spinellis.invoice.Invoice" alt="" coords="74,16,134,43"/>
<area shape="rect" id="node2" href="./Invoice.html" title="&lt;TABLE&gt;" alt="" coords="63,5,145,53"/>
</map>
<!-- UML diagram added by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/) -->
<div align="center"><img src="InvoiceItem.png" alt="Package class diagram package InvoiceItem" usemap="#G" border=0/></div>
<!-- UML diagram added by UMLGraph version R5_7_2-25-gc0b796 (http://www.spinellis.gr/umlgraph/) -->
<div align="center"><object type="image/svg+xml" data="InvoiceItem.svg" alt="Package class diagram package InvoiceItem" border=0></object></div>
</div>
<div class="contentContainer">
<ul class="inheritance">

View File

@ -1,23 +1,23 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version 5.4 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-11-g86574a (http://www.umlgraph.org/)
#
digraph G {
edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.invoice.InvoiceItem
c0 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./InvoiceItem.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice
c1 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Customer
c2 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Customer.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.InvoiceItem
c1:p -> c0:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.Customer
c1:p -> c2:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
node [fontname="Helvetica",fontsize=10,shape=plaintext];
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.invoice.InvoiceItem
c0 [label=<<table title="gr.spinellis.invoice.InvoiceItem" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./InvoiceItem.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> InvoiceItem </td></tr></table></td></tr></table>>, URL="./InvoiceItem.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice
c1 [label=<<table title="gr.spinellis.invoice.Invoice" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Invoice.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Invoice </td></tr></table></td></tr></table>>, URL="./Invoice.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Customer
c2 [label=<<table title="gr.spinellis.invoice.Customer" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Customer.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Customer </td></tr></table></td></tr></table>>, URL="./Customer.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.InvoiceItem
c1:p -> c0:p [taillabel="", label="", headlabel="*", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.invoice.Invoice NAVASSOC gr.spinellis.invoice.Customer
c1:p -> c2:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
}

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>gr.spinellis.invoice</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>gr.spinellis.invoice</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>
@ -70,16 +70,8 @@
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 title="Package" class="title">Package&nbsp;gr.spinellis.invoice</h1>
<map id="G" name="G">
<area shape="rect" id="node1_0" href="./InvoiceItem.html" title="gr.spinellis.invoice.InvoiceItem" alt="" coords="16,112,101,139"/>
<area shape="rect" id="node1" href="./InvoiceItem.html" title="&lt;TABLE&gt;" alt="" coords="5,101,112,149"/>
<area shape="rect" id="node2_1" href="./Invoice.html" title="gr.spinellis.invoice.Invoice" alt="" coords="91,16,151,43"/>
<area shape="rect" id="node2" href="./Invoice.html" title="&lt;TABLE&gt;" alt="" coords="81,5,162,53"/>
<area shape="rect" id="node3_2" href="./Customer.html" title="gr.spinellis.invoice.Customer" alt="" coords="147,112,224,139"/>
<area shape="rect" id="node3" href="./Customer.html" title="&lt;TABLE&gt;" alt="" coords="136,101,235,149"/>
</map>
<!-- UML diagram added by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/) -->
<div align="center"><img src="gr.spinellis.invoice.png" alt="Package class diagram package gr.spinellis.invoice" usemap="#G" border=0/></div>
<!-- UML diagram added by UMLGraph version R5_7_2-25-gc0b796 (http://www.spinellis.gr/umlgraph/) -->
<div align="center"><object type="image/svg+xml" data="gr.spinellis.invoice.svg" alt="Package class diagram package gr.spinellis.invoice" border=0></object></div>
</div>
<div class="contentContainer">
<ul class="blockList">

View File

@ -2,9 +2,9 @@
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_20) on Tue Oct 28 20:20:40 EET 2014 -->
<!-- Generated by javadoc (1.8.0_121) on Tue Mar 21 19:49:58 EET 2017 -->
<title>gr.spinellis.invoice Class Hierarchy</title>
<meta name="date" content="2014-10-28">
<meta name="date" content="2017-03-21">
<link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../script.js"></script>
</head>

View File

@ -1,7 +1,7 @@
#!/usr/local/bin/dot
#
# Class diagram
# Generated by UMLGraph version R5_7_0-10-g786d98 (http://www.umlgraph.org/)
# Generated by UMLGraph version R5_7_2-11-g86574a (http://www.umlgraph.org/)
#
digraph G {
@ -10,9 +10,9 @@ digraph G {
nodesep=0.25;
ranksep=0.5;
// gr.spinellis.product.Product
c20 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Product.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>, URL="./Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c20 [label=<<table title="gr.spinellis.product.Product" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="./Product.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Product </td></tr></table></td></tr></table>>, URL="./Product.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.product.Category
c21 [label=<<table title="gr.spinellis.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Category.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="./Category.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c21 [label=<<table title="gr.spinellis.product.Category" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" bgcolor="lemonChiffon" href="./Category.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> Category </td></tr></table></td></tr></table>>, URL="./Category.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
// gr.spinellis.product.Product NAVASSOC java.lang.String
c20:p -> c27:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// gr.spinellis.product.Product NAVASSOC gr.spinellis.product.Category
@ -20,6 +20,6 @@ digraph G {
// gr.spinellis.product.Category NAVASSOC java.lang.String
c21:p -> c27:p [taillabel="", label="", headlabel="", fontname="Helvetica", fontcolor="black", fontsize=10.0, color="black", arrowhead=open];
// java.lang.String
c27 [label=<<table title="java.lang.String" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> String </td></tr><tr><td align="center" balign="center"> java.lang </td></tr></table></td></tr></table>>, URL="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
c27 [label=<<table title="java.lang.String" border="0" cellborder="1" cellspacing="0" cellpadding="2" port="p" href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html" target="_parent"><tr><td><table border="0" cellspacing="0" cellpadding="1"><tr><td align="center" balign="center"> String </td></tr><tr><td align="center" balign="center"> java.lang </td></tr></table></td></tr></table>>, URL="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html", fontname="Helvetica", fontcolor="black", fontsize=10.0];
}

Some files were not shown because too many files have changed in this diff Show More