You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2010/12/22 10:58:50 UTC

svn commit: r1051806 - in /felix/sandbox/clement/ipojo-constructor-injection: core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ core/src/main/java/org/apache/felix/ipojo/util/ manipulator/src/main/java/org/apache/felix/ipojo/manipulatio...

Author: clement
Date: Wed Dec 22 09:58:50 2010
New Revision: 1051806

URL: http://svn.apache.org/viewvc?rev=1051806&view=rev
Log:
Implement the constructor injection support for @Property (still work in progress, tests are missing).

Property implements the constructor injector interface.

Add the type attribute when discovering a parameter annotation.


Modified:
    felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
    felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/util/Property.java
    felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/CustomAnnotationVisitor.java
    felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java

Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java?rev=1051806&r1=1051805&r2=1051806&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java Wed Dec 22 09:58:50 2010
@@ -123,9 +123,11 @@ public class ConfigurationHandler extend
         for (int i = 0; configurables != null && i < configurables.length; i++) {
             String fieldName = configurables[i].getAttribute("field");
             String methodName = configurables[i].getAttribute("method");
+            String paramIndex = configurables[i].getAttribute("contructor-parameter");
 
-            if (fieldName == null && methodName == null) {
-                throw new ConfigurationException("Malformed property : The property needs to contain at least a field or a method");
+            if (fieldName == null && methodName == null  && paramIndex == null) {
+                throw new ConfigurationException("Malformed property : The property needs to contain" +
+                		" at least a field, a method or a contructor-parameter");
             }
 
             String name = configurables[i].getAttribute("name");
@@ -143,7 +145,7 @@ public class ConfigurationHandler extend
             // Detect the type of the property
             PojoMetadata manipulation = getFactory().getPojoMetadata();
             String type = null;
-            if (fieldName == null) {
+            if (methodName != null) {
                 MethodMetadata[] method = manipulation.getMethods(methodName);
                 if (method.length == 0) {
                     type = configurables[i].getAttribute("type");
@@ -157,11 +159,24 @@ public class ConfigurationHandler extend
                     type = method[0].getMethodArguments()[0];
                     configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
                 }
-            } else {
+            } else if (fieldName != null) {
                 FieldMetadata field = manipulation.getField(fieldName);
                 if (field == null) { throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation class"); }
                 type = field.getFieldType();
                 configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
+            } else if (paramIndex != null) {
+            	int index = Integer.parseInt(paramIndex);
+            	type = configurables[i].getAttribute("type");
+        		MethodMetadata[] cts = manipulation.getConstructors();
+        		// If we don't have a type, try to get the first constructor and get the type of the parameter
+        		// we the index 'index'.
+            	if (type == null && cts.length != 0  && cts[0].getMethodArguments().length > index) {
+            		type = cts[0].getMethodArguments()[index];
+            		configurables[i].addAttribute(new Attribute("type", type));
+            	} else {
+            		throw new ConfigurationException("Cannot determine the type of the property " + index +
+            				", please use the type attribute");
+            	}
             }
 
             // Is the property set to immutable
@@ -240,13 +255,22 @@ public class ConfigurationHandler extend
         for (int i = 0; configurables != null && i < configurables.length; i++) {
             String fieldName = configurables[i].getAttribute("field");
             String methodName = configurables[i].getAttribute("method");
+            String paramIndex = configurables[i].getAttribute("contructor-parameter");
+            int index = -1;
 
             String name = configurables[i].getAttribute("name"); // The initialize method has fixed the property name.
             String value = configurables[i].getAttribute("value");
 
             String type = configurables[i].getAttribute("type"); // The initialize method has fixed the property name.
 
-            Property prop = new Property(name, fieldName, methodName, value, type, getInstanceManager(), this);
+            Property prop = null;
+            if (paramIndex == null) {
+            	prop = new Property(name, fieldName, methodName, value, type, getInstanceManager(), this);
+            } else {
+            	index = Integer.parseInt(paramIndex);
+            	prop = new Property(name, fieldName, methodName, index,
+            			value, type, getInstanceManager(), this);
+            }
             addProperty(prop);
 
             // Check if the instance configuration contains value for the current property :
@@ -262,6 +286,10 @@ public class ConfigurationHandler extend
                 FieldMetadata field = new FieldMetadata(fieldName, type);
                 getInstanceManager().register(field, prop);
             }
+
+            if (index != -1) {
+            	getInstanceManager().register(index, prop);
+            }
         }
 
         m_description = new ConfigurationHandlerDescription(this, m_configurableProperties, m_managedServicePID);

Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/util/Property.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/util/Property.java?rev=1051806&r1=1051805&r2=1051806&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/util/Property.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/util/Property.java Wed Dec 22 09:58:50 2010
@@ -25,6 +25,7 @@ import java.lang.reflect.Method;
 
 import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.ConstructorInjector;
 import org.apache.felix.ipojo.FieldInterceptor;
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
@@ -36,7 +37,7 @@ import org.osgi.framework.BundleContext;
  * This class managed the method invocation as well as field injection.
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class Property implements FieldInterceptor {
+public class Property implements FieldInterceptor, ConstructorInjector {
 
     /**
      * Object used for an unvalued property.
@@ -62,6 +63,12 @@ public class Property implements FieldIn
     private final Callback m_method;
 
     /**
+     * The index of the parameter in case of
+     * constructor injection.
+     */
+    private int m_index = -1;
+
+    /**
      * The value of the property.
      */
     private Object m_value = NO_VALUE;
@@ -125,7 +132,12 @@ public class Property implements FieldIn
         } else {
             m_method = null;
         }
+    }
 
+    public Property(String name, String field, String method, int index,
+    		String value, String type, InstanceManager manager, Handler handler) throws ConfigurationException {
+    	this(name, field, method, value, type, manager, handler);
+    	m_index = index;
     }
 
     /**
@@ -258,6 +270,16 @@ public class Property implements FieldIn
     }
 
     /**
+     * Gets the parameter index.
+     * @return the parameter index or <code>-1</code>
+     * if this property is not injected using constructor
+     * parameter.
+     */
+    public int getParameterIndex() {
+    	return m_index;
+    }
+
+    /**
      * Checks if the property has a field.
      * @return <code>true</code> if the property has a field.
      */
@@ -566,7 +588,18 @@ public class Property implements FieldIn
         }
     }
 
-    /**
+    public Object getConstructorParameter(int index) {
+    	if (m_index != index) {
+    		return null;
+    	}
+
+    	if (m_value  == NO_VALUE) {
+           return getNoValue(m_type);
+        }
+        return m_value;
+	}
+
+	/**
      * Gets the handler managing the property.
      * @return the configuration handler.
      */

Modified: felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/CustomAnnotationVisitor.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/CustomAnnotationVisitor.java?rev=1051806&r1=1051805&r2=1051806&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/CustomAnnotationVisitor.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/CustomAnnotationVisitor.java Wed Dec 22 09:58:50 2010
@@ -23,6 +23,7 @@ import java.lang.reflect.Array;
 import org.apache.felix.ipojo.metadata.Attribute;
 import org.apache.felix.ipojo.metadata.Element;
 import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.EmptyVisitor;
 
 /**
@@ -234,6 +235,8 @@ public class CustomAnnotationVisitor ext
             m_collector.getElements().put(m_elem, m_parent);
 
             if (m_isParameterAnnotation) {
+            	String t = Type.getArgumentTypes(m_desc)[m_index].getClassName();
+            	m_elem.addAttribute(new Attribute("type", t));
             	m_elem.addAttribute(
             			new Attribute("constructor-parameter", Integer.toString(m_index)));
             }

Modified: felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java?rev=1051806&r1=1051805&r2=1051806&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java Wed Dec 22 09:58:50 2010
@@ -609,6 +609,8 @@ public class MethodCollector extends Emp
             }
 
             if (m_isParameterAnnotation) {
+            	String t = Type.getArgumentTypes(m_descriptor)[m_index].getClassName();
+            	prop.addAttribute(new Attribute("type", t));
                 prop.addAttribute(new Attribute("constructor-parameter", Integer.toString(m_index)));
             } else {
                 prop.addAttribute(new Attribute("method", m_method));