Compare commits

..

No commits in common. "master" and "R5_5" have entirely different histories.
master ... R5_5

248 changed files with 8710 additions and 9595 deletions

7
.classpath Normal file
View File

@ -0,0 +1,7 @@
<?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>

19
.gitignore vendored
View File

@ -1,18 +1,7 @@
*.DS_Store
*.iml
*.ipr
*.iws
*.swp
.idea
.settings
.project
.classpath
_vimrc
build
CHECKSUM.MD5
javadoc
lib
TAGS
target
UMLGraph-R*
UMLGraph-snapshot*
javadoc
UMLGraph-snapshot
UMLGraph-snapshot.tar.gz
UMLGraph-snapshot.zip

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>umlgraph_cvs</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

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

View File

@ -1,9 +1,14 @@
VERSION:=$(shell git describe --abbrev=6 HEAD | sed 's/R//;s/_/./;s/-/./;s/-.*$$/-SNAPSHOT/')
#
# $Id$
#
VERSION?=$(shell git describe --abbrev=6 HEAD)
TAGVERSION=$(shell echo $(VERSION) | sed 's/\./_/g')
BALL_TAR_GZ=UMLGraph-$(VERSION).tar.gz
ZIPBALL=UMLGraph-$(VERSION).zip
DISTDIR=UMLGraph-$(VERSION)
WEBDIR=$(UH)/dds/pubs/web/home/umlgraph
DOCLETSRCPATH=src/main/java/org/umlgraph/doclet
WEBDIR=$(UH)/dds/pubs/web/home/sw/umlgraph-mirror
DOCLETSRCPATH=src/org/umlgraph/doclet
DOCLETSRC= \
$(DOCLETSRCPATH)/ClassGraph.java \
$(DOCLETSRCPATH)/ClassInfo.java \
@ -12,12 +17,14 @@ DOCLETSRC= \
$(DOCLETSRCPATH)/UmlGraph.java \
$(DOCLETSRCPATH)/Version.java
TESTSRC = \
src/main/java/org/umlgraph/test/DotDiff.java \
src/main/java/org/umlgraph/test/BasicTest.java
src/org/umlgraph/test/DotDiff.java \
src/org/umlgraph/test/BasicTest.java
PICFILE=sequence.pic
README=README.txt
LICENSE=LICENSE
OTHERSRC=index.html build.xml Makefile oldversion.html
# Files to tag
ALLTAG=$(DOCLETSRC) $(TESTSRC) $(PICFILE) $(README) $(LICENSE) $(OTHERSRC)
# Documentation location (release)
ifeq ($(VERSION),snapshot)
DOC=snapshot-doc
@ -65,25 +72,19 @@ test:
ant test
testupdate:
bash tools/testupdate.sh
# Create only the static HTML pages
static-web:
(cd web && sh build.sh)
cp web/build/* $(WEBDIR)
sed "s/VERSION/$(VERSION)/g" web/build/download.html >$(WEBDIR)/download.html
sh tools/testupdate.sh
web: $(BALL_TAR_GZ) CHECKSUM.MD5
cp $(BALL_TAR_GZ) $(ZIPBALL) CHECKSUM.MD5 $(WEBDIR)
(cd web && sh build.sh)
cp web/build/* $(WEBDIR)
cp web/build/*.* $(WEBDIR)
sed "s/VERSION/$(VERSION)/g" web/build/download.html >$(WEBDIR)/download.html
cp $(JARFILE) $(WEBDIR)/jars/UmlGraph-$(VERSION).jar
tar cf - javadoc | tar -C $(WEBDIR) -xvf -
CHECKSUM.MD5: $(BALL_TAR_GZ) $(JARFILE)
openssl md5 legacy/UMLGraph-2.10.* legacy/UMLGraph-4.8.* UMLGraph-$(VERSION).* >CHECKSUM.MD5
(cd lib ; openssl md5 UmlGraph.jar) >>CHECKSUM.MD5
md5 legacy/UMLGraph-2.10.* legacy/UMLGraph-4.8.* UMLGraph-$(VERSION).* >CHECKSUM.MD5
(cd lib ; md5 UmlGraph.jar) >>CHECKSUM.MD5
tags:
etags **/*.java
tag:
rcs -nV$(TAGVERSION): $(ALLTAG)

View File

