You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hivemind.apache.org by ah...@apache.org on 2007/03/05 08:01:04 UTC

svn commit: r514579 - in /hivemind/hivemind2/trunk/annotations/src: java/org/apache/hivemind/annotations/ java/org/apache/hivemind/annotations/definition/processors/ java/org/apache/hivemind/annotations/internal/ test/org/apache/hivemind/annotations/

Author: ahuegen
Date: Sun Mar  4 23:01:03 2007
New Revision: 514579

URL: http://svn.apache.org/viewvc?view=rev&rev=514579
Log:
More annotation processors

Added:
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ConfigurationProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ContributionProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/SubmoduleProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationExtensionLoader.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java
Modified:
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedModuleReader.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedRegistryBuilder.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessingContext.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ServiceProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotatedModuleProcessor.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessingContextImpl.java
    hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/AnnotationTestCase.java
    hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModuleReader.java

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedModuleReader.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedModuleReader.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedModuleReader.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedModuleReader.java Sun Mar  4 23:01:03 2007
@@ -18,15 +18,13 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.ClassResolver;
-import org.apache.hivemind.ErrorHandler;
-import org.apache.hivemind.HiveMind;
 import org.apache.hivemind.annotations.internal.AnnotatedModuleProcessor;
+import org.apache.hivemind.annotations.internal.AnnotationProcessorRegistryFactory;
 import org.apache.hivemind.definition.RegistryDefinition;
 import org.apache.hivemind.impl.DefaultClassResolver;
-import org.apache.hivemind.impl.DefaultErrorHandler;
 
 /**
- * Reads a annotated hivemind module into a {@link RegistryDefinition}. Thus
+ * Reads an annotated hivemind module into a {@link RegistryDefinition}. Thus
  * the defined services configurations and contributions are added to the
  * registry.
  * The class delegates the work to {@link AnnotatedModuleProcessor}
@@ -39,10 +37,6 @@
 
     private RegistryDefinition _registryDefinition;
 
-    private AnnotatedModuleProcessor _processor;
-
-    private ErrorHandler _errorHandler;
-
     private ClassResolver _classResolver;
 
     /**
@@ -50,22 +44,18 @@
      */
     public AnnotatedModuleReader(RegistryDefinition registryDefinition)
     {
-        this(registryDefinition, new DefaultClassResolver(), new DefaultErrorHandler());
+        this(registryDefinition, new DefaultClassResolver());
     }
 
     /**
      * @param registryDefinition  the registry definition to which the modules are added.
      * @param classResolver  the {@link ClassResolver} used to resolve all classes referenced from 
      *          elements inside this module.
-     * @param errorHandler  errorHandler used for handling recoverable errors
      */
-    public AnnotatedModuleReader(RegistryDefinition registryDefinition, ClassResolver classResolver,
-            ErrorHandler errorHandler)
+    public AnnotatedModuleReader(RegistryDefinition registryDefinition, ClassResolver classResolver)
     {
         _registryDefinition = registryDefinition;
         _classResolver = classResolver;
-        _errorHandler = errorHandler;
-        _processor = new AnnotatedModuleProcessor(_registryDefinition, _classResolver, _errorHandler);
     }
 
     /**
@@ -87,13 +77,18 @@
      */
     public void readModule(Class moduleClass)
     {
+        AnnotatedModuleProcessor _processor = new AnnotatedModuleProcessor(
+                _registryDefinition, _classResolver, 
+                AnnotationProcessorRegistryFactory.createDefaultRegistry());
         try
         {
             _processor.processModule(moduleClass);
         }
         catch (RuntimeException ex)
         {
-            _errorHandler.error(LOG, ex.getMessage(), HiveMind.getLocation(ex), ex);
+            // TODO: Improve exception handling
+            throw ex;
+//            _errorHandler.error(LOG, ex.getMessage(), HiveMind.getLocation(ex), ex);
         }
     }
     

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedRegistryBuilder.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedRegistryBuilder.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedRegistryBuilder.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/AnnotatedRegistryBuilder.java Sun Mar  4 23:01:03 2007
@@ -91,7 +91,7 @@
         for (int i = 0; i < moduleClassNames.length; i++)
         {
             AnnotatedModuleReader reader = new AnnotatedModuleReader(definition,
-                    _classResolver, _errorHandler);
+                    _classResolver);
             reader.readModule(moduleClassNames[i]);
         }
 
