diff --git a/projects/viztool/src/java/com/samskivert/viztool/enum/ClassEnumerator.java b/projects/viztool/src/java/com/samskivert/viztool/enum/ClassEnumerator.java index e07fc2dd..0e48a301 100644 --- a/projects/viztool/src/java/com/samskivert/viztool/enum/ClassEnumerator.java +++ b/projects/viztool/src/java/com/samskivert/viztool/enum/ClassEnumerator.java @@ -1,5 +1,5 @@ // -// $Id: ClassEnumerator.java,v 1.1 2001/06/14 20:57:15 mdb Exp $ +// $Id: ClassEnumerator.java,v 1.2 2001/07/04 18:22:26 mdb Exp $ package com.samskivert.viztool.enum; @@ -14,7 +14,7 @@ import java.util.StringTokenizer; * The component enumerators are structured so that new enumerators can be * authored for new kinds of classpath component. */ -public class ClassEnumerator +public class ClassEnumerator implements Enumerator { /** * Constructs a class enumerator with the supplied classpath. A set of @@ -42,8 +42,8 @@ public class ClassEnumerator } else { try { - System.out.println("Adding [enum=" + enum + - ", component=" + component + "]."); +// System.out.println("Adding [enum=" + enum + +// ", component=" + component + "]."); // construct an enumerator to enumerate this component // and put it on our list _enums.add(enum.enumerate(component)); diff --git a/projects/viztool/src/java/com/samskivert/viztool/enum/Enumerator.java b/projects/viztool/src/java/com/samskivert/viztool/enum/Enumerator.java new file mode 100644 index 00000000..9fd63ca9 --- /dev/null +++ b/projects/viztool/src/java/com/samskivert/viztool/enum/Enumerator.java @@ -0,0 +1,21 @@ +// +// $Id: Enumerator.java,v 1.1 2001/07/04 18:22:26 mdb Exp $ + +package com.samskivert.viztool.enum; + +/** + * An enumerator is used to iterate over a set of classes. + */ +public interface Enumerator +{ + /** + * Returns true if this enumerator has more classes yet to enumerate, + * false if all classes have been reported. + */ + public boolean hasMoreClasses (); + + /** + * Returns the class name of the next class in the enumeration. + */ + public String nextClass (); +} diff --git a/projects/viztool/src/java/com/samskivert/viztool/enum/FilterEnumerator.java b/projects/viztool/src/java/com/samskivert/viztool/enum/FilterEnumerator.java new file mode 100644 index 00000000..1e653140 --- /dev/null +++ b/projects/viztool/src/java/com/samskivert/viztool/enum/FilterEnumerator.java @@ -0,0 +1,68 @@ +// +// $Id: FilterEnumerator.java,v 1.1 2001/07/04 18:22:26 mdb Exp $ + +package com.samskivert.viztool.enum; + +/** + * The filter enumerator provides the framework by which a particular + * subset of classes can be filtered from the total enumeration of classes + * in a classpath. This is useful for doing things like only considering + * classes in a particular package or only considering interfaces, and so + * on. + */ +public abstract class FilterEnumerator implements Enumerator +{ + /** + * Constructs a filter enumerator with the supplied class enumerator + * as the source of classes. + */ + public FilterEnumerator (ClassEnumerator source) + { + _source = source; + // we'd love to call scanToNextClass() here but that calls + // filterClass() and it's extremely bad form to call a function + // provided by a derived class in the super class's constructor + // because the derived class's constructor hasn't yet been + // executed. sigh. + } + + public boolean hasMoreClasses () + { + if (_nextClass == null) { + scanToNextClass(); + } + return _nextClass != null; + } + + public String nextClass () + { + if (_nextClass == null) { + scanToNextClass(); + } + String clazz = _nextClass; + _nextClass = null; + scanToNextClass(); + return clazz; + } + + protected void scanToNextClass () + { + while (_source.hasMoreClasses()) { + String clazz = _source.nextClass(); + if (!filterClass(clazz)) { + _nextClass = clazz; + break; + } + } + } + + /** + * Derived classes should override this method and return true if the + * specified class should be filtered (meaning it should be excluded + * from the classes returned) or false if it should be included. + */ + protected abstract boolean filterClass (String clazz); + + protected ClassEnumerator _source; + protected String _nextClass; +} diff --git a/projects/viztool/src/java/com/samskivert/viztool/enum/PackageEnumerator.java b/projects/viztool/src/java/com/samskivert/viztool/enum/PackageEnumerator.java new file mode 100644 index 00000000..c65e3187 --- /dev/null +++ b/projects/viztool/src/java/com/samskivert/viztool/enum/PackageEnumerator.java @@ -0,0 +1,45 @@ +// +// $Id: PackageEnumerator.java,v 1.1 2001/07/04 18:22:26 mdb Exp $ + +package com.samskivert.viztool.enum; + +/** + * The package enumerator filters out only classes from the specified + * package (and subpackages) from the class enumerator provided at + * construct time. + */ +public class PackageEnumerator extends FilterEnumerator +{ + public PackageEnumerator (String pkg, ClassEnumerator source) + { + super(source); + _package = pkg; + } + + protected boolean filterClass (String clazz) + { + return !clazz.startsWith(_package); + } + + public static void main (String[] args) + { + // run ourselves on the classpath + String classpath = System.getProperty("java.class.path"); + ClassEnumerator enum = new ClassEnumerator(classpath); + String pkg = "com.samskivert.viztool.enum"; + PackageEnumerator penum = new PackageEnumerator(pkg, enum); + + // print out the warnings + ClassEnumerator.Warning[] warnings = enum.getWarnings(); + for (int i = 0; i < warnings.length; i++) { + System.out.println("Warning: " + warnings[i].reason); + } + + // enumerate over whatever classes match our package + while (penum.hasMoreClasses()) { + System.out.println("Class: " + penum.nextClass()); + } + } + + protected String _package; +}