Author: cziegeler
Date: Tue Jul 3 19:07:10 2012
New Revision: 1356869
URL: http://svn.apache.org/viewvc?rev=1356869&view=rev
Log:
FELIX-3550 : Reimplement the SCR Generator
Modified:
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassModifier.java
Modified:
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java?rev=1356869&r1=1356868&r2=1356869&view=diff
==============================================================================
---
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
(original)
+++
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
Tue Jul 3 19:07:10 2012
@@ -239,6 +239,7 @@ public class SCRDescriptorGenerator {
type,
createBind,
createUnbind,
+ this.project.getClassLoader(),
this.project.getClassesDirectory());
}
}
Modified:
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassModifier.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassModifier.java?rev=1356869&r1=1356868&r2=1356869&view=diff
==============================================================================
---
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassModifier.java
(original)
+++
felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassModifier.java
Tue Jul 3 19:07:10 2012
@@ -54,6 +54,7 @@ public abstract class ClassModifier {
final String typeName,
final boolean createBind,
final boolean createUnbind,
+ final ClassLoader classLoader,
final String outputDirectory)
throws SCRDescriptorException {
// now do byte code manipulation
@@ -63,7 +64,34 @@ public abstract class ClassModifier {
final ClassReader reader = new ClassReader(new
FileInputStream(fileName));
reader.accept(cn, 0);
- final ClassWriter writer = new
ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ // TODO: ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES
+ final ClassWriter writer = new ClassWriter(0) {
+
+ protected String getCommonSuperClass(final String type1, final
String type2)
+ {
+ Class c, d;
+ try {
+ c = classLoader.loadClass(type1.replace('/', '.'));
+ d = classLoader.loadClass(type2.replace('/', '.'));
+ } catch (Exception e) {
+ throw new RuntimeException(e.toString());
+ }
+ if (c.isAssignableFrom(d)) {
+ return type1;
+ }
+ if (d.isAssignableFrom(c)) {
+ return type2;
+ }
+ if (c.isInterface() || d.isInterface()) {
+ return "java/lang/Object";
+ } else {
+ do {
+ c = c.getSuperclass();
+ } while (!c.isAssignableFrom(d));
+ return c.getName().replace('.', '/');
+ }
+ }
+ };
// remove existing implementation von previous builds
final ClassAdapter adapter = new ClassAdapter(writer) {