- From: <Joel.Crisp@bristol.ac.uk>
- Date: Tue, 14 Jan 1997 16:14:38 +0000 (GMT)
- To: www-jigsaw@www10.w3.org
- Message-Id: <199701141619.QAA14657@mail.ilrt.bris.ac.uk>
Hi Those of you working with UNIX and JAVA 1.02 might be interested in the following perl script. It takes a set of JAVA 1.02 classes and builds a daVinci TERM tree from them. It colours nodes according to their package, differentiates between classes and interfaces, and will store/load a colour map of packages from an auxilary file. If you are not familier with daVinci, it is a superb free (for non- commercial use) Tree, DAG, and cyclic graph viewer available from the University of Bremen. <URL:HTTP://www.informatik.uni-bremen.de/~davinci/> The best options for viewing the resultant graph are : Layout/Orientation/Left to Right Options/Layout Algorithm/Quality = 5 Options/Layout Algorithm/Keep Nodes At Levels = OFF I've found it extremely useful when dealing with my Jigsaw extensions. (Just to validate my posting this to this list ! ;-) ----^) Joel -- Joel.Crisp@bris.ac.uk | ets-webmaster@bris.ac.uk | "I remember Babylon" - Software Engineer, Institute for Learning and | Arthur C Clarke Research Technology, University of Bristol, UK | http://www.ets.bris.ac.uk/ |
#!/usr/local/bin/perl
# $Id: java2davinci,v 1.2 1997/01/14 15:55:19 joel Exp $
# Quick hack to draw JAVA class diagrams from compiled JAVA files.
# All JAVA files must be .class and all referenced classes must be in
# CLASSPATH. Uses javap, so javap must be in the path.
# Usage : java2davinci -p <full package name> [classfile] [classfile] ....
# Other options :
# -q supresses progress output, error output is to stderr.
# -i <package> ignores all class files in <package>
# -m <file> load package colours from <file>
# -d <file> dump package colours to <file>
# Typically :
# wip/JAVA-$> java2davinci -p UK.ac.bris.ilrt `find . -name \*.class -print`
$quiet=0;
%ignore=();
%parsed=();
%nodes=();
%edges=();
%interfacep=();
%packages=();
@colours=( 'white', 'red', 'green', 'blue', 'grey', 'yellow', 'brown', 'pink', 'orange', 'darkgrey' , 'darkred', 'khaki', 'azure3' ,'cyan');
$cnum=0;
@stack=();
$id=0;
$usedump=0;
$tpackage="UK.ac.bris.ilrt";
while( $classfile = shift (@ARGV)) {
if($classfile eq "-p" ) {
$tpackage=shift @ARGV;
next;
}
if($classfile eq "-i" ) {
$package=shift @ARGV; # ignore all classes in package
$ignore{$package}=1;
next;
}
if($classfile eq "-q") {
$quiet=1;
next;
}
if($classfile eq "-m") {
$file=shift @ARGV;
open(INFILE,"<$file");
while(<INFILE>) {
@info=split (" ",$_);
$colour=$info[1];
$packages{$info[0]}=$colour;
print STDERR "Loading $info[0] as $colour\n" if ! $quiet;
@colours2=();
while($colour2=shift @colours) {
push(@colours2,$colour2) if($colour2 ne $colour);
}
@colours=@colours2;
@colours2=();
}
close INFILE;
}
if($classfile eq "-d") {
$dumpfile=shift @ARGV;
$usedump=1;
}
$classfile=~s#\/#.#g;
$classfile=~s#\.class##;
$classfile=~s#^\.\.##;
push(@stack,$classfile) if $classfile =~ m/^$tpackage/;
}
while ( $classfile = shift @stack) {
$classfile=~s#\/#.#g;
next if exists $parsed{$classfile};
$package=$classfile;
$package=~ s/.[^\.]*$//;
next if exists $ignore{$package};
print STDERR "Parsing $classfile\n" if (! $quiet);
$parsed{$classfile} = 1;
open (INFILE,"javap $classfile|");
$junk=<INFILE>;
$classdef=<INFILE>;
@methods=();
@vars=();
while(<INFILE>) {
last if $_ eq "}";
if($_ =~ m/(.*)/) {
push(@methods,$_);
} else {
push(@vars,$_);
}
}
close INFILE;
@data=split(" ",$classdef);
while( $word = shift (@data)) {
last if($word eq "class" || $word eq "interface")
}
$isinterface=0;
$isinterface=1 if $word eq "interface";
$word=shift (@data);
next if $word eq "";
$thisclass=$word;
$thisclass=~ s#/#.#g; # Convert interface classes from /x/y/z to .x.y.z
$nodes{$thisclass}=$id++ if(! exists $nodes{$thisclass});
$interfacep{$thisclass}=$isinterface;
$word=shift (@data); # skip 'Extends'
next if ($word ne "extends");
$word = shift @data;
$package=$word;
$package=~ s/.[^\.]*$//;
next if exists $ignore{$package};
# next if $word eq "java.lang.Object";
if(! exists $nodes{$word} ) {
$nodes{$word}=$id++;
push(@stack,$word);
}
my @edges=();
$edges{$thisclass}=\@edges;
push ( @edges, $nodes{$word});
$word=shift @data;
next if $word ne "implements";
@interfaces=split(",",(shift @data));
foreach $interface (@interfaces) {
next if $interface eq "";
$package=$interface;
$package=~ s/.[^\.]*$//;
next if exists $ignore{$package};
$interface=~ s#/#.#g; # Convert interface classes from /x/y/z to .x.y.z
if(! exists $nodes{$interface} ) {
$nodes{$interface}=$id++;
push(@stack,$interface);
}
$interfacep{$interface}=1;
push (@edges, $nodes{$interface});
}
}
print STDERR "----\n" if (! $quiet);
print "[";
open(DUMPFILE,">$dumpfile") if $usedump;
%dumped=();
foreach $key (keys %nodes) {
$name=$key;
$name =~ s/.*\.([^\.]*)$/$1/;
$package=$key;
$package=~ s/\.[^\.]*$//;
if (! exists $packages{$package} ) {
$packages{$package}=$colours[$cnum++];
}
if( !exists $dumped{$package} ) {
print STDERR "Package $package is $packages{$package}\n" if(! $quiet);
print DUMPFILE "$package $packages{$package}\n" if $usedump;
$dumped{$package}=1;
}
print "l(\"$nodes{$key}\",n(\"\",[a(\"OBJECT\",\"$name\")";
print ",a(\"COLOR\",\"".$packages{$package}."\")";
print ",a(\"_GO\",\"ellipse\")" if($interfacep{$key});
print "],[";
$c=$#{$edges{$key}};
foreach $edge (@{$edges{$key}}) {
print "e(\"".$nodes{$key}."->$edge\",[],r(\"$edge\"))";
$c--;
print "," if($c>=0);
}
print "])),";
}
close DUMPFILE if $usedump;
foreach $package (keys %packages) {
print "l(\"$packages{$package}\",n(\"\",[a(\"OBJECT\",\"$package\"),a(\"COLOR\",\"$packages{$package}\")],[])),";
}
print "l(\"interface\",n(\"\",[a(\"OBJECT\",\"Interface\"),a(\"_GO\",\"ellipse\")],[])),";
print "l(\"class\",n(\"\",[a(\"OBJECT\",\"Class\")],[])),";
print "l(\"key\",n(\"\",[a(\"OBJECT\",\"Key\"),a(\"_GO\",\"text\")],[";
print "l(\"key->types\",e(\"\",[],r(\"types\"))),";
print "l(\"key->packages\",e(\"\",[],r(\"packages\")))])),";
print "l(\"types\",n(\"\",[a(\"OBJECT\",\"Types\")],[";
print "l(\"types->interface\",e(\"\",[],r(\"interface\"))),";
print "l(\"types->class\",e(\"\",[],r(\"class\")))])),";
print "l(\"packages\",n(\"\",[a(\"OBJECT\",\"Packages\")],[";
foreach $package (keys %packages) {
print "l(\"packages->".$packages{$package}."\",e(\"\",[],r(\"$packages{$package}\"))),";
}
print "]))";
print "]";
Received on Tuesday, 14 January 1997 11:20:59 UTC