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


Reply via email to