@ -1,69 +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 [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
If you build against Java 8, please use latest version of 5.X of the Doclet.
Since Java 9 doclet APIs where completely rewritten, the Doclet in version 6 supports only supports Java 9 and above.
## 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>
## See also
* [D2: Declarative Diagraming](https://d2lang.com/) (Emphasis on aesthetics and extensionability)
* [Mermaid diagramming and charting tool](https://mermaid.js.org/) (JavaScript-based; easier syntax, good Markdown integration; interactive diagrams)
* [PlantUML](https://plantuml.com/) (Java-based; supports IDEs and more diagram types)
* [Comparison of textual diagraming systems](https://text-to-diagram.com/)

23
README.mediawiki Normal file
View File

@ -0,0 +1,23 @@
==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

21
README.txt Normal file
View File

@ -0,0 +1,21 @@
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

10
TODO
View File

@ -1,14 +1,14 @@
$Id$
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.
State diagrams:
See state-example.dot
See also http://forrst.com/posts/State_Machine_Dont_abuse_the_if-1fE
Note that Hierarchically nested states cannot be shown in GraphViz,
because you can't set shape and labels in cluster, nor can they act
as edge targets.
See alsohttp://forrst.com/posts/State_Machine_Dont_abuse_the_if-1fE
Add in UmlGraphDoc support for showing package dependencies.
See http://java.dzone.com/articles/reverse-engineer-source-code-u#comment-6124

223
build.xml
View File

@ -1,77 +1,20 @@
<project name="umlgraph" default="compile" basedir="."
xmlns:artifact="antlib:org.apache.maven.artifact.ant" >
<project name="umlgraph" default="compile" basedir=".">
<description>
The specification for the Java-based umlgraph build processes.
$Id$
</description>
<!-- set global properties for this build -->
<property name="src" location="src/main/java"/>
<property name="testsrc" location="src/test"/>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="javadoc" location="javadoc"/>
<property name="lib" location="lib"/>
<property name="testsrc" location="test/src"/>
<property name="testout" location="${basedir}/testdata/dot-out"/>
<property name="testref" location="${basedir}/testdata/dot-ref"/>
<property name="dist" location="dist" />
<!-- obtain version from git; see http://techblog.41concepts.com/2009/05/08/generating-ant-build-numbers-using-subversion/ -->
<macrodef name="gitversion" description="Get git version.">
<attribute name="outputproperty"/>
<sequential>
<echo message="git rev-parse --short=6 => '@{outputproperty}'"/>
<exec executable="git"
failonerror="true"
outputproperty="@{outputproperty}">
<arg value="rev-parse"/>
<arg value="--short=6"/>
<arg value="HEAD"/>
<redirector>
<outputfilterchain>
<tokenfilter>
<replaceregex pattern="R" replace=""/>
<replaceregex pattern="_" replace="."/>
<replaceregex pattern="-" replace="."/>
<replaceregex pattern="(-.*)$" replace="-SNAPSHOT"/>
</tokenfilter>
</outputfilterchain>
</redirector>
</exec>
<echo message="gitversion returned '${@{outputproperty}}'"/>
</sequential>
</macrodef>
<!-- define Maven coordinates; see https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-7c.DeploySnapshotsandStageReleaseswithAnt -->
<property name="groupId" value="org.umlgraph" />
<property name="artifactId" value="UmlGraph" />
<!-- <property name="version" value="1.0-SNAPSHOT" /> -->
<gitversion outputproperty="version"/>
<!-- define artifacts' name, which follows the convention of Maven -->
<property name="maven-jar" value="${dist}/lib/${artifactId}-${version}.jar" />
<property name="maven-javadoc-jar" value="${dist}/lib/${artifactId}-${version}-javadoc.jar" />
<property name="maven-sources-jar" value="${dist}/lib/${artifactId}-${version}-sources.jar" />
<!-- defined maven snapshots and staging repository id and url -->
<!-- passwords are stored in \Users\Diomidis Spinellis\.m2\settings.xml -->
<property name="maven-snapshots-repository-id" value="sonatype-nexus-snapshots" />
<property name="maven-snapshots-repository-url" value="https://oss.sonatype.org/content/repositories/snapshots/" />
<property name="maven-staging-repository-id" value="sonatype-nexus-staging" />
<property name="maven-staging-repository-url" value="https://oss.sonatype.org/service/local/staging/deploy/maven2/" />
<!-- 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/>
@ -80,18 +23,18 @@
<mkdir dir="${lib}"/>
<mkdir dir="testdata/dot-out"/>
<mkdir dir="${javadoc}"/>
<mkdir dir="${dist}/lib"/>
</target>
<target name="version">
<exec executable="git"
outputproperty="VERSION">
<arg value="rev-parse"/>
<arg value="--short=6"/>
<arg value="describe"/>
<arg value="--abbrev=6"/>
<arg value="HEAD"/>
</exec>
<echo>Version is ${VERSION}</echo>
<echo file="src/main/java/org/umlgraph/doclet/Version.java">/* Automatically generated file */
<echo file="src/org/umlgraph/doclet/Version.java">/* Automatically generated file */
package org.umlgraph.doclet;
class Version { public static String VERSION = "${VERSION}";}
</echo>
@ -99,12 +42,8 @@ class Version { public static String VERSION = "${VERSION}";}
<target name="compile" depends="init,version"
description="compile the source, build library " >
<javac srcdir="${src}" destdir="${build}" debug="true"
deprecation="true" includeantruntime="false" >
<javac srcdir="${src}" destdir="${build}" debug="true" deprecation="true" >
<compilerarg value="-Xlint"/>
<classpath>
<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
</classpath>
</javac>
<jar basedir="${build}" destfile="${lib}/UmlGraph.jar" includes="org/umlgraph/doclet/*.class">
<manifest>
@ -114,57 +53,38 @@ class Version { public static String VERSION = "${VERSION}";}
</jar>
</target>
<target name="testcompile" depends="init"
description="compile the test code " >
<javac srcdir="${testsrc}" destdir="${build}" debug="true"
deprecation="true" includeantruntime="false" >
<target name="test" depends="compile"
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>
<compilerarg value="-Xlint"/>
</javac>
</target>
<target name="test" depends="compile,testcompile"
description="run the regression tests" >
<!-- 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>
</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>
<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">
@ -172,7 +92,6 @@ 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.*"/>
@ -185,95 +104,5 @@ class Version { public static String VERSION = "${VERSION}";}
</doclet>
</javadoc>
</target>
<target name="pom" description="generate the pom.xml file with the correct version">
<copy file="pom.template.xml"
tofile="pom.xml"
filtering="yes" overwrite="yes">
<filterchain>
<filterreader classname="org.apache.tools.ant.filters.ExpandProperties"/>
</filterchain>
</copy>
</target>
<target name="dist" depends="compile" description="generate the distribution">
<!-- build the main artifact -->
<jar jarfile="${maven-jar}" basedir="${build}" />
<!-- build the javadoc artifact -->
<javadoc sourcepath="${src}" destdir="${dist}/javadoc" />
<jar jarfile="${maven-javadoc-jar}">
<fileset dir="${dist}/javadoc" />
</jar>
<!-- build the sources artifact -->
<jar jarfile="${maven-sources-jar}">
<fileset dir="${src}" />
</jar>
</target>
<target name="deploy" depends="dist,pom" description="deploy snapshot version to Maven snapshot repository">
<!-- for this to work install http://maven.apache.org/ant-tasks/download.html into ant/lib -->
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-deploy-plugin:2.6:deploy-file" />
<arg value="-Durl=${maven-snapshots-repository-url}" />
<arg value="-DrepositoryId=${maven-snapshots-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-jar}" />
</artifact:mvn>
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-deploy-plugin:2.6:deploy-file" />
<arg value="-Durl=${maven-snapshots-repository-url}" />
<arg value="-DrepositoryId=${maven-snapshots-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-sources-jar}" />
<arg value="-Dclassifier=sources" />
</artifact:mvn>
<!-- sign and deploy the javadoc artifact -->
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-deploy-plugin:2.6:deploy-file" />
<arg value="-Durl=${maven-snapshots-repository-url}" />
<arg value="-DrepositoryId=${maven-snapshots-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-javadoc-jar}" />
<arg value="-Dclassifier=javadoc" />
</artifact:mvn>
</target>
<!-- before this, update project version (both build.xml and pom.xml) from SNAPSHOT to RELEASE -->
<target name="stage" depends="dist,pom" description="deploy release version to Maven staging repository">
<!-- sign and deploy the main artifact -->
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-staging-repository-url}" />
<arg value="-DrepositoryId=${maven-staging-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-jar}" />
<arg value="-Pgpg" />
</artifact:mvn>
<!-- sign and deploy the sources artifact -->
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-staging-repository-url}" />
<arg value="-DrepositoryId=${maven-staging-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-sources-jar}" />
<arg value="-Dclassifier=sources" />
<arg value="-Pgpg" />
</artifact:mvn>
<!-- sign and deploy the javadoc artifact -->
<artifact:mvn>
<arg value="org.apache.maven.plugins:maven-gpg-plugin:1.3:sign-and-deploy-file" />
<arg value="-Durl=${maven-staging-repository-url}" />
<arg value="-DrepositoryId=${maven-staging-repository-id}" />
<arg value="-DpomFile=pom.xml" />
<arg value="-Dfile=${maven-javadoc-jar}" />
<arg value="-Dclassifier=javadoc" />
<arg value="-Pgpg" />
</artifact:mvn>
</target>
</project>

27
doc/.gitignore vendored
View File

@ -1,5 +1,28 @@
bib.xml
GUI-DB.gif
advrel.gif
assoc.gif
car.gif
catalina.gif
cd-opt.err
class-eg.gif
classadd.gif
color.gif
dist-52.gif
dnsq.gif
faq.err
fmtcache
general.gif
schema.gif
seq-cd.gif
seq-eg.gif
seq-impr.gif
seq-ops.err
seq-simple.gif
uml-182.gif
uml-184.gif
uml-71.gif
uml-appa.gif
ver.err
vis.gif
*.dot
*.gif
*.err

View File

@ -13,6 +13,7 @@
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# $Id$
#
.PS

View File

@ -1,10 +1,11 @@
#
# $Id$
#
ROOT=/cygdrive/c
PIC2PLOT=pic2plot
GS=gs
DESTDIR=/dds/pubs/web/home/umlgraph
DESTDIR=/dds/pubs/web/home/sw/umlgraph-mirror
NOTETOOLS=/dds/pubs/Courses/tools
GIF := $(shell sed -n 's/.*<img *src *= *"\([^.]*\.gif\)".*/\1/p' *.xml)
XML := $(wildcard *.xml)
@ -38,7 +39,7 @@ DOC?=snapshot-doc
all: sequence.pic $(GIF) $(XML)
sh $(ROOT)/$(NOTETOOLS)/coursebib.sh bib
echo "Drawing UML Diagrams with UMLGraph" | /c/Perl/bin/perl $(NOTETOOLS)/thread.pl -n -h html -r -p ../index.html index ${DESTDIR}/${DOC}
echo "Drawing UML Diagrams with UMLGraph" | perl $(NOTETOOLS)/thread.pl -n -h html -r -p ../index.html index ${DESTDIR}/${DOC}
sequence.pic: ../sequence.pic
perl -p -e 'BEGIN {binmode(STDOUT);} s/\r//' $< >$@

View File

@ -1,4 +1,5 @@
// Author: Vadim Nasardinov
// Version: $Id$
import java.util.List;
import java.util.Map;

View File

@ -1,5 +1,6 @@
// Author: Vadim Nasardinov
// Author: Andrea Aime
// Version: $Id$
import java.util.List;
import java.util.Map;
@ -63,4 +64,4 @@ class DetailedView {}
/**
* @view
*/
class Overview {}
class Overview {}

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<p>
UMLGraph was developed and is being maintained by
@ -46,7 +47,6 @@ 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

@ -1,6 +1,7 @@
/*
* Advanced relationships
* UML User Guide p. 137
* $Id$
*/
/**

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
To run the UMLGraph doclet from <em>ant</em>, use a rule,
like the following.

View File

@ -1,3 +1,4 @@
// $Id$
/**
* Associations with visibility

View File

@ -110,14 +110,3 @@
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

@ -1,3 +1,4 @@
// $Id$
class Tyre {}
class Engine {}

View File

@ -1,5 +1,6 @@
/*
* Interface and generalization relationships in Jakarta Catalina
* $Id$
*/
/**

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-7" ?>
<!-- $Id$ -->
<notes>
One specifies a class diagram using the Java syntax complemented by
<a href="http://java.sun.com/j2se/javadoc/"><em>javadoc</em></a>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The UMLGraph class diagrams allows you to model
<ul>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
In UMLGraph you can easily add a note (comment) to an element,
using the <code>@note</code> tag.

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
UMLGraph's input follows the Java syntax and semantics.
However,
@ -72,14 +73,6 @@ 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,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Since the options are really a part of the generated graph you
want in many cases to include them in the diagram specification.

View File

@ -1,10 +1,10 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
A number of options control the operation of UMLGraph
A number of options contol the operation of UMLGraph
class diagram generator.
These can be specified on the command line, and most can also
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.
be specified through javadoc tags within the diagram, affecting all or some elements.
<p/>
<h2>What Gets Drawn</h2> <!-- {{{1 -->
<dl>
@ -28,12 +28,8 @@ Most have a negated version by prefixing an exclamation mark.
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.
@ -44,7 +40,6 @@ Most have a negated version by prefixing an exclamation mark.
<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>
@ -83,9 +78,9 @@ Most have a negated version by prefixing an exclamation mark.
<p />
All colors can be either a symbolic name (e.g. blue),
a triple specifying hue-saturation-brightness as values 0-1
a tripple specifying hue-saturation-brightness as values 0-1
(e.g. ".13 0.9 1"),
or a triple specifying red-green-blue values as hexadecimal
or a tripple 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
@ -188,6 +183,10 @@ 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

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
UmlGraphDoc is a standard doclet wrapper that combines
the standard doclet output (javadoc documentation) along with auto-generated

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>
@ -31,7 +32,7 @@ class SetTopController implements URLStreamHandler {
void connect() {}
}
/** @depend - &lt;friend&gt; - SetTopController */
/** @depend - <friend> - SetTopController */
class ChannelIterator {}
interface URLStreamHandler {

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<fmtcode ext="java">
/*

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,12 +1,12 @@
<?xml version="1.0" ?>
<!-- $Id: ceg-schema.xml,v 1.1 2005/11/23 22:21:22 dds Exp $ -->
<notes>
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.
The following was generated by annotating the source code of the
<a href="http://www.sqo-oss.org">SQO-OSS</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 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!
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!
</p>
</blockquote>
<p />

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>
@ -20,8 +21,8 @@ class UMLOptions {}
class Person {
House[] houses;
List&lt;Dog&gt; dogs;
List<Dog> dogs;
public Room getFavouriteRoom(House house) {}
}
@ -29,7 +30,7 @@ class Person {
* @opt inferreltype composed
*/
class House {
Map&lt;String, Room&gt; nameRoomMap;
Map<String, Room> nameRoomMap;
}
class Room {}
@ -37,6 +38,7 @@ class Room {}
class Dog {
Person owner;
}
</fmtcode>
</td><td>
<img src="infer.png" alt="UML diagram with relationship inference" />

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Vadim Nasardinov noted that an advantage of UMLGraph over many
GUI-oriented UML drawing tools is the ability
@ -15,6 +16,7 @@ a Makefile illustrates a way to organize this process.
<h2>Java Description</h2>
<fmtcode ext="java">
// Author: Vadim Nasardinov
// Version: $Id$
import java.util.List;
import java.util.Map;
@ -61,7 +63,8 @@ class DataOperation extends Element {}
<fmtcode ext="mak">
# Author: Vadim Nasardinov (vadimn@redhat.com)
# Since: 2004-05-26
# See: http://www.spinellis.gr/umlgraph/doc/ceg-mv.html
# Version: $Id$
# See: http://www.spinellis.gr/sw/umlgraph/doc/ceg-mv.html
# Requires: graphviz
# Requires: javadoc
@ -93,18 +96,18 @@ clean:
build/%.dot : %.java
mkdir -p $(dir $@)
$(jd) $(jd_flags) $(detailed_flags) -output $@ $&lt;
$(jd) $(jd_flags) $(detailed_flags) -output $@ $<
build/%-small.dot : %.java
mkdir -p $(dir $@)
$(jd) $(jd_flags) -output $@ $&lt;
$(jd) $(jd_flags) -output $@ $<
%.png : %.dot
dot -Nheight=0.2 -Elabelfontcolor=DarkSlateBlue -Elabelfontsize=8 -Tpng -o $@ $&lt;
dot -Nheight=0.2 -Elabelfontcolor=DarkSlateBlue -Elabelfontsize=8 -Tpng -o $@ $<
build/%.png : %.fig
mkdir -p $(dir $@)
fig2dev -L png -S 4 $&lt; $@
fig2dev -L png -S 4 $< $@
dot: $(dot_files)
@ -112,7 +115,7 @@ png: $(png_files)
build/%.png : %.png
mkdir -p $(dir $@)
cp $&lt; $@
cp $< $@
# Example usage:
# make debug-java_files

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<fmtcode ext="java">
/**

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<table>
<tr><td>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The makefile-based multiple view example can be generated by using internal
view support by means of the following sources (note the use of UmlOptions
@ -8,6 +9,7 @@ diagrams at different detail level).
<fmtcode ext="java">
// Author: Vadim Nasardinov
// Author: Andrea Aime
// Version: $Id$
import java.util.List;
import java.util.Map;

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Views are especially interesting in big projects, since they allow to
generate package specific diagrams and overview diagrams in a quick and

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Views are special classes that allow the generation of a custom class
diagram based on a set of diagram global options and a set of option

View File

@ -1,3 +1,4 @@
// $Id$
/**
* @opt nodefillcolor ".13 .9 1"

View File

@ -1,6 +1,7 @@
/*
* Class stereotypes and tagged values
* UML User Guide p. 439
* $Id$
*/
/**

View File

@ -1,3 +1,4 @@
// $Id$
/**
* @opt edgecolor "yellow"

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Here are other programs or efforts that build on UMLGraph's
code or ideas.
@ -34,12 +35,5 @@ UMLGraph diagrams in
<a href="http://wiki.splitbrain.org/wiki:dokuwiki">DokuWiki</a>.</li>
<li> Mykhaylo Sorochan has built on top of UMLGraph a
<a href="http://macroexpand.org/doku.php/articles:uml-sequence-diagram-dsl-txl:start">higher-level domain-specific language for specifying UML sequence diagrams</a>.</li>
<li>
<a href="http://sketchlet.sourceforge.net/">Sketchlet</a> is using UMLGraph as a widget plugin. You can find a video about the Sketchlet UMLGraph widget usage at <a href="http://www.youtube.com/watch?v=H6lrgSYyzE0">http://www.youtube.com/watch?v=H6lrgSYyzE0</a>.
</li>
<li>
<a href="http://argouml-graphviz.tigris.org/">argouml-graphviz</a>
is a plugin to let ArgoUML generate graphviz files.
</li>
</ul>
</notes>

View File

@ -1,5 +1,6 @@
# UML Distilled: Figure 5-2 p. 70
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, based on the diagram appearing on p. 70 of
UML Distilled, contains self calls, object activation,

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, illustrates the operating system calls of
a typical DNS query.
@ -16,6 +17,7 @@ drawing facility.
#
# DNS query collaboration diagram
#
# $Id$
#
.PS

View File

@ -4,6 +4,7 @@
#
# DNS query collaboration diagram
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<!--

View File

@ -1,6 +1,7 @@
/*
* Generalisation
* UML User Guide p. 141
* $Id$
*/
/* Basic categorisations */

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following sequence diagram demonstrates the use of the frame and comment elements.
<h2>Diagram</h2>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<index>
<ch><ti>Introduction</ti><fi>intro</fi></ch>
<ch><ti>Installation</ti><fi>install</fi></ch>

View File

@ -1,5 +1,6 @@
/*
* Relationship inference
* $Id$
*/
import java.util.List;

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-7" ?>
<!-- $Id$ -->
<notes>
To install UmlGraph follow these steps.
<ol>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
UMLGraph allows the declarative specification and drawing of
UML class and sequence diagrams.

View File

@ -1,6 +1,7 @@
/*
* Schema model
* UML User Guide p. 112
* $Id$
*/
/**

View File

@ -1,4 +1,5 @@
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Objects do not always appear at the top of a UML sequence diagram;
they are often constructed by other objects.

View File

@ -1,5 +1,6 @@
# UML User Guide: Appendix A,p. 436
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Let us try to improve the simple sequence diagram.
<fmtcode ext="pic">

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
One specifies a sequence diagram using <em>pic</em> macros to define
objects and method invocations.

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- $Id$ -->
<notes>
The following calls can be used to define a sequence diagram.
<dl>

View File

@ -1,4 +1,5 @@
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
A sequence diagram is defined in three main phases:
<ol>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Sequence diagrams consist of objects, their lifelines
(also known as smimming lanes),

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The value of
<em>pic</em> variables can sometimes be modified by assignment

View File

@ -14,6 +14,7 @@
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# $Id$
#

View File

@ -1,5 +1,6 @@
# UML User Guide: Figure 18-2
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, based on the one appearing on p. 247 of the
UML User Guide, illustrates the dynamic creation and destruction of

View File

@ -1,5 +1,6 @@
# UML User Guide: Figure 18-4
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, based on Figure 18-4 appearing on p. 252 of the
UML User Guide, illustrates constraints on an object's lifeline,
@ -30,7 +31,7 @@ async(); message(S,W,"liftReceiver"); sync();
active(S);
message(W,S,"setDialTone()");
async(); message(S,W,"*dialDigit(d)"); sync();
lconstraint(W,"{dialing.executionTime &lt; 30s}");
lconstraint(W,"{dialing.executionTime < 30s}");
active(W);
message(W,W,"routeCalls(s,n)");
inactive(W);

View File

@ -1,5 +1,6 @@
# UML User Guide Figure 7-1.
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, based on Figure 7-1 appearing on p. 102 of the
UML User Guide, illustrates an interaction diagram with an

View File

@ -1,5 +1,6 @@
# UML User Guide: Appendix A,p. 436
#
# $Id$
#
.PS

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
The following diagram, based on the one appearing on p. 436 of the
UML User Guide, contains the most important elements

View File

@ -1,29 +1,9 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
<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>
<ul>
<li>Maven artifact deployment</li>
</ul>
<dt>Version 5.6 Under development </dt><dd>
</dd>
<dt>Version 5.5 2012-05-13 </dt><dd>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" ?>
<!-- $Id$ -->
<notes>
Documenting a big project often requires multiple diagrams:
each to show a specific and limited portion of the system.

View File

@ -1,3 +1,4 @@
// $Id$
/**
* Attribute and operation visility

View File

@ -1,38 +0,0 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.umlgraph</groupId>
<artifactId>umlgraph</artifactId>
<packaging>jar</packaging>
<name>UMLGraph</name>
<version>${version}</version>
<description>Declarative Drawing of UML Diagrams</description>
<url>http://www.spinellis.gr/umlgraph</url>
<licenses>
<license>
<name>BSD License (original)</name>
<url>http://www.opensource.org/licenses/bsd-license.php</url>
<distribution>repo</distribution>
</license>
</licenses>
<scm>
<url>https://github.com/dspinellis/UMLGraph</url>
<connection>git://github.com/dspinellis/UMLGraph.git</connection>
</scm>
<developers>
<developer>
<id>dspinellis</id>
<name>Diomidis Spinellis</name>
<email>dds@aueb.gr</email>
</developer>
</developers>
<dependencies/>
</project>

156
pom.xml
View File

@ -1,156 +0,0 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.umlgraph</groupId>
<artifactId>umlgraph</artifactId>
<packaging>jar</packaging>
<name>UMLGraph</name>
<version>6.0.1-SNAPSHOT</version>
<description>Declarative Drawing of UML Diagrams</description>
<url>http://www.spinellis.gr/umlgraph</url>
<licenses>
<license>
<name>BSD License (original)</name>
<url>http://www.opensource.org/licenses/bsd-license.php</url>
<distribution>repo</distribution>
</license>
</licenses>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<scm>
<url>https://github.com/dspinellis/UMLGraph/</url>
<connection>scm:git://github.com/dspinellis/UMLGraph.git</connection>
<developerConnection>scm:git:git@github.com:dspinellis/UMLGraph.git</developerConnection>
<tag>R5_7_1</tag>
</scm>
<developers>
<developer>
<id>dspinellis</id>
<name>Diomidis Spinellis</name>
<email>dds@aueb.gr</email>
</developer>
</developers>
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>9</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>org.umlgraph.doclet.UmlGraph</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>3.0.0-M7</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<tags>
<tag>
<name>depend</name>
<placement>X</placement>
</tag>
<tag>
<name>hidden</name>
<placement>X</placement>
</tag>
<tag>
<name>opt</name>
<placement>X</placement>
</tag>
</tags>
<doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>
<docletPath>${project.build.directory}${file.separator}${project.build.finalName}.jar</docletPath>
<additionalOptions>
<option>-inferrel</option>
<option>-inferdep</option>
<option>-autosize</option>
<option>-collapsible</option>
<option>--hide="java.*"</option>
<option>--collpackages=</option>
<option>-qualify</option>
<option>-postfixpackage</option>
<option>-nodefontsize 9</option>
<option>-nodefontpackagesize 7</option>
<option>--link="https://docs.oracle.com/javase/9/docs/api/"</option>
</additionalOptions>
<detectJavaApiLink>false</detectJavaApiLink>
<useStandardDocletOptions>true</useStandardDocletOptions>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -14,6 +14,7 @@
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# $Id$
#

View File

@ -1,6 +0,0 @@
module org.umlgraph.doclet {
exports org.umlgraph.doclet;
opens org.umlgraph.doclet;
requires transitive jdk.javadoc;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,210 +0,0 @@
/*
* Contibuted by Andrea Aime
* (C) Copyright 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 java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
/**
* Matches classes that are directly connected to one of the classes matched by
* the regual expression specified. The context center is computed by regex
* lookup. Depending on the specified Options, inferred relations and
* dependencies will be used as well.
* <p>
* This class needs to perform quite a bit of computations in order to gather
* the network of class releationships, so you are allowed to reuse it should
* you
*
* @author wolf
*
* @depend - - - DevNullWriter
*/
public class ContextMatcher implements ClassMatcher {
ClassGraphHack cg;
Pattern pattern;
List<TypeElement> matched;
Set<String> visited = new HashSet<>();
/** The options will be used to decide on inference */
Options opt;
DocletEnvironment root;
boolean keepParentHide;
/**
* Builds the context matcher
*
* @param root The root doc returned by JavaDoc
* @param pattern The pattern that will match the "center" of this
* context
* @param keepParentHide If true, parent option hide patterns will be preserved,
* so that classes hidden by the options won't be shown in
* the context
* @throws IOException
*/
public ContextMatcher(DocletEnvironment root, Pattern pattern, Options options, boolean keepParentHide) throws IOException {
this.pattern = pattern;
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" });
this.cg = new ClassGraphHack(root, opt);
setContextCenter(pattern);
}
/**
* Can be used to setup a different pattern for this context matcher.
* <p>
* This can be used to speed up subsequent matching with the same global
* options, since the class network informations will be reused.
*
* @param pattern
*/
public void setContextCenter(Pattern pattern) {
// build up the classgraph printing the relations for all of the
// classes that make up the "center" of this context
this.pattern = pattern;
matched = new ArrayList<>();
for (Element cd : root.getIncludedElements()) {
if (cd instanceof TypeElement && pattern.matcher(cd.toString()).matches()) {
matched.add((TypeElement) cd);
addToGraph((TypeElement) cd);
}
}
}
/**
* Adds the specified class to the internal class graph along with its relations
* and dependencies, eventually inferring them, according to the Options
* specified for this matcher
*
* @param cd
*/
private void addToGraph(TypeElement 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
if (visited.contains(cd.toString())) {
return;
}
visited.add(cd.toString());
cg.printClass(cd, false);
cg.printRelations(cd);
if (opt.inferRelationships) {
cg.printInferredRelations(cd);
}
if (opt.inferDependencies) {
cg.printInferredDependencies(cd);
}
}
/**
* @see org.umlgraph.doclet.ClassMatcher#matches(TypeElement)
*/
public boolean matches(TypeElement cd) {
if (keepParentHide && opt.matchesHideExpression(cd.getQualifiedName())) {
return false;
}
// if the class is matched, it's in by default.
if (matched.contains(cd)) {
return true;
}
// otherwise, add the class to the graph and see if it's associated
// with any of the matched classes using the classgraph hack
addToGraph(cd);
return matches(cd.toString());
}
/**
* @see org.umlgraph.doclet.ClassMatcher#matches(CharSequence)
*/
public boolean matches(CharSequence name) {
if (pattern.matcher(name).matches()) {
return true;
}
for (TypeElement mcd : matched) {
RelationPattern rp = cg.getClassInfo(mcd, true).getRelation(name);
if (rp != null && opt.contextRelationPattern.matchesOne(rp)) {
return true;
}
}
return false;
}
/**
* A quick hack to compute class dependencies reusing ClassGraph but without
* generating output. Will be removed once the ClassGraph class will be split
* into two classes for graph computation and output generation.
*
* @author wolf
*
*/
private static class ClassGraphHack extends ClassGraph {
public ClassGraphHack(DocletEnvironment root, OptionProvider optionProvider) throws IOException {
super(root, optionProvider, null);
prologue();
}
@Override
public void prologue() throws IOException {
w = new PrintWriter(new DevNullWriter());
}
}
/**
* Simple dev/null imitation
*
* @author wolf
*/
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

@ -1,133 +0,0 @@
package org.umlgraph.doclet;
import java.io.IOException;
import java.util.regex.Pattern;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.TypeElement;
import org.umlgraph.doclet.util.ElementUtil;
import com.sun.source.util.DocTrees;
/**
* A view designed for UMLDoc, filters out everything that it's not directly
* connected to the center class of the context.
* <p>
* As such, can be viewed as a simplified version of a {@linkplain View} using a
* single {@linkplain ContextMatcher}, but provides some extra configuration
* such as context highlighting and output path configuration (and it is
* specified in code rather than in javadoc comments).
*
* @author wolf
*
*/
public class ContextView implements OptionProvider {
private TypeElement cd;
private DocletEnvironment root;
private ContextMatcher matcher;
private Options globalOptions;
private Options myGlobalOptions;
private Options hideOptions;
private Options centerOptions;
private Options packageOptions;
private static final String[] HIDE_OPTIONS = new String[] { "hide" };
public ContextView(String outputFolder, TypeElement cd, DocletEnvironment root, Options parent) throws IOException {
this.cd = cd;
this.root = root;
ModuleElement md = ElementUtil.getModuleOf(root, cd);
String pathPrefix = Runtime.version().major() > 10 && md != null ? md.getQualifiedName().toString() + "/" : "";
String outputPath = pathPrefix + ElementUtil.getPackageOf(root, cd).getQualifiedName().toString().replace('.', '/') + "/" + cd.getSimpleName() + ".dot";
// setup options statically, so that we won't need to change them so
// often
this.globalOptions = parent.getGlobalOptions();
this.packageOptions = parent.getGlobalOptions();
this.packageOptions.showQualified = false;
this.myGlobalOptions = parent.getGlobalOptions();
this.myGlobalOptions.setOption(new String[] { "output", outputPath });
this.myGlobalOptions.setOption(HIDE_OPTIONS);
this.hideOptions = parent.getGlobalOptions();
this.hideOptions.setOption(HIDE_OPTIONS);
this.centerOptions = parent.getGlobalOptions();
this.centerOptions.nodeFillColor = "lemonChiffon";
this.centerOptions.showQualified = false;
this.matcher = new ContextMatcher(root, Pattern.compile(Pattern.quote(cd.toString())), myGlobalOptions, true);
}
public void setContextCenter(TypeElement contextCenter) {
this.cd = contextCenter;
ModuleElement md = ElementUtil.getModuleOf(root, contextCenter);
String pathPrefix = Runtime.version().major() > 10 && md != null ? md.getQualifiedName().toString() + "/" : "";
String outputPath = pathPrefix + ElementUtil.getPackageOf(root, cd).getQualifiedName().toString().replace('.', '/') + "/" + cd.getSimpleName() + ".dot";
this.myGlobalOptions.setOption(new String[] { "output", outputPath });
matcher.setContextCenter(Pattern.compile(Pattern.quote(cd.toString())));
}
public String getDisplayName() {
return "Context view for class " + cd;
}
public Options getGlobalOptions() {
return myGlobalOptions;
}
public Options getOptionsFor(DocTrees dt, TypeElement cd) {
Options opt;
if (globalOptions.matchesHideExpression(cd.getQualifiedName())
|| !(matcher.matches(cd) || globalOptions.matchesIncludeExpression(cd.getQualifiedName()))) {
opt = hideOptions;
} else if (cd.equals(this.cd)) {
opt = centerOptions;
} else if (root.getElementUtils().getPackageOf(cd).equals(root.getElementUtils().getPackageOf(this.cd))) {
opt = packageOptions;
} else {
opt = globalOptions;
}
Options optionClone = (Options) opt.clone();
overrideForClass(optionClone, cd);
return optionClone;
}
public Options getOptionsFor(CharSequence name) {
Options opt;
if (!matcher.matches(name)) {
opt = hideOptions;
} else if (name.equals(cd.getSimpleName())) {
opt = centerOptions;
} else {
opt = globalOptions;
}
Options optionClone = (Options) opt.clone();
overrideForClass(optionClone, name);
return optionClone;
}
public void overrideForClass(Options opt, TypeElement cd) {
opt.setOptions(root.getDocTrees(), cd);
if (opt.matchesHideExpression(cd.getQualifiedName())
|| !(matcher.matches(cd) || opt.matchesIncludeExpression(cd.getQualifiedName()))) {
opt.setOption(HIDE_OPTIONS);
}
if (cd.equals(this.cd)) {
opt.nodeFillColor = "lemonChiffon";
}
}
public void overrideForClass(Options opt, CharSequence className) {
if (!(matcher.matches(className) || opt.matchesIncludeExpression(className))) {
opt.setOption(HIDE_OPTIONS);
}
}
}

View File

@ -1,101 +0,0 @@
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

@ -1,52 +0,0 @@
package org.umlgraph.doclet;
import java.util.regex.Pattern;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import org.umlgraph.doclet.util.ElementUtil;
/**
* Matches every class that implements (directly or indirectly) an interfaces
* matched by regular expression provided.
*/
public class InterfaceMatcher implements ClassMatcher {
protected DocletEnvironment root;
protected Pattern pattern;
public InterfaceMatcher(DocletEnvironment root, Pattern pattern) {
this.root = root;
this.pattern = pattern;
}
public boolean matches(TypeElement cd) {
// if it's the interface we're looking for, match
if (cd.getKind() == ElementKind.INTERFACE && pattern.matcher(cd.toString()).matches()) {
return true;
}
// for each interface, recurse, since classes and interfaces
// are treated the same in the doclet API
for (TypeMirror type : cd.getInterfaces()) {
TypeElement iType = ElementUtil.getTypeElement(type);
if (iType != null && matches(iType)) {
return true;
}
}
// recurse on superclass, if available
TypeElement scd = ElementUtil.getTypeElement(cd.getSuperclass());
return scd == null ? false : matches(scd);
}
public boolean matches(CharSequence name) {
TypeElement cd = root.getElementUtils().getTypeElement(name);
return cd == null ? false : matches(cd);
}
}

View File

@ -1,53 +0,0 @@
package org.umlgraph.doclet;
import java.util.List;
import jdk.javadoc.doclet.Doclet;
/**
* A base class for declaring options. Subtypes for specific options should
* implement the {@link #process(String,List) process} method to handle
* instances of the option found on the command line.
*/
public abstract class Option implements Doclet.Option {
private final String name;
private final int argumentCount;
private final String description;
private final String parameters;
public Option(String name, boolean hasArg, String description, String parameters) {
this(name, hasArg ? 1 : 0, description, parameters);
}
public Option(String name, int argumentCount, String description, String parameters) {
this.name = name;
this.argumentCount = argumentCount;
this.description = description;
this.parameters = parameters;
}
@Override
public int getArgumentCount() {
return argumentCount;
}
@Override
public String getDescription() {
return description;
}
@Override
public Kind getKind() {
return Kind.STANDARD;
}
@Override
public List<String> getNames() {
return List.of(name);
}
@Override
public String getParameters() {
return argumentCount == 0 ? "" : parameters;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +0,0 @@
package org.umlgraph.doclet;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import org.umlgraph.doclet.util.ElementUtil;
public class PackageMatcher implements ClassMatcher {
protected DocletEnvironment root;
protected PackageElement packageDoc;
public PackageMatcher(DocletEnvironment root, PackageElement packageDoc) {
this.root = root;
this.packageDoc = packageDoc;
}
public boolean matches(TypeElement cd) {
return packageDoc.equals(ElementUtil.getPackageOf(root, cd));
}
public boolean matches(CharSequence name) {
for (Element cd : packageDoc.getEnclosedElements()) {
if (cd instanceof TypeElement && ((TypeElement) cd).getQualifiedName().equals(name)) {
return true;
}
}
return false;
}
}

View File

@ -1,95 +0,0 @@
package org.umlgraph.doclet;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import org.umlgraph.doclet.util.ElementUtil;
import com.sun.source.util.DocTrees;
/**
* A view designed for UMLDoc, filters out everything that it's not contained in
* the specified package.
* <p>
* As such, can be viewed as a simplified version of a {@linkplain View} using a
* single {@linkplain ClassMatcher}, and provides some extra configuration such
* as output path configuration (and it is specified in code rather than in
* javadoc comments).
*
* @author wolf
*
*/
public class PackageView implements OptionProvider {
private static final String[] HIDE = new String[] { "hide" };
private PackageElement pd;
private OptionProvider parent;
private ClassMatcher matcher;
private String outputPath;
private Options opt;
private DocTrees docTrees;
public PackageView(String outputFolder, PackageElement pd, DocletEnvironment root, OptionProvider parent) {
this.parent = parent;
this.pd = pd;
this.docTrees = root.getDocTrees();
this.matcher = new PackageMatcher(root, pd);
this.opt = parent.getGlobalOptions();
this.opt.setOptions(docTrees, pd);
ModuleElement md = ElementUtil.getModuleOf(root, pd);
String pathPrefix = Runtime.version().major() > 10 && md != null ? md.getQualifiedName().toString() + "/" : "";
this.outputPath = pathPrefix + pd.getQualifiedName().toString().replace('.', '/') + "/" + pd.getSimpleName().toString() + ".dot";
}
public String getDisplayName() {
return "Package view for package " + pd;
}
public Options getGlobalOptions() {
Options go = parent.getGlobalOptions();
go.setOption(new String[] { "output", outputPath });
go.setOption(HIDE);
return go;
}
public Options getOptionsFor(DocTrees dt, TypeElement cd) {
Options go = parent.getGlobalOptions();
overrideForClass(go, cd);
return go;
}
public Options getOptionsFor(CharSequence name) {
Options go = parent.getGlobalOptions();
overrideForClass(go, name);
return go;
}
public void overrideForClass(Options opt, TypeElement cd) {
opt.setOptions(docTrees, cd);
boolean inPackage = matcher.matches(cd);
if (inPackage) {
opt.showQualified = false;
}
boolean included = inPackage || this.opt.matchesIncludeExpression(cd.getQualifiedName());
if (!included || this.opt.matchesHideExpression(cd.getQualifiedName())) {
opt.setOption(HIDE);
}
}
public void overrideForClass(Options opt, CharSequence className) {
opt.showQualified = false;
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

@ -1,34 +0,0 @@
package org.umlgraph.doclet;
/**
* The type of relation that links two entities, and the graphviz format
*
* @author Erich Schubert
*/
public enum RelationType {
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

@ -1,83 +0,0 @@
/*
* Manage the GraphViz interface for node shapes
*
* (C) Copyright 2007 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 java.util.HashMap;
import java.util.Locale;
/**
* Properties of node shapes
*
* @version $Revision$
* @author Erich Schubert
*/
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("");
/** Graphviz style */
public final String style;
/** Map for valid shape names */
private static final HashMap<String, Shape> index = new HashMap<String, Shape>(16);
/** Initialize the lookup index */
static {
for (Shape s : Shape.values()) {
index.put(s.name(), s);
index.put(s.name().toLowerCase(Locale.ROOT), s);
}
}
/**
* 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 static Shape of(String s) {
Shape shp = index.get(s);
if (shp != null)
return shp;
System.err.println("Ignoring invalid shape: " + s);
return CLASS;
}
/** Enum constructor, must be private! */
private Shape(String style) {
this.style = style;
}
/** Return the table border required for the shape */
public String extraColumn() {
return this == Shape.ACTIVECLASS ? ("<td rowspan=\"10\"></td>") : "";
}
/** Return the cell border required for the shape */
public String cellBorder() {
return this == CLASS || this == ACTIVECLASS ? "1" : "0";
}
}

View File

@ -1,239 +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 javax.lang.model.element.Name;
import javax.lang.model.util.Elements;
import java.util.*;
import java.util.regex.Pattern;
/**
* String utility functions
*
* @version $Revision$
* @author <a href="http://www.spinellis.gr">Diomidis Spinellis</a>
*/
class StringUtil {
/** Tokenize string s into an array */
public static String[] tokenize(String s) {
ArrayList<String> r = new ArrayList<String>();
String remain = s;
int n = 0, pos;
remain = remain.trim();
while (remain.length() > 0) {
if (remain.startsWith("\"")) {
// Field in quotes
pos = remain.indexOf('"', 1);
if (pos == -1)
break;
r.add(remain.substring(1, pos));
if (pos + 1 < remain.length())
pos++;
} else {
// Space-separated field
pos = remain.indexOf(' ', 0);
if (pos == -1) {
r.add(remain);
remain = "";
} else
r.add(remain.substring(0, pos));
}
remain = remain.substring(pos + 1);
remain = remain.trim();
// - is used as a placeholder for empy fields
if (r.get(n).equals("-"))
r.set(n, "");
n++;
}
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 Name removeTemplate(Elements elements, Name name) {
int openIdx = name.toString().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 elements.getName(buf.toString());
}
public static String buildRelativePathFromClassNames(Name contextPackageName, String classPackageName) {
// path, relative to the root, of the destination class
String[] contextClassPath = contextPackageName.toString().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 name
* @return Splitting point (Either referring to a dot, or -1)
*/
public static int splitPackageClass(CharSequence name) {
String className = name.toString();
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

@ -1,41 +0,0 @@
package org.umlgraph.doclet;
import java.util.regex.Pattern;
import jdk.javadoc.doclet.DocletEnvironment;
import javax.lang.model.element.TypeElement;
import org.umlgraph.doclet.util.ElementUtil;
/**
* Matches every class that extends (directly or indirectly) a class matched by
* the regular expression provided.
*/
public class SubclassMatcher implements ClassMatcher {
protected DocletEnvironment root;
protected Pattern pattern;
public SubclassMatcher(DocletEnvironment root, Pattern pattern) {
this.root = root;
this.pattern = pattern;
}
public boolean matches(TypeElement cd) {
// if it's the class we're looking for return
if (pattern.matcher(cd.toString()).matches()) {
return true;
}
// recurse on superclass, if available
TypeElement scd = ElementUtil.getTypeElement(cd.getSuperclass());
return scd == null ? false : matches(scd);
}
public boolean matches(CharSequence name) {
TypeElement cd = root.getElementUtils().getTypeElement(name);
return cd == null ? false : matches(cd);
}
}

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