@@ -105,7 +105,7 @@
         for (int i = 0; i < moduleClasses.length; i++)
         {
             AnnotatedModuleReader reader = new AnnotatedModuleReader(definition,
-                    _classResolver, _errorHandler);
+                    _classResolver);
             reader.readModule(moduleClasses[i]);
         }
 

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessingContext.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessingContext.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessingContext.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessingContext.java Sun Mar  4 23:01:03 2007
@@ -3,8 +3,10 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 
+import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
+import org.apache.hivemind.annotations.internal.AnnotatedModuleProcessor;
 import org.apache.hivemind.annotations.internal.ModuleInstanceProvider;
 
 public interface AnnotationProcessingContext
@@ -15,4 +17,6 @@
     public Location getLocation();
     public AnnotatedModuleDefinitionImpl getModule(); 
     public ModuleInstanceProvider getModuleInstanceProvider();
+    public ClassResolver getClassResolver();
+    public AnnotatedModuleProcessor createSubmoduleProcessor();
 }

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessor.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessor.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/AnnotationProcessor.java Sun Mar  4 23:01:03 2007
@@ -2,6 +2,12 @@
 
 import org.apache.hivemind.ApplicationRuntimeException;
 
+/**
+ * The same instance is used for all annotations of one kind which are loaded
+ * by the same AnnotatedModuleProcessor or AnnotatedModuleReader.
+ * 
+ * @author Achim Huegen
+ */
 public interface AnnotationProcessor
 {
     /**

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ConfigurationProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ConfigurationProcessor.java?view=auto&rev=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ConfigurationProcessor.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ConfigurationProcessor.java Sun Mar  4 23:01:03 2007
@@ -0,0 +1,57 @@
+package org.apache.hivemind.annotations.definition.processors;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hivemind.annotations.definition.Configuration;
+import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
+import org.apache.hivemind.annotations.internal.CheckTools;
+import org.apache.hivemind.annotations.internal.MethodCallContributionConstructor;
+import org.apache.hivemind.definition.Contribution;
+import org.apache.hivemind.definition.Occurances;
+import org.apache.hivemind.definition.Visibility;
+import org.apache.hivemind.definition.impl.ConfigurationPointDefinitionImpl;
+import org.apache.hivemind.definition.impl.ContributionDefinitionImpl;
+
+public class ConfigurationProcessor implements AnnotationProcessor
+{
+    private static final Log _log = LogFactory.getLog(ConfigurationProcessor.class);
+
+    /**
+     * @see org.apache.hivemind.annotations.definition.processors.AnnotationProcessor#processAnnotation(org.apache.hivemind.annotations.definition.processors.AnnotationProcessingContext)
+     */
+    public boolean processAnnotation(AnnotationProcessingContext context)
+    {
+        Method method = (Method) context.getAnnotatedElement();
+        AnnotatedModuleDefinitionImpl module = context.getModule();
+        Configuration configurationAnnotation = (Configuration) context.getTargetAnnotation(); 
+        
+        CheckTools.checkMethodModifiers(method, 0, "configuration point");
+        
+        if (_log.isDebugEnabled())
+        {
+            _log.debug("Method " + method.getName() + "classified as configuration point.");
+        }
+        
+        Visibility visibility = Visibility.PUBLIC;
+        if (Modifier.isProtected(method.getModifiers())) {
+            visibility = Visibility.PRIVATE;
+        }
+        
+        ConfigurationPointDefinitionImpl cpd = new ConfigurationPointDefinitionImpl(module, configurationAnnotation.id(), 
+                context.getLocation(), visibility, method.getReturnType().getName(), Occurances.UNBOUNDED,
+                false);
+        module.addConfigurationPoint(cpd);
+        
+        // Add method implementation as initial contribution
+        Contribution contribution = new MethodCallContributionConstructor(
+                context.getLocation(), method, context.getModuleInstanceProvider());
+        ContributionDefinitionImpl cd = new ContributionDefinitionImpl(module, context.getLocation(), contribution, true);
+        cpd.addContribution(cd);
+
+        return true;
+    }
+
+}

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ContributionProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ContributionProcessor.java?view=auto&rev=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ContributionProcessor.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ContributionProcessor.java Sun Mar  4 23:01:03 2007
@@ -0,0 +1,46 @@
+package org.apache.hivemind.annotations.definition.processors;
+
+import java.lang.reflect.Method;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hivemind.annotations.definition.Contribution;
+import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
+import org.apache.hivemind.annotations.internal.CheckTools;
+import org.apache.hivemind.annotations.internal.MethodCallContributionConstructor;
+import org.apache.hivemind.definition.impl.ContributionDefinitionImpl;
+import org.apache.hivemind.util.IdUtils;
+
+public class ContributionProcessor implements AnnotationProcessor
+{
+    private static final Log _log = LogFactory.getLog(ContributionProcessor.class);
+
+    /**
+     * @see org.apache.hivemind.annotations.definition.processors.AnnotationProcessor#processAnnotation(org.apache.hivemind.annotations.definition.processors.AnnotationProcessingContext)
+     */
+    public boolean processAnnotation(AnnotationProcessingContext context)
+    {
+        Method method = (Method) context.getAnnotatedElement();
+        AnnotatedModuleDefinitionImpl module = context.getModule();
+        Contribution contributionAnnotation = (Contribution) context.getTargetAnnotation(); 
+        
+        CheckTools.checkMethodModifiers(method, 0, "contribution");
+        
+        if (_log.isDebugEnabled())
+        {
+            _log.debug("Method " + method.getName() + "classified as contribution.");
+        }
+        
+        org.apache.hivemind.definition.Contribution constructor = new MethodCallContributionConstructor(
+                context.getLocation(), method, context.getModuleInstanceProvider());
+
+        ContributionDefinitionImpl cd = new ContributionDefinitionImpl(module, context.getLocation(), constructor, false);
+        String qualifiedConfigurationId = IdUtils.qualify(
+                module.getId(),
+                contributionAnnotation.configurationId());
+        module.addContribution(qualifiedConfigurationId, cd);
+
+        return true;
+    }
+
+}

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ServiceProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ServiceProcessor.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ServiceProcessor.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ServiceProcessor.java Sun Mar  4 23:01:03 2007
@@ -5,10 +5,8 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.hivemind.Location;
 import org.apache.hivemind.annotations.definition.Service;
 import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
