[jboss-cvs] JBossAS SVN: r76002 - in projects/metadata/trunk/src: main/java/org/jboss/metadata/annotation/creator/client and 8 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jul 18 12:06:03 EDT 2008


Author: emuckenhuber
Date: 2008-07-18 12:06:03 -0400 (Fri, 18 Jul 2008)
New Revision: 76002

Added:
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractCreator.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AnnotationContext.java
Modified:
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractComponentProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractEJBProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractPersistenceContextProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractResourceProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractRunAsProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/DeclareRolesProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/EJBsClassProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PostConstructMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PreDestroyMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/Processor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ProcessorUtils.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ResourcesClassProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/client/ApplicationClient5MetaDataCreator.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractEnterpriseBeanProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractSessionBeanProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractTransactionAttributeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ApplicationExceptionProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AroundInvokeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/DenyAllProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/EjbJar30Creator.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ImplicitLocalProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InitProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorsProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalHomeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/MessageDrivenProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PermitAllProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PostActivateMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PrePassivateMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteHomeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoveProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RolesAllowedProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatefulProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatelessProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/TimeoutProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractEnterpriseBeanProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractTransactionAttributeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ApplicationExceptionProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AroundInvokeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/DenyAllProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ImplicitLocalProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InitProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InterceptorsProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBoss50Creator.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossAspectDomainProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossCacheConfigProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossClusteredProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossConsumerProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossJndiPolicyProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossManagementProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossPoolProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducerProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducersProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossResourceAdapterProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossSerializedConcurrentAccessProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossServiceProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalBindingProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeBindingProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/MessageDrivenProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PermitAllProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PostActivateMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PrePassivateMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingsProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeBindingProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoveProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RolesAllowedProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatefulProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatelessProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/TimeoutProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/AbstractComponentProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PostConstructMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PreDestroyMethodProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/web/Web25MetaDataCreator.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/AbstractWebServiceRefProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceHandlerChainProcessor.java
   projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceRefsClassProcessor.java
   projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/client/AnnotationClientUnitTestCase.java
   projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/AnnotationEjb3UnitTestCase.java
   projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/JBossAnnotationEjb3UnitTestCase.java
   projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/web/AnnotationWebUnitTestCase.java
Log:
[JBMETA-72] expose processed annotations

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractComponentProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractComponentProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractComponentProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -22,19 +22,7 @@
 package org.jboss.metadata.annotation.creator;
 
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
-import org.jboss.logging.Logger;
 import org.jboss.metadata.annotation.creator.ws.WebServiceRefClassProcessor;
 import org.jboss.metadata.annotation.creator.ws.WebServiceRefFieldProcessor;
 import org.jboss.metadata.annotation.creator.ws.WebServiceRefMethodProcessor;
@@ -55,28 +43,12 @@
  * @version $Revision$
  */
 public abstract class AbstractComponentProcessor<MD>
-   extends AbstractFinderUser
+   extends AbstractProcessor<MD>
 {
-   private static Logger log = Logger.getLogger(AbstractComponentProcessor.class);
 
-   /** Map<Processor metdata type class, List<Processor for classes>> */
-   protected Map<Class<?>, List<Processor<Object, Class<?>>>> typeProcessors;
-   /** Map<Processor metdata type class, List<Processor for fields>> */
-   protected Map<Class<?>, List<Processor<Object, Field>>> fieldProcessors;
-   /** Map<Processor metdata type class, List<Processor for methods>> */
-   protected Map<Class<?>, List<Processor<Object, Method>>> methodProcessors;
-   /** */
-   protected Set<Class> boundedTypes = new HashSet<Class>();
-
-   /**
-    * @param finder
-    */
    public AbstractComponentProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-      typeProcessors = new HashMap<Class<?>, List<Processor<Object,Class<?>>>>();
-      fieldProcessors = new HashMap<Class<?>, List<Processor<Object,Field>>>();
-      methodProcessors = new HashMap<Class<?>, List<Processor<Object,Method>>>();
 
       // Add component environment processors
       // @Resources/@Resource
@@ -103,49 +75,9 @@
       addTypeProcessor(new WebServiceRefsClassProcessor(finder));
    }
 
-   public void addFieldProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addFieldProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Field>> processors = fieldProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Field>>();
-         fieldProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-
-   public void addMethodProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addMethodProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Method>> processors = methodProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Method>>();
-         methodProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-   public void addTypeProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addTypeProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Class<?>>> processors = typeProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Class<?>>>();
-         typeProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-
    /**
     * Process type for remote environment metadata related annotations
+    * 
     * @param metaData
     * @param type
     */
@@ -180,8 +112,10 @@
       }
       processClass(wsRefs, type);
    }
+   
    /**
     * Process type for environment metadata related annotations
+    * 
     * @param metaData
     * @param type
     */
@@ -198,174 +132,4 @@
       }
       processClass(pcRefs, type);
    }
-   /**
-    * Process type for component metadata related annotations
-    * @param metaData
-    * @param type
-    */
-   public void process(MD metaData, Class<?> type)
-   {
-      processClass(metaData, type);
-   }
-
-   /**
-    * Process a the cls annotations at the type, method and field levels
-    * into the argument metaData. Only processors registered for the metaData
-    * type will be run.
-    * 
-    * @param <T>
-    * @param metaData
-    * @param cls
-    */
-   protected <T> void processClass(T metaData, Class<?> cls)
-   {
-      Class<?> type = metaData.getClass();
-      boolean trace = log.isTraceEnabled();
-      int processorCount = processClass(metaData, cls, type);
-      if(trace)
-         log.trace("Found "+processorCount+" processors for type: "+type);
-      // See if metaData has a bounded type
-      type = type.getSuperclass();
-      while(boundedTypes.contains(type) == false && type != Object.class)
-      {
-         type = type.getSuperclass();
-      }
-      // 
-      if(type != Object.class)
-      {
-         if(trace)
-            log.trace("Reprocessing class using bounded processor type: "+type);
-         processClass(metaData, cls, type);
-      }
-      // Also process the interfaces of the metadata class
-      for(Class<?> iface : metaData.getClass().getInterfaces())
-      {
-         if(boundedTypes.contains(iface));
-         {
-            processClass(metaData, cls, iface);
-         }
-      }
-   }
-   private <T> int processClass(T metaData, Class<?> cls, Class processorType)
-   {
-      boolean trace = log.isTraceEnabled();
-      int processorCount = 0;
-      if(trace)
-         log.trace("processClass for metaData: "+processorType+", class: "+cls);
-
-      List<Processor<Object, Class<?>>> tps = typeProcessors.get(processorType);
-      if(tps != null)
-      {
-         processorCount += tps.size();
-         if(trace)
-            log.trace("typeProcessors("+tps.size()+") for metaData: "+tps);
-         for(Processor<Object, Class<?>> processor : tps)
-         {
-            processor.process(metaData, cls);
-         }
-         
-         for(Class<?> intf : cls.getInterfaces())
-         {
-            for(Processor<Object, Class<?>> processor : tps)
-            {
-               processor.process(metaData, intf);
-            }
-         }
-      }
-      
-      List<Processor<Object, Field>> fps = fieldProcessors.get(processorType);
-      if(fps != null)
-      {
-         processorCount += fps.size();
-         if(trace)
-            log.trace("fieldProcessors("+fps.size()+") for metaData: "+fps);
-         Field[] fields = {};
-         try
-         {
-            fields = cls.getDeclaredFields();
-         }
-         catch(Throwable e)
-         {
-            log.debug("Failed to get DeclaredFields for: "+cls, e);
-         }
-         for(Field field : fields)
-         {
-            for(Processor<Object, Field> processor : fps)
-            {
-               processor.process(metaData, field);
-            }
-         }
-      }
-
-      List<Processor<Object, Method>> mps = methodProcessors.get(processorType);
-      if(mps != null)
-      {
-         processorCount += mps.size();
-         if(trace)
-            log.trace("methodProcessors("+mps.size()+") for metaData: "+mps);
-         Method[] methods = {};
-         try
-         {
-            methods = cls.getDeclaredMethods();
-         }
-         catch(Throwable e)
-         {
-            log.debug("Failed to get DeclaredMethods for: "+cls, e);            
-         }
-         for(Method method : methods)
-         {
-            if(trace)
-               log.trace("process method " + method);
-            for(Processor<Object, Method> processor : mps)
-            {
-               processor.process(metaData, method);
-            }
-         }
-      }
-      
-      if(cls.getSuperclass() != null && cls.getSuperclass() != Object.class)
-         processorCount += processClass(metaData, cls.getSuperclass(), processorType);
-      return processorCount;
-   }
-
-   /**
-    * Determine the Processor<T, ?> T generic processorType class.
-    * 
-    * @param processor
-    * @return The Class for the T parameter type. If this was an upper bound,
-    * this will have been added to the boundedTypes set.
-    */
-   protected Class getProcessorMetaDataType(Processor processor)
-   {
-      // Find the Proccessor<T, ?> interface
-      Type[] interfaces = processor.getClass().getGenericInterfaces();
-      Type processorType = null;
-      for(Type t : interfaces)
-      {
-         ParameterizedType pt = (ParameterizedType) t;
-         Type rawType = pt.getRawType();
-         if((rawType instanceof Class) && ((Class)rawType).getName().equals("org.jboss.metadata.annotation.creator.Processor"))
-         {
-            processorType = t;
-            break;
-         }
-      }
-      if(processorType == null)
-         throw new IllegalStateException("No generic Processor interface found on: "+processor);
-
-      // Get the type of the T parameter
-      ParameterizedType pt = (ParameterizedType) processorType;
-      Type t0 = pt.getActualTypeArguments()[0];
-      Class t = null;
-      if(t0 instanceof Class)
-         t = (Class) t0;
-      else if(t0 instanceof TypeVariable)
-      {
-         TypeVariable tv = (TypeVariable) t0;
-         t = (Class)tv.getBounds()[0];
-         boundedTypes.add(t);
-      }
-      return t;
-   }
-
 }

