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/20 16:59:57 UTC
svn commit: r1051155 - in /felix/sandbox/clement/ipojo-constructor-injection:
core/src/main/java/org/apache/felix/ipojo/
core/src/main/java/org/apache/felix/ipojo/parser/
manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/
Author: clement
Date: Mon Dec 20 15:59:57 2010
New Revision: 1051155
URL: http://svn.apache.org/viewvc?rev=1051155&view=rev
Log:
Overall simplification of the constructor injection.
- Remove the need of 'constructor' element in the metadata.
- Identify parameters per index
Removed:
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/parser/ConstructorMetadata.java
Modified:
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ConstructorInjector.java
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManagerFactory.java
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.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/MetadataCollector.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/ComponentFactory.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java Mon Dec 20 15:59:57 2010
@@ -30,12 +30,12 @@ import java.util.Map;
import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ConstructorMetadata;
import org.apache.felix.ipojo.parser.ParseUtils;
import org.apache.felix.ipojo.parser.PojoMetadata;
import org.apache.felix.ipojo.util.Logger;
import org.apache.felix.ipojo.util.Tracker;
import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
@@ -92,9 +92,6 @@ public class ComponentFactory extends IP
*/
private PojoMetadata m_manipulation;
-
- private ConstructorMetadata m_constructor;
-
/**
* Creates a instance manager factory.
* The class is given in parameter. The component type is not a composite.
@@ -139,7 +136,6 @@ public class ComponentFactory extends IP
m_classname = element.getAttribute("classname");
if (m_classname == null) { throw new ConfigurationException("A component needs a class name : " + element); }
m_manipulation = new PojoMetadata(m_componentMetadata);
- m_constructor = new ConstructorMetadata(m_componentMetadata);
}
/**
@@ -296,8 +292,7 @@ public class ComponentFactory extends IP
Element[] elems = m_componentMetadata.getElements();
for (int i = 0; i < elems.length; i++) {
Element current = elems[i];
- if (!"manipulation".equals(current.getName()) // Remove the manipulation element
- && !"constructor".equals(current.getName())) { // Remove the constructor element
+ if (!"manipulation".equals(current.getName())) { // Remove the manipulation element
RequiredHandler req = new RequiredHandler(current.getName(), current.getNameSpace());
if (!list.contains(req)) {
list.add(req);
@@ -440,10 +435,6 @@ public class ComponentFactory extends IP
return m_manipulation;
}
- public ConstructorMetadata getConstructorMetadata() {
- return m_constructor;
- }
-
/**
* Gets the version of the component type.
* @return the version of <code>null</code> if not set.
Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ConstructorInjector.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ConstructorInjector.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ConstructorInjector.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/ConstructorInjector.java Mon Dec 20 15:59:57 2010
@@ -2,6 +2,6 @@ package org.apache.felix.ipojo;
public interface ConstructorInjector {
- Object getConstructorParameter(String id, int index);
+ Object getConstructorParameter(int index);
}
Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java Mon Dec 20 15:59:57 2010
@@ -241,11 +241,4 @@ public class HandlerManager extends Inst
}
}
- public Object getConstructorParameter(String id, int index) {
- if (m_handler instanceof ConstructorInjector) {
- return ((ConstructorInjector) m_handler).getConstructorParameter(id, index);
- }
- return null;
- }
-
}
Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManagerFactory.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManagerFactory.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManagerFactory.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/HandlerManagerFactory.java Mon Dec 20 15:59:57 2010
@@ -152,8 +152,7 @@ public class HandlerManagerFactory exten
Element[] elems = m_componentMetadata.getElements();
for (int i = 0; i < elems.length; i++) {
Element current = elems[i];
- if (!"manipulation".equals(current.getName()) // Remove the manipulation element
- && !"constructor".equals(current.getName())) { // Remove the constructor element
+ if (!"manipulation".equals(current.getName())) { // Remove the manipulation element
RequiredHandler req = new RequiredHandler(current.getName(),
current.getNameSpace());
if (!list.contains(req)) {
Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java Mon Dec 20 15:59:57 2010
@@ -105,12 +105,20 @@ public class InstanceManager implements
private Map m_fieldRegistration;
/**
- * the map [method identifier, {@link MethodInterceptor} list] storing handlers interested by the method.
- * Once configure this map can't change.
+ * the map [method identifier, {@link MethodInterceptor} list] interested
+ * by the method.
+ * Once configured, this map can't change.
*/
private Map m_methodRegistration;
/**
+ * the map (sorted by parameter index) or {@link ConstructorInjector} interested by
+ * injecting constructor parameter.
+ * Once configured, this list can't change.
+ */
+ private Map m_constructorRegistration;
+
+ /**
* The manipulated class.
* Once set, this field doesn't change.
*/
@@ -197,6 +205,15 @@ public class InstanceManager implements
for (int i = 0; i < m_handlers.length; i++) {
m_handlers[i].init(this, metadata, configuration);
}
+
+ // Check that the constructor parameter are continuous.
+ if (m_constructorRegistration != null) {
+ for (int i = 0; i < m_constructorRegistration.size(); i++) {
+ if (! m_constructorRegistration.containsKey(new Integer(i))) {
+ throw new ConfigurationException("The constructor parameter " + i + " is not managed");
+ }
+ }
+ }
}
/**
@@ -596,18 +613,18 @@ public class InstanceManager implements
// No factory-method, we use the constructor.
try {
// Try to find the correct constructor.
- if (getFactory().getConstructorMetadata().hasConstructorMetadata()) {
- // Build the map of injected values.
- String[] ids = getFactory().getConstructorMetadata().getIds();
+ if (m_constructorRegistration != null) {
// Initialize the injected values and types
// We have the IM first.
- Object[] values = new Object[ids.length + 1];
- Class[] types = new Class[ids.length + 1];
+ Object[] values = new Object[m_constructorRegistration.size() + 1];
+ Class[] types = new Class[m_constructorRegistration.size() + 1];
values[0] = this;
types[0] = InstanceManager.class;
- for (int i = 0; i < ids.length; i++) {
+ for (int i = 0; i < m_constructorRegistration.size(); i++) {
for (int j = 0; values[i] == null && j < m_handlers.length; j++) {
- Object v = m_handlers[j].getConstructorParameter(ids[i], i);
+ ConstructorInjector injector = (ConstructorInjector)
+ m_constructorRegistration.get(new Integer(i));
+ Object v = injector.getConstructorParameter(i);
if (v != null) {
values[i + 1] = v;
types[i + 1] = v.getClass();
@@ -967,6 +984,19 @@ public class InstanceManager implements
}
}
+ public void register(int index, ConstructorInjector injector) throws ConfigurationException {
+ Integer key = new Integer(index);
+ if (m_constructorRegistration == null) {
+ m_constructorRegistration = new HashMap();
+ }
+ if (! m_constructorRegistration.containsKey(key)) {
+ m_constructorRegistration.put(key, injector);
+ } else {
+ throw new ConfigurationException("Another constructor injector " +
+ "manages the parameter " + index);
+ }
+ }
+
/**
* This method is called by the manipulated class each time that a GETFIELD instruction is executed.
* The method asks to each attached handler monitoring this field which value need
Modified: felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java Mon Dec 20 15:59:57 2010
@@ -163,7 +163,7 @@ public abstract class PrimitiveHandler e
* TODO
* @see org.apache.felix.ipojo.ConstructorInjector#getConstructorParameter(java.lang.String, int)
*/
- public Object getConstructorParameter(String id, int index) {
+ public Object getConstructorParameter(int index) {
return null;
}
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=1051155&r1=1051154&r2=1051155&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 Mon Dec 20 15:59:57 2010
@@ -31,8 +31,6 @@ import org.objectweb.asm.commons.EmptyVi
*/
public class CustomAnnotationVisitor extends EmptyVisitor implements AnnotationVisitor {
- //TODO manage enum annotations.
-
/**
* Parent element.
*/
@@ -236,7 +234,8 @@ public class CustomAnnotationVisitor ext
m_collector.getElements().put(m_elem, m_parent);
if (m_isParameterAnnotation) {
- m_collector.addConstructorParameter(m_index, m_id);
+ 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/MetadataCollector.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java?rev=1051155&r1=1051154&r2=1051155&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java (original)
+++ felix/sandbox/clement/ipojo-constructor-injection/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java Mon Dec 20 15:59:57 2010
@@ -659,64 +659,5 @@ public class MetadataCollector extends E
}
}
- public void createConstructorElement(String descriptor) {
- Element constructor = null;
- if (! m_elem.containsElement("constructor")) {
- constructor = new Element("constructor", null);
- Type[] types = Type.getArgumentTypes(descriptor);
-
- StringBuffer args = new StringBuffer("{");
- for (int i = 0; i < types.length; i++) {
- Type type = types[i];
- String t = null;
- if (type.getSort() == Type.ARRAY) {
- if (type.getInternalName().startsWith("L")) {
- String internalType = type.getInternalName().substring(1);
- String nameType = internalType.replace('/', '.');
- t = nameType + "[]";
- } else {
- String nameType = type.getClassName().substring(0,
- type.getClassName().length() - 2);
- t = nameType + "[]";
- }
- } else {
- t = type.getClassName();
- }
-
- if (i == 0) {
- args.append(t);
- } else {
- args.append("," + t);
- }
- }
- args.append("}");
- constructor.addAttribute(new Attribute("parameters", args.toString()));
- m_elem.addElement(constructor);
- }
- }
-
- /**
- * Adds a constructor parameter.
- * @param index the index
- * @param id the refid
- */
- public void addConstructorParameter(int index, String id) {
- if (id == null) {
- System.err.println("Cannot compute contructor parameter : no refid");
-
- }
- Element constructor = null;
- if (m_elem.containsElement("constructor")) {
- constructor = m_elem.getElements("constructor")[0];
- // Parameter element
- Element param = new Element("param", null);
- param.addAttribute(new Attribute("index", "" + index));
- param.addAttribute(new Attribute("refid", id));
- constructor.addElement(param);
- } else {
- System.err.println("No constructor found");
- }
- }
-
}
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=1051155&r1=1051154&r2=1051155&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 Mon Dec 20 15:59:57 2010
@@ -63,25 +63,18 @@ public class MethodCollector extends Emp
public AnnotationVisitor visitParameterAnnotation(int index, String annotation,
boolean visible) {
if (m_name.equals("<init>")) {
- AnnotationVisitor visitor = null;
if (annotation.equals("Lorg/apache/felix/ipojo/annotations/Property;")) {
- visitor = processProperty(true, index);
+ return processProperty(true, index);
}
if (annotation.equals("Lorg/apache/felix/ipojo/annotations/Requires;")) {
- visitor = new BindAnnotationParser(index);
+ return new BindAnnotationParser(index);
}
- if (visitor == null && CustomAnnotationVisitor.isCustomAnnotation(annotation)) {
+ if (CustomAnnotationVisitor.isCustomAnnotation(annotation)) {
Element elem = CustomAnnotationVisitor.buildElement(annotation);
elem.addAttribute(new Attribute("index", "" + index));
- visitor = new CustomAnnotationVisitor(elem, m_collector, true, false, index, m_descriptor);
+ return new CustomAnnotationVisitor(elem, m_collector, true, false, index, m_descriptor);
}
-
- if (visitor != null) {
- m_collector.createConstructorElement(m_descriptor);
- return visitor;
- }
-
}
return super.visitParameterAnnotation(index, annotation, visible);
}
@@ -484,7 +477,7 @@ public class MethodCollector extends Emp
method.addAttribute(new Attribute("type", m_type));
req.addElement(method);
} else {
- m_collector.addConstructorParameter(m_index, m_id);
+ req.addAttribute(new Attribute("constructor-parameter", Integer.toString(m_index)));
}
m_collector.getIds().put(m_id, req);
@@ -616,7 +609,7 @@ public class MethodCollector extends Emp
}
if (m_isParameterAnnotation) {
- m_collector.addConstructorParameter(m_index, m_id);
+ prop.addAttribute(new Attribute("constructor-parameter", Integer.toString(m_index)));
} else {
prop.addAttribute(new Attribute("method", m_method));
}