You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2014/06/23 21:34:43 UTC

svn commit: r1604914 - in /sling/trunk/bundles/extensions/models: api/src/main/java/org/apache/sling/models/spi/injectorspecific/ impl/src/main/java/org/apache/sling/models/impl/ impl/src/main/java/org/apache/sling/models/impl/injectors/ impl/src/test/...

Author: justin
Date: Mon Jun 23 19:34:43 2014
New Revision: 1604914

URL: http://svn.apache.org/r1604914
Log:
SLING-3683 - breaking apart annotation processor factory selection from injector selection

Modified:
    sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
    sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
    sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java
    sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
    sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
    sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
    sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
    sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java

Modified: sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java (original)
+++ sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java Mon Jun 23 19:34:43 2014
@@ -18,9 +18,7 @@ package org.apache.sling.models.spi.inje
 
 import java.lang.reflect.AnnotatedElement;
 
-import org.apache.sling.models.spi.Injector;
-
-public interface InjectAnnotationProcessorFactory extends Injector {
+public interface InjectAnnotationProcessorFactory {
     /**
      * 
      * @param adaptable the object from which this model is adapted

Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java Mon Jun 23 19:34:43 2014
@@ -156,6 +156,12 @@ public class ModelAdapterFactory impleme
 
     private volatile Injector[] sortedInjectors = new Injector[0];
 
+    @Reference(name = "injectAnnotationProcessorFactory", referenceInterface = InjectAnnotationProcessorFactory.class,
+            cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+    private final Map<Object, InjectAnnotationProcessorFactory> injectAnnotationProcessorFactories = new TreeMap<Object, InjectAnnotationProcessorFactory>();
+
+    private volatile InjectAnnotationProcessorFactory[] sortedInjectAnnotationProcessorFactories = new InjectAnnotationProcessorFactory[0];
+
     private ModelPackageBundleListener listener;
 
     private ServiceRegistration jobRegistration;
@@ -275,16 +281,18 @@ public class ModelAdapterFactory impleme
         InjectAnnotationProcessor annotationProcessor = null;
         String source = getSource(element);
         boolean wasInjectionSuccessful = false;
+        
+        // find an appropriate annotation processor
+        for (InjectAnnotationProcessorFactory factory : sortedInjectAnnotationProcessorFactories) {
+            annotationProcessor = factory.createAnnotationProcessor(adaptable, element);
+            if (annotationProcessor != null) {
+                break;
+            }
+        }
 
         // find the right injector
         for (Injector injector : sortedInjectors) {
             if (source == null || source.equals(injector.getName())) {
-                // get annotation processor
-                if (injector instanceof InjectAnnotationProcessorFactory) {
-                    annotationProcessor = ((InjectAnnotationProcessorFactory) injector).createAnnotationProcessor(adaptable,
-                            element);
-                }
-
                 String name = getName(element, annotationProcessor);
                 Object injectionAdaptable = getAdaptable(adaptable, element, annotationProcessor);
                 if (injectionAdaptable != null) {
@@ -784,8 +792,26 @@ public class ModelAdapterFactory impleme
         }
     }
 
+    protected void bindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory injector, final Map<String, Object> props) {
+        synchronized (injectors) {
+            injectAnnotationProcessorFactories.put(ServiceUtil.getComparableForServiceRanking(props), injector);
+            sortedInjectAnnotationProcessorFactories = injectAnnotationProcessorFactories.values().toArray(new InjectAnnotationProcessorFactory[injectAnnotationProcessorFactories.size()]);
+        }
+    }
+
+    protected void unbindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory injector, final Map<String, Object> props) {
+        synchronized (injectors) {
+            injectAnnotationProcessorFactories.remove(ServiceUtil.getComparableForServiceRanking(props));
+            sortedInjectAnnotationProcessorFactories = injectors.values().toArray(new InjectAnnotationProcessorFactory[injectAnnotationProcessorFactories.size()]);
+        }
+    }
+
     Injector[] getInjectors() {
         return sortedInjectors;
     }
 
+    InjectAnnotationProcessorFactory[] getInjectAnnotationProcessorFactories() {
+        return sortedInjectAnnotationProcessorFactories;
+    }
+
 }

Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java Mon Jun 23 19:34:43 2014
@@ -19,14 +19,12 @@ package org.apache.sling.models.impl;
 import java.io.PrintWriter;
 
 import org.apache.sling.models.spi.Injector;
+import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory;
 
 public class ModelConfigurationPrinter {
 
     private final ModelAdapterFactory modelAdapterFactory;
 
-    /**
-     * @param modelAdapterFactory
-     */
     ModelConfigurationPrinter(ModelAdapterFactory modelAdapterFactory) {
         this.modelAdapterFactory = modelAdapterFactory;
     }
@@ -42,6 +40,17 @@ public class ModelConfigurationPrinter {
                 printWriter.println();
             }
         }
+        printWriter.println();
+        printWriter.println("Sling Models Inject Annotation Processor Factories:");
+        InjectAnnotationProcessorFactory[] factories = modelAdapterFactory.getInjectAnnotationProcessorFactories();
+        if (factories == null) {
+            printWriter.println("none");
+        } else {
+            for (InjectAnnotationProcessorFactory factory : factories) {
+                printWriter.printf("%s", factory.getClass().getName());
+                printWriter.println();
+            }
+        }
     }
 
 }