Added: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractCreator.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractCreator.java	                        (rev 0)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractCreator.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -0,0 +1,183 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.metadata.annotation.creator;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jboss.metadata.annotation.creator.AbstractProcessor.Scope;
+import org.jboss.metadata.annotation.finder.AnnotationFinder;
+
+/**
+ * A abstract base creator.
+ * 
+ * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
+ * @version $Revision$
+ */ 
+public abstract class AbstractCreator<MD> extends AbstractFinderUser
+{
+   /** The Processors */
+   private List<Processor<MD, Class<?>>> processors;
+   
+   /** The processed annotations */
+   private Map<Scope, Set<Class<? extends Annotation>>> processedAnnotations;
+
+   /**
+    * The constructor.
+    * 
+    * @param finder the AnnotationFinder
+    */
+   protected AbstractCreator(AnnotationFinder<AnnotatedElement> finder)
+   {
+      super(finder);
+      // 
+      this.processors = new ArrayList<Processor<MD,Class<?>>>();
+      this.processedAnnotations = new HashMap<Scope, Set<Class<? extends Annotation>>>();
+   }
+
+   /**
+    * Abstract create method of a Creator<Collection<Class<?>, MD>.
+    * 
+    * @param element the classes
+    * @return the metadata
+    */
+   public abstract MD create(Collection<Class<?>> element);
+   
+   /**
+    * Add a Class<?> processor.
+    * 
+    * @param processor
+    * @throws IllegalArgumentException
+    */
+   @SuppressWarnings("unchecked")
+   public void addProcessor(Processor<MD, Class<?>> processor)
+   {
+      if(processor == null)
+         throw new IllegalArgumentException("null processor.");
+      
+      // Add annotations
+      if(processor instanceof AbstractProcessor)
+         addAnnotations((AbstractProcessor) processor);
+      else
+         addAnnotations(Scope.TYPE, processor.getAnnotationTypes());
+      
+      this.processors.add(processor);
+   }
+
+   /**
+    * Process the meta data.
+    * 
+    * @param metaData the meta data
+    * @param type a Class
+    * @throws IllegalArgumentException
+    */
+   protected void process(MD metaData, Class<?> type)
+   {
+      if(metaData == null)
+         throw new IllegalArgumentException("null metadata.");
+      if(type == null)
+         throw new IllegalArgumentException("null classes;");
+      
+      for(Processor<MD, Class<?>> processor : processors)
+      {
+         processor.process(metaData, type);
+      }
+   }
+   
+   /**
+    * Add the annotations handled by an AbstractProcessor.
+    * 
+    * @param processor the abstract processor
+    */
+   @SuppressWarnings("unchecked")
+   private void addAnnotations(AbstractProcessor processor)
+   {
+      addAnnotations(Scope.TYPE, processor.getProcessedAnnotations(Scope.TYPE));
+      addAnnotations(Scope.METHOD, processor.getProcessedAnnotations(Scope.METHOD));
+      addAnnotations(Scope.FIELD, processor.getProcessedAnnotations(Scope.FIELD));
+   }
+   
+   /**
+    * Add annotations to a specific Scope.
+    * 
+    * @param scope the scope
+    * @param annotations a set of annotations
+    */
+   private void addAnnotations(Scope scope, Collection<Class<?extends Annotation>> annotations)
+   {
+      if(annotations == null)
+         return;
+         
+     if(scope == null)
+        throw new IllegalArgumentException("null scope.");
+      
+      if(this.processedAnnotations.get(scope) == null)
+         this.processedAnnotations.put(scope, new HashSet<Class<? extends Annotation>>());
+      
+      this.processedAnnotations.get(scope).addAll(annotations);
+   }
+   
+   /**
+    * Get annotations for a given Scope.
+    * 
+    * @param scope the Scope
+    * @return the processed annotations
+    */
+   protected Collection<Class<? extends Annotation>> getAnnotationsForScope(Scope scope)
+   {
+      return this.processedAnnotations.get(scope);
+   }
+   
+   /**
+    * Create a basic annotation context, based on the information of the added processors.
+    * 
+    * @return the annotation context
+    */
+   public AnnotationContext getAnnotationContext()
+   {
+      return new AnnotationContext()
+      {
+         public Collection<Class<? extends Annotation>> getFieldAnnotations()
+         {
+            return processedAnnotations.get(Scope.FIELD);
+         }
+
+         public Collection<Class<? extends Annotation>> getMethodAnnotations()
+         {
+            return processedAnnotations.get(Scope.METHOD);
+         }
+
+         public Collection<Class<? extends Annotation>> getTypeAnnotations()
+         {
+            return processedAnnotations.get(Scope.TYPE);
+         }
+      };
+   }
+}
+

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractEJBProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractEJBProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractEJBProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 import java.util.Set;
 
 import javax.ejb.EJB;
@@ -107,4 +109,9 @@
 
       return ref;
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(EJB.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractPersistenceContextProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractPersistenceContextProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractPersistenceContextProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 import java.util.Set;
 
 import javax.persistence.PersistenceContext;
@@ -99,4 +101,9 @@
 
       return ref;
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PersistenceContext.class);
+   }
 }

Added: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractProcessor.java	                        (rev 0)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -0,0 +1,381 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.metadata.annotation.creator;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.jboss.logging.Logger;
+import org.jboss.metadata.annotation.finder.AnnotationFinder;
+
+/**
+ * A abstract base processor.
+ * 
+ * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
+ * @version $Revision$
+ */
+public abstract class AbstractProcessor<MD> extends AbstractFinderUser
+{
+
+   /** Map<Processor metdata type class, List<Processor for classes>> */
+   private Map<Class<?>, List<Processor<Object, Class<?>>>> typeProcessors;
+   
+   /** Map<Processor metdata type class, List<Processor for fields>> */
+   private Map<Class<?>, List<Processor<Object, Field>>> fieldProcessors;
+   
+   /** Map<Processor metdata type class, List<Processor for methods>> */
+   private Map<Class<?>, List<Processor<Object, Method>>> methodProcessors;
+   
+   /** The map of processed Annotations */
+   private Map<Scope, Set<Class<? extends Annotation>>> processedAnnotations;
+   
+   /** The processed types. */
+   private Set<Class<?>> processedTypes = new HashSet<Class<?>>();
+   
+   /** The logger */
+   private final static Logger log = Logger.getLogger(AbstractProcessor.class);
+
+   /**
+    * The constructor.
+    * 
+    * @param finder the AnnotationFinder
+    */
+   public AbstractProcessor(AnnotationFinder<AnnotatedElement> finder)
+   {
+      super(finder);
+      //
+      typeProcessors = new HashMap<Class<?>, List<Processor<Object,Class<?>>>>();
+      fieldProcessors = new HashMap<Class<?>, List<Processor<Object,Field>>>();
+      methodProcessors = new HashMap<Class<?>, List<Processor<Object,Method>>>();
+      processedAnnotations = new HashMap<Scope, Set<Class<? extends Annotation>>>();
+   }
+
+   /**
+    * Add a Field processor.
+    * 
+    * @param processor Processor<Object, Field>
+    */
+   public void addFieldProcessor(Processor processor)
+   {
+      Class<?> processorType = getProcessorMetaDataType(processor, Scope.FIELD);
+      if(log.isTraceEnabled())
+         log.trace("addFieldProcessor: " + processor + ", for type: " + processorType);
+      List<Processor<Object, Field>> processors = fieldProcessors.get(processorType);
+      if(processors == null)
+      {
+         processors = new ArrayList<Processor<Object, Field>>();
+         fieldProcessors.put(processorType, processors);
+      }
+      processors.add(processor);
+   }
+
+   /**
+    * Add a method processor.
+    * 
+    * @param processor Processor<Object, Method>>
+    */
+   public void addMethodProcessor(Processor processor)
+   {
+      Class<?> processorType = getProcessorMetaDataType(processor, Scope.METHOD);
+      if(log.isTraceEnabled())
+         log.trace("addMethodProcessor: " + processor + ", for type: " + processorType);
+      List<Processor<Object, Method>> processors = methodProcessors.get(processorType);
+      if(processors == null)
+      {
+         processors = new ArrayList<Processor<Object, Method>>();
+         methodProcessors.put(processorType, processors);
+      }
+      processors.add(processor);
+   }
+   
+   /**
+    * Add a type processor.
+    * 
+    * @param processor Processor<Object, Class<?>>
+    */
+   public void addTypeProcessor(Processor processor)
+   {
+      Class<?> processorType = getProcessorMetaDataType(processor, Scope.TYPE);
+      if(log.isTraceEnabled())
+         log.trace("addTypeProcessor: " + processor + ", for type: " + processorType);
+      List<Processor<Object, Class<?>>> processors = typeProcessors.get(processorType);
+      if(processors == null)
+      {
+         processors = new ArrayList<Processor<Object, Class<?>>>();
+         typeProcessors.put(processorType, processors);
+      }
+      processors.add(processor);
+   }
+   
+   /**
+    * Process type for component meta data related annotations
+    * 
+    * @param metaData
+    * @param type
+    */
+   public void process(MD metaData, Class<?> type)
+   {
+      processClass(metaData, type);
+   }
+
+   /**
+    * Process a the cls annotations at the type, method and field levels
+    * into the argument metaData. Only processors registered for the metaData
+    * type will be run.
+    * 
+    * @param <T>
+    * @param metaData
+    * @param cls
+    */
+   protected <T> void processClass(T metaData, Class<?> cls)
+   {
+      Class<?> type = metaData.getClass();
+      boolean trace = log.isTraceEnabled();
+
+      // See if we process this type
+      while(type != Object.class)
+      {
+         if(processedTypes.contains(type))
+         {
+            int processorCount = processClass(metaData, cls, type);
+            if(trace)
+               log.trace("Found "+processorCount+" processors for type: "+type);
+         }
+         // Also process each superClass of the meta data
+         type = type.getSuperclass();
+      }
+      
+      // Also process the interfaces of the meta data class 
+      for(Class<?> iface : metaData.getClass().getInterfaces())
+      {
+         if(processedTypes.contains(iface));
+         {
+            processClass(metaData, cls, iface);
+         }
+      }
+   }
+   
+   /**
+    * Process the class and superClasses, based on their processorType.
+    * 
+    * @param <T>
+    * @param metaData the metadata
+    * @param cls the class
+    * @param processorType the processed metadata class
+    * @return
+    */
+   protected <T> int processClass(T metaData, Class<?> cls, Class processorType)
+   {
+      boolean trace = log.isTraceEnabled();
+      int processorCount = 0;
+      if(trace)
+         log.trace("processClass for metaData: " + processorType + ", class: " + cls);
+
+      List<Processor<Object, Class<?>>> tps = typeProcessors.get(processorType);
+      if(tps != null)
+      {
+         processorCount += tps.size();
+         if(trace)
+            log.trace("typeProcessors(" + tps.size() + ") for metaData: "+tps);
+         // Process class
+         for(Processor<Object, Class<?>> processor : tps)
+         {
+            processor.process(metaData, cls);
+         }
+         // Process interfaces
+         for(Class<?> intf : cls.getInterfaces())
+         {
+            for(Processor<Object, Class<?>> processor : tps)
+            {
+               processor.process(metaData, intf);
+            }
+         }
+      }
+      
+      List<Processor<Object, Field>> fps = fieldProcessors.get(processorType);
+      if(fps != null)
+      {
+         processorCount += fps.size();
+         if(trace)
+            log.trace("fieldProcessors(" + fps.size() + ") for metaData: " + fps);
+         Field[] fields = {};
+         try
+         {
+            fields = cls.getDeclaredFields();
+         }
+         catch(Throwable e)
+         {
+            log.debug("Failed to get DeclaredFields for: " + cls, e);
+         }
+         // Process fields
+         for(Field field : fields)
+         {
+            for(Processor<Object, Field> processor : fps)
+            {
+               processor.process(metaData, field);
+            }
+         }
+      }
+
+      List<Processor<Object, Method>> mps = methodProcessors.get(processorType);
+      if(mps != null)
+      {
+         processorCount += mps.size();
+         if(trace)
+            log.trace("methodProcessors(" + mps.size() + ") for metaData: " + mps);
+         Method[] methods = {};
+         try
+         {
+            methods = cls.getDeclaredMethods();
+         }
+         catch(Throwable e)
+         {
+            log.debug("Failed to get DeclaredMethods for: " + cls, e);            
+         }
+         // Process methods
+         for(Method method : methods)
+         {
+            if(trace)
+               log.trace("process method " + method);
+            for(Processor<Object, Method> processor : mps)
+            {
+               processor.process(metaData, method);
+            }
+         }
+      }
+      
+      // Process superclass
+      if(cls.getSuperclass() != null && cls.getSuperclass() != Object.class)
+         processorCount += processClass(metaData, cls.getSuperclass(), processorType);
+      return processorCount;
+   }
+
+   /**
+    * Determine the Processor<T, ?> T generic processorType class.
+    * 
+    * @param processor
+    * @return The Class for the T parameter type.
+    */
+   private Class<?> getProcessorMetaDataType(Processor processor, Scope scope)
+   {
+      // Find the Proccessor<T, ?> interface
+      Type[] interfaces = processor.getClass().getGenericInterfaces();
+      Type processorType = null;
+      for(Type t : interfaces)
+      {
+         ParameterizedType pt = (ParameterizedType) t;
+         Type rawType = pt.getRawType();
+         if((rawType instanceof Class) && ((Class<?>)rawType).getName().equals(Processor.class.getName()))
+         {
+            processorType = t;
+            break;
+         }
+      }
+      if(processorType == null)
+         throw new IllegalStateException("No generic Processor interface found on: "+processor);
+
+      // Get the type of the T parameter
+      ParameterizedType pt = (ParameterizedType) processorType;
+      Type t0 = pt.getActualTypeArguments()[0];
+      Class<?> t = null;
+      if(t0 instanceof Class)
+         t = (Class<?>) t0;
+      else if(t0 instanceof TypeVariable)
+      {
+         TypeVariable tv = (TypeVariable) t0;
+         t = (Class<?>)tv.getBounds()[0];
+      }
+      
+      // Add processed annotations
+      addProcessedAnnotations(scope, processor.getAnnotationTypes());
+      
+      // Add processor to boundedTypes
+      if(! processedTypes.contains(t))
+         processedTypes.add(t);
+      
+      return t;
+   }
+   
+   /**
+    * Add processed annotations to a specific scope.
+    * 
+    * @param scope the Scope
+    * @param annotations the processed annotations
+    */
+   private void addProcessedAnnotations(Scope scope, Collection<Class<? extends Annotation>> annotations)
+   {
+      if(annotations != null && annotations.size() > 0)
+      {
+         if(this.processedAnnotations.get(scope) == null)
+            this.processedAnnotations.put(scope, new HashSet<Class<? extends Annotation>>());
+           
+         this.processedAnnotations.get(scope).addAll(annotations);
+      }
+   }
+   
+   /**
+    * Get annotations for a given scope.
+    * 
+    * @param scope the Scope
+    * @return the processed annotations
+    */
+   public Collection<Class<? extends Annotation>> getProcessedAnnotations(Scope scope)
+   {
+      return this.processedAnnotations.get(scope);
+   }
+   
+   /**
+    * Get a set of all processed annotations handled by this processor.
+    * 
+    * @return processed annotations
+    */
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      // Merge processed annotations from all scopes 
+      Set<Class<? extends Annotation>> set = new HashSet<Class<? extends Annotation>>();
+      if(getProcessedAnnotations(Scope.TYPE) != null)
+         set.addAll(getProcessedAnnotations(Scope.TYPE));
+      if(getProcessedAnnotations(Scope.METHOD) != null)
+         set.addAll(getProcessedAnnotations(Scope.METHOD));
+      if(getProcessedAnnotations(Scope.FIELD) != null)
+         set.addAll(getProcessedAnnotations(Scope.FIELD ));
+      return set;
+   }
+   
+   public static enum Scope
+   {
+      TYPE, METHOD, FIELD
+   }
+
+}

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractResourceProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractResourceProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractResourceProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -377,4 +379,9 @@
       return ref;
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Resource.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractRunAsProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractRunAsProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AbstractRunAsProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.annotation.security.RunAs;
 