-import org.apache.hivemind.annotations.internal.AnnotatedModuleLocation;
 import org.apache.hivemind.annotations.internal.CheckTools;
 import org.apache.hivemind.annotations.internal.MethodCallImplementationConstructor;
 import org.apache.hivemind.definition.ImplementationConstructor;

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/SubmoduleProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/SubmoduleProcessor.java?view=auto&rev=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/SubmoduleProcessor.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/SubmoduleProcessor.java Sun Mar  4 23:01:03 2007
@@ -0,0 +1,43 @@
+package org.apache.hivemind.annotations.definition.processors;
+
+import java.lang.reflect.Method;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hivemind.annotations.definition.Submodule;
+import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
+import org.apache.hivemind.annotations.internal.AnnotatedModuleProcessor;
+import org.apache.hivemind.annotations.internal.CheckTools;
+import org.apache.hivemind.util.IdUtils;
+
+public class SubmoduleProcessor implements AnnotationProcessor
+{
+    private static final Log _log = LogFactory.getLog(SubmoduleProcessor.class);
+
+    /**
+     * @see org.apache.hivemind.annotations.definition.processors.AnnotationProcessor#processAnnotation(org.apache.hivemind.annotations.definition.processors.AnnotationProcessingContext)
+     */
+    public boolean processAnnotation(AnnotationProcessingContext context)
+    {
+        Method method = (Method) context.getAnnotatedElement();
+        AnnotatedModuleDefinitionImpl module = context.getModule();
+        Submodule submoduleAnnotation = (Submodule) context.getTargetAnnotation(); 
+        
+        CheckTools.checkMethodModifiers(method, 0, "submodule");
+        
+        if (_log.isDebugEnabled())
+        {
+            _log.debug("Method " + method.getName() + "classified as submodule.");
+        }
+        
+        String fullModuleId = IdUtils.qualify(
+                module.getId(),
+                submoduleAnnotation.id());
+        // TODO: Check if return type is defined
+        AnnotatedModuleProcessor submoduleProcessor = context.createSubmoduleProcessor();
+        submoduleProcessor.processModule(method.getReturnType(), fullModuleId);
+
+        return true;
+    }
+
+}

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotatedModuleProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotatedModuleProcessor.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotatedModuleProcessor.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotatedModuleProcessor.java Sun Mar  4 23:01:03 2007
@@ -23,35 +23,27 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.ClassResolver;
-import org.apache.hivemind.ErrorHandler;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.Resource;
 import org.apache.hivemind.annotations.AnnotationsMessages;
