commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Struberg <strub...@yahoo.de>
Subject Re: [classscan] Experiment on xbean-finder
Date Wed, 06 Jun 2012 06:19:21 GMT
Hi!

I now moved all the stuff to trunk.

Next I'll work on a structure for the API and extract a mainingful api from both Chas' and
Davids 'backends' + do the initial maven setup stuff.

LieGrue,
strub



----- Original Message -----
> From: Mark Struberg <struberg@yahoo.de>
> To: Commons Developers List <dev@commons.apache.org>
> Cc: 
> Sent: Wednesday, June 6, 2012 7:50 AM
> Subject: Re: [classscan] Experiment on xbean-finder
> 
>g ood stuff.
> 
> I'd like to go on and do the following:
> 
> in ./trunk add the following new directories
> 
> tck -> our mass tests, etc which we can use for common testing, performance 
> measurements, etc
> 
> api -> the part a user interacts with
> impl-bcel -> move Chas' work to
> impl-xbf -> move branches/commons-finder to
> 
> LieGrue,
> strub
> 
> 
> 
> ----- Original Message -----
>>  From: David Blevins <david.blevins@gmail.com>
>>  To: Commons Developers List <dev@commons.apache.org>; 
> gudnabrsam@gmail.com
>>  Cc: 
>>  Sent: Wednesday, June 6, 2012 7:32 AM
>>  Subject: Re: [classscan] Experiment on xbean-finder
>> 
>>  An expanded view of the info below in markdown:
>> 
>>    https://gist.github.com/2880038
>> 
>>  Pulled in some also pulled in some Meta-Annotation information from the 
>>  proposals going around Java EE 7.  There's a lot there, feel free to 
> ignore 
>>  it.  Not critical.
>> 
>> 
>>  -David
>> 
>> 
>>  On Jun 5, 2012, at 9:57 PM, David Blevins wrote:
>> 
>>> 
>>>   On Jun 5, 2012, at 1:12 PM, Matt Benson wrote:
>>> 
>>>>   Welcome, David!
>>> 
>>>   Thanks, Matt!
>>> 
>>>   Ok, so I refactored it a bit to work in some of the ideas I was 
> hearing on 
>>  IRC today.
>>> 
>>>   Those changes were primarily:
>>>   - Promote Info objects that represent class data to a separate package 
> not 
>>  tied to any bytecode library
>>>   - Add listener interface to consume the Info objects
>>>   - Added parser abstraction to use ASM or similar library to create the 
> Info 
>>  objects and invoke listener
>>> 
>>>   The code was there and generally written somewhat decoupled with those 
> 
>>  parts in mind.  Took a bit of snipping and cutting here and there to fully 
>>  decouple it and separate everything out into separate packages.
>>> 
>>>   There's no ParserFacory yet, that could easily be created.  I 
> figured 
>>  there was enough there to show how things work.
>>> 
>>>   Here's an overview of the code:
>>> 
>>>   org.apache.commons.classscan.finder
>>>   - AnnotationFinder
>>>   - IAnnotationFinder
>>>   - ResourceFinder
>>> 
>>>   AnnotationFinder is essentially the "db" and has methods to 
>>  query.
>>> 
>>>   ResourceFinder is for basic file location such as 
>>  "META-INF/persistence.xml" and can also be used as part of a 
>>  ServiceLoader replacement.  See the ResourceFinder.mdtext for details
>>> 
>>> 
>>>   org.apache.commons.classscan.finder.archive
>>>   - Archive
>>>   - ArchiveIterator
>>>   - ClassesArchive
>>>   - ClasspathArchive
>>>   - CompositeArchive
>>>   - FileArchive
>>>   - FilteredArchive
>>>   - JarArchive
>>> 
>>>   The Archive interface allows for sources of class files to be 
> abstracted.  
>>  The JarArchive, ClassesArchive and FileArchive are concrete 
> implementations.  
>>  CompositeArchive is simply a collection of Archive implementations.  
>>  FilteredArchive allows for the archive itself to be filtered in various 
> ways.
>>> 
>>>   org.apache.commons.classscan.finder.filter
>>>   - ClassFilter
>>>   - ContainsFilter
>>>   - ExcludeIncludeFilter
>>>   - Filter
>>>   - FilterList
>>>   - Filters
>>>   - IncludeExcludeFilter
>>>   - PackageFilter
>>>   - PatternFilter
>>>   - PrefixFilter
>>>   - SuffixFilter
>>> 
>>>   The Filter interface simply allows you to give a yay or nay to a 
> String.  
>>  This is of course useful for greatly limiting the classes actually scanned 
> when 
>>  combined with an Archive via wrapping it with a FilteredArchive and 
> supplying a 
>>  Filter.
>>> 
>>>   FilterList is a Filter implementation that combines one or more 
> filters.  
>>  Both "yes" and "no" filters can be used via 
>>  IncludeExcludeFilter or ExcludeIncludeFilter which are modeled after HTTPd 
>>  allowed host pattern.
>>> 
>>>   PackageFilter, ClassFilter, SuffixFilter, PrefixFilter, ContainsFilter 
> and 
>>  PatternFilter are concrete implementations of Filter that each have a 
> simple 
>>  approach to testing the string to give a yay or nay.
>>> 
>>>   The Filters class is a convenience class that makes it easy to 
> construct 
>>  the various filters with little syntax as well as performs unwrapping when 
>>  necessary if it sees things like a FilterList with only one filter or a 
>>  FilterList containing another FilterList.
>>> 
>>> 
>>>   org.apache.commons.classscan.finder.meta
>>>   - Annotated
>>>   - AnnotatedMember
>>>   - AnnotatedMethod
>>>   - MetaAnnotated
>>>   - MetaAnnotatedClass
>>>   - MetaAnnotatedConstructor
>>>   - MetaAnnotatedElement
>>>   - MetaAnnotatedField
>>>   - MetaAnnotatedMethod
>>>   - MetaAnnotation
>>> 
>>>   This package provides basic support for meta-annotations which are 
> simply 
>>  annotation reuse or inheritance.  CDI, Bean Validation and JAX-RS all have 
>>  similar concepts of inheritance.  This code does a more generic approach to 
> 
>>  reuse that isn't tied to any one particular specification.  Fun to play 
> 
>>  with, but not critical to the core concept of annotation scanning.
>>> 
>>>   org.apache.commons.classscan.finder.model
>>>   - Annotatable
>>>   - AnnotationInfo
>>>   - ClassInfo
>>>   - FieldInfo
>>>   - Info
>>>   - InfoHandler
>>>   - MethodInfo
>>>   - PackageInfo
>>> 
>>>   The basic objects to model class metadata along with a listener.
>>> 
>>>   There could easily be a InfoHandlerList which would be an 
> implementation of 
>>  InfoHandler that allowed for a collection of InfoHandlers.
>>> 
>>>   org.apache.commons.classscan.finder.parse
>>>   - AsmParser
>>>   - Parser
>>> 
>>>   Abstracts out the actual bytecode parsing such as ASM.  The parser 
> need 
>>  only read from the Archive and produce the model of Info objects and invoke 
> the 
>>  InfoHandler.
>>> 
>>>   org.apache.commons.classscan.finder.util
>>>   - Classes
>>>   - SingleLinkedList
>>>   - UriSet
>>>   - UrlSet
>>> 
>>>   Just some utilities.  UrlSet and UriSet are essentially searchable 
>>  collections of URL or URI to allow for something as large as a classpath of 
> URLs 
>>  to be easily narrowed.  Was written before the Filter API and only 
> partially 
>>  supports it.  Would be nice to have it updated.  SingleLinkedList is a 
> minimally 
>>  functional list designed to save memory in the model Info objects.
>>> 
>>> 
>>>   Overview of AnnotationFinder methods
>>> 
>>>      public AnnotationFinder(Archive archive)
>>> 
>>>   Basic constructor.  The Parser or some ParserFactory should be added.
>>> 
>>>      public AnnotationFinder enableMetaAnnotations()
>>>      public AnnotationFinder enableFindImplementations()
>>>      public AnnotationFinder enableFindSubclasses()
>>> 
>>>   Methods to enable some heavier lifting.  Each has a cost and none are 
>>  essential to basic annotation scanning.
>>> 
>>>      public List<Package> findAnnotatedPackages(Class<? extends 
> 
>>  Annotation> annotation)
>>>      public List<Class<?>> findAnnotatedClasses(Class<? 
>>  extends Annotation> annotation)
>>>      public List<Method> findAnnotatedMethods(Class<? extends 
>>  Annotation> annotation)
>>>      public List<Constructor> findAnnotatedConstructors(Class<? 
> 
>>  extends Annotation> annotation)
>>>      public List<Field> findAnnotatedFields(Class<? extends 
>>  Annotation> annotation)
>>> 
>>>   Fairly self explanatory.
>>> 
>>>      public List<Annotated<Class<?>>> 
>>  findMetaAnnotatedClasses(Class<? extends Annotation> annotation)
>>>      public List<Annotated<Method>> 
>>  findMetaAnnotatedMethods(Class<? extends Annotation> annotation)
>>>      public List<Annotated<Field>> 
>>  findMetaAnnotatedFields(Class<? extends Annotation> annotation)
>>> 
>>>   Meta-annotation versions of the above.  Just noticed a couple missing 
> :)
>>> 
>>>      public boolean isAnnotationPresent(Class<? extends 
> Annotation> 
>>  annotation)
>>>      public List<Class<?>> findClassesInPackage(String 
>>  packageName, boolean recursive)
>>> 
>>>   Some trivial utility methods.
>>> 
>>>      public <T> List<Class<? extends T>> 
>>  findSubclasses(Class<T> clazz)
>>>      public <T> List<Class<? extends T>> 
>>  findImplementations(Class<T> clazz)
>>> 
>>>   These are quite heavy and not recommended for large sets of classes 
> such as 
>>  the entire JVM classpath.  Works great for a handful of jars.  Beyond that 
> is 
>>  not recommended unless you have heaps of Heap.
>>> 
>>>      public AnnotationFinder select(Class<?>... clazz)
>>>      public AnnotationFinder select(String... clazz)
>>>      public AnnotationFinder select(Iterable<String> clazz)
>>> 
>>>   Newer methods that allow you to narrow down the scope of the 
>>  AnnotationFinder.  Say you have a finder for an entire .war file and you 
> want to 
>>  get the data for just a jar or specific class or list of classes.  Likely 
> there 
>>  could be 'join' methods to mirror these.  As well there could be a 
>>  'select' method that could easily take a Filter as an arg.
>>> 
>>> 
>>>   So that's more or less what is there :)  Of course anyone is 
> welcome to 
>>  play with the code.  Consider it soft.  Delete, add, refactor, whatever you 
> 
>>  want.  It's all in svn so no harm can be done.  Have fun.
>>> 
>>> 
>>>   Any missing features?  Thoughts?
>>> 
>>> 
>>>   -David
>>> 
>> 
>> 
>>  ---------------------------------------------------------------------
>>  To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>  For additional commands, e-mail: dev-help@commons.apache.org
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message