From 893eb64605b755b83bf985cea9d13ca813e59610 Mon Sep 17 00:00:00 2001 From: mdb Date: Wed, 4 Jul 2001 18:22:26 +0000 Subject: [PATCH] Created filter enumerator which allows one enumerator to filter the output of another. Created Enumerator interface which allows all enumerators to be accessed the same way. Created simple package enumerator that filters out all classes not in or below a particular package. git-svn-id: https://samskivert.googlecode.com/svn/trunk@160 6335cc39-0255-0410-8fd6-9bcaacd3b74c --- .../viztool/enum/ClassEnumerator.java | 8 +-- .../samskivert/viztool/enum/Enumerator.java | 21 ++++++ .../viztool/enum/FilterEnumerator.java | 68 +++++++++++++++++++ .../viztool/enum/PackageEnumerator.java | 45 ++++++++++++ 4 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 projects/viztool/src/java/com/samskivert/viztool/enum/Enumerator.java create mode 100644 projects/viztool/src/java/com/samskivert/viztool/enum/FilterEnumerator.java create mode 100644 projects/viztool/src/java/com/samskivert/viztool/enum/PackageEnumerator.java 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; +}