-import org.apache.hivemind.annotations.definition.Configuration;
 import org.apache.hivemind.annotations.definition.Module;
-import org.apache.hivemind.annotations.definition.Service;
-import org.apache.hivemind.annotations.definition.Submodule;
 import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
 import org.apache.hivemind.annotations.definition.processors.AnnotationProcessingContext;
 import org.apache.hivemind.annotations.definition.processors.AnnotationProcessor;
-import org.apache.hivemind.annotations.definition.processors.ServiceProcessor;
-import org.apache.hivemind.definition.Contribution;
-import org.apache.hivemind.definition.ImplementationConstructor;
-import org.apache.hivemind.definition.ImplementationDefinition;
-import org.apache.hivemind.definition.Occurances;
 import org.apache.hivemind.definition.RegistryDefinition;
-import org.apache.hivemind.definition.Visibility;
-import org.apache.hivemind.definition.impl.ConfigurationPointDefinitionImpl;
-import org.apache.hivemind.definition.impl.ContributionDefinitionImpl;
-import org.apache.hivemind.definition.impl.ImplementationDefinitionImpl;
-import org.apache.hivemind.definition.impl.ServicePointDefinitionImpl;
 import org.apache.hivemind.util.ClasspathResource;
-import org.apache.hivemind.util.IdUtils;
 
 /**
- * Does the work for {@link org.apache.hivemind.annotations.AnnotatedModuleReader}. Processes an
- * annotated class and registers the defined extension and extension points in a registry
- * definition.
+ * Does the work for {@link org.apache.hivemind.annotations.AnnotatedModuleReader}. 
+ * Processes an annotated class and registers the defined extension and extension points 
+ * in a registry definition. For each module class a new instance of this processor is created.
+ * 
+ * The processor iterates over the methods of the module class and their annotations.
+ * Annotations defined in ancestors are included too.
+ * For each found annotation a list of registered processors for the annotation type 
+ * is requested from the associated {@link AnnotationProcessorRegistry}. 
+ * The processors are called and can contribute to the module definition.
+ * 
  * The construction of extension points and extensions bases on reflective method calls
  * to an instance of the module class. The module instance is created by a 
  * {@link ModuleInstanceProvider} during registry construction. 
@@ -64,19 +56,16 @@
 
     private ClassResolver _classResolver;
 
-    private ErrorHandler _errorHandler;
-
     private RegistryDefinition _registryDefinition;
     
     private AnnotationProcessorRegistry _annotationProcessorRegistry;
 
     public AnnotatedModuleProcessor(RegistryDefinition registryDefinition,
-            ClassResolver classResolver, ErrorHandler errorHandler)
+            ClassResolver classResolver, AnnotationProcessorRegistry annotationProcessorRegistry)
     {
         _registryDefinition = registryDefinition;
         _classResolver = classResolver;
-        _errorHandler = errorHandler;
-        _annotationProcessorRegistry = createAnnotationProcessorRegistry();
+        _annotationProcessorRegistry = annotationProcessorRegistry;
     }
     
     public void processModule(Class moduleClass)
@@ -110,13 +99,6 @@
 
     }
     
-    private AnnotationProcessorRegistry createAnnotationProcessorRegistry()
-    {
-        AnnotationProcessorRegistry result = new AnnotationProcessorRegistry();
-        result.registerProcessor(Service.class, new ServiceProcessor());
-        return result;
-    }
-    
     /**
      * Ensures that a module class fulfills all prerequisites.
      * 
@@ -172,160 +154,22 @@
             Location location = new AnnotatedModuleLocation(module.getLocation().getResource(), 
                     method.getDeclaringClass(), method);
 
-            AnnotationProcessingContext context = new AnnotationProcessingContextImpl(module,
-                    annotation, method, location, instanceProvider);
+            AnnotationProcessingContext context = new AnnotationProcessingContextImpl(
+                    _registryDefinition, module, _classResolver,
+                    annotation, method, location, instanceProvider,
+                    _annotationProcessorRegistry);
             
-            List<AnnotationProcessor> processors = _annotationProcessorRegistry.getProcessors(annotation.getClass());
+            List<AnnotationProcessor> processors = _annotationProcessorRegistry.getProcessors(annotation.annotationType());
             if (processors != null) {
                 for (AnnotationProcessor processor : processors)
                 {
-                    processor.processAnnotation(null);
+                    processor.processAnnotation(context);
                 }
             }
-            
-            if (Service.class.equals(annotation.annotationType()))
-            {
-                processAnnotatedServiceMethod(
-                        method,
-                        (Service) annotation,
-                        module,
-                        instanceProvider);
-            }
-            else if (Configuration.class.equals(annotation.annotationType()))
-            {
-                processAnnotatedConfigurationMethod(
-                        method,
-                        (Configuration) annotation,
-                        module,
-                        instanceProvider);
-            }
-            else if (org.apache.hivemind.annotations.definition.Contribution.class.equals(annotation.annotationType()))
-            {
-                processAnnotatedContributionMethod(
-                        method,
-                        (org.apache.hivemind.annotations.definition.Contribution) annotation,
-                        module,
-                        instanceProvider);
-            }
-            else if (Submodule.class.equals(annotation.annotationType()))
-            {
-                processAnnotatedSubmoduleMethod(
-                        method,
-                        (Submodule) annotation,
-                        module,
-                        instanceProvider);
-            }
-        }
-
-    }
-    
-
-    private void processAnnotatedServiceMethod(Method method, Service service,
-            AnnotatedModuleDefinitionImpl module, ModuleInstanceProvider instanceProvider)
-    {
-        CheckTools.checkMethodModifiers(method, 0, "service point");
-        
-        if (_log.isDebugEnabled())
-        {
-            _log.debug("Method " + method.getName() + "classified as service point.");
-        }
-        
-        Location location = new AnnotatedModuleLocation(module.getLocation().getResource(), 
-                method.getDeclaringClass(), method);
-
-        Visibility visibility = Visibility.PUBLIC;
-        if (Modifier.isProtected(method.getModifiers())) {
-            visibility = Visibility.PRIVATE;
-        }
-        ServicePointDefinitionImpl spd = new ServicePointDefinitionImpl(module, service.id(), location, 
-                visibility, method.getReturnType().getName());
-        module.addServicePoint(spd);
-
-        ImplementationConstructor constructor = new MethodCallImplementationConstructor(location, 
-                method, instanceProvider);
-
-        ImplementationDefinition sid = new ImplementationDefinitionImpl(module, location, 
-                constructor, service.serviceModel(), true);
-
-        spd.addImplementation(sid);
-
-    }
-
-    private void processAnnotatedConfigurationMethod(Method method, Configuration configuration, 
-            AnnotatedModuleDefinitionImpl module, ModuleInstanceProvider instanceProvider)
-    {
-        CheckTools.checkMethodModifiers(method, 0, "configuration point");
-
-        if (_log.isDebugEnabled())
-        {
-            _log.debug("Method " + method.getName() + "classified as configuration point.");
-        }
-        
-        Location location = new AnnotatedModuleLocation(module.getLocation().getResource(), 
-                method.getDeclaringClass(), method);
-        
-        Visibility visibility = Visibility.PUBLIC;
-        if (Modifier.isProtected(method.getModifiers())) {
-            visibility = Visibility.PRIVATE;
         }
-        ConfigurationPointDefinitionImpl cpd = new ConfigurationPointDefinitionImpl(module, configuration.id(), 
-                location, visibility, method.getReturnType().getName(), Occurances.UNBOUNDED,
-                false);
-        module.addConfigurationPoint(cpd);
-        
-        // Add method implementation as initial contribution
-        Contribution contribution = new MethodCallContributionConstructor(
-                location, method, instanceProvider);
-        ContributionDefinitionImpl cd = new ContributionDefinitionImpl(module, location, contribution, true);
-        cpd.addContribution(cd);
-    }
-
-    private void processAnnotatedContributionMethod(Method method, org.apache.hivemind.annotations.definition.Contribution contribution, 
-            AnnotatedModuleDefinitionImpl module, ModuleInstanceProvider instanceProvider)
-    {
-        CheckTools.checkMethodModifiers(method, 0, "contribution");
-
-        if (_log.isDebugEnabled())
-        {
-            _log.debug("Method " + method.getName() + "classified as contribution.");
-        }
-        
-        Location location = new AnnotatedModuleLocation(module.getLocation().getResource(), 
-                method.getDeclaringClass(), method);
-        
-        Contribution constructor = new MethodCallContributionConstructor(
-                location, method, instanceProvider);
-
-        ContributionDefinitionImpl cd = new ContributionDefinitionImpl(module, location, constructor, false);
-        String qualifiedConfigurationId = IdUtils.qualify(
-                module.getId(),
-                contribution.configurationId());
-        module.addContribution(qualifiedConfigurationId, cd);
 
     }
-    
-    /**
-     * Processes a method that is marked as submodule definition.
-     */
-    private void processAnnotatedSubmoduleMethod(Method method, Submodule submodule, 
-            AnnotatedModuleDefinitionImpl module, ModuleInstanceProvider instanceProvider)
-    {
-        CheckTools.checkMethodModifiers(method, 0, "submodule");
 
-        if (_log.isDebugEnabled())
-        {
-            _log.debug("Method " + method.getName() + "classified as submodule.");
-        }
-        
-        String fullModuleId = IdUtils.qualify(
-                module.getId(),
-                submodule.id());
-        // TODO: Check if return type is defined
-        AnnotatedModuleProcessor submoduleProcessor = new AnnotatedModuleProcessor(_registryDefinition,
-                _classResolver, _errorHandler);
-        submoduleProcessor.processModule(method.getReturnType(), fullModuleId);
-    }
-    
     /**
      * Creates a location pointing at the module class. 
      */

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationExtensionLoader.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationExtensionLoader.java?view=auto&rev=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationExtensionLoader.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationExtensionLoader.java Sun Mar  4 23:01:03 2007
@@ -0,0 +1,175 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.hivemind.annotations.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.ClassResolver;
+import org.apache.hivemind.annotations.definition.processors.AnnotationProcessor;
+import org.apache.hivemind.util.IOUtils;
+import org.apache.hivemind.util.URLResource;
+
+/**
+ * @author Achim Huegen
+ */
+public class AnnotationExtensionLoader
+{
+    private static final Log LOG = LogFactory.getLog(AnnotationExtensionLoader.class);
+    public static final String MANIFEST = "META-INF/MANIFEST.MF";
+    public static final String HIVEMIND_SECTION_NAME = "hivemind";
+    public static final String PROCESSOR_ATTRIBUTE_NAME = "annotation-definition-processors";
+    
+    private List _providers = new ArrayList();
+    
+    public AnnotationExtensionLoader(ClassResolver resolver)
+    {
+        processManifestFiles(resolver);
+    }
+    
+    public List getProviders()
+    {
+        return _providers;
+    }
+    
+    /**
+     * Process all manifest files found in the classpath
+     * @param resolver  the ClassResolver to use for the search
+     */
+    private void processManifestFiles(ClassResolver resolver)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Processing manifest files visible to " + resolver);
+
+        ClassLoader loader = resolver.getClassLoader();
+        Enumeration e = null;
+
+        try
+        {
+            e = loader.getResources(MANIFEST);
+        }
+        catch (IOException ex)
+        {
+            throw new ApplicationRuntimeException(ImplMessages.unableToFindProviders(resolver, ex),
+                    ex);
+        }
+
+        while (e.hasMoreElements())
+        {
+            URL descriptorURL = (URL) e.nextElement();
+
+            processManifestFile(resolver, new URLResource(descriptorURL));
+        }
+
+    }
+
+
+    /**
+     * Process a single manifest file.
+     * 
+     * @param resolver
+     * @param resource  pointer to the manifest file
+     */
+    private void processManifestFile(ClassResolver resolver, URLResource resource)
+    {
+        URL url = resource.getResourceURL();
+        InputStream manifestStream = null;
+        Manifest manifest;
+        try
+        {
+            manifestStream = IOUtils.openStreamWithoutCaching(url);
+            manifest = new Manifest(manifestStream);
+        }
+        catch (IOException e)
+        {
+            throw new ApplicationRuntimeException(ImplMessages.unableToReadManifest(url, e),
+                    e);
+        }
+        finally
+        {
+            IOUtils.close(manifestStream);
+        }
+        // Search for an entry that defines a provider class
+        Attributes attributes = manifest.getMainAttributes();
+        if (attributes != null) {
+            String providers = attributes.getValue(PROCESSOR_ATTRIBUTE_NAME);
+            if (providers != null) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Found providers '" + providers + "' defined in manifest file '" + url.toString() + "'");
+                }
+                handleProviderAttribute(resolver, providers);
+            }
+        }
+    }
+
+    /**
+     * Parse the provider list in an attribute and load all classes.
+     */
+    private void handleProviderAttribute(ClassResolver resolver, String providers)
+    {
+        StringTokenizer tokenizer = new StringTokenizer(providers, ",");
+        while (tokenizer.hasMoreTokens())
+        {   
+            String providerClassName = tokenizer.nextToken();
+            loadProvider(resolver, providerClassName);
+        }
+    }
+    
+    /**
+     * Load a provider class and create an instance.
+     * 
+     * @param resolver
+     * @param providerClassName
+     */
+    private void loadProvider(ClassResolver resolver, String providerClassName)
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Loading provider " + providerClassName);
+        Object provider = null;
+        try
+        {
+            Class providerClass = resolver.findClass(providerClassName);
+            provider = providerClass.newInstance();
+        }
+        catch (Exception e)
+        {
+            Exception cause = e;
+            if (e instanceof InvocationTargetException)
+            {
+                cause = (InvocationTargetException) e;
+            }
+            throw new ApplicationRuntimeException(ImplMessages.unableToCreateProvider(providerClassName, e),
+                    cause);
+        }
+        // Check type of provider
+        if (!(provider instanceof AnnotationProcessor)) {
+            throw new ApplicationRuntimeException(ImplMessages.providerWrongType(providerClassName, RegistryProvider.class));
+        }
+        
+        _providers.add(provider);
+    }
+
+}