@@ -37,14 +39,14 @@
  */
 public class AbstractRunAsProcessor
    extends AbstractFinderUser
-   implements Creator<Class, RunAsMetaData>
+   implements Creator<Class<?>, RunAsMetaData>
 {
    public AbstractRunAsProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
    }
 
-   public RunAsMetaData create(Class element)
+   public RunAsMetaData create(Class<?> element)
    {
       RunAs runAs = finder.getAnnotation(element, RunAs.class);
       if(runAs == null)
@@ -57,4 +59,9 @@
       return metaData;
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RunAs.class);
+   }
+   
 }

Added: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AnnotationContext.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AnnotationContext.java	                        (rev 0)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/AnnotationContext.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.metadata.annotation.creator;
+
+import java.lang.annotation.Annotation;
+import java.util.Collection;
+
+/**
+ * The annotation context represents the annotations handled by a
+ * Creator or Processor. 
+ * 
+ * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
+ * @version $Revision$
+ */
+public interface AnnotationContext
+{
+   /**
+    * Get the processed Type annotations. 
+    * 
+    * @return the processed Type annotations
+    */
+   Collection<Class<? extends Annotation>> getTypeAnnotations();
+
+   /**
+    * Get the processed Method annotations.
+    * 
+    * @return the processed Method annotations
+    */
+   Collection<Class<? extends Annotation>> getMethodAnnotations();
+   
+   /**
+    * Get the processed Field annotations.
+    * 
+    * @return the processed Field annotations
+    */
+   Collection<Class<? extends Annotation>> getFieldAnnotations();
+   
+}
\ No newline at end of file

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/DeclareRolesProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/DeclareRolesProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/DeclareRolesProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.annotation.security.DeclareRoles;
 
@@ -38,14 +40,14 @@
  */
 public class DeclareRolesProcessor
    extends AbstractFinderUser
-   implements Processor<SecurityRolesMetaData, Class>
+   implements Processor<SecurityRolesMetaData, Class<?>>
 {
    public DeclareRolesProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
    }
 
-   public void process(SecurityRolesMetaData metaData, Class element)
+   public void process(SecurityRolesMetaData metaData, Class<?> element)
    {
       DeclareRoles roles = finder.getAnnotation(element, DeclareRoles.class);
       if(roles == null)
@@ -61,4 +63,9 @@
       }
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(DeclareRoles.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/EJBsClassProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/EJBsClassProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/EJBsClassProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJB;
 import javax.ejb.EJBs;
@@ -73,5 +75,11 @@
    {
       return element;
    }
+   
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(EJBs.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PostConstructMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PostConstructMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PostConstructMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.PostConstruct;
 
@@ -65,5 +67,10 @@
       }
       postConstructs.add(callback);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PostConstruct.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PreDestroyMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PreDestroyMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/PreDestroyMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.PreDestroy;
 
@@ -66,4 +68,8 @@
       preDestroys.add(callback);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PreDestroy.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/Processor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/Processor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/Processor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,32 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
+
 /**
  * Creates and places a piece of meta data into the right place.
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
-public interface Processor<MD, T>
+public interface Processor<MD, T extends AnnotatedElement>
 {
+   
+   /**
+    * Process a piece of meta data.
+    * 
+    * @param metaData the meta data
+    * @param type the annotated element
+    */
    void process(MD metaData, T type);
+   
+   /**
+    * Get the annotations handled by this processor.
+    * 
+    * @return the processed annotation types
+    */
+   Collection<Class<? extends Annotation>> getAnnotationTypes();
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ProcessorUtils.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ProcessorUtils.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ProcessorUtils.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,10 +21,13 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.jboss.annotation.javaee.Descriptions;
@@ -142,4 +145,19 @@
       return dg;      
    }
 
