diff --git a/.classpath b/.classpath index c4a5e07..3875dff 100644 --- a/.classpath +++ b/.classpath @@ -1,7 +1,9 @@ - - - - + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba077a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin diff --git a/res/info.html b/res/info.html new file mode 100644 index 0000000..cd977e3 --- /dev/null +++ b/res/info.html @@ -0,0 +1,65 @@ +The JDepend utility +analyzes directories of Java class files and generates the following metrics for +each Java package. + +

+

+

+These metrics are hereafter referred to as the "Martin Metrics", as they are +credited to Robert Martin (Object Mentor Inc.) and referenced in the book +"Designing Object Oriented C++ Applications using the Booch Method", by +Robert C. Martin, Prentice Hall, 1995. +

+ diff --git a/res/main.css b/res/main.css new file mode 100644 index 0000000..772e009 --- /dev/null +++ b/res/main.css @@ -0,0 +1,62 @@ +body { + background-color: #eeeeee; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 10pt; +} + +h1 { + font-size: 24pt; + color: #023264; + font-family: Arial; + font-weight: bold; + font-family: Arial +} + +h2 { + color: white; + background-color: #023264; +} + +h3 { + font-size: 14pt; + color: #023264; +} + +#hor-minimalist-b { + font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; + font-size: 12px; + margin: 45px; + width: 80%; + border-collapse: collapse; + text-align: left; +} + +#hor-minimalist-b th { + font-size: 14px; + font-weight: normal; + color: #039; + padding: 10px 8px; + border-bottom: 2px solid #6678b1; +} + +#hor-minimalist-b td { + border-bottom: 1px solid #ccc; + color: #669; + padding: 6px 8px; +} + +#hor-minimalist-b tbody tr:hover td { + color: #009; +} + +.message { + color: #aaaaaa; + font-size: 0.8em; +} + +.footer { + color: #aaaaaa; + font-size: 0.8em; + text-align: center; + margin-top: 3em; +} \ No newline at end of file diff --git a/src/jdepend/framework/AbstractParser.java b/src/jdepend/framework/AbstractParser.java index 17849d4..f621fd6 100755 --- a/src/jdepend/framework/AbstractParser.java +++ b/src/jdepend/framework/AbstractParser.java @@ -16,8 +16,7 @@ public abstract class AbstractParser { private ArrayList parseListeners; private PackageFilter filter; - public static boolean DEBUG = false; - + public static final boolean DEBUG = Boolean.parseBoolean( System.getProperty( "jdepend.debug", "false" ) ); public AbstractParser() { this(new PackageFilter()); diff --git a/src/jdepend/framework/ClassFileParser.java b/src/jdepend/framework/ClassFileParser.java index 93af36f..13b14a8 100755 --- a/src/jdepend/framework/ClassFileParser.java +++ b/src/jdepend/framework/ClassFileParser.java @@ -745,8 +745,6 @@ public String toString() { public static void main(String args[]) { try { - ClassFileParser.DEBUG = true; - if (args.length <= 0) { System.err.println("usage: ClassFileParser "); System.exit(0); diff --git a/src/jdepend/htmlui/JDepend.java b/src/jdepend/htmlui/JDepend.java new file mode 100644 index 0000000..4caaf4a --- /dev/null +++ b/src/jdepend/htmlui/JDepend.java @@ -0,0 +1,272 @@ +package jdepend.htmlui; + +import java.io.*; +import java.util.*; + +import java.text.NumberFormat; + +import jdepend.framework.JavaClass; +import jdepend.framework.JavaPackage; + +/** + * The JDepend class analyzes directories of Java class files, generates metrics for each Java package, and + * reports the metrics in a HTML format. + * + * @author Richard Oliver Legendi (rlegendi) + */ +public class JDepend + extends jdepend.textui.JDepend { + + /** + * Constructs a JDepend instance using standard output. + */ + public JDepend() { + this( new PrintWriter( System.out ) ); + } + + /** + * Constructs a JDepend instance with the specified writer. + * + * @param writer Writer. + */ + public JDepend(final PrintWriter writer) { + super( writer ); + + formatter = NumberFormat.getInstance( Locale.ENGLISH ); + formatter.setMaximumFractionDigits( 2 ); + } + + // TODO This definitely needs some update. If there're more source folders (e.g. src, test), it may + // be impossible to locate them correctly. + private String findJavaClassLocation(final JavaClass javaClass) { + return "src" + File.separatorChar + javaClass.getName().replace( '.', File.separatorChar ); + } + + /** + * Includes a file to the current PrintWriter object. + * + *

+ * File allocation is performed through the {@link Class#getResourceAsStream(String)} function, using the + * '/' prefix helps navigation with an absolute name of the referred resource. + *

+ * + * @param fileName the file to append to the current writer object + */ + private void includeFile(final String fileName) { + BufferedReader br = null; + + try { + br = new BufferedReader( new InputStreamReader( JDepend.class.getResourceAsStream( fileName ) ) ); + + String line = null; + while ( ( line = br.readLine() ) != null ) { + getWriter().println( line ); + } + } catch (final Exception e) { + usage( e.getMessage() ); + } finally { + if ( br != null ) { + try { + br.close(); + } catch (final IOException e) { + usage( e.getMessage() ); + } + } + } + } + + protected void printHeader() { + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( "JDepend Analysis Report" ); + + getWriter().println( "" ); + + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( "

JDepend Analysis Report

" ); + getWriter().println( "

Designed to use with JDepend and Ant.

" ); + getWriter().println( "

Report generated at " + new Date() ); + + getWriter().println( "

General Information

" ); + includeFile( "/info.html" ); + } + + protected void printFooter() { + getWriter().println( "" ); + getWriter().println( "" ); + } + + protected void printPackagesHeader() { + getWriter().println( "

Packages

" ); + } + + protected void printPackagesFooter() { + ; + } + + protected void printPackageHeader(final JavaPackage jPackage) { + printSectionBreak(); + getWriter().println( "

Package " + jPackage.getName() + "

" ); + } + + protected void printPackageFooter(final JavaPackage jPackage) { + getWriter().println( "
" ); + } + + protected void printNoStats() { + getWriter().println( tab() + "

No stats available: package referenced, but not analyzed.

" ); // CHECKME + } + + protected void printStatistics(final JavaPackage jPackage) { + getWriter().println( tab( 1 ) + "

Statistics

" ); + getWriter().println( tab( 1 ) + "" ); + } + + protected void printClassName(final JavaClass jClass) { + getWriter().println( "Class " + jClass.getName() + "
" ); + } + + protected void printPackageName(final JavaPackage jPackage) { + getWriter().println( "Package " + jPackage.getName() + "
" ); + } + + protected void printAbstractClassesHeader() { + getWriter().println( "

AbstractClasses

" ); + } + + protected void printAbstractClassesFooter() { + ; + } + + protected void printConcreteClassesHeader() { + getWriter().println( "

ConcreteClasses

" ); + } + + protected void printConcreteClassesFooter() { + ; + } + + protected void printEfferentsHeader() { + getWriter().println( "

DependsUpon

" ); + } + + protected void printEfferentsFooter() { + ; + } + + protected void printEfferentsError() { + getWriter().println( tab() + "

Efferents not available.

" ); + } + + protected void printAfferentsHeader() { + getWriter().println( "

UsedBy

" ); + } + + protected void printAfferentsFooter() { + ; + } + + protected void printAfferentsError() { + getWriter().println( tab() + "

Afferents not available.

" ); + } + + protected void printCyclesHeader() { + printSectionBreak(); + getWriter().println( tab() + "

Package Dependency Cycles

" ); + } + + protected void printCyclesFooter() { + getWriter().println( "
" ); + } + + protected void printCycleHeader(final JavaPackage jPackage) { + getWriter().println( "

Package " + jPackage.getName() + "

" ); + getWriter().println( "" ); + printSectionBreak(); + } + + protected void printCycleTarget(final JavaPackage jPackage) { + printCycleContributor( jPackage ); + } + + protected void printCycleContributor(final JavaPackage jPackage) { + getWriter().println( "
  • " + jPackage.getName() + "
  • " ); + } + + @SuppressWarnings("rawtypes") + protected void printSummary(final Collection packages) { + getWriter().println( "" ); + + getWriter().println( "

    Summary

    " ); + getWriter().println( "" ); + getWriter().println( "" ); + getWriter().println( tab( 1 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 1 ) + "" ); + getWriter().println( "" ); + + final Iterator i = packages.iterator(); + while ( i.hasNext() ) { + final JavaPackage jPackage = (JavaPackage) i.next(); + + getWriter().println( "" ); + getWriter().println( tab( 1 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 2 ) + "" ); + getWriter().println( tab( 1 ) + "" ); + getWriter().println( "" ); + } + + getWriter().println( "
    NameClass CountAbstract Class CountCaCeAIDV
    " + jPackage.getName() + "" + jPackage.getClassCount() + "" + jPackage.getAbstractClassCount() + "" + jPackage.afferentCoupling() + "" + jPackage.efferentCoupling() + "" + toFormattedString( jPackage.abstractness() ) + "" + toFormattedString( jPackage.instability() ) + "" + toFormattedString( jPackage.distance() ) + "" + jPackage.getVolatility() + "
    " ); + + getWriter().println(); + getWriter().println( "

    Generated by JDepend.
    " + + "HTML output formatting written by Richard O. Legendi.

    " ); + getWriter().println(); + } + + /** + * Main function, which is a delegate itself to {@link JDepend#instanceMain(String[])}. + * + * @param args passed directly to the instanceMain() method + */ + public static void main(final String args[]) { + new JDepend().instanceMain( args ); + } + +}