Modified: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessingContextImpl.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessingContextImpl.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessingContextImpl.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessingContextImpl.java Sun Mar  4 23:01:03 2007
@@ -3,9 +3,11 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 
+import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
 import org.apache.hivemind.annotations.definition.processors.AnnotationProcessingContext;
+import org.apache.hivemind.definition.RegistryDefinition;
 
 public class AnnotationProcessingContextImpl implements AnnotationProcessingContext
 {
@@ -14,15 +16,26 @@
     private AnnotatedModuleDefinitionImpl _module;
     private ModuleInstanceProvider _moduleInstanceProvider;
     private Annotation _targetAnnotation;
-
-    public AnnotationProcessingContextImpl(AnnotatedModuleDefinitionImpl module, Annotation targetAnnotation, AnnotatedElement annotatedElement, Location location, ModuleInstanceProvider moduleInstanceProvider)
+    private RegistryDefinition _registryDefinition;
+    private ClassResolver _classResolver;
+    private AnnotationProcessorRegistry _annotationProcessorRegistry;
+    
+    public AnnotationProcessingContextImpl(
+            RegistryDefinition registryDefinition, AnnotatedModuleDefinitionImpl module,
+            ClassResolver classResolver,
+            Annotation targetAnnotation, AnnotatedElement annotatedElement, 
+            Location location, ModuleInstanceProvider moduleInstanceProvider,
+            AnnotationProcessorRegistry annotationProcessorRegistry)
     {
         super();
+        _registryDefinition = registryDefinition;
         _module = module;
+        _classResolver = classResolver;
         _targetAnnotation = targetAnnotation;
         _annotatedElement = annotatedElement;
         _location = location;
         _moduleInstanceProvider = moduleInstanceProvider;
+        _annotationProcessorRegistry = annotationProcessorRegistry;
     }
 
     public Annotation[] getAllAnnotations()
@@ -53,6 +66,17 @@
     public Annotation getTargetAnnotation()
     {
         return _targetAnnotation;
+    }
+
+    public ClassResolver getClassResolver()
+    {
+        return _classResolver;
+    }
+
+    public AnnotatedModuleProcessor createSubmoduleProcessor()
+    {
+        return new AnnotatedModuleProcessor(_registryDefinition,
+                _classResolver, _annotationProcessorRegistry);
     }
 
 }

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java?view=auto&rev=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java Sun Mar  4 23:01:03 2007
@@ -0,0 +1,25 @@
+package org.apache.hivemind.annotations.internal;
+
+import org.apache.hivemind.annotations.definition.Configuration;
+import org.apache.hivemind.annotations.definition.Contribution;
+import org.apache.hivemind.annotations.definition.Service;
+import org.apache.hivemind.annotations.definition.Submodule;
+import org.apache.hivemind.annotations.definition.processors.ConfigurationProcessor;
+import org.apache.hivemind.annotations.definition.processors.ContributionProcessor;
+import org.apache.hivemind.annotations.definition.processors.ServiceProcessor;
+import org.apache.hivemind.annotations.definition.processors.SubmoduleProcessor;
+
+public class AnnotationProcessorRegistryFactory
+{
+    
+    public static AnnotationProcessorRegistry createDefaultRegistry()
+    {
+        AnnotationProcessorRegistry result = new AnnotationProcessorRegistry();
+        result.registerProcessor(Service.class, new ServiceProcessor());
+        result.registerProcessor(Configuration.class, new ConfigurationProcessor());
+        result.registerProcessor(Contribution.class, new ContributionProcessor());
+        result.registerProcessor(Submodule.class, new SubmoduleProcessor());
+        return result;
+    }
+}
+