+   public static Collection<Class<? extends Annotation>> createAnnotationSet(Class<? extends Annotation> annotation)
+   {
+      Set<Class<? extends Annotation>> set = new HashSet<Class<? extends Annotation>>();
+      set.add(annotation);
+      return set;
+   }
+   
+   public static Collection<Class<? extends Annotation>> createAnnotationSet(Class<? extends Annotation>... annotations)
+   {
+      Set<Class<? extends Annotation>> set = new HashSet<Class<? extends Annotation>>();
+      for(Class<? extends Annotation> annotation : annotations)
+         set.add(annotation);
+      return set;
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ResourcesClassProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ResourcesClassProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ResourcesClassProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.annotation.Resource;
 import javax.annotation.Resources;
@@ -85,5 +87,11 @@
    {
       return element.getName();
    }
+   
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Resources.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/client/ApplicationClient5MetaDataCreator.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/client/ApplicationClient5MetaDataCreator.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/client/ApplicationClient5MetaDataCreator.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -22,13 +22,10 @@
 package org.jboss.metadata.annotation.creator.client;
 
 import java.lang.reflect.AnnotatedElement;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
-import org.jboss.metadata.annotation.creator.AbstractFinderUser;
+import org.jboss.metadata.annotation.creator.AbstractCreator;
 import org.jboss.metadata.annotation.creator.Creator;
-import org.jboss.metadata.annotation.creator.Processor;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.client.spec.ApplicationClient5MetaData;
 
@@ -38,31 +35,28 @@
  * @author Scott.Stark at jboss.org
  * @version $Revision$
  */
-public class ApplicationClient5MetaDataCreator extends AbstractFinderUser
+public class ApplicationClient5MetaDataCreator extends AbstractCreator<ApplicationClient5MetaData>
    implements Creator<Collection<Class<?>>, ApplicationClient5MetaData>
 {
-   private List<Processor<ApplicationClient5MetaData, Class<?>>> processors;
-   
    public ApplicationClient5MetaDataCreator(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
       
-      processors = new ArrayList<Processor<ApplicationClient5MetaData,Class<?>>>();
-      processors.add(new ApplicationClientProcessor(finder));
+      addProcessor(new ApplicationClientProcessor(finder));
    }
 
    public ApplicationClient5MetaData create(Collection<Class<?>> classes)
    {
+      // Don't create meta data for a empty collection
+      if(classes == null || classes.isEmpty())
+         return null;
+      
       ApplicationClient5MetaData metaData = new ApplicationClient5MetaData();
       metaData.setVersion("5");
 
+      // Process
       for(Class<?> cls : classes)
-      {
-         for(Processor<ApplicationClient5MetaData, Class<?>> processor : processors)
-         {
-            processor.process(metaData, cls);
-         }
-      }
+         process(metaData, cls);
       
       return metaData;
    }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractEnterpriseBeanProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractEnterpriseBeanProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractEnterpriseBeanProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,11 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Collections;
 
 import org.jboss.metadata.annotation.creator.AbstractComponentProcessor;
 import org.jboss.metadata.annotation.creator.DeclareRolesProcessor;
@@ -142,4 +145,31 @@
 
       EjbNameThreadLocal.ejbName.set(null);
    }
+   
+   /**
+    * Get the processed annotations types.
+    * Inherited classes need to override the getAnnotationTypes method from AbstractProcessor
+    * to only expose the top level class annotation.
+    * 
+    * @returns a collection of processed annotations
+    */
+   public abstract Collection<Class<? extends Annotation>> getAnnotationTypes();
+   
+   /**
+    * Get the processed annotations for a specific scope.
+    * In case of a EnterpriseBean we only need the TYPE annotation, as the other annotations
+    * depend on the presents of this 'top level' annotation. e.g. @Stateful, @Stateles, @MesageDriven
+    * 
+    * @param scope the Scope
+    * @returns a collection of processed annotations
+    * 
+    */
+   @Override
+   public Collection<Class<? extends Annotation>> getProcessedAnnotations(Scope scope)
+   {
+      if(scope == Scope.TYPE)
+         return getAnnotationTypes();
+      else
+         return Collections.EMPTY_SET;
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractSessionBeanProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractSessionBeanProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractSessionBeanProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -48,7 +48,7 @@
    protected AbstractSessionBeanProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-
+      //
       addTypeProcessor(new LocalProcessor(finder));
       addTypeProcessor(new LocalHomeProcessor(finder));
       addTypeProcessor(new RemoteProcessor(finder));

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractTransactionAttributeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractTransactionAttributeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AbstractTransactionAttributeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.TransactionAttribute;
 import javax.ejb.TransactionAttributeType;
@@ -80,4 +82,9 @@
       ContainerTransactionMetaData transaction = createContainerTransaction(bean.getEjbName(), annotation, element);
       ejbJarMetaData.getAssemblyDescriptor().getContainerTransactions().add(transaction);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(TransactionAttribute.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ApplicationExceptionProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ApplicationExceptionProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ApplicationExceptionProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.ApplicationException;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Creator;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.ApplicationExceptionMetaData;
 import org.jboss.metadata.ejb.spec.ApplicationExceptionsMetaData;
@@ -38,11 +41,11 @@
  * Process an application exception annotation.
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
+ * @version $Revision$
  */
 public class ApplicationExceptionProcessor extends AbstractFinderUser implements Creator<Class<?>, ApplicationExceptionMetaData>, Processor<EjbJar3xMetaData, Class<?>>
 {
-   protected ApplicationExceptionProcessor(AnnotationFinder<AnnotatedElement> finder)
+   public ApplicationExceptionProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
    }
@@ -76,4 +79,9 @@
       
       ejbJar.getAssemblyDescriptor().getApplicationExceptions().add(applicationException);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(ApplicationException.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AroundInvokeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AroundInvokeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/AroundInvokeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,14 +21,17 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.interceptor.AroundInvoke;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Creator;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.AroundInvokeMetaData;
 import org.jboss.metadata.ejb.spec.AroundInvokesMetaData;
@@ -38,7 +41,7 @@
  * Process an AroundInvoke annotation.
  *
  * @author Scott.Stark at jboss.org
- * @version $Revision: $
+ * @version $Revision$
  */
 public class AroundInvokeProcessor extends AbstractFinderUser
    implements Creator<Method, AroundInvokeMetaData>,
@@ -76,4 +79,9 @@
       }
       invokes.add(metaData);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(AroundInvoke.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/DenyAllProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/DenyAllProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/DenyAllProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.security.DenyAll;
 
@@ -74,5 +76,10 @@
       log.trace("add " + mmd);
       methods.add(mmd);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(DenyAll.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/EjbJar30Creator.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/EjbJar30Creator.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/EjbJar30Creator.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,14 +21,15 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
+import java.util.Collections;
 
-import org.jboss.metadata.annotation.creator.AbstractFinderUser;
+import org.jboss.metadata.annotation.creator.AbstractCreator;
+import org.jboss.metadata.annotation.creator.AnnotationContext;
 import org.jboss.metadata.annotation.creator.Creator;
-import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.AbstractProcessor.Scope;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.EjbJar30MetaData;
 import org.jboss.metadata.ejb.spec.EjbJar3xMetaData;
@@ -39,35 +40,66 @@
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
-public class EjbJar30Creator extends AbstractFinderUser
+public class EjbJar30Creator extends AbstractCreator<EjbJar3xMetaData>
    implements Creator<Collection<Class<?>>, EjbJar30MetaData>
 {
-   private List<Processor<EjbJar3xMetaData, Class<?>>> processors;
-   
+   /**
+    * Create a new EjbJar30Creator.
+    * 
+    * @param finder the AnnotationFinder
+    */
    public EjbJar30Creator(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-      
-      processors = new ArrayList<Processor<EjbJar3xMetaData,Class<?>>>();
-      processors.add(new StatefulProcessor(finder));
-      processors.add(new StatelessProcessor(finder));
-      processors.add(new MessageDrivenProcessor(finder));
-      processors.add(new ApplicationExceptionProcessor(finder));
+      //
+      addProcessor(new StatefulProcessor(finder));
+      addProcessor(new StatelessProcessor(finder));
+      addProcessor(new MessageDrivenProcessor(finder));
+      addProcessor(new ApplicationExceptionProcessor(finder));
    }
    
+   /**
+    * Create the meta data for a set of annotated classes.
+    * 
+    * @param classes
+    */
    public EjbJar30MetaData create(Collection<Class<?>> classes)
    {
+      // Don't create meta data for a empty collection
+      if(classes == null || classes.isEmpty())
+         return null;
+      
+      // Create meta data
       EjbJar30MetaData metaData = new EjbJar30MetaData();
       metaData.setVersion("3.0");
       
+      // Process metadata
       for(Class<?> cls : classes)
+         process(metaData, cls);
+      
+      return metaData;
+   }
+   
+   /**
+    * Get the annotation context. This overrides the inherited method,
+    * as we just need the Type annotations. e.g. @Stateful, @Stateless, @Service
+    * 
+    * @return the AnnotationContext
+    */
+   @Override
+   public AnnotationContext getAnnotationContext()
+   {
+      return new AnnotationContext()
       {
-         for(Processor<EjbJar3xMetaData, Class<?>> processor : processors)
+         public Collection<Class<? extends Annotation>> getTypeAnnotations()
          {
-            processor.process(metaData, cls);
+            return getAnnotationsForScope(Scope.TYPE);
          }
-      }
-      
-      return metaData;
+         
+         public Collection<Class<? extends Annotation>> getFieldAnnotations() { return Collections.EMPTY_SET; }
+
+         public Collection<Class<? extends Annotation>> getMethodAnnotations() { return Collections.EMPTY_SET; }
+         
+      };
    }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ImplicitLocalProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ImplicitLocalProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/ImplicitLocalProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
+import java.util.Collections;
 
 import javax.ejb.EJBLocalObject;
 import javax.ejb.Remote;
@@ -83,5 +86,11 @@
       // Finally add local business interface
       metaData.getBusinessLocals().add(businessInterface.getName());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      // does not process any annotation
+      return Collections.EMPTY_SET;
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InitProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InitProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InitProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Init;
 
@@ -43,7 +45,7 @@
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @author Scott.Stark at jboss.org
- * @version $Revision: $
+ * @version $Revision$
  */
 public class InitProcessor extends AbstractFinderUser implements Creator<Method, InitMethodMetaData>, Processor<SessionBeanMetaData, Method>
 {
@@ -99,4 +101,9 @@
       
       bean.getInitMethods().add(initMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Init.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorsProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorsProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/InterceptorsProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
@@ -91,4 +93,9 @@
       metaData.add(interceptor);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Interceptors.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalHomeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalHomeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalHomeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
 import javax.ejb.LocalHome;
 
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 
@@ -73,7 +76,11 @@
          throw new IllegalStateException("2.1 bean " + metaData.getEjbName() + " already has a local interface " + metaData.getLocal() + ", can't add " + businessInterface.getName());
       
       metaData.setLocal(businessInterface.getName());
-
    }
    
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(LocalHome.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/LocalProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBLocalObject;
 import javax.ejb.Local;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.BusinessLocalsMetaData;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
@@ -88,4 +91,9 @@
          }
       }
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Local.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/MessageDrivenProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/MessageDrivenProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/MessageDrivenProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.ActivationConfigProperty;
 import javax.ejb.MessageDriven;
@@ -84,5 +86,10 @@
       metaData.setActivationConfig(config);
       return metaData;
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(MessageDriven.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PermitAllProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PermitAllProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PermitAllProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.security.PermitAll;
 
@@ -79,4 +81,9 @@
       metaData.add(perm);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PermitAll.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PostActivateMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PostActivateMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PostActivateMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.PostActivate;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -68,4 +71,9 @@
       preDestroys.add(callback);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PostActivate.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PrePassivateMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PrePassivateMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/PrePassivateMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.PrePassivate;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -68,4 +71,9 @@
       preDestroys.add(callback);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PrePassivate.class);
+   }
+   
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteHomeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteHomeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteHomeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBHome;
 import javax.ejb.EJBObject;
 import javax.ejb.RemoteHome;
 
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 
@@ -74,7 +77,10 @@
          throw new IllegalStateException("2.1 bean " + metaData.getEjbName() + " already has a remote interface " + metaData.getRemote() + ", can't add " + businessInterface.getName());
          
       metaData.setRemote(businessInterface.getName());
-
    }
    
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RemoteHome.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoteProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBObject;
 import javax.ejb.Remote;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.BusinessRemotesMetaData;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
@@ -88,4 +91,9 @@
          }
       }
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Remote.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoveProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoveProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RemoveProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Remove;
 
@@ -85,4 +87,9 @@
       
       bean.getRemoveMethods().add(removeMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Remove.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RolesAllowedProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RolesAllowedProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/RolesAllowedProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.HashSet;
 
 import javax.annotation.security.RolesAllowed;
@@ -81,5 +83,10 @@
       methods.add(mmd);
       metaData.add(perm);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RolesAllowed.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatefulProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatefulProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatefulProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,10 +21,13 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.Stateful;
 
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.SessionType;
@@ -34,7 +37,7 @@
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @author Scott.Stark at jboss.org
- * @version $Revision: $
+ * @version $Revision$
  */
 public class StatefulProcessor extends AbstractSessionBeanProcessor
 {
@@ -61,4 +64,9 @@
    {
       return create(beanClass, annotation.name(), annotation.mappedName(), annotation.description());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Stateful.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatelessProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatelessProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/StatelessProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,10 +21,13 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.Stateless;
 
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.spec.SessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.SessionType;
@@ -33,7 +36,7 @@
  * Create the correct meta data for a stateless annotation.
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
+ * @version $Revision$
  */
 public class StatelessProcessor extends AbstractSessionBeanProcessor
 {
@@ -57,4 +60,9 @@
    {
       return create(beanClass, annotation.name(), annotation.mappedName(), annotation.description());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Stateless.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/TimeoutProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/TimeoutProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/TimeoutProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Timeout;
 
@@ -58,4 +60,9 @@
       timeoutMethod.setMethodParams(ProcessorUtils.getMethodParameters(method));
       bean.setTimeoutMethod(timeoutMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Timeout.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractEnterpriseBeanProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractEnterpriseBeanProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractEnterpriseBeanProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,15 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Collections;
 
 import org.jboss.metadata.annotation.creator.DeclareRolesProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.AbstractProcessor.Scope;
 import org.jboss.metadata.annotation.creator.jboss.AbstractComponentProcessor;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
@@ -155,4 +159,32 @@
          EjbNameThreadLocal.ejbName.set(null);
       }
    }
+   
+   /**
+    * Get the processed annotations types.
+    * Inherited classes need to override the getAnnotationTypes method from AbstractProcessor
+    * to only expose the top level class annotation.
+    * 
+    * @returns a collection of processed annotations
+    */
+   public abstract Collection<Class<? extends Annotation>> getAnnotationTypes();
+   
+   /**
+    * Get the processed annotations for a specific scope.
+    * In case of a EnterpriseBean we only need the TYPE annotation, as the other annotations
+    * depend on the presents of this 'top level' annotation. e.g. @Stateful, @Stateles, @MesageDriven
+    * 
+    * @param scope the Scope
+    * @returns a collection of processed annotations
+    * 
+    */
+   @Override
+   public Collection<Class<? extends Annotation>> getProcessedAnnotations(Scope scope)
+   {
+      if(scope == Scope.TYPE)
+         return getAnnotationTypes();
+      else
+         return Collections.EMPTY_SET;
+   }
+
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractTransactionAttributeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractTransactionAttributeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AbstractTransactionAttributeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.TransactionAttribute;
 import javax.ejb.TransactionAttributeType;
@@ -83,4 +85,9 @@
       ContainerTransactionMetaData transaction = createContainerTransaction(bean.getEjbName(), annotation, element);
       ejbJarMetaData.getAssemblyDescriptor().getContainerTransactions().add(transaction);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(TransactionAttribute.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ApplicationExceptionProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ApplicationExceptionProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ApplicationExceptionProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.ApplicationException;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Creator;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossAssemblyDescriptorMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
@@ -42,7 +45,7 @@
  */
 public class ApplicationExceptionProcessor extends AbstractFinderUser implements Creator<Class<?>, ApplicationExceptionMetaData>, Processor<JBossMetaData, Class<?>>
 {
-   protected ApplicationExceptionProcessor(AnnotationFinder<AnnotatedElement> finder)
+   public ApplicationExceptionProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
    }
@@ -76,4 +79,9 @@
       
       ejbJar.getAssemblyDescriptor().getApplicationExceptions().add(applicationException);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(ApplicationException.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AroundInvokeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AroundInvokeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/AroundInvokeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,14 +21,17 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.interceptor.AroundInvoke;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Creator;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.AroundInvokeMetaData;
@@ -76,4 +79,9 @@
       }
       invokes.add(metaData);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(AroundInvoke.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/DenyAllProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/DenyAllProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/DenyAllProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.security.DenyAll;
 
@@ -75,4 +77,8 @@
       methods.add(mmd);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(DenyAll.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ImplicitLocalProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ImplicitLocalProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/ImplicitLocalProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
+import java.util.Collections;
 
 import javax.ejb.EJBLocalObject;
 import javax.ejb.Remote;
@@ -83,4 +86,10 @@
       // Finally add local business interface
       metaData.getBusinessLocals().add(businessInterface.getName());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      // does not process any annotation
+      return Collections.EMPTY_SET;
+   }
 }
\ No newline at end of file

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InitProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InitProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InitProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Init;
 
@@ -99,4 +101,9 @@
       
       bean.getInitMethods().add(initMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Init.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InterceptorsProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InterceptorsProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/InterceptorsProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.ExcludeDefaultInterceptors;
@@ -91,4 +93,8 @@
       metaData.add(interceptor);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Interceptors.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBoss50Creator.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBoss50Creator.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBoss50Creator.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,58 +21,89 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
+import java.util.Collections;
 
-import org.jboss.metadata.annotation.creator.AbstractFinderUser;
+import org.jboss.metadata.annotation.creator.AbstractCreator;
+import org.jboss.metadata.annotation.creator.AnnotationContext;
 import org.jboss.metadata.annotation.creator.Creator;
-import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.AbstractProcessor.Scope;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 
-
 /**
  * A JBoss50Creator.
  * 
  * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
  * @version $Revision: 1.1 $
  */
-public class JBoss50Creator extends AbstractFinderUser
+public class JBoss50Creator extends AbstractCreator<JBossMetaData>
    implements Creator<Collection<Class<?>>, JBoss50MetaData>
 {
-   private List<Processor<JBossMetaData, Class<?>>> processors;
-
+   /**
+    * Create a new JBoss50Creator.
+    * 
+    * @param finder the AnnotationFinder
+    */
    public JBoss50Creator(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-      
-      processors = new ArrayList<Processor<JBossMetaData,Class<?>>>();
-      processors.add(new StatefulProcessor(finder));
-      processors.add(new StatelessProcessor(finder));
-      processors.add(new JBossServiceProcessor(finder));
-      processors.add(new JBossConsumerProcessor(finder));
-      processors.add(new MessageDrivenProcessor(finder));
-      processors.add(new ApplicationExceptionProcessor(finder));
-      
+      //
+      addProcessor(new StatefulProcessor(finder));
+      addProcessor(new StatelessProcessor(finder));
+      addProcessor(new JBossServiceProcessor(finder));
+      addProcessor(new JBossConsumerProcessor(finder));
+      addProcessor(new MessageDrivenProcessor(finder));
+      addProcessor(new ApplicationExceptionProcessor(finder));
    }
 
+   /**
+    * Create the meta data for a set of annotated classes.
+    * 
+    * @param classes
+    */
    public JBoss50MetaData create(Collection<Class<?>> classes)
    {
+      // Don't create meta data for a empty collection
+      if(classes == null || classes.isEmpty())
+         return null;
+      
+      // Create meta data
       JBoss50MetaData metaData = new JBoss50MetaData();
       metaData.setVersion("3.0");
       metaData.setEjbVersion("3.0");
       
+      // Process classes
       for(Class<?> cls : classes)
+         process(metaData, cls);
+
+      return metaData;
+   }
+   
+   /**
+    * Get the annotation context. This overrides the inherited method,
+    * as we just need the Type annotations. e.g. @Stateful, @Stateless, @Service
+    * 
+    * @return the AnnotationContext
+    */
+   @Override
+   public AnnotationContext getAnnotationContext()
+   {
+      return new AnnotationContext()
       {
-         for(Processor<JBossMetaData, Class<?>> processor : processors)
+         public Collection<Class<? extends Annotation>> getTypeAnnotations()
          {
-            processor.process(metaData, cls);
+            return getAnnotationsForScope(Scope.TYPE);
          }
-      }
+         
+         public Collection<Class<? extends Annotation>> getFieldAnnotations() { return Collections.EMPTY_SET; }
 
-      return metaData;
+         public Collection<Class<? extends Annotation>> getMethodAnnotations() { return Collections.EMPTY_SET; }
+         
+      };
    }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossAspectDomainProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossAspectDomainProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossAspectDomainProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.AspectDomain;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 
@@ -55,5 +58,9 @@
          metaData.setAopDomainName(annotation.value());
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(AspectDomain.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossCacheConfigProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossCacheConfigProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossCacheConfigProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.CacheConfig;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.CacheConfigMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
@@ -64,5 +67,9 @@
       metaData.setCacheConfig(cacheConfig);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(CacheConfig.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossClusteredProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossClusteredProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossClusteredProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.Clustered;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
@@ -63,5 +65,9 @@
       metaData.setClusterConfig(clustered);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Clustered.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossConsumerProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossConsumerProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossConsumerProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,19 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.ActivationConfigProperty;
 
 import org.jboss.ejb3.annotation.Consumer;
+import org.jboss.metadata.annotation.creator.Creator;
+import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigPropertiesMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigPropertyMetaData;
@@ -38,7 +44,9 @@
  * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
  * @version $Revision$
  */
-public class JBossConsumerProcessor extends AbstractEnterpriseBeanProcessor<JBossConsumerBeanMetaData>
+public class JBossConsumerProcessor
+   extends AbstractEnterpriseBeanProcessor<JBossConsumerBeanMetaData>
+   implements Creator<Class<?>, JBossConsumerBeanMetaData>, Processor<JBossMetaData, Class<?>>
 {
 
    protected JBossConsumerProcessor(AnnotationFinder<AnnotatedElement> finder)
@@ -50,7 +58,7 @@
    }
 
    @Override
-   protected JBossConsumerBeanMetaData create(Class<?> beanClass)
+   public JBossConsumerBeanMetaData create(Class<?> beanClass)
    {
       Consumer annotation = finder.getAnnotation(beanClass, Consumer.class);
       if(annotation == null)
@@ -79,5 +87,9 @@
       return metaData;
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Consumer.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossJndiPolicyProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossJndiPolicyProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossJndiPolicyProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.JndiBindingPolicy;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 
@@ -54,5 +57,9 @@
       metaData.setJndiBindingPolicy(annotation.policy().getName());
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(JndiBindingPolicy.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossManagementProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossManagementProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossManagementProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.Management;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
 import org.jboss.metadata.lang.ClassHelper;
@@ -73,5 +76,10 @@
          return ClassHelper.getDefaultInterface(type);
       }
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Management.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossPoolProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossPoolProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossPoolProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.Pool;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.PoolConfigMetaData;
@@ -58,5 +61,10 @@
       poolConfig.setValue(annotation.value());
       metaData.setPoolConfig(poolConfig);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Pool.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducerProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducerProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducerProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,12 +21,15 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.util.ArrayList;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.Producer;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
 import org.jboss.metadata.ejb.jboss.ProducerMetaData;
@@ -61,11 +64,11 @@
       ProducerMetaData producer = new ProducerMetaData();
       if(annotation.connectionFactory().length() > 1)
          producer.setConnectionFactory(annotation.connectionFactory());
+      
       if(annotation.producer() != Producer.class)
          producer.setClassName(annotation.producer().getName());
-      // TODO find interfaces
+      // TODO find default interface ?
       
-      
       // TODO
       // annotation.transacted();
       // annotation.acknowledgeMode()
@@ -76,5 +79,9 @@
       metaData.getProducers().add(producer);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Producer.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducersProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducersProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossProducersProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.Producer;
 import org.jboss.ejb3.annotation.Producers;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
 
@@ -58,5 +61,11 @@
          super.process(metaData, producer);
       }
    }
+   
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Producers.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossResourceAdapterProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossResourceAdapterProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossResourceAdapterProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.ResourceAdapter;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
 
@@ -55,5 +58,9 @@
          metaData.setResourceAdapterName(annotation.value());
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(ResourceAdapter.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossSerializedConcurrentAccessProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossSerializedConcurrentAccessProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossSerializedConcurrentAccessProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.SerializedConcurrentAccess;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -53,5 +56,10 @@
       
       metaData.setConcurrent(Boolean.TRUE);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(SerializedConcurrentAccess.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossServiceProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossServiceProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/JBossServiceProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,18 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
 
 import org.jboss.ejb3.annotation.Service;
+import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
+import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -38,6 +43,7 @@
  * @version $Revision$
  */
 public class JBossServiceProcessor extends StatefulProcessor
+   implements Processor<JBossMetaData, Class<?>>
 {
 
    protected JBossServiceProcessor(AnnotationFinder<AnnotatedElement> finder)
@@ -73,6 +79,12 @@
       
       return bean;
    }
+   
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Service.class);
+   }
 
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalBindingProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalBindingProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalBindingProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.LocalBinding;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -53,4 +56,8 @@
          metaData.setLocalJndiName(annotation.jndiBinding());
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(LocalBinding.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeBindingProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeBindingProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeBindingProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.LocalHomeBinding;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -54,6 +57,11 @@
       if(annotation.jndiBinding().length() > 1)
          metaData.setLocalHomeJndiName(annotation.jndiBinding());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(LocalHomeBinding.class);
+   }
 
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalHomeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBLocalHome;
 import javax.ejb.EJBLocalObject;
 import javax.ejb.LocalHome;
 
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.creator.ejb.AbstractHomeProcessor;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
@@ -36,6 +39,7 @@
  * Comment
  *
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
  * @version $Revision: 67165 $
  */
 public class LocalHomeProcessor extends AbstractHomeProcessor implements Processor<JBossSessionBeanMetaData, Class<?>>
@@ -74,4 +78,9 @@
       
       metaData.setLocal(businessInterface.getName());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(LocalHome.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/LocalProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBLocalObject;
 import javax.ejb.Local;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.BusinessLocalsMetaData;
@@ -88,4 +91,9 @@
          }
       }
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Local.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/MessageDrivenProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/MessageDrivenProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/MessageDrivenProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.ActivationConfigProperty;
 import javax.ejb.MessageDriven;
@@ -88,4 +90,9 @@
       metaData.setActivationConfig(config);
       return metaData;
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(MessageDriven.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PermitAllProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PermitAllProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PermitAllProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.security.PermitAll;
 
@@ -51,7 +53,6 @@
    {
       super(finder);
    }
-
    
    public void process(MethodPermissionsMetaData metaData, T type)
    {
@@ -78,5 +79,10 @@
       methods.add(mmd);
       metaData.add(perm);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PermitAll.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PostActivateMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PostActivateMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PostActivateMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.PostActivate;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -68,4 +71,8 @@
       preDestroys.add(callback);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PostActivate.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PrePassivateMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PrePassivateMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/PrePassivateMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.PrePassivate;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -67,5 +70,10 @@
       }
       preDestroys.add(callback);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PrePassivate.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.util.ArrayList;
+import java.util.Collection;
 
 import org.jboss.annotation.javaee.Descriptions;
 import org.jboss.ejb3.annotation.RemoteBinding;
@@ -82,4 +84,8 @@
       return remote;
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RemoteBinding.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingsProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingsProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteBindingsProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.RemoteBinding;
 import org.jboss.ejb3.annotation.RemoteBindings;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -53,5 +56,11 @@
       for(RemoteBinding remoteBinding : annotation.value())
          process(metaData, type, remoteBinding);
    }
+   
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RemoteBindings.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeBindingProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeBindingProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeBindingProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,14 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import org.jboss.ejb3.annotation.RemoteHomeBinding;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 
@@ -54,5 +57,10 @@
       if(annotation.jndiBinding().length() > 1)
          metaData.setHomeJndiName(annotation.jndiBinding());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RemoteHomeBinding.class);
+   }
 }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteHomeProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBHome;
 import javax.ejb.EJBObject;
 import javax.ejb.RemoteHome;
 
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.creator.ejb.AbstractHomeProcessor;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
@@ -76,4 +79,9 @@
          
       metaData.setRemote(businessInterface.getName());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RemoteHome.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoteProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.EJBObject;
 import javax.ejb.Remote;
 
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.BusinessRemotesMetaData;
@@ -88,4 +91,9 @@
          }
       }
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Remote.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoveProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoveProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RemoveProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Remove;
 
@@ -85,4 +87,9 @@
       
       bean.getRemoveMethods().add(removeMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Remove.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RolesAllowedProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RolesAllowedProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/RolesAllowedProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.HashSet;
 
 import javax.annotation.security.RolesAllowed;
@@ -51,7 +53,6 @@
    {
       super(finder);
    }
-
    
    public void process(MethodPermissionsMetaData metaData, T type)
    {
@@ -81,5 +82,10 @@
       methods.add(mmd);
       metaData.add(perm);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(RolesAllowed.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatefulProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatefulProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatefulProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,10 +21,13 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.Stateful;
 
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.SessionType;
@@ -68,4 +71,9 @@
    {
       return create(beanClass, annotation.name(), annotation.mappedName(), annotation.description());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Stateful.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatelessProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatelessProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/StatelessProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,10 +21,13 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.ejb.Stateless;
 
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.SessionType;
@@ -61,4 +64,9 @@
    {
       return create(beanClass, annotation.name(), annotation.mappedName(), annotation.description());
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Stateless.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/TimeoutProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/TimeoutProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ejb/jboss/TimeoutProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,8 +21,10 @@
  */
 package org.jboss.metadata.annotation.creator.ejb.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.ejb.Timeout;
 
@@ -58,4 +60,9 @@
       timeoutMethod.setMethodParams(ProcessorUtils.getMethodParameters(method));
       bean.setTimeoutMethod(timeoutMethod);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(Timeout.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/AbstractComponentProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/AbstractComponentProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/AbstractComponentProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -22,20 +22,8 @@
 package org.jboss.metadata.annotation.creator.jboss;
 
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
-import org.jboss.logging.Logger;
-import org.jboss.metadata.annotation.creator.AbstractFinderUser;
+import org.jboss.metadata.annotation.creator.AbstractProcessor;
 import org.jboss.metadata.annotation.creator.EJBClassProcessor;
 import org.jboss.metadata.annotation.creator.EJBFieldProcessor;
 import org.jboss.metadata.annotation.creator.EJBMethodProcessor;
@@ -43,7 +31,6 @@
 import org.jboss.metadata.annotation.creator.PersistenceContextClassProcessor;
 import org.jboss.metadata.annotation.creator.PersistenceContextFieldProcessor;
 import org.jboss.metadata.annotation.creator.PersistenceContextMethodProcessor;
-import org.jboss.metadata.annotation.creator.Processor;
 import org.jboss.metadata.annotation.creator.ResourceClassProcessor;
 import org.jboss.metadata.annotation.creator.ResourceFieldProcessor;
 import org.jboss.metadata.annotation.creator.ResourceMethodProcessor;
@@ -70,28 +57,12 @@
  * @version $Revision: 72364 $
  */
 public abstract class AbstractComponentProcessor<MD>
-   extends AbstractFinderUser
+   extends AbstractProcessor<MD>
 {
-   private static Logger log = Logger.getLogger(AbstractComponentProcessor.class);
 
-   /** Map<Processor metdata type class, List<Processor for classes>> */
-   protected Map<Class<?>, List<Processor<Object, Class<?>>>> typeProcessors;
-   /** Map<Processor metdata type class, List<Processor for fields>> */
-   protected Map<Class<?>, List<Processor<Object, Field>>> fieldProcessors;
-   /** Map<Processor metdata type class, List<Processor for methods>> */
-   protected Map<Class<?>, List<Processor<Object, Method>>> methodProcessors;
-   /** */
-   protected Set<Class<?>> boundedTypes = new HashSet<Class<?>>();
-
-   /**
-    * @param finder
-    */
    public AbstractComponentProcessor(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-      typeProcessors = new HashMap<Class<?>, List<Processor<Object,Class<?>>>>();
-      fieldProcessors = new HashMap<Class<?>, List<Processor<Object,Field>>>();
-      methodProcessors = new HashMap<Class<?>, List<Processor<Object,Method>>>();
 
       // Add component environment processors
       // @Resources/@Resource
@@ -118,49 +89,9 @@
       addTypeProcessor(new WebServiceRefsClassProcessor(finder));
    }
 
-   public void addFieldProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addFieldProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Field>> processors = fieldProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Field>>();
-         fieldProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-
-   public void addMethodProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addMethodProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Method>> processors = methodProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Method>>();
-         methodProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-   public void addTypeProcessor(Processor processor)
-   {
-      Class processorType = getProcessorMetaDataType(processor);
-      if(log.isTraceEnabled())
-         log.trace("addTypeProcessor: "+processor+", for type: "+processorType);
-      List<Processor<Object, Class<?>>> processors = typeProcessors.get(processorType);
-      if(processors == null)
-      {
-         processors = new ArrayList<Processor<Object, Class<?>>>();
-         typeProcessors.put(processorType, processors);
-      }
-      processors.add(processor);
-   }
-
    /**
     * Process type for remote environment metadata related annotations
+    * 
     * @param metaData
     * @param type
     */
@@ -195,8 +126,10 @@
       }
       processClass(wsRefs, type);
    }
+   
    /**
     * Process type for environment metadata related annotations
+    * 
     * @param metaData
     * @param type
     */
@@ -213,175 +146,4 @@
       }
       processClass(pcRefs, type);
    }
-   /**
-    * Process type for component metadata related annotations
-    * @param metaData
-    * @param type
-    */
-   public void process(MD metaData, Class<?> type)
-   {
-      processClass(metaData, type);
-   }
-
-   /**
-    * Process a the cls annotations at the type, method and field levels
-    * into the argument metaData. Only processors registered for the metaData
-    * type will be run.
-    * 
-    * @param <T>
-    * @param metaData
-    * @param cls
-    */
-   protected <T> void processClass(T metaData, Class<?> cls)
-   {
-      Class<?> type = metaData.getClass();
-      boolean trace = log.isTraceEnabled();
-      int processorCount = processClass(metaData, cls, type);
-      if(trace)
-         log.trace("Found "+processorCount+" processors for type: "+type);
-      // See if metaData has a bounded type
-      while(type != Object.class)
-      {
-         type = type.getSuperclass();
-         if(boundedTypes.contains(type))
-         {
-            if(trace)
-               log.trace("Reprocessing class using bounded processor type: "+type);
-            processClass(metaData, cls, type);            
-         }
-      }
-      // Also process the interfaces of the metadata class
-      for(Class<?> iface : metaData.getClass().getInterfaces())
-      {
-         if(boundedTypes.contains(iface));
-         {
-            processClass(metaData, cls, iface);
-         }
-      }
-   }
-   private <T> int processClass(T metaData, Class<?> cls, Class processorType)
-   {
-      boolean trace = log.isTraceEnabled();
-      int processorCount = 0;
-      if(trace)
-         log.trace("processClass for metaData: "+processorType+", class: "+cls);
-
-      List<Processor<Object, Class<?>>> tps = typeProcessors.get(processorType);
-      if(tps != null)
-      {
-         processorCount += tps.size();
-         if(trace)
-            log.trace("typeProcessors("+tps.size()+") for metaData: "+tps);
-         for(Processor<Object, Class<?>> processor : tps)
-         {
-            processor.process(metaData, cls);
-         }
-         
-         for(Class<?> intf : cls.getInterfaces())
-         {
-            for(Processor<Object, Class<?>> processor : tps)
-            {
-               processor.process(metaData, intf);
-            }
-         }
-      }
-      
-      List<Processor<Object, Field>> fps = fieldProcessors.get(processorType);
-      if(fps != null)
-      {
-         processorCount += fps.size();
-         if(trace)
-            log.trace("fieldProcessors("+fps.size()+") for metaData: "+fps);
-         Field[] fields = {};
-         try
-         {
-            fields = cls.getDeclaredFields();
-         }
-         catch(Throwable e)
-         {
-            log.debug("Failed to get DeclaredFields for: "+cls, e);
-         }
-         for(Field field : fields)
-         {
-            for(Processor<Object, Field> processor : fps)
-            {
-               processor.process(metaData, field);
-            }
-         }
-      }
-
-      List<Processor<Object, Method>> mps = methodProcessors.get(processorType);
-      if(mps != null)
-      {
-         processorCount += mps.size();
-         if(trace)
-            log.trace("methodProcessors("+mps.size()+") for metaData: "+mps);
-         Method[] methods = {};
-         try
-         {
-            methods = cls.getDeclaredMethods();
-         }
-         catch(Throwable e)
-         {
-            log.debug("Failed to get DeclaredMethods for: "+cls, e);            
-         }
-         for(Method method : methods)
-         {
-            if(trace)
-               log.trace("process method " + method);
-            for(Processor<Object, Method> processor : mps)
-            {
-               processor.process(metaData, method);
-            }
-         }
-      }
-      
-      if(cls.getSuperclass() != null && cls.getSuperclass() != Object.class)
-         processorCount += processClass(metaData, cls.getSuperclass(), processorType);
-      return processorCount;
-   }
-
-   /**
-    * Determine the Processor<T, ?> T generic processorType class.
-    * 
-    * @param processor
-    * @return The Class for the T parameter type. If this was an upper bound,
-    * this will have been added to the boundedTypes set.
-    */
-   protected Class getProcessorMetaDataType(Processor processor)
-   {
-      // Find the Proccessor<T, ?> interface
-      Type[] interfaces = processor.getClass().getGenericInterfaces();
-      Type processorType = null;
-      for(Type t : interfaces)
-      {
-         ParameterizedType pt = (ParameterizedType) t;
-         Type rawType = pt.getRawType();
-         if((rawType instanceof Class) && ((Class)rawType).getName().equals("org.jboss.metadata.annotation.creator.Processor"))
-         {
-            processorType = t;
-            break;
-         }
-      }
-      if(processorType == null)
-         throw new IllegalStateException("No generic Processor interface found on: "+processor);
-
-      // Get the type of the T parameter
-      ParameterizedType pt = (ParameterizedType) processorType;
-      Type t0 = pt.getActualTypeArguments()[0];
-      Class<?> t = null;
-      if(t0 instanceof Class)
-         t = (Class<?>) t0;
-      else if(t0 instanceof TypeVariable)
-      {
-         TypeVariable tv = (TypeVariable) t0;
-         t = (Class<?>)tv.getBounds()[0];
-      }
-      // Add processor to boundedTypes
-      if(! boundedTypes.contains(t))
-         boundedTypes.add(t);
-      
-      return t;
-   }
-
-}
+ }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PostConstructMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PostConstructMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PostConstructMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.PostConstruct;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossEnvironmentRefsGroupMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -67,5 +70,10 @@
       }
       postConstructs.add(callback);
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PostConstruct.class);
+   }
 
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PreDestroyMethodProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PreDestroyMethodProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/jboss/PreDestroyMethodProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,16 @@
  */
 package org.jboss.metadata.annotation.creator.jboss;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import javax.annotation.PreDestroy;
 
 import org.jboss.metadata.annotation.creator.AbstractLifeCycleMethodProcessor;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.ejb.jboss.JBossEnvironmentRefsGroupMetaData;
 import org.jboss.metadata.javaee.spec.LifecycleCallbackMetaData;
