From 2d1f90ddb6c0cd9799af710cd98b2b411ee700f1 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Thu, 5 Dec 2013 08:53:09 -0800 Subject: [PATCH] Fixes #29 --- .../org/springsource/loaded/ClassRenamer.java | 16 +++++++++++++ .../loaded/TypeDescriptorExtractor.java | 15 +++++++----- .../loaded/test/ReloadableTypeTests.java | 24 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/org.springsource.loaded/src/main/java/org/springsource/loaded/ClassRenamer.java b/org.springsource.loaded/src/main/java/org/springsource/loaded/ClassRenamer.java index b0119fb..af6cd30 100644 --- a/org.springsource.loaded/src/main/java/org/springsource/loaded/ClassRenamer.java +++ b/org.springsource.loaded/src/main/java/org/springsource/loaded/ClassRenamer.java @@ -96,6 +96,22 @@ public class ClassRenamer { super.visit(version, access, newname, signature, superName, interfaces); } + @Override + public void visitInnerClass(String name, String outername, String innerName, int access) { + super.visitInnerClass(renameRetargetIfNecessary(name), renameRetargetIfNecessary(outername), renameRetargetIfNecessary(innerName), access); + } + + private String renameRetargetIfNecessary(String string) { + String value = retargets.get(string); + if (value!=null) { + return value; + } + if (string.indexOf(oldname) != -1) { + return string.replace(oldname, newname); + } + return string; + } + @Override public MethodVisitor visitMethod(int flags, String name, String descriptor, String signature, String[] exceptions) { if (descriptor.indexOf(oldname) != -1) { diff --git a/org.springsource.loaded/src/main/java/org/springsource/loaded/TypeDescriptorExtractor.java b/org.springsource.loaded/src/main/java/org/springsource/loaded/TypeDescriptorExtractor.java index fcd6ce4..4f762cd 100644 --- a/org.springsource.loaded/src/main/java/org/springsource/loaded/TypeDescriptorExtractor.java +++ b/org.springsource.loaded/src/main/java/org/springsource/loaded/TypeDescriptorExtractor.java @@ -66,10 +66,11 @@ public class TypeDescriptorExtractor { private List fieldsRequiringAccessors = new ArrayList(); private List fields = new ArrayList(); private List finalInHierarchy = new ArrayList(); - + public ExtractionVisitor(boolean isReloadableType) { this.isReloadableType = isReloadableType; } + public TypeDescriptor getTypeDescriptor() { if (isReloadableType) { @@ -270,7 +271,13 @@ public class TypeDescriptorExtractor { return null; } - public void visitAttribute(Attribute arg0) { + public void visitAttribute(Attribute attribute) { + } + + public void visitInnerClass(String name, String outername, String innerName, int access) { + if (name.equals(typename)) { + this.flags = access; + } } public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { @@ -280,10 +287,6 @@ public class TypeDescriptorExtractor { } return null; } - - public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) { - } - // For each method, copy it into the new class making appropriate adjustments /** * Visit a method in the class and build an appropriate representation for it to include in the extracted output. diff --git a/org.springsource.loaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java b/org.springsource.loaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java index 7f7754f..bf70abb 100644 --- a/org.springsource.loaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java +++ b/org.springsource.loaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java @@ -21,6 +21,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; +import java.lang.reflect.Modifier; + import org.junit.Test; import org.springsource.loaded.GlobalConfiguration; import org.springsource.loaded.ReloadableType; @@ -433,4 +435,26 @@ public class ReloadableTypeTests extends SpringLoadedTests { retrieveRename("basic.Basic", "basic.Basic003")); assertEquals(2, rc); } + + @Test + public void innerTypesLosingStaticModifier() throws Exception { + TypeRegistry typeRegistry = getTypeRegistry("inners.Outer$Inner"); + byte[] sc = loadBytesForClass("inners.Outer$Inner"); + ReloadableType rtype = typeRegistry.addType("inners.Outer$Inner", sc); + + Class simpleClass = rtype.getClazz(); + Result r = null; + + r = runUnguarded(simpleClass, "foo"); + assertEquals("foo!", r.returnValue); + assertTrue(Modifier.isPublic((Integer)runUnguarded(simpleClass, "getModifiers").returnValue)); + assertTrue(Modifier.isStatic((Integer)runUnguarded(simpleClass, "getModifiers").returnValue)); + + rtype.loadNewVersion("002", retrieveRename("inners.Outer$Inner", "inners.Outer2$Inner2")); + + r = runUnguarded(simpleClass, "foo"); + assertEquals("bar!", r.returnValue); + assertTrue(Modifier.isPublic((Integer)runUnguarded(simpleClass, "getModifiers").returnValue)); + assertTrue(Modifier.isStatic((Integer)runUnguarded(simpleClass, "getModifiers").returnValue)); + } } \ No newline at end of file