Modified: hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/AnnotationTestCase.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/AnnotationTestCase.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/AnnotationTestCase.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/AnnotationTestCase.java Sun Mar  4 23:01:03 2007
@@ -16,9 +16,13 @@
 
 import org.apache.hivemind.definition.RegistryDefinition;
 import org.apache.hivemind.definition.impl.RegistryDefinitionImpl;
-import org.apache.hivemind.impl.DefaultErrorHandler;
 import org.apache.hivemind.test.HiveMindTestCase;
 
+/**
+ * Ancestor for test cases that use annotated modules.
+ * 
+ * @author Achim Huegen
+ */
 public class AnnotationTestCase extends HiveMindTestCase
 {
     protected TypedRegistry constructRegistry(String ... moduleClassNames)
@@ -39,8 +43,7 @@
 
         for (int i = 0; i < moduleClasses.length; i++)
         {
-            AnnotatedModuleReader reader = new AnnotatedModuleReader(definition, getClassResolver(),
-                    new DefaultErrorHandler());
+            AnnotatedModuleReader reader = new AnnotatedModuleReader(definition, getClassResolver());
             reader.readModule(moduleClasses[i]);
         }
 

Modified: hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModuleReader.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModuleReader.java?view=diff&rev=514579&r1=514578&r2=514579
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModuleReader.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModuleReader.java Sun Mar  4 23:01:03 2007
@@ -21,7 +21,6 @@
 import org.apache.hivemind.definition.ServicePointDefinition;
 import org.apache.hivemind.definition.impl.RegistryDefinitionImpl;
 import org.apache.hivemind.impl.DefaultClassResolver;
-import org.apache.hivemind.impl.DefaultErrorHandler;
 
 public class TestAnnotatedModuleReader extends AnnotationTestCase
 {
@@ -57,7 +56,7 @@
     public void testModuleClassNotFinal()
     {
         AnnotatedModuleProcessor processor = new AnnotatedModuleProcessor(new RegistryDefinitionImpl(),
-                new DefaultClassResolver(), new DefaultErrorHandler());
+                new DefaultClassResolver());
         try
         {
             processor.processModule(FinalModule.class);
@@ -71,7 +70,7 @@
     public void testModuleClassNotAbstract()
     {
         AnnotatedModuleProcessor processor = new AnnotatedModuleProcessor(new RegistryDefinitionImpl(),
-                new DefaultClassResolver(), new DefaultErrorHandler());
+                new DefaultClassResolver());
         try
         {
             processor.processModule(AbstractModule.class);
@@ -85,7 +84,7 @@
     public void testModuleClassPublic()
     {
         AnnotatedModuleProcessor processor = new AnnotatedModuleProcessor(new RegistryDefinitionImpl(),
-                new DefaultClassResolver(), new DefaultErrorHandler());
+                new DefaultClassResolver());
         try
         {
             processor.processModule(NotPublicModule.class);