@@ -68,4 +71,8 @@
       preDestroys.add(callback);
    }
 
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(PreDestroy.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/web/Web25MetaDataCreator.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/web/Web25MetaDataCreator.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/web/Web25MetaDataCreator.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -22,13 +22,10 @@
 package org.jboss.metadata.annotation.creator.web;
 
 import java.lang.reflect.AnnotatedElement;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
-import org.jboss.metadata.annotation.creator.AbstractFinderUser;
+import org.jboss.metadata.annotation.creator.AbstractCreator;
 import org.jboss.metadata.annotation.creator.Creator;
-import org.jboss.metadata.annotation.creator.Processor;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.web.spec.Web25MetaData;
 import org.jboss.metadata.web.spec.WebMetaData;
@@ -39,32 +36,29 @@
  * @author Scott.Stark at jboss.org
  * @version $Revision$
  */
-public class Web25MetaDataCreator extends AbstractFinderUser
-   implements Creator<Collection<Class<?>>, Web25MetaData>
+public class Web25MetaDataCreator extends AbstractCreator<WebMetaData>
+      implements Creator<Collection<Class<?>>, Web25MetaData>
 {
-   private List<Processor<WebMetaData, Class<?>>> processors;
-   
    public Web25MetaDataCreator(AnnotationFinder<AnnotatedElement> finder)
    {
       super(finder);
-      
-      processors = new ArrayList<Processor<WebMetaData,Class<?>>>();
-      processors.add(new WebComponentProcessor(finder));
+      addProcessor(new WebComponentProcessor(finder));
    }
 
    public Web25MetaData create(Collection<Class<?>> classes)
    {
+      // Don't create meta data for a empty collection
+      if(classes == null || classes.isEmpty())
+         return null;
+      
+      // Create meta data
       Web25MetaData metaData = new Web25MetaData();
       metaData.setVersion("2.5");
 
-      for(Class<?> cls : classes)
-      {
-         for(Processor<WebMetaData, Class<?>> processor : processors)
-         {
-            processor.process(metaData, cls);
-         }
-      }
-      
+      // Process classes
+      for (Class<?> cls : classes)
+         process(metaData, cls);
+
       return metaData;
    }
 

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/AbstractWebServiceRefProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/AbstractWebServiceRefProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/AbstractWebServiceRefProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,7 +21,9 @@
  */
 package org.jboss.metadata.annotation.creator.ws;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 import java.util.Set;
 
 import javax.xml.ws.WebServiceRef;
@@ -65,6 +67,7 @@
          return;
       process(refs, element, annotation);
    }
+   
    protected void process(RemoteEnvironmentRefsGroupMetaData refs, E element, WebServiceRef annotation)
    {
       boolean trace = log.isTraceEnabled();
@@ -84,7 +87,7 @@
       if(trace)
          log.trace("created service-ref: "+ref);
       
-      /** Delegate to handlerChainProcessor */
+      /** Delegate @HandlerChain processing to the handlerChainProcessor */
       handlerChainProcessor.process(ref, element);
    }
 
@@ -124,4 +127,9 @@
 
       return ref;
    }