\ No newline at end of file

Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java Mon Jun 23 19:34:43 2014
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
 @Component
 @Service
 @Property(name = Constants.SERVICE_RANKING, intValue = 2000)
-public class ValueMapInjector implements InjectAnnotationProcessorFactory, Injector {
+public class ValueMapInjector implements Injector, InjectAnnotationProcessorFactory {
 
     private static final Logger log = LoggerFactory.getLogger(ValueMapInjector.class);
 

Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java Mon Jun 23 19:34:43 2014
@@ -63,8 +63,11 @@ public class CustomInjectorTest {
 
     @Test
     public void testInjectorWithCustomAnnotation() {
+        CustomAnnotationInjector injector = new CustomAnnotationInjector();
+
         factory.bindInjector(new SimpleInjector(), new ServicePropertiesMap(1, 1));
-        factory.bindInjector(new CustomAnnotationInjector(), new ServicePropertiesMap(1, 1));
+        factory.bindInjector(injector, new ServicePropertiesMap(1, 1));
+        factory.bindInjectAnnotationProcessorFactory(injector, new ServicePropertiesMap(1, 1));
 
         CustomAnnotationModel model = factory.getAdapter(new Object(), CustomAnnotationModel.class);
         assertNotNull(model);

Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java Mon Jun 23 19:34:43 2014
@@ -77,15 +77,33 @@ public class InjectorSpecificAnnotationT
         osgiInjector = new OSGiServiceInjector();
         osgiInjector.activate(componentCtx);
 
-        factory.bindInjector(new BindingsInjector(),
+        BindingsInjector bindingsInjector = new BindingsInjector();
+        ValueMapInjector valueMapInjector = new ValueMapInjector();
+        ChildResourceInjector childResourceInjector = new ChildResourceInjector();
+        RequestAttributeInjector requestAttributeInjector = new RequestAttributeInjector();
+
+        factory.bindInjector(bindingsInjector,
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 1L));
-        factory.bindInjector(new ValueMapInjector(),
+        factory.bindInjector(valueMapInjector,
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 2L));
-        factory.bindInjector(new ChildResourceInjector(),
+        factory.bindInjector(childResourceInjector,
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 3L));
-        factory.bindInjector(new RequestAttributeInjector(),
+        
+        factory.bindInjector(requestAttributeInjector,
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 4L));
         factory.bindInjector(osgiInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 5L));
+
+        factory.bindInjectAnnotationProcessorFactory(bindingsInjector,
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 1L));
+        factory.bindInjectAnnotationProcessorFactory(valueMapInjector,
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 2L));
+        factory.bindInjectAnnotationProcessorFactory(childResourceInjector,
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 3L));
+        factory.bindInjectAnnotationProcessorFactory(requestAttributeInjector,
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 4L));
+        factory.bindInjectAnnotationProcessorFactory(osgiInjector,
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 5L));
+
         SlingBindings bindings = new SlingBindings();
         bindings.setLog(log);
         Mockito.when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings);

Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java Mon Jun 23 19:34:43 2014
@@ -70,6 +70,7 @@ public class MultipleInjectorTest {
         factory.activate(componentCtx);
         factory.bindInjector(bindingsInjector, new ServicePropertiesMap(2, 2));
         factory.bindInjector(attributesInjector, new ServicePropertiesMap(1, 1));
+        factory.bindInjectAnnotationProcessorFactory(bindingsInjector, new ServicePropertiesMap(2, 2));
 
         when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings);
     }
@@ -107,6 +108,7 @@ public class MultipleInjectorTest {
         assertEquals(obj.firstAttribute, attributeValue);
 
         verify(bindingsInjector).getName();
+        verify(bindingsInjector).createAnnotationProcessor(any(), any(AnnotatedElement.class));
         verifyNoMoreInteractions(bindingsInjector);
     }
 

Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java?rev=1604914&r1=1604913&r2=1604914&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java Mon Jun 23 19:34:43 2014
@@ -20,11 +20,12 @@ import java.lang.reflect.AnnotatedElemen
 import java.lang.reflect.Type;
 
 import org.apache.sling.models.spi.DisposalCallbackRegistry;
+import org.apache.sling.models.spi.Injector;
 import org.apache.sling.models.spi.injectorspecific.AbstractInjectAnnotationProcessor;
 import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor;
 import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory;
 
-public class CustomAnnotationInjector implements InjectAnnotationProcessorFactory {
+public class CustomAnnotationInjector implements Injector, InjectAnnotationProcessorFactory {
 
     @Override
     public String getName() {