fixing out agent runner for junit 4.12 and avoid to require openjpa dependency

git-svn-id: https://svn.apache.org/repos/asf/incubator/sirona/trunk@1713963 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
index 99304e9..39a7d56 100644
--- a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
+++ b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
@@ -34,6 +34,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.reflect.Field;
@@ -59,9 +60,14 @@
         Thread.currentThread().setContextClassLoader(getTestLoader());
         try {
             final Class<?> testTransformedClass = testLoader.loadClass(getTestClass().getName());
-            final Field f = ParentRunner.class.getDeclaredField("fTestClass");
-            f.setAccessible(true);
-            f.set(this, new TestClass(testTransformedClass));
+            Field field;
+            try { // junit 4.11
+                field = ParentRunner.class.getDeclaredField("fTestClass");
+            } catch (final NoSuchFieldException nsfe) { // junit 4.12
+                field = ParentRunner.class.getDeclaredField("testClass");
+            }
+            field.setAccessible(true);
+            field.set(this, new TestClass(testTransformedClass));
         } catch (final Exception e) {
             throw new RuntimeException(e);
         } finally {
@@ -151,28 +157,7 @@
                         final SironaTransformer transformer = new SironaTransformer(false, null);
                         buffer = transformer.transform(this, className, null, null, buffer);
                     } else if (PCClassFileTransformer.class.equals(t)) {
-                        if (name.endsWith("Entity")) {
-                            // hacky but avoid to build a full openjpa project/context
-                            final PersistenceMetaDataFactory factory = new PersistenceMetaDataFactory();
-                            factory.setTypes("org.apache.test.sirona.javaagent.OpenJPATest$ServiceSquareEntity");
-
-                            final MetaDataRepository repos = new MetaDataRepository();
-                            repos.setConfiguration(new OpenJPAConfigurationImpl());
-                            repos.setMetaDataFactory(factory);
-
-                            final BCClass type = new Project().loadClass(new ByteArrayInputStream(buffer), new URLClassLoader(new URL[0], getParent()));
-                            final PCEnhancer enhancer = new PCEnhancer(repos.getConfiguration(), type, repos, this);
-                            enhancer.setAddDefaultConstructor(true);
-                            enhancer.setEnforcePropertyRestrictions(true);
-
-                            if (enhancer.run() != PCEnhancer.ENHANCE_NONE) {
-                                final BCClass pcb = enhancer.getPCBytecode();
-                                final byte[] transformed = AsmAdaptor.toByteArray(pcb, pcb.toByteArray());
-                                if (transformed != null) {
-                                    buffer = transformed;
-                                }
-                            }
-                        }
+                        buffer = handleJpa(name, buffer);
                     } else {
                         buffer = ClassFileTransformer.class.cast(t.newInstance()).transform(this, className, null, null, buffer);
                     }
@@ -198,5 +183,41 @@
                 throw new ClassNotFoundException(t.getMessage(), t);
             }
         }
+
+        private byte[] handleJpa(final String name, final byte[] buffer) throws IOException {
+            return Jpa.handleJpa(name, buffer, this);
+        }
+    }
+
+    private static class Jpa {
+        private Jpa() {
+            // no-op
+        }
+
+        public static byte[] handleJpa(final String name, final byte[] buffer, final ClassLoader loader) throws IOException {
+            if (name.endsWith("Entity")) {
+                // hacky but avoid to build a full openjpa project/context
+                final PersistenceMetaDataFactory factory = new PersistenceMetaDataFactory();
+                factory.setTypes("org.apache.test.sirona.javaagent.OpenJPATest$ServiceSquareEntity");
+
+                final MetaDataRepository repos = new MetaDataRepository();
+                repos.setConfiguration(new OpenJPAConfigurationImpl());
+                repos.setMetaDataFactory(factory);
+
+                final BCClass type = new Project().loadClass(new ByteArrayInputStream(buffer), new URLClassLoader(new URL[0], loader.getParent()));
+                final PCEnhancer enhancer = new PCEnhancer(repos.getConfiguration(), type, repos, loader);
+                enhancer.setAddDefaultConstructor(true);
+                enhancer.setEnforcePropertyRestrictions(true);
+
+                if (enhancer.run() != PCEnhancer.ENHANCE_NONE) {
+                    final BCClass pcb = enhancer.getPCBytecode();
+                    final byte[] transformed = AsmAdaptor.toByteArray(pcb, pcb.toByteArray());
+                    if (transformed != null) {
+                        return transformed;
+                    }
+                }
+            }
+            return buffer;
+        }
     }
 }
diff --git a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
index be2ec34..30ecf2f 100644
--- a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
+++ b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
@@ -311,6 +311,9 @@
                     url = loader.getResource(classFileName);
                 } else {
                     url = clazz.getResource(classFileName);
+                    if (url == null) {
+                        url = clazz.getResource('/' + classFileName);
+                    }
                 }
 
                 if (url == null) {
@@ -325,7 +328,7 @@
                         throw new MalformedURLException("no ! found in jar url spec:" + spec);
                     }
 
-                    url = new URL(spec.substring(0, separator++));
+                    url = new URL(spec.substring(0, separator));
 
                     return new File(decode(url.getFile()));