+   
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(WebServiceRef.class);
+   }
 }

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceHandlerChainProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceHandlerChainProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceHandlerChainProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -23,17 +23,20 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Collection;
 
 import javax.jws.HandlerChain;
 
 import org.jboss.logging.Logger;
 import org.jboss.metadata.annotation.creator.AbstractFinderUser;
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.javaee.spec.ServiceReferenceHandlerChainsMetaData;
 import org.jboss.metadata.javaee.spec.ServiceReferenceMetaData;
@@ -78,7 +81,8 @@
 
       if (annotation.file() != null && annotation.file().length() > 1)
       {
-         log.trace("processing HandlerChain for element: " + type);
+         if(log.isTraceEnabled())
+            log.trace("processing HandlerChain for element: " + type);
          process(refs, type, annotation);
       }
    }
@@ -117,7 +121,7 @@
    }
 
    /**
-    * Unmarshal
+    * Unmarshal the handler-chains xml file.
     * 
     * @param in the input stream of the file
     * @return ServiceReferenceHandlerChainsMetaData
@@ -201,4 +205,9 @@
          return ((Field) element).getDeclaringClass();
    }
    
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(HandlerChain.class);
+   }
+   
 }
\ No newline at end of file

Modified: projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceRefsClassProcessor.java
===================================================================
--- projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceRefsClassProcessor.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/main/java/org/jboss/metadata/annotation/creator/ws/WebServiceRefsClassProcessor.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,16 +21,21 @@
  */
 package org.jboss.metadata.annotation.creator.ws;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
