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]>.
