This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.models.impl-1.0.6
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git

commit a91e250477dee764663de881e417c88c00d46a6c
Author: Justin Edelson <[email protected]>
AuthorDate: Mon Jun 23 19:34:43 2014 +0000

    SLING-3683 - breaking apart annotation processor factory selection from 
injector selection
    
    git-svn-id: 
https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/impl@1604914
 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/models/impl/ModelAdapterFactory.java     | 38 ++++++++++++++++++----
 .../models/impl/ModelConfigurationPrinter.java     | 15 +++++++--
 .../models/impl/injectors/ValueMapInjector.java    |  2 +-
 .../sling/models/impl/CustomInjectorTest.java      |  5 ++-
 .../impl/InjectorSpecificAnnotationTest.java       | 26 ++++++++++++---
 .../sling/models/impl/MultipleInjectorTest.java    |  2 ++
 .../impl/injector/CustomAnnotationInjector.java    |  3 +-
 7 files changed, 75 insertions(+), 16 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java 
b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
index abdd732..bd0ca47 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
@@ -156,6 +156,12 @@ public class ModelAdapterFactory implements 
AdapterFactory, Runnable {
 
     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 implements 
AdapterFactory, Runnable {
         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 implements 
AdapterFactory, Runnable {
         }
     }
 
+    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;
+    }
+
 }
diff --git 
a/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java 
b/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java
index 3e874b1..67e754b 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelConfigurationPrinter.java
@@ -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
diff --git 
a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java 
b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
index 5084686..ee2d419 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
@@ -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);
 
diff --git a/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java 
b/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
index 2db9d7d..046ce00 100644
--- a/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/CustomInjectorTest.java
@@ -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);
diff --git 
a/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
 
b/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
index 6fe6a2b..806a3ad 100644
--- 
a/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
+++ 
b/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java
@@ -77,15 +77,33 @@ public class InjectorSpecificAnnotationTest {
         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);
diff --git 
a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java 
b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
index 605d750..4e7c331 100644
--- a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
+++ b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java
@@ -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);
     }
 
diff --git 
a/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java
 
b/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java
index 053c1e6..e183f2c 100644
--- 
a/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java
+++ 
b/src/test/java/org/apache/sling/models/impl/injector/CustomAnnotationInjector.java
@@ -20,11 +20,12 @@ import java.lang.reflect.AnnotatedElement;
 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() {

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to