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/29 22:01:18 UTC

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

Author: ahuegen
Date: Thu Mar 29 13:01:16 2007
New Revision: 523821

URL: http://svn.apache.org/viewvc?view=rev&rev=523821
Log:
Implementation annotation added

Added:
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/Implementation.java
    hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ImplementationProcessor.java
    hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/OverrideServiceModule.java
Modified:
    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/AnnotationProcessorRegistryFactory.java
    hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModules.java

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/Implementation.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/Implementation.java?view=auto&rev=523821
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/Implementation.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/Implementation.java Thu Mar 29 13:01:16 2007
@@ -0,0 +1,38 @@
+// 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.definition;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.hivemind.internal.ServiceModel;
+
+/**
+ * Marks a method in an annotated module as the implementation of a service point.
+ * The return type of the method must match the corresponding service interface. 
+ * The method is used factory method for the construction of service implementations.
+ * 
+ * @author Achim Huegen
+ */
+@Documented
+@Retention(value = RetentionPolicy.RUNTIME)
+@Target(value = ElementType.METHOD)
+public @interface Implementation {
+    String serviceId();
+    String serviceModel() default ServiceModel.SINGLETON;
+}

Added: hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ImplementationProcessor.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ImplementationProcessor.java?view=auto&rev=523821
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ImplementationProcessor.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/definition/processors/ImplementationProcessor.java Thu Mar 29 13:01:16 2007
@@ -0,0 +1,51 @@
+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.Implementation;
+import org.apache.hivemind.annotations.definition.impl.AnnotatedModuleDefinitionImpl;
+import org.apache.hivemind.annotations.internal.CheckTools;
+import org.apache.hivemind.annotations.internal.MethodCallImplementationConstructor;
+import org.apache.hivemind.definition.ImplementationConstructor;
+import org.apache.hivemind.definition.ImplementationDefinition;
+import org.apache.hivemind.definition.impl.ImplementationDefinitionImpl;
+import org.apache.hivemind.util.IdUtils;
+
+public class ImplementationProcessor implements AnnotationProcessor
+{
+    private static final Log _log = LogFactory.getLog(ImplementationProcessor.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();
+        Implementation implementationAnnotation = (Implementation) context.getTargetAnnotation(); 
+        
+        CheckTools.checkMethodModifiers(method, 0, "implementation");
+        
+        if (_log.isDebugEnabled())
+        {
+            _log.debug("Method " + method.getName() + "classified as implementation.");
+        }
+        
+        // Create implementation constructor that calls the annotated method 
+        ImplementationConstructor constructor = new MethodCallImplementationConstructor(context.getLocation(), 
+                method, context.getModuleInstanceProvider());
+
+        ImplementationDefinition id = new ImplementationDefinitionImpl(module, context.getLocation(), 
+                constructor, implementationAnnotation.serviceModel(), true);
+        
+        String qualifiedServiceId = IdUtils.qualify(
+                module.getId(), implementationAnnotation.serviceId());
+
+        module.addImplementation(qualifiedServiceId, id);
+
+        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=523821&r1=523820&r2=523821
==============================================================================
--- 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 Thu Mar 29 13:01:16 2007
@@ -47,7 +47,7 @@
                 method, context.getModuleInstanceProvider());
 
         ImplementationDefinition sid = new ImplementationDefinitionImpl(module, context.getLocation(), 
-                constructor, serviceAnnotation.serviceModel(), true);
+                constructor, serviceAnnotation.serviceModel(), false);
 
         spd.addImplementation(sid);
 

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=523821&r1=523820&r2=523821
==============================================================================
--- 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 Thu Mar 29 13:01:16 2007
@@ -67,6 +67,7 @@
     {
         _registryDefinition = registryDefinition;
         _classResolver = classResolver;
+        _annotationProcessorRegistry = annotationProcessorRegistry;
         _annotationProcessorFactory = new AnnotationProcessorFactory(annotationProcessorRegistry);
     }
     

Modified: 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=diff&rev=523821&r1=523820&r2=523821
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/java/org/apache/hivemind/annotations/internal/AnnotationProcessorRegistryFactory.java Thu Mar 29 13:01:16 2007
@@ -3,10 +3,12 @@
 import org.apache.hivemind.ClassResolver;
 import org.apache.hivemind.annotations.definition.Configuration;
 import org.apache.hivemind.annotations.definition.Contribution;
+import org.apache.hivemind.annotations.definition.Implementation;
 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.ImplementationProcessor;
 import org.apache.hivemind.annotations.definition.processors.ServiceProcessor;
 import org.apache.hivemind.annotations.definition.processors.SubmoduleProcessor;
 
@@ -37,6 +39,7 @@
         processorRegistry.registerProcessor(Configuration.class, ConfigurationProcessor.class);
         processorRegistry.registerProcessor(Contribution.class, ContributionProcessor.class);
         processorRegistry.registerProcessor(Submodule.class, SubmoduleProcessor.class);
+        processorRegistry.registerProcessor(Implementation.class, ImplementationProcessor.class);
     }
     
 }

Added: hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/OverrideServiceModule.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/OverrideServiceModule.java?view=auto&rev=523821
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/OverrideServiceModule.java (added)
+++ hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/OverrideServiceModule.java Thu Mar 29 13:01:16 2007
@@ -0,0 +1,37 @@
+// 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;
+
+import hivemind.test.services.StringHolder;
+import hivemind.test.services.impl.StringHolderImpl;
+
+import org.apache.hivemind.annotations.definition.Implementation;
+import org.apache.hivemind.annotations.definition.Module;
+import org.apache.hivemind.annotations.definition.Service;
+import org.apache.hivemind.internal.ServiceModel;
+
+@Module(id = "testModule")
+public class OverrideServiceModule extends AbstractAnnotatedModule
+{
+    @Service(id = "Test")
+    public StringHolder getStringHolder() {
+        return null;
+    }
+
+    @Implementation(serviceId = "Test", serviceModel=ServiceModel.PRIMITIVE)
+    public StringHolder getStringHolderImpl() {
+        return new StringHolderImpl();
+    }
+}

Modified: hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModules.java
URL: http://svn.apache.org/viewvc/hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModules.java?view=diff&rev=523821&r1=523820&r2=523821
==============================================================================
--- hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModules.java (original)
+++ hivemind/hivemind2/trunk/annotations/src/test/org/apache/hivemind/annotations/TestAnnotatedModules.java Thu Mar 29 13:01:16 2007
@@ -16,6 +16,7 @@
 
 import hivemind.test.services.ServiceAutowireTarget;
 import hivemind.test.services.StringHolder;
+import hivemind.test.services.impl.StringHolderImpl;
 
 public class TestAnnotatedModules extends AnnotationTestCase
 {
@@ -31,6 +32,14 @@
         TypedRegistry registry = constructRegistry(Supermodule.class);
         StringHolder service = registry.getService("super.sub.StringHolder", StringHolder.class);
         assertNotNull(service);
+    }
+
+    public void testOverrideServiceImplementation()
+    {
+        TypedRegistry registry = constructRegistry(OverrideServiceModule.class);
+        StringHolder service = registry.getService("testModule.Test", StringHolder.class);
+        assertNotNull(service);
+        assertEquals(service.getClass(), StringHolderImpl.class);
     }
 
 }