From 6e7f99ef8c556cc438b8553f46504e185db3fa86 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Fri, 2 Jun 2006 08:56:15 +0000 Subject: [PATCH] Small performance improvements, new options for UMLDoc, in particular the ability to enable strict hide pattern matching (m.matches()) instead of lax matching (m.find()). We should think if having strict matching by default would be better (in my opinion it is, but that's just my opinion)... Also added a reflective toString() that I've used for debugging settings during UmlDoc developtment (the code comes more or less from the first pages of Code Quality, the open source perspective :-) ) --- src/gr/spinellis/umlgraph/doclet/Options.java | 57 +++++++++++++++---- src/org/umlgraph/doclet/Options.java | 57 +++++++++++++++---- 2 files changed, 94 insertions(+), 20 deletions(-) diff --git a/src/gr/spinellis/umlgraph/doclet/Options.java b/src/gr/spinellis/umlgraph/doclet/Options.java index d43932d..c1f228d 100644 --- a/src/gr/spinellis/umlgraph/doclet/Options.java +++ b/src/gr/spinellis/umlgraph/doclet/Options.java @@ -22,6 +22,7 @@ package gr.spinellis.umlgraph.doclet; import com.sun.javadoc.*; +import java.lang.reflect.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,10 +33,12 @@ import java.util.regex.PatternSyntaxException; * @version $Revision$ * @author Diomidis Spinellis */ -class Options implements Cloneable, OptionProvider { +public class Options implements Cloneable, OptionProvider { // dot's font platform dependence workaround private static String defaultFont; private static String defaultItalicFont; + // reused often, especially in UmlDoc, worth creating just once and reusing + private static Pattern allPattern = Pattern.compile(".*"); static { // use an appropriate font depending on the current operating system @@ -50,7 +53,7 @@ class Options implements Cloneable, OptionProvider { } // instance fields - private Vector hidePatterns; + Vector hidePatterns; boolean showQualified; boolean showAttributes; boolean showEnumerations; @@ -77,7 +80,7 @@ class Options implements Cloneable, OptionProvider { double nodeFontPackageSize; String nodeFontPackageName; String bgColor; - String outputFileName; + public String outputFileName; String outputEncoding; String apiDocMapFileName; String apiDocRoot; @@ -85,7 +88,7 @@ class Options implements Cloneable, OptionProvider { boolean useGuillemot; boolean findViews; String viewName; - String outputDirectory; + public String outputDirectory; /** Guillemot left (open) */ String guilOpen = "«"; // "\u00ab"; /** Guillemot right (close) */ @@ -96,9 +99,15 @@ class Options implements Cloneable, OptionProvider { boolean verbose2; String inferRelationshipType; private Vector collPackages; - public boolean compact; + boolean compact; // internal option, used by UMLDoc to generate relative links between classes - boolean relativeLinksForSourcePackages; + boolean relativeLinksForSourcePackages; + // 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 + // would have been hidden by the hide pattern "java.*" + // TODO: consider making this standard behaviour + boolean strictMatching; Options() { showQualified = false; @@ -352,7 +361,7 @@ class Options implements Cloneable, OptionProvider { } else if(opt[0].equals("-hide")) { if(opt.length == 1) { hidePatterns.clear(); - hidePatterns.add(Pattern.compile(".*")); + hidePatterns.add(allPattern); } else { try { hidePatterns.add(Pattern.compile(opt[1])); @@ -457,9 +466,18 @@ class Options implements Cloneable, OptionProvider { */ public boolean matchesHideExpression(String s) { for (Pattern hidePattern : hidePatterns) { - Matcher m = hidePattern.matcher(s); - if (m.find()) + // micro-optimization because the "all pattern" is heavily used in UmlDoc + if(hidePattern == allPattern) return true; + + Matcher m = hidePattern.matcher(s); + if (strictMatching) { + if (m.matches()) { + return true; + } + } else if (m.find()) { + return true; + } } return false; } @@ -472,8 +490,13 @@ class Options implements Cloneable, OptionProvider { public boolean matchesCollPackageExpression(String s) { for (Pattern collPattern : collPackages) { Matcher m = collPattern.matcher(s); - if (m.find()) + if (strictMatching) { + if (m.matches()) { + return true; + } + } else if (m.find()) { return true; + } } return false; } @@ -508,5 +531,19 @@ class Options implements Cloneable, OptionProvider { return "general class diagram"; } + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("UMLGRAPH OPTIONS\n"); + for(Field f : this.getClass().getDeclaredFields()) { + if(!Modifier.isStatic(f.getModifiers())) { + f.setAccessible(true); + try { + sb.append(f.getName() + ":" + f.get(this) + "\n"); + } catch (Exception e) { + } + } + } + return sb.toString(); + } } diff --git a/src/org/umlgraph/doclet/Options.java b/src/org/umlgraph/doclet/Options.java index d43932d..c1f228d 100644 --- a/src/org/umlgraph/doclet/Options.java +++ b/src/org/umlgraph/doclet/Options.java @@ -22,6 +22,7 @@ package gr.spinellis.umlgraph.doclet; import com.sun.javadoc.*; +import java.lang.reflect.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,10 +33,12 @@ import java.util.regex.PatternSyntaxException; * @version $Revision$ * @author Diomidis Spinellis */ -class Options implements Cloneable, OptionProvider { +public class Options implements Cloneable, OptionProvider { // dot's font platform dependence workaround private static String defaultFont; private static String defaultItalicFont; + // reused often, especially in UmlDoc, worth creating just once and reusing + private static Pattern allPattern = Pattern.compile(".*"); static { // use an appropriate font depending on the current operating system @@ -50,7 +53,7 @@ class Options implements Cloneable, OptionProvider { } // instance fields - private Vector hidePatterns; + Vector hidePatterns; boolean showQualified; boolean showAttributes; boolean showEnumerations; @@ -77,7 +80,7 @@ class Options implements Cloneable, OptionProvider { double nodeFontPackageSize; String nodeFontPackageName; String bgColor; - String outputFileName; + public String outputFileName; String outputEncoding; String apiDocMapFileName; String apiDocRoot; @@ -85,7 +88,7 @@ class Options implements Cloneable, OptionProvider { boolean useGuillemot; boolean findViews; String viewName; - String outputDirectory; + public String outputDirectory; /** Guillemot left (open) */ String guilOpen = "«"; // "\u00ab"; /** Guillemot right (close) */ @@ -96,9 +99,15 @@ class Options implements Cloneable, OptionProvider { boolean verbose2; String inferRelationshipType; private Vector collPackages; - public boolean compact; + boolean compact; // internal option, used by UMLDoc to generate relative links between classes - boolean relativeLinksForSourcePackages; + boolean relativeLinksForSourcePackages; + // 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 + // would have been hidden by the hide pattern "java.*" + // TODO: consider making this standard behaviour + boolean strictMatching; Options() { showQualified = false; @@ -352,7 +361,7 @@ class Options implements Cloneable, OptionProvider { } else if(opt[0].equals("-hide")) { if(opt.length == 1) { hidePatterns.clear(); - hidePatterns.add(Pattern.compile(".*")); + hidePatterns.add(allPattern); } else { try { hidePatterns.add(Pattern.compile(opt[1])); @@ -457,9 +466,18 @@ class Options implements Cloneable, OptionProvider { */ public boolean matchesHideExpression(String s) { for (Pattern hidePattern : hidePatterns) { - Matcher m = hidePattern.matcher(s); - if (m.find()) + // micro-optimization because the "all pattern" is heavily used in UmlDoc + if(hidePattern == allPattern) return true; + + Matcher m = hidePattern.matcher(s); + if (strictMatching) { + if (m.matches()) { + return true; + } + } else if (m.find()) { + return true; + } } return false; } @@ -472,8 +490,13 @@ class Options implements Cloneable, OptionProvider { public boolean matchesCollPackageExpression(String s) { for (Pattern collPattern : collPackages) { Matcher m = collPattern.matcher(s); - if (m.find()) + if (strictMatching) { + if (m.matches()) { + return true; + } + } else if (m.find()) { return true; + } } return false; } @@ -508,5 +531,19 @@ class Options implements Cloneable, OptionProvider { return "general class diagram"; } + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("UMLGRAPH OPTIONS\n"); + for(Field f : this.getClass().getDeclaredFields()) { + if(!Modifier.isStatic(f.getModifiers())) { + f.setAccessible(true); + try { + sb.append(f.getName() + ":" + f.get(this) + "\n"); + } catch (Exception e) { + } + } + } + return sb.toString(); + } }