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() {