Some long needed changes/improvements to the finder API.

  XBEAN-165: Meta Annotation Support
  
  XBEAN-166 : Class Name Filtering for Optimized Scanning
   XBEAN-171: RegexFilteredArchive supporting regular expressions to 
include/exclude classes from scanning
   XBEAN-172: PrefixFilteredArchive supports "startsWith" list of accepted 
prefixes
   XBEAN-173: PackageFilteredArchive supports strict list of accepted package 
names
  
  XBEAN-167:  Archive Interface for cleaner integration of Classpath and OSGi 
based systems
   XBEAN-168: ClassesArchive for static class list finder support
   XBEAN-169: ClasspathArchive for traditional java classpath finder support
   XBEAN-170: BundleArchive for OSGi bundle finder support

The first, meta annotations, is probably less interesting in Geronimo terms, 
but the second two classes of changes are major improvements.

Rather than subclassing I've attempted to abstract out the few parts that are 
different and switch us over to a delegation based model.  Once that was done 
adding wrapping/decorating of the delegates to achieve filtering was a natural 
next step.  A bit reason I'm not fan of subclassing as in that model doing this 
kind of shared filtering would require all the subclasses to inherit from this 
new "filtering" parent which would in turn now subclass from the original 
parent.  And that is an oversimplification as you can't really wrap abstract 
methods like that -- a filtering parent class can't call "subclass.doThis()" 
and mutate the result in it's own "doThis()" method, so you end up with more 
abstract methods.  Delegation is also composable, whereas you can't dynamically 
change your parent class to use or not use the common filtering parent class.

Anyway enough about that :)

So what we have now is a composable system.  You create your finder and feed it 
an archive, like so:

  new AnnotationFinder(  new BundleArchive() );

If you want some filtering, you add that in:

  new AnnotationFinder(  new PackageFilteredArchive( new BundleArchive(), 
"org.foo" ) );

And if some day we decide we want to support some sort of mashing of OSGi and 
traditional sources, we could create an Archive implementation to combine them, 
like so:

  new AnnotationFinder(
     new PackageFilteredArchive(
         new CompositeArchive( 
                new BundleArchive(),
                new ClasspathArchive()
         ),
         "org.foo" 
      ) 
  );

Sky is the limit.

Some concrete things I need help with.

  1)  Finishing the BundleArchive.  I have stub in there based on the subclass 
version.  But the subclass "pushed" classes into the finder and the new 
approach is a "pull".  Anyone who has any time, please grab XBEAN-170 and 
assign it to yourself.  It's up for grabs.

  2)  Converting all the code from AbstractFinder to AnnotationFinder.  Once we 
get #1 finished, we'll need to roll the code over.  It should be fairly easy as 
the effective API is the same, just the way we construct things is different.

Still in the works:

  1)  Tests for all the filters
  2)  An SAXParser style error handler -- the whole classesNotLoaded thing is 
going bye-bye
  3)  Finishing the ClasspathArchive and Meta Annotation support for fields


-David

Reply via email to