Change the iPOJO Plugin name to be "Maven compliant" (org.apache.felix.ipojo becomes maven-ipojo-plugin)
Fix a bug on fields from super class in the manipulator.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@579527 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
index 7592ba1..b153751 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
@@ -18,6 +18,8 @@
*/
package org.apache.felix.ipojo.manipulation;
+import java.util.Set;
+
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
@@ -40,17 +42,24 @@
* Is the super call detected ?
*/
private boolean m_superDetected;
+
+ /**
+ * Set of contained fields.
+ */
+ private Set m_fields;
/**
* PropertyCodeAdapter constructor.
* A new FiledCodeAdapter should be create for each method visit.
* @param mv MethodVisitor
* @param owner Name of the class
+ * @param fields List of contained fields
*/
- public ConstructorCodeAdapter(final MethodVisitor mv, final String owner) {
+ public ConstructorCodeAdapter(final MethodVisitor mv, final String owner, Set fields) {
super(mv);
m_owner = owner;
m_superDetected = false;
+ m_fields = fields;
}
@@ -67,7 +76,7 @@
final String owner,
final String name,
final String desc) {
- if (owner.equals(m_owner)) {
+ if (m_fields.contains(name) && m_owner.equals(owner)) {
if (opcode == GETFIELD) {
String gDesc = "()" + desc;
visitMethodInsn(INVOKEVIRTUAL, owner, "_get" + name, gDesc);
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
index c1070ae..acb18fc 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
@@ -92,7 +92,7 @@
ckReader.accept(ck, ClassReader.SKIP_FRAMES);
is1.close();
- m_fields = ck.getFields();
+ m_fields = ck.getFields(); // GEt visited fields (contains only POJO fields)
// Get interface and remove POJO interface is presents
String[] its = ck.getInterfaces();
@@ -128,7 +128,7 @@
InputStream is2 = url.openStream();
ClassReader cr0 = new ClassReader(is2);
ClassWriter cw0 = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- PojoAdapter preprocess = new PojoAdapter(cw0);
+ PojoAdapter preprocess = new PojoAdapter(cw0, m_fields);
cr0.accept(preprocess, ClassReader.SKIP_FRAMES);
is2.close();
@@ -196,7 +196,7 @@
InputStream is2 = new ByteArrayInputStream(origin);
ClassReader cr0 = new ClassReader(is2);
ClassWriter cw0 = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- PojoAdapter preprocess = new PojoAdapter(cw0);
+ PojoAdapter preprocess = new PojoAdapter(cw0, m_fields);
cr0.accept(preprocess, ClassReader.SKIP_FRAMES);
is2.close();
finalWriter = cw0;
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
index 64b78a3..03b8256 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
@@ -18,6 +18,8 @@
*/
package org.apache.felix.ipojo.manipulation;
+import java.util.Set;
+
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
@@ -40,6 +42,11 @@
* Name of the method.
*/
private String m_name;
+
+ /**
+ * Contained fields.
+ */
+ private Set m_fields;
/**
* MethodCodeAdapter constructor.
@@ -48,11 +55,13 @@
* @param access : Method access
* @param name : Method name
* @param desc : Method descriptor
+ * @param fields : Contained fields
*/
- public MethodCodeAdapter(final MethodVisitor mv, final String owner, int access, String name, String desc) {
+ public MethodCodeAdapter(final MethodVisitor mv, final String owner, int access, String name, String desc, Set fields) {
super(mv, access, name, desc);
m_owner = owner;
m_name = name;
+ m_fields = fields;
}
/**
@@ -64,7 +73,7 @@
* @param desc : descriptor of the field
*/
public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) {
- if (owner.equals(m_owner)) {
+ if (owner.equals(m_owner) && m_fields.contains(name)) {
if (opcode == GETFIELD) {
String gDesc = "()" + desc;
visitMethodInsn(INVOKEVIRTUAL, owner, "_get" + name, gDesc);
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java
index 7ac4226..06bb461 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java
@@ -19,7 +19,10 @@
package org.apache.felix.ipojo.manipulation;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
@@ -50,7 +53,8 @@
/**
* Field list.
*/
- private List m_fields = new ArrayList();
+ private Set m_fields;
+
/**
* Method list.
@@ -65,9 +69,12 @@
/**
* Constructor.
* @param arg0 : class adapter on which delegate.
+ * @param fields : map of contained fields.
+ * @param m_fields2
*/
- public PojoAdapter(ClassVisitor arg0) {
+ public PojoAdapter(ClassVisitor arg0, Map fields) {
super(arg0);
+ m_fields = fields.keySet();
}
/**
@@ -121,7 +128,6 @@
createGetComponentInstanceMethod();
m_methods.clear();
- m_fields.clear();
cv.visitEnd();
}
@@ -140,7 +146,6 @@
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
// Add the field to the list.
if ((access & ACC_STATIC) == 0) {
- m_fields.add(name);
addFlagField(name);
m_getterSetterCreator.visitField(access, name, desc, signature, value);
}
@@ -187,7 +192,7 @@
return null;
} else {
// return new ConstructorCodeAdapter(mv, access, desc, m_owner);
- return new ConstructorCodeAdapter(mv, m_owner);
+ return new ConstructorCodeAdapter(mv, m_owner, m_fields);
}
} else { // "Normal methods"
// avoid manipulating static methods.
@@ -213,7 +218,7 @@
}
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new MethodCodeAdapter(mv, m_owner, access, name, desc);
+ return new MethodCodeAdapter(mv, m_owner, access, name, desc, m_fields);
}
}
@@ -300,8 +305,9 @@
mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredFields", "()Ljava/util/Set;");
mv.visitVarInsn(ASTORE, 2);
- for (int i = 0; i < m_fields.size(); i++) {
- String field = (String) m_fields.get(i);
+ Iterator it = m_fields.iterator();
+ while (it.hasNext()) {
+ String field = (String) it.next();
mv.visitVarInsn(ALOAD, 2);
mv.visitLdcInsn(field);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");