+import java.util.Collection;
 
 import javax.xml.ws.WebServiceRef;
 import javax.xml.ws.WebServiceRefs;
 
 import org.jboss.metadata.annotation.creator.Processor;
+import org.jboss.metadata.annotation.creator.ProcessorUtils;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.javaee.spec.RemoteEnvironmentRefsGroupMetaData;
 
 /**
+ * @WebServiceRefs processor
+ * 
  * @author <a href="mailto:emuckenh at redhat.com">Emanuel Muckenhuber</a>
  * @version $Revision$
  */
@@ -78,4 +83,9 @@
       return element.getName();
    }
 
+   @Override
+   public Collection<Class<? extends Annotation>> getAnnotationTypes()
+   {
+      return ProcessorUtils.createAnnotationSet(WebServiceRefs.class);
+   }
 }

Modified: projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/client/AnnotationClientUnitTestCase.java
===================================================================
--- projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/client/AnnotationClientUnitTestCase.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/client/AnnotationClientUnitTestCase.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,11 +21,26 @@
  */
 package org.jboss.test.metadata.annotation.client;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import javax.annotation.Resources;
+import javax.annotation.security.DeclareRoles;
+import javax.annotation.security.RunAs;
+import javax.ejb.EJB;
+import javax.ejb.EJBs;
+import javax.persistence.PersistenceContext;
+import javax.xml.ws.WebServiceRef;
+import javax.xml.ws.WebServiceRefs;
+
+import org.jboss.metadata.annotation.creator.AnnotationContext;
 import org.jboss.metadata.annotation.creator.client.ApplicationClient5MetaDataCreator;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.annotation.finder.DefaultAnnotationFinder;
@@ -196,6 +211,8 @@
       assertEquals(Client.class.getName(), wsRefFieldTarget.getInjectionTargetClass());
       assertEquals("service", wsRefFieldTarget.getInjectionTargetName());
       assertNull(wsRef.getServiceInterface());
+      
+      assertAnnotationContext(creator.getAnnotationContext());
    }
 
    @ScanPackage("org.jboss.test.metadata.annotation.client.basic")
@@ -367,4 +384,45 @@
          assertEquals("service", wsRefFieldTarget.getInjectionTargetName());
          assertEquals(wsRefField.getType().getName(), serviceRef.getServiceInterface());
    }
+   
+   private void assertAnnotationContext(AnnotationContext context)
+   {
+      Collection<Class<? extends Annotation>> typeAnnotations = new HashSet<Class<? extends Annotation>>();
+      typeAnnotations.add(Resource.class);
+      typeAnnotations.add(Resources.class);
+      typeAnnotations.add(EJB.class);
+      typeAnnotations.add(EJBs.class);
+      typeAnnotations.add(PersistenceContext.class);
+      typeAnnotations.add(WebServiceRef.class);
+      typeAnnotations.add(WebServiceRefs.class);
+      
+      // Assert Type annotations
+      assertAnnotations(typeAnnotations, context.getTypeAnnotations());
+      
+      Collection<Class<? extends Annotation>> methodAnnotations = new HashSet<Class<? extends Annotation>>();
+      methodAnnotations.add(PreDestroy.class);
+      methodAnnotations.add(PostConstruct.class);
+      methodAnnotations.add(Resource.class);
+      methodAnnotations.add(EJB.class);
+      methodAnnotations.add(PersistenceContext.class);
+      methodAnnotations.add(WebServiceRef.class);
+      
+      // Assert Method annotations
+      assertAnnotations(methodAnnotations, context.getMethodAnnotations());
+      
+      Collection<Class<? extends Annotation>> fieldAnnotations = new HashSet<Class<? extends Annotation>>();
+      fieldAnnotations.add(Resource.class);
+      fieldAnnotations.add(EJB.class);
+      fieldAnnotations.add(PersistenceContext.class);
+      fieldAnnotations.add(WebServiceRef.class);
+      
+      // Assert Field annotations
+      assertAnnotations(fieldAnnotations, context.getFieldAnnotations());
+   }
+   
+   private void assertAnnotations(Collection<Class<? extends Annotation>> expected, Collection<Class<? extends Annotation>> actual)
+   {
+      assertEquals(expected.size(), actual.size());
+      assertTrue(actual.containsAll(expected));
+   }
 }

Modified: projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/AnnotationEjb3UnitTestCase.java
===================================================================
--- projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/AnnotationEjb3UnitTestCase.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/AnnotationEjb3UnitTestCase.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -23,6 +23,7 @@
 
 import java.io.File;
 import java.io.FilenameFilter;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -33,6 +34,10 @@
 import java.util.Iterator;
 import java.util.List;
 
+import javax.ejb.ApplicationException;
+import javax.ejb.MessageDriven;
+import javax.ejb.Stateful;
+import javax.ejb.Stateless;
 import javax.ejb.Timer;
 import javax.ejb.TransactionAttributeType;
 
@@ -42,11 +47,9 @@
 import org.jboss.metadata.common.ejb.IEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBoss50DTDMetaData;
 import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
-import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
-import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigMetaData;
 import org.jboss.metadata.ejb.spec.ActivationConfigPropertiesMetaData;
@@ -62,7 +65,6 @@
 import org.jboss.metadata.ejb.spec.EjbJar3xMetaData;
 import org.jboss.metadata.ejb.spec.EnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.spec.EnterpriseBeansMetaData;
-import org.jboss.metadata.ejb.spec.EntityBeanMetaData;
 import org.jboss.metadata.ejb.spec.ExcludeListMetaData;
 import org.jboss.metadata.ejb.spec.InitMethodMetaData;
 import org.jboss.metadata.ejb.spec.InitMethodsMetaData;
@@ -810,4 +812,26 @@
       assertNotNull(runAs);
       assertEquals("InternalUser", runAs.getRoleName());
    }
+   
+   public void testEjbJar30CreatorAnnotationContext()
+   {
+      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
+      EjbJar30Creator creator = new EjbJar30Creator(finder);
+      
+      assertNotNull(creator);
+      assertNotNull(creator.getAnnotationContext());
+      
+      Collection<Class<? extends Annotation>> expected = new HashSet<Class<? extends Annotation>>();
+      expected.add(Stateless.class);
+      expected.add(Stateful.class);
+      expected.add(MessageDriven.class);
+      expected.add(ApplicationException.class);
+      
+      // Check Type annotations, others must be empty
+      assertEquals(expected.size(), creator.getAnnotationContext().getTypeAnnotations().size());
+      assertTrue(creator.getAnnotationContext().getTypeAnnotations().containsAll(expected));
+      
+      assertTrue(creator.getAnnotationContext().getFieldAnnotations().isEmpty());
+      assertTrue(creator.getAnnotationContext().getMethodAnnotations().isEmpty());
+   }
 }

Modified: projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/JBossAnnotationEjb3UnitTestCase.java
===================================================================
--- projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/JBossAnnotationEjb3UnitTestCase.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/ejb3/JBossAnnotationEjb3UnitTestCase.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -23,6 +23,7 @@
 
 import java.io.File;
 import java.io.FilenameFilter;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -33,9 +34,15 @@
 import java.util.Iterator;
 import java.util.List;
 
+import javax.ejb.ApplicationException;
+import javax.ejb.MessageDriven;
+import javax.ejb.Stateful;
+import javax.ejb.Stateless;
 import javax.ejb.Timer;
 import javax.ejb.TransactionAttributeType;
 
+import org.jboss.ejb3.annotation.Consumer;
+import org.jboss.ejb3.annotation.Service;
 import org.jboss.metadata.annotation.creator.ejb.jboss.JBoss50Creator;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.annotation.finder.DefaultAnnotationFinder;
@@ -48,7 +55,6 @@
 import org.jboss.metadata.ejb.jboss.JBossConsumerBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeansMetaData;
-import org.jboss.metadata.ejb.jboss.JBossEntityBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMessageDrivenBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.ejb.jboss.JBossServiceBeanMetaData;
@@ -980,4 +986,28 @@
       }
       return classes;
    }
+   
+   public void testJBoss50CreatorAnnotationContext()
+   {
+      AnnotationFinder<AnnotatedElement> finder = new DefaultAnnotationFinder<AnnotatedElement>();
+      JBoss50Creator creator = new JBoss50Creator(finder);
+      
+      assertNotNull(creator);
+      assertNotNull(creator.getAnnotationContext());
+      
+      Collection<Class<? extends Annotation>> expected = new HashSet<Class<? extends Annotation>>();
+      expected.add(Stateless.class);
+      expected.add(Stateful.class);
+      expected.add(MessageDriven.class);
+      expected.add(ApplicationException.class);
+      expected.add(Consumer.class);
+      expected.add(Service.class);
+      
+      // Check Type annotations, others must be empty
+      assertEquals(expected.size(), creator.getAnnotationContext().getTypeAnnotations().size());
+      assertTrue(creator.getAnnotationContext().getTypeAnnotations().containsAll(expected));
+      
+      assertTrue(creator.getAnnotationContext().getFieldAnnotations().isEmpty());
+      assertTrue(creator.getAnnotationContext().getMethodAnnotations().isEmpty());
+   }
 }

Modified: projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/web/AnnotationWebUnitTestCase.java
===================================================================
--- projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/web/AnnotationWebUnitTestCase.java	2008-07-18 15:25:18 UTC (rev 76001)
+++ projects/metadata/trunk/src/test/java/org/jboss/test/metadata/annotation/web/AnnotationWebUnitTestCase.java	2008-07-18 16:06:03 UTC (rev 76002)
@@ -21,13 +21,28 @@
  */
 package org.jboss.test.metadata.annotation.web;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import javax.annotation.Resources;
+import javax.annotation.security.DeclareRoles;
+import javax.annotation.security.RunAs;
+import javax.ejb.EJB;
+import javax.ejb.EJBs;
+import javax.persistence.PersistenceContext;
 import javax.transaction.UserTransaction;
+import javax.xml.ws.WebServiceRef;
+import javax.xml.ws.WebServiceRefs;
 
+import org.jboss.metadata.annotation.creator.AnnotationContext;
 import org.jboss.metadata.annotation.creator.web.Web25MetaDataCreator;
 import org.jboss.metadata.annotation.finder.AnnotationFinder;
 import org.jboss.metadata.annotation.finder.DefaultAnnotationFinder;
@@ -397,5 +412,50 @@
       JBossServletMetaData jbossServletMetaData = newMerged.getServlets().get("MyServlet");
       assertEquals("InternalUser", jbossServletMetaData.getRunAs().getRoleName());
       assertEquals("javajoe", jbossServletMetaData.getRunAsPrincipal()); 
-   }    
+      
+      assertAnnotationContext(creator.getAnnotationContext());
+   }
+   
+   private void assertAnnotationContext(AnnotationContext context)
+   {
+      Collection<Class<? extends Annotation>> typeAnnotations = new HashSet<Class<? extends Annotation>>();
+      typeAnnotations.add(RunAs.class);
+      typeAnnotations.add(DeclareRoles.class);
+      typeAnnotations.add(Resource.class);
+      typeAnnotations.add(Resources.class);
+      typeAnnotations.add(EJB.class);
+      typeAnnotations.add(EJBs.class);
+      typeAnnotations.add(PersistenceContext.class);
+      typeAnnotations.add(WebServiceRef.class);
+      typeAnnotations.add(WebServiceRefs.class);
+      
+      // Assert Type annotations
+      assertAnnotations(typeAnnotations, context.getTypeAnnotations());
+      
+      Collection<Class<? extends Annotation>> methodAnnotations = new HashSet<Class<? extends Annotation>>();
+      methodAnnotations.add(PreDestroy.class);
+      methodAnnotations.add(PostConstruct.class);
+      methodAnnotations.add(Resource.class);
+      methodAnnotations.add(EJB.class);
+      methodAnnotations.add(PersistenceContext.class);
+      methodAnnotations.add(WebServiceRef.class);
+      
+      // Assert Method annotations
+      assertAnnotations(methodAnnotations, context.getMethodAnnotations());
+      
+      Collection<Class<? extends Annotation>> fieldAnnotations = new HashSet<Class<? extends Annotation>>();
+      fieldAnnotations.add(Resource.class);
+      fieldAnnotations.add(EJB.class);
+      fieldAnnotations.add(PersistenceContext.class);
+      fieldAnnotations.add(WebServiceRef.class);
+      
+      // Assert Field Annotations
+      assertAnnotations(fieldAnnotations, context.getFieldAnnotations());
+   }
+   
+   private void assertAnnotations(Collection<Class<? extends Annotation>> expected, Collection<Class<? extends Annotation>> actual)
+   {
+      assertEquals(expected.size(), actual.size());
+      assertTrue(actual.containsAll(expected));
+   }
 }




More information about the jboss-cvs-commits mailing list