Author: sseifert Date: Thu Oct 30 14:44:18 2014 New Revision: 1635517 URL: http://svn.apache.org/r1635517 Log: SLING-4112 introduce StaticInjectAnnotationProcessorFactory for those injectors supporting static parsing of annotation independent from adaptable
Added: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java (with props) Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/AbstractInjectAnnotationProcessor.java Thu Oct 30 14:44:18 2014 @@ -17,8 +17,7 @@ package org.apache.sling.models.spi.injectorspecific; /** - * Default implementation of ModelAnnotationProcessor. - * + * Default implementation of {@link InjectAnnotationProcessor}. */ public class AbstractInjectAnnotationProcessor implements InjectAnnotationProcessor { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/InjectAnnotationProcessorFactory.java Thu Oct 30 14:44:18 2014 @@ -18,7 +18,12 @@ package org.apache.sling.models.spi.inje import java.lang.reflect.AnnotatedElement; +/** + * Factory for {@link InjectAnnotationProcessor} that is evaluated at runtime for each + * sling model adaption and may depend on the adaptable. + */ public interface InjectAnnotationProcessorFactory { + /** * * @param adaptable the object from which this model is adapted @@ -28,4 +33,5 @@ public interface InjectAnnotationProcess * null */ InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element); + } Added: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java?rev=1635517&view=auto ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java (added) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java Thu Oct 30 14:44:18 2014 @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.sling.models.spi.injectorspecific; + +import java.lang.reflect.AnnotatedElement; + +/** + * Factory for {@link InjectAnnotationProcessor} that is evaluated once + * a sling model implementation class is registered. + * Whenever possible this interface should be favored above {@link InjectAnnotationProcessorFactory}. + */ +public interface StaticInjectAnnotationProcessorFactory { + + /** + * + * @param element the field or method which is annotated + * @return a ModelAnnotationProcessor in case there is a known + * injector-specific annotation on the given element found otherwise + * null + */ + InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element); + +} Propchange: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Thu Oct 30 14:44:18 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/StaticInjectAnnotationProcessorFactory.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/api/src/main/java/org/apache/sling/models/spi/injectorspecific/package-info.java Thu Oct 30 14:44:18 2014 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@Version("1.0.0") +@Version("1.1.0") package org.apache.sling.models.spi.injectorspecific; import aQute.bnd.annotation.Version; \ No newline at end of file Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/AdapterImplementations.java Thu Oct 30 14:44:18 2014 @@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentSk import org.apache.commons.lang.StringUtils; import org.apache.sling.models.impl.model.ModelClass; import org.apache.sling.models.spi.ImplementationPicker; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; /** * Collects alternative adapter implementations that may be defined in a @Model.adapters attribute. @@ -43,6 +44,7 @@ final class AdapterImplementations { = new ConcurrentHashMap<String,ModelClass<?>>(); private volatile ImplementationPicker[] sortedImplementationPickers = new ImplementationPicker[0]; + private volatile StaticInjectAnnotationProcessorFactory[] sortedStaticInjectAnnotationProcessorFactories = new StaticInjectAnnotationProcessorFactory[0]; public void setImplementationPickers(Collection<ImplementationPicker> implementationPickers) { this.sortedImplementationPickers = implementationPickers.toArray(new ImplementationPicker[implementationPickers.size()]); @@ -51,6 +53,15 @@ final class AdapterImplementations { public ImplementationPicker[] getImplementationPickers() { return this.sortedImplementationPickers; } + + public StaticInjectAnnotationProcessorFactory[] getStaticInjectAnnotationProcessorFactories() { + return sortedStaticInjectAnnotationProcessorFactories; + } + + public void setStaticInjectAnnotationProcessorFactories( + Collection<StaticInjectAnnotationProcessorFactory> factories) { + this.sortedStaticInjectAnnotationProcessorFactories = factories.toArray(new StaticInjectAnnotationProcessorFactory[factories.size()]); + } /** * Add implementation mapping for the given adapter type. @@ -61,7 +72,7 @@ final class AdapterImplementations { public void add(Class<?> adapterType, Class<?> implType) { String key = adapterType.getName(); if (adapterType == implType) { - modelClasses.put(key, new ModelClass(implType)); + modelClasses.put(key, new ModelClass(implType, sortedStaticInjectAnnotationProcessorFactories)); } else { // although we already use a ConcurrentMap synchronize explicitly because we apply non-atomic operations on it @@ -72,7 +83,7 @@ final class AdapterImplementations { implementations = new ConcurrentSkipListMap<String,ModelClass<?>>(); adapterImplementations.put(key, implementations); } - implementations.put(implType.getName(), new ModelClass(implType)); + implementations.put(implType.getName(), new ModelClass(implType, sortedStaticInjectAnnotationProcessorFactories)); } } } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java Thu Oct 30 14:44:18 2014 @@ -45,7 +45,6 @@ import java.util.concurrent.ConcurrentMa import javax.annotation.PostConstruct; import org.apache.commons.beanutils.PropertyUtils; -import org.apache.commons.lang.ArrayUtils; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Deactivate; @@ -58,10 +57,8 @@ import org.apache.sling.api.adapter.Adap import org.apache.sling.api.adapter.AdapterFactory; import org.apache.sling.commons.osgi.PropertiesUtil; import org.apache.sling.commons.osgi.ServiceUtil; -import org.apache.sling.models.annotations.Default; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Model; -import org.apache.sling.models.annotations.Via; import org.apache.sling.models.factory.InvalidAdaptableException; import org.apache.sling.models.factory.InvalidModelException; import org.apache.sling.models.factory.MissingElementsException; @@ -80,6 +77,7 @@ import org.apache.sling.models.spi.Imple import org.apache.sling.models.spi.Injector; import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor; import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; @@ -146,6 +144,10 @@ public class ModelAdapterFactory impleme private volatile InjectAnnotationProcessorFactory[] sortedInjectAnnotationProcessorFactories = new InjectAnnotationProcessorFactory[0]; + @Reference(name = "staticInjectAnnotationProcessorFactory", referenceInterface = StaticInjectAnnotationProcessorFactory.class, + cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC) + private final Map<Object, StaticInjectAnnotationProcessorFactory> staticInjectAnnotationProcessorFactories = new TreeMap<Object, StaticInjectAnnotationProcessorFactory>(); + @Reference(name = "implementationPicker", referenceInterface = ImplementationPicker.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC) private final Map<Object, ImplementationPicker> implementationPickers = new TreeMap<Object, ImplementationPicker>(); @@ -220,7 +222,7 @@ public class ModelAdapterFactory impleme } // normally this code path is not executed, because all types are cached in adapterImplementations // it is still useful for unit testing - return new ModelClass<ModelType>(requestedType); + return new ModelClass<ModelType>(requestedType, this.adapterImplementations.getStaticInjectAnnotationProcessorFactories()); } @SuppressWarnings("unchecked") @@ -549,72 +551,14 @@ public class ModelAdapterFactory impleme return callback.inject(point, processor.getDefault(), result); } } - Default defaultAnnotation = point.getDefaultAnnotation(); - if (defaultAnnotation == null) { - return false; - } - Object value = null; - - if (point.getType() instanceof Class) { - Class<?> injectedClass = (Class<?>) point.getType(); - if (injectedClass.isArray()) { - Class<?> componentType = injectedClass.getComponentType(); - if (componentType == String.class) { - value = defaultAnnotation.values(); - } else if (componentType == Integer.TYPE) { - value = defaultAnnotation.intValues(); - } else if (componentType == Integer.class) { - value = ArrayUtils.toObject(defaultAnnotation.intValues()); - } else if (componentType == Long.TYPE) { - value = defaultAnnotation.longValues(); - } else if (componentType == Long.class) { - value = ArrayUtils.toObject(defaultAnnotation.longValues()); - } else if (componentType == Boolean.TYPE) { - value = defaultAnnotation.booleanValues(); - } else if (componentType == Boolean.class) { - value = ArrayUtils.toObject(defaultAnnotation.booleanValues()); - } else if (componentType == Short.TYPE) { - value = defaultAnnotation.shortValues(); - } else if (componentType == Short.class) { - value = ArrayUtils.toObject(defaultAnnotation.shortValues()); - } else if (componentType == Float.TYPE) { - value = defaultAnnotation.floatValues(); - } else if (componentType == Float.class) { - value = ArrayUtils.toObject(defaultAnnotation.floatValues()); - } else if (componentType == Double.TYPE) { - value = defaultAnnotation.doubleValues(); - } else if (componentType == Double.class) { - value = ArrayUtils.toObject(defaultAnnotation.doubleValues()); - } else { - log.warn("Default values for {} are not supported", componentType); - return false; - } - } else { - if (injectedClass == String.class) { - value = defaultAnnotation.values().length == 0 ? "" : defaultAnnotation.values()[0]; - } else if (injectedClass == Integer.class) { - value = defaultAnnotation.intValues().length == 0 ? 0 : defaultAnnotation.intValues()[0]; - } else if (injectedClass == Long.class) { - value = defaultAnnotation.longValues().length == 0 ? 0l : defaultAnnotation.longValues()[0]; - } else if (injectedClass == Boolean.class) { - value = defaultAnnotation.booleanValues().length == 0 ? false : defaultAnnotation.booleanValues()[0]; - } else if (injectedClass == Short.class) { - value = defaultAnnotation.shortValues().length == 0 ? ((short) 0) : defaultAnnotation.shortValues()[0]; - } else if (injectedClass == Float.class) { - value = defaultAnnotation.floatValues().length == 0 ? 0f : defaultAnnotation.floatValues()[0]; - } else if (injectedClass == Double.class) { - value = defaultAnnotation.doubleValues().length == 0 ? 0d : defaultAnnotation.doubleValues()[0]; - } else { - log.warn("Default values for {} are not supported", injectedClass); - return false; - } - } - } else { - log.warn("Cannot provide default for {}", point.getType()); + Object value = point.getDefaultValue(); + if (value != null) { + return callback.inject(point, value, result); + } + else { return false; } - return callback.inject(point, value, result); } /** @@ -657,11 +601,10 @@ public class ModelAdapterFactory impleme viaPropertyName = processor.getVia(); } if (viaPropertyName == null) { - Via viaAnnotation = point.getViaAnnotation(); - if (viaAnnotation == null) { - return adaptable; - } - viaPropertyName = viaAnnotation.value(); + viaPropertyName = point.getVia(); + } + if (viaPropertyName == null) { + return adaptable; } try { return PropertyUtils.getProperty(adaptable, viaPropertyName); @@ -925,20 +868,34 @@ public class ModelAdapterFactory impleme } } - protected void bindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory injector, final Map<String, Object> props) { + protected void bindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory factory, final Map<String, Object> props) { synchronized (injectAnnotationProcessorFactories) { - injectAnnotationProcessorFactories.put(ServiceUtil.getComparableForServiceRanking(props), injector); + injectAnnotationProcessorFactories.put(ServiceUtil.getComparableForServiceRanking(props), factory); sortedInjectAnnotationProcessorFactories = injectAnnotationProcessorFactories.values().toArray(new InjectAnnotationProcessorFactory[injectAnnotationProcessorFactories.size()]); } } - protected void unbindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory injector, final Map<String, Object> props) { + protected void unbindInjectAnnotationProcessorFactory(final InjectAnnotationProcessorFactory factory, final Map<String, Object> props) { synchronized (injectAnnotationProcessorFactories) { injectAnnotationProcessorFactories.remove(ServiceUtil.getComparableForServiceRanking(props)); sortedInjectAnnotationProcessorFactories = injectAnnotationProcessorFactories.values().toArray(new InjectAnnotationProcessorFactory[injectAnnotationProcessorFactories.size()]); } } + protected void bindStaticInjectAnnotationProcessorFactory(final StaticInjectAnnotationProcessorFactory factory, final Map<String, Object> props) { + synchronized (staticInjectAnnotationProcessorFactories) { + staticInjectAnnotationProcessorFactories.put(ServiceUtil.getComparableForServiceRanking(props), factory); + this.adapterImplementations.setStaticInjectAnnotationProcessorFactories(staticInjectAnnotationProcessorFactories.values()); + } + } + + protected void unbindStaticInjectAnnotationProcessorFactory(final StaticInjectAnnotationProcessorFactory factory, final Map<String, Object> props) { + synchronized (staticInjectAnnotationProcessorFactories) { + staticInjectAnnotationProcessorFactories.remove(ServiceUtil.getComparableForServiceRanking(props)); + this.adapterImplementations.setStaticInjectAnnotationProcessorFactories(staticInjectAnnotationProcessorFactories.values()); + } + } + protected void bindImplementationPicker(final ImplementationPicker implementationPicker, final Map<String, Object> props) { synchronized (implementationPickers) { implementationPickers.put(ServiceUtil.getComparableForServiceRanking(props), implementationPicker); Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java Thu Oct 30 14:44:18 2014 @@ -30,7 +30,7 @@ import org.apache.sling.models.spi.Dispo 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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +38,7 @@ import org.slf4j.LoggerFactory; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = 1000) -public class BindingsInjector implements Injector, InjectAnnotationProcessorFactory { +public class BindingsInjector implements Injector, StaticInjectAnnotationProcessorFactory { private static final Logger log = LoggerFactory.getLogger(BindingsInjector.class); @@ -76,7 +76,7 @@ public class BindingsInjector implements } @Override - public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element) { // check if the element has the expected annotation ScriptVariable annotation = element.getAnnotation(ScriptVariable.class); if (annotation != null) { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/OSGiServiceInjector.java Thu Oct 30 14:44:18 2014 @@ -36,13 +36,13 @@ import org.apache.sling.api.scripting.Sl import org.apache.sling.api.scripting.SlingScriptHelper; import org.apache.sling.models.annotations.Filter; import org.apache.sling.models.annotations.injectorspecific.OSGiService; +import org.apache.sling.models.spi.AcceptsNullName; import org.apache.sling.models.spi.DisposalCallback; import org.apache.sling.models.spi.DisposalCallbackRegistry; -import org.apache.sling.models.spi.AcceptsNullName; 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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; @@ -54,7 +54,7 @@ import org.slf4j.LoggerFactory; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = 5000) -public class OSGiServiceInjector implements Injector, InjectAnnotationProcessorFactory, AcceptsNullName { +public class OSGiServiceInjector implements Injector, StaticInjectAnnotationProcessorFactory, AcceptsNullName { private static final Logger log = LoggerFactory.getLogger(OSGiServiceInjector.class); @@ -217,7 +217,7 @@ public class OSGiServiceInjector impleme } @Override - public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element) { // check if the element has the expected annotation OSGiService annotation = element.getAnnotation(OSGiService.class); if (annotation != null) { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/RequestAttributeInjector.java Thu Oct 30 14:44:18 2014 @@ -29,13 +29,13 @@ import org.apache.sling.models.spi.Dispo 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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.Constants; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = 4000) -public class RequestAttributeInjector implements Injector, InjectAnnotationProcessorFactory { +public class RequestAttributeInjector implements Injector, StaticInjectAnnotationProcessorFactory { @Override public String getName() { @@ -53,7 +53,7 @@ public class RequestAttributeInjector im } @Override - public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element) { // check if the element has the expected annotation RequestAttribute annotation = element.getAnnotation(RequestAttribute.class); if (annotation != null) { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/ResourcePathInjector.java Thu Oct 30 14:44:18 2014 @@ -33,14 +33,14 @@ import org.apache.sling.models.spi.Dispo 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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.Constants; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = 2500) public class ResourcePathInjector extends AbstractInjector implements Injector, AcceptsNullName, - InjectAnnotationProcessorFactory { + StaticInjectAnnotationProcessorFactory { @Override public String getName() { @@ -83,11 +83,11 @@ public class ResourcePathInjector extend } @Override - public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element) { // check if the element has the expected annotation ResourcePath annotation = element.getAnnotation(ResourcePath.class); if (annotation != null) { - return new ResourcePathAnnotationProcessor(annotation, adaptable); + return new ResourcePathAnnotationProcessor(annotation); } return null; } @@ -96,7 +96,7 @@ public class ResourcePathInjector extend private final ResourcePath annotation; - public ResourcePathAnnotationProcessor(ResourcePath annotation, Object adaptable) { + public ResourcePathAnnotationProcessor(ResourcePath annotation) { this.annotation = annotation; } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SelfInjector.java Thu Oct 30 14:44:18 2014 @@ -24,12 +24,12 @@ import org.apache.felix.scr.annotations. import org.apache.felix.scr.annotations.Service; import org.apache.sling.models.annotations.injectorspecific.Self; import org.apache.sling.models.impl.model.ConstructorParameter; -import org.apache.sling.models.spi.DisposalCallbackRegistry; import org.apache.sling.models.spi.AcceptsNullName; +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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.Constants; /** @@ -38,7 +38,7 @@ import org.osgi.framework.Constants; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE) -public class SelfInjector implements Injector, InjectAnnotationProcessorFactory, AcceptsNullName { +public class SelfInjector implements Injector, StaticInjectAnnotationProcessorFactory, AcceptsNullName { @Override public String getName() { @@ -64,7 +64,7 @@ public class SelfInjector implements Inj } @Override - public InjectAnnotationProcessor createAnnotationProcessor(Object adaptable, AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(AnnotatedElement element) { // check if the element has the expected annotation Self annotation = element.getAnnotation(Self.class); if (annotation != null) { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/injectors/SlingObjectInjector.java Thu Oct 30 14:44:18 2014 @@ -37,7 +37,7 @@ import org.apache.sling.models.spi.Dispo 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; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.osgi.framework.Constants; /** @@ -48,7 +48,7 @@ import org.osgi.framework.Constants; @Component @Service @Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE) -public final class SlingObjectInjector implements Injector, InjectAnnotationProcessorFactory, AcceptsNullName { +public final class SlingObjectInjector implements Injector, StaticInjectAnnotationProcessorFactory, AcceptsNullName { /** * Injector name @@ -124,7 +124,7 @@ public final class SlingObjectInjector i } @Override - public InjectAnnotationProcessor createAnnotationProcessor(final Object adaptable, final AnnotatedElement element) { + public InjectAnnotationProcessor createAnnotationProcessor(final AnnotatedElement element) { // check if the element has the expected annotation SlingObject annotation = element.getAnnotation(SlingObject.class); if (annotation != null) { Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/AbstractInjectableElement.java Thu Oct 30 14:44:18 2014 @@ -19,72 +19,230 @@ package org.apache.sling.models.impl.model; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Type; import javax.inject.Named; +import org.apache.commons.lang.ArrayUtils; import org.apache.sling.models.annotations.Default; import org.apache.sling.models.annotations.Optional; import org.apache.sling.models.annotations.Required; import org.apache.sling.models.annotations.Source; import org.apache.sling.models.annotations.Via; +import org.apache.sling.models.impl.ModelAdapterFactory; import org.apache.sling.models.impl.ReflectionUtil; +import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessor; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; abstract class AbstractInjectableElement implements InjectableElement { private final AnnotatedElement element; - private final Named namedAnnotation; + private final Type type; + private final String name; private final String source; - private final Via viaAnnotation; - private final Default defaultAnnotation; + private final String via; + private final boolean hasDefaultValue; + private final Object defaultValue; private final boolean isOptional; private final boolean isRequired; - public AbstractInjectableElement(AnnotatedElement element) { + private static final Logger log = LoggerFactory.getLogger(ModelAdapterFactory.class); + + public AbstractInjectableElement(AnnotatedElement element, Type type, String defaultName, + StaticInjectAnnotationProcessorFactory[] processorFactories) { this.element = element; - this.namedAnnotation = element.getAnnotation(Named.class); - + this.type = type; + InjectAnnotationProcessor annotationProcessor = getAnnotationProcessor(element, processorFactories); + this.name = getName(element, defaultName, annotationProcessor); + this.source = getSource(element); + this.via = getVia(element, annotationProcessor); + this.hasDefaultValue = getHasDefaultValue(element, annotationProcessor); + this.defaultValue = getDefaultValue(element, type, annotationProcessor); + this.isOptional = getOptional(element, annotationProcessor); + this.isRequired = getRequired(element, annotationProcessor); + } + + private static InjectAnnotationProcessor getAnnotationProcessor(AnnotatedElement element, StaticInjectAnnotationProcessorFactory[] processorFactories) { + for (StaticInjectAnnotationProcessorFactory processorFactory : processorFactories) { + InjectAnnotationProcessor annotationProcessor = processorFactory.createAnnotationProcessor(element); + if (annotationProcessor != null) { + return annotationProcessor; + } + } + return null; + } + + private static String getName(AnnotatedElement element, String defaultName, InjectAnnotationProcessor annotationProcessor) { + String name = null; + if (annotationProcessor != null) { + name = annotationProcessor.getName(); + } + if (name == null) { + Named namedAnnotation = element.getAnnotation(Named.class); + if (namedAnnotation != null) { + name = namedAnnotation.value(); + } + else { + name = defaultName; + } + } + return name; + } + + private static String getSource(AnnotatedElement element) { Source source = ReflectionUtil.getAnnotation(element, Source.class); if (source != null) { - this.source = source.value(); + return source.value(); + } + return null; + } + + private static String getVia(AnnotatedElement element, InjectAnnotationProcessor annotationProcessor) { + String via = null; + if (annotationProcessor != null) { + via = annotationProcessor.getVia(); + } + if (via == null) { + Via viaAnnotation = element.getAnnotation(Via.class); + if (viaAnnotation != null) { + via = viaAnnotation.value(); + } } - else { - this.source = null; + return via; + } + + private static boolean getHasDefaultValue(AnnotatedElement element, InjectAnnotationProcessor annotationProcessor) { + if (annotationProcessor != null) { + return annotationProcessor.hasDefault(); + } + return element.isAnnotationPresent(Default.class); + } + + private static Object getDefaultValue(AnnotatedElement element, Type type, InjectAnnotationProcessor annotationProcessor) { + if (annotationProcessor != null && annotationProcessor.hasDefault()) { + return annotationProcessor.getDefault(); } - this.viaAnnotation = element.getAnnotation(Via.class); - this.defaultAnnotation = element.getAnnotation(Default.class); - this.isOptional = element.isAnnotationPresent(Optional.class); - this.isRequired = element.isAnnotationPresent(Required.class); + Default defaultAnnotation = element.getAnnotation(Default.class); + if (defaultAnnotation == null) { + return null; + } + + Object value = null; + + if (type instanceof Class) { + Class<?> injectedClass = (Class<?>) type; + if (injectedClass.isArray()) { + Class<?> componentType = injectedClass.getComponentType(); + if (componentType == String.class) { + value = defaultAnnotation.values(); + } else if (componentType == Integer.TYPE) { + value = defaultAnnotation.intValues(); + } else if (componentType == Integer.class) { + value = ArrayUtils.toObject(defaultAnnotation.intValues()); + } else if (componentType == Long.TYPE) { + value = defaultAnnotation.longValues(); + } else if (componentType == Long.class) { + value = ArrayUtils.toObject(defaultAnnotation.longValues()); + } else if (componentType == Boolean.TYPE) { + value = defaultAnnotation.booleanValues(); + } else if (componentType == Boolean.class) { + value = ArrayUtils.toObject(defaultAnnotation.booleanValues()); + } else if (componentType == Short.TYPE) { + value = defaultAnnotation.shortValues(); + } else if (componentType == Short.class) { + value = ArrayUtils.toObject(defaultAnnotation.shortValues()); + } else if (componentType == Float.TYPE) { + value = defaultAnnotation.floatValues(); + } else if (componentType == Float.class) { + value = ArrayUtils.toObject(defaultAnnotation.floatValues()); + } else if (componentType == Double.TYPE) { + value = defaultAnnotation.doubleValues(); + } else if (componentType == Double.class) { + value = ArrayUtils.toObject(defaultAnnotation.doubleValues()); + } else { + log.warn("Default values for {} are not supported", componentType); + } + } else { + if (injectedClass == String.class) { + value = defaultAnnotation.values().length == 0 ? "" : defaultAnnotation.values()[0]; + } else if (injectedClass == Integer.class) { + value = defaultAnnotation.intValues().length == 0 ? 0 : defaultAnnotation.intValues()[0]; + } else if (injectedClass == Long.class) { + value = defaultAnnotation.longValues().length == 0 ? 0l : defaultAnnotation.longValues()[0]; + } else if (injectedClass == Boolean.class) { + value = defaultAnnotation.booleanValues().length == 0 ? false : defaultAnnotation.booleanValues()[0]; + } else if (injectedClass == Short.class) { + value = defaultAnnotation.shortValues().length == 0 ? ((short) 0) : defaultAnnotation.shortValues()[0]; + } else if (injectedClass == Float.class) { + value = defaultAnnotation.floatValues().length == 0 ? 0f : defaultAnnotation.floatValues()[0]; + } else if (injectedClass == Double.class) { + value = defaultAnnotation.doubleValues().length == 0 ? 0d : defaultAnnotation.doubleValues()[0]; + } else { + log.warn("Default values for {} are not supported", injectedClass); + } + } + } else { + log.warn("Cannot provide default for {}", type); + } + return value; } + private static boolean getOptional(AnnotatedElement element, InjectAnnotationProcessor annotationProcessor) { + if (annotationProcessor != null) { + Boolean optional = annotationProcessor.isOptional(); + if (optional != null) { + return optional.booleanValue(); + } + } + return element.isAnnotationPresent(Optional.class); + } + + private static boolean getRequired(AnnotatedElement element, InjectAnnotationProcessor annotationProcessor) { + if (annotationProcessor != null) { + Boolean optional = annotationProcessor.isOptional(); + if (optional != null) { + return !optional.booleanValue(); + } + } + return element.isAnnotationPresent(Required.class); + } + @Override public final AnnotatedElement getAnnotatedElement() { return this.element; } + + @Override + public final Type getType() { + return type; + } @Override public final String getName() { - if (this.namedAnnotation != null) { - return this.namedAnnotation.value(); - } - return getElementName(); + return this.name; } - protected abstract String getElementName(); - @Override public String getSource() { return this.source; } @Override - public Via getViaAnnotation() { - return this.viaAnnotation; + public String getVia() { + return this.via; } @Override - public Default getDefaultAnnotation() { - return this.defaultAnnotation; + public boolean hasDefaultValue() { + return this.hasDefaultValue; + } + + @Override + public Object getDefaultValue() { + return this.defaultValue; } @Override Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ConstructorParameter.java Thu Oct 30 14:44:18 2014 @@ -22,6 +22,8 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; + /** * Constructor parameters aren't normally accessible using the * AnnotatedElement. This class acts as a facade to ease @@ -34,8 +36,9 @@ public class ConstructorParameter extend private final boolean isPrimitive; private final int parameterIndex; - public ConstructorParameter(Annotation[] annotations, Type parameterType, Type genericType, boolean isPrimitive, int parameterIndex) { - super(new FakeAnnotatedElement(annotations, parameterIndex)); + public ConstructorParameter(Annotation[] annotations, Type parameterType, Type genericType, boolean isPrimitive, + int parameterIndex, StaticInjectAnnotationProcessorFactory[] processorFactories) { + super(new FakeAnnotatedElement(annotations, parameterIndex), genericType, null, processorFactories); this.parameterType = parameterType; this.genericType = genericType; this.isPrimitive = isPrimitive; @@ -50,16 +53,6 @@ public class ConstructorParameter extend return this.parameterType; } - /** - * @return Type of injectable mapped to wrapper class - */ - public Type getType() { - return this.genericType; - } - - /** - * @return true if return type is a primitive type - */ public boolean isPrimitive() { return isPrimitive; } @@ -73,12 +66,6 @@ public class ConstructorParameter extend return "Parameter" + this.parameterIndex + "[" + this.genericType.toString() + "]"; } - @Override - public String getElementName() { - // implicit name not supported for constructor parameters - but do not throw exception because class-based injection is still possible - return null; - } - public static class FakeAnnotatedElement implements AnnotatedElement { private final Annotation[] annotations; Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableElement.java Thu Oct 30 14:44:18 2014 @@ -21,9 +21,6 @@ package org.apache.sling.models.impl.mod import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Type; -import org.apache.sling.models.annotations.Default; -import org.apache.sling.models.annotations.Via; - public interface InjectableElement { /** @@ -54,12 +51,17 @@ public interface InjectableElement { /** * @return Via annotation or null */ - Via getViaAnnotation(); + String getVia(); + + /** + * @return true, if a default value is set + */ + boolean hasDefaultValue(); /** - * @return Default annotation or null + * @return Default value or null */ - Default getDefaultAnnotation(); + Object getDefaultValue(); /** * @return @Optional annotation is present Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableField.java Thu Oct 30 14:44:18 2014 @@ -19,42 +19,25 @@ package org.apache.sling.models.impl.model; import java.lang.reflect.Field; -import java.lang.reflect.Type; import org.apache.sling.models.impl.ReflectionUtil; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; public class InjectableField extends AbstractInjectableElement { private final Field field; - private final Type genericType; - public InjectableField(Field field) { - super(field); + public InjectableField(Field field, StaticInjectAnnotationProcessorFactory[] processorFactories) { + super(field, ReflectionUtil.mapPrimitiveClasses(field.getGenericType()), field.getName(), processorFactories); this.field = field; - this.genericType = ReflectionUtil.mapPrimitiveClasses(field.getGenericType()); } public Field getField() { return field; } - /** - * @return Type of injectable mapped to wrapper class - */ - public Type getType() { - return genericType; - } - - /** - * @return Always false for field - */ public boolean isPrimitive() { return false; } - @Override - public String getElementName() { - return field.getName(); - } - } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/InjectableMethod.java Thu Oct 30 14:44:18 2014 @@ -22,18 +22,17 @@ import java.lang.reflect.Method; import java.lang.reflect.Type; import org.apache.sling.models.impl.ReflectionUtil; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; public class InjectableMethod extends AbstractInjectableElement { private final Method method; private final Type genericReturnType; - private final Type returnType; - public InjectableMethod(Method method) { - super(method); + public InjectableMethod(Method method, StaticInjectAnnotationProcessorFactory[] processorFactories) { + super(method, ReflectionUtil.mapPrimitiveClasses(method.getGenericReturnType()), getDefaultName(method), processorFactories); this.method = method; this.genericReturnType = method.getGenericReturnType(); - this.returnType = ReflectionUtil.mapPrimitiveClasses(this.genericReturnType); } public Method getMethod() { @@ -47,22 +46,11 @@ public class InjectableMethod extends Ab return this.genericReturnType; } - /** - * @return Type of injectable mapped to wrapper class - */ - public Type getType() { - return returnType; - } - - /** - * @return true if return type is a primitive type - */ public boolean isPrimitive() { - return this.returnType != this.genericReturnType; + return getType() != this.genericReturnType; } - @Override - public String getElementName() { + private static String getDefaultName(Method method) { String methodName = method.getName(); if (methodName.startsWith("get")) { return methodName.substring(3, 4).toLowerCase() + methodName.substring(4); Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClass.java Thu Oct 30 14:44:18 2014 @@ -26,6 +26,7 @@ import java.util.List; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.impl.ReflectionUtil; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; public class ModelClass<ModelType> { @@ -35,16 +36,16 @@ public class ModelClass<ModelType> { private final InjectableField[] injectableFields; private final InjectableMethod[] injectableMethods; - public ModelClass(Class<ModelType> type) { + public ModelClass(Class<ModelType> type, StaticInjectAnnotationProcessorFactory[] processorFactories) { this.type = type; this.modelAnnotation = type.getAnnotation(Model.class); - this.constructors = getConstructors(type); - this.injectableFields = getInjectableFields(type); - this.injectableMethods = getInjectableMethods(type); + this.constructors = getConstructors(type, processorFactories); + this.injectableFields = getInjectableFields(type, processorFactories); + this.injectableMethods = getInjectableMethods(type, processorFactories); } @SuppressWarnings("unchecked") - private static ModelClassConstructor[] getConstructors(Class<?> type) { + private static ModelClassConstructor[] getConstructors(Class<?> type, StaticInjectAnnotationProcessorFactory[] processorFactories) { if (type.isInterface()) { return new ModelClassConstructor[0]; } @@ -55,31 +56,31 @@ public class ModelClass<ModelType> { ModelClassConstructor[] array = new ModelClassConstructor[constructors.length]; for (int i=0; i<array.length; i++) { - array[i] = new ModelClassConstructor(constructors[i]); + array[i] = new ModelClassConstructor(constructors[i], processorFactories); } return array; } - private static InjectableField[] getInjectableFields(Class<?> type) { + private static InjectableField[] getInjectableFields(Class<?> type, StaticInjectAnnotationProcessorFactory[] processorFactories) { if (type.isInterface()) { return new InjectableField[0]; } List<Field> injectableFields = ReflectionUtil.collectInjectableFields(type); InjectableField[] array = new InjectableField[injectableFields.size()]; for (int i=0; i<array.length; i++) { - array[i] = new InjectableField(injectableFields.get(i)); + array[i] = new InjectableField(injectableFields.get(i), processorFactories); } return array; } - private static InjectableMethod[] getInjectableMethods(Class<?> type) { + private static InjectableMethod[] getInjectableMethods(Class<?> type, StaticInjectAnnotationProcessorFactory[] processorFactories) { if (!type.isInterface()) { return new InjectableMethod[0]; } List<Method> injectableMethods = ReflectionUtil.collectInjectableMethods(type); InjectableMethod[] array = new InjectableMethod[injectableMethods.size()]; for (int i=0; i<array.length; i++) { - array[i] = new InjectableMethod(injectableMethods.get(i)); + array[i] = new InjectableMethod(injectableMethods.get(i), processorFactories); } return array; } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/main/java/org/apache/sling/models/impl/model/ModelClassConstructor.java Thu Oct 30 14:44:18 2014 @@ -24,6 +24,7 @@ import java.lang.reflect.Type; import javax.inject.Inject; import org.apache.sling.models.impl.ReflectionUtil; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; public class ModelClassConstructor<ModelType> { @@ -31,7 +32,7 @@ public class ModelClassConstructor<Model private final boolean hasInjectAnnotation; private final ConstructorParameter[] constructorParametersArray; - public ModelClassConstructor(Constructor<ModelType> constructor) { + public ModelClassConstructor(Constructor<ModelType> constructor, StaticInjectAnnotationProcessorFactory[] processorFactories) { this.constructor = constructor; this.hasInjectAnnotation = constructor.isAnnotationPresent(Inject.class); @@ -42,7 +43,8 @@ public class ModelClassConstructor<Model Type genericType = ReflectionUtil.mapPrimitiveClasses(parameterTypes[i]); boolean isPrimitive = (parameterTypes[i] != genericType); this.constructorParametersArray[i] = new ConstructorParameter( - constructor.getParameterAnnotations()[i], constructor.getParameterTypes()[i], genericType, isPrimitive, i); + constructor.getParameterAnnotations()[i], constructor.getParameterTypes()[i], genericType, isPrimitive, i, + processorFactories); } } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/InjectorSpecificAnnotationTest.java Thu Oct 30 14:44:18 2014 @@ -95,15 +95,15 @@ public class InjectorSpecificAnnotationT Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 4L)); factory.bindInjector(osgiInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 5L)); - factory.bindInjectAnnotationProcessorFactory(bindingsInjector, + factory.bindStaticInjectAnnotationProcessorFactory(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, + factory.bindStaticInjectAnnotationProcessorFactory(requestAttributeInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 4L)); - factory.bindInjectAnnotationProcessorFactory(osgiInjector, + factory.bindStaticInjectAnnotationProcessorFactory(osgiInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 5L)); SlingBindings bindings = new SlingBindings(); Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java Thu Oct 30 14:44:18 2014 @@ -73,7 +73,7 @@ public class MultipleInjectorTest { factory.activate(componentCtx); factory.bindInjector(bindingsInjector, new ServicePropertiesMap(1, 1)); factory.bindInjector(attributesInjector, new ServicePropertiesMap(2, 2)); - factory.bindInjectAnnotationProcessorFactory(bindingsInjector, new ServicePropertiesMap(1, 1)); + factory.bindStaticInjectAnnotationProcessorFactory(bindingsInjector, new ServicePropertiesMap(1, 1)); when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings); } @@ -92,7 +92,7 @@ public class MultipleInjectorTest { assertEquals(obj.firstAttribute, bindingsValue); verifyNoMoreInteractions(attributesInjector); - verify(bindingsInjector).createAnnotationProcessor(any(), any(AnnotatedElement.class)); + verify(bindingsInjector).createAnnotationProcessor(any(AnnotatedElement.class)); verify(bindingsInjector).getValue(eq(request), eq("firstAttribute"), eq(String.class), any(AnnotatedElement.class), any(DisposalCallbackRegistry.class)); verifyNoMoreInteractions(bindingsInjector); } @@ -111,7 +111,7 @@ public class MultipleInjectorTest { assertEquals(obj.firstAttribute, attributeValue); verify(bindingsInjector).getName(); - verify(bindingsInjector).createAnnotationProcessor(any(), any(AnnotatedElement.class)); + verify(bindingsInjector).createAnnotationProcessor(any(AnnotatedElement.class)); verifyNoMoreInteractions(bindingsInjector); } Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/ResourcePathInjectionTest.java Thu Oct 30 14:44:18 2014 @@ -96,7 +96,7 @@ public class ResourcePathInjectionTest { factory.bindInjector(new SelfInjector(), new ServicePropertiesMap(1, Integer.MAX_VALUE)); factory.bindInjector(new ValueMapInjector(), new ServicePropertiesMap(2, 2000)); factory.bindInjector(new ResourcePathInjector(), new ServicePropertiesMap(3, 2500)); - factory.bindInjectAnnotationProcessorFactory(new ResourcePathInjector(), new ServicePropertiesMap(3, 2500)); + factory.bindStaticInjectAnnotationProcessorFactory(new ResourcePathInjector(), new ServicePropertiesMap(3, 2500)); } @Test Modified: sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java URL: http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java?rev=1635517&r1=1635516&r2=1635517&view=diff ============================================================================== --- sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java (original) +++ sling/whiteboard/sseifert/SLING-4112_models_tuning/impl/src/test/java/org/apache/sling/models/impl/injectors/SelfInjectorTest.java Thu Oct 30 14:44:18 2014 @@ -30,6 +30,7 @@ import org.apache.sling.api.SlingHttpSer import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.models.annotations.injectorspecific.Self; import org.apache.sling.models.impl.model.ConstructorParameter; +import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,8 +53,10 @@ public class SelfInjectorTest { @Before public void setup() { - firstConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 0); - secondConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 1); + firstConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 0, + new StaticInjectAnnotationProcessorFactory[0]); + secondConstructorParameter = new ConstructorParameter(new Annotation[0], Object.class, Object.class, true, 1, + new StaticInjectAnnotationProcessorFactory[0]); } @Test