You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/03/23 18:16:39 UTC
svn commit: r1580543 -
/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
Author: rmannibucau
Date: Sun Mar 23 17:16:39 2014
New Revision: 1580543
URL: http://svn.apache.org/r1580543
Log:
extracting sironaclassloader
Modified:
incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java?rev=1580543&r1=1580542&r2=1580543&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/sirona/javaagent/InJvmTransformerRunner.java Sun Mar 23 17:16:39 2014
@@ -50,7 +50,7 @@ public class InJvmTransformerRunner exte
if (customTransformers != null) {
transformers = customTransformers.value();
} else {
- transformers = new Class[] { SironaTransformer.class };
+ transformers = new Class[]{SironaTransformer.class};
}
Thread.currentThread().setContextClassLoader(getTestLoader());
@@ -69,70 +69,7 @@ public class InJvmTransformerRunner exte
private ClassLoader getTestLoader() {
if (testLoader == null) {
originalLoader = Thread.currentThread().getContextClassLoader();
- testLoader = new URLClassLoader(new URL[0]) {
- @Override
- public String toString() {
- return InJvmTransformerRunner.class.getSimpleName() + "-" + super.toString();
- }
-
- @Override
- public Class<?> loadClass(final String name) throws ClassNotFoundException {
- if (!name.startsWith(getTestClass().getName())) {
- return getParent().loadClass(name);
- }
-
- final Class<?> existing = findLoadedClass(name);
- if (existing != null) {
- return existing;
- }
-
- try {
- final String resourceName = name.replaceAll("\\.", "/") + ".class";
- final InputStream is = getResourceAsStream(resourceName);
- if (is == null) {
- throw new ClassNotFoundException(name);
- }
-
- final String className = resourceName.replace(".class", "");
-
- byte[] buffer = IOUtils.toByteArray(is);
- for (final Class<?> t : transformers) {
- if (SironaTransformer.class.equals(t)) {
- final SironaTransformer transformer = new SironaTransformer(false);
- 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], originalLoader));
- 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;
- }
- }
- }
- } else {
- buffer = ClassFileTransformer.class.cast(t.newInstance()).transform(this, className, null, null, buffer);
- }
- }
- return defineClass(name, buffer, 0, buffer.length);
- } catch (final Throwable t) {
- throw new ClassNotFoundException(t.getMessage(), t);
- }
- }
- };
+ testLoader = new SironaClassLoader(getTestClass().getJavaClass(), transformers, originalLoader);
}
return testLoader;
}
@@ -163,4 +100,84 @@ public class InJvmTransformerRunner exte
}
};
}
+
+ public static class SironaClassLoader extends URLClassLoader {
+ private final Class<?>[] transformers;
+ private final Class<?> testClass;
+
+ public SironaClassLoader(final URL[] urls, final Class<?> testClass, final Class<?>[] transformers, final ClassLoader parent) {
+ super(urls, parent);
+ this.testClass = testClass;
+ this.transformers = transformers;
+ }
+
+ public SironaClassLoader(final Class<?> testClass, final Class<?>[] transformers, final ClassLoader parent) {
+ super(new URL[0], parent);
+ this.testClass = testClass;
+ this.transformers = transformers;
+ }
+
+ @Override
+ public String toString() {
+ return InJvmTransformerRunner.class.getSimpleName() + "-" + super.toString();
+ }
+
+ @Override
+ public Class<?> loadClass(final String name) throws ClassNotFoundException {
+ if (!name.startsWith(testClass.getName())) {
+ return getParent().loadClass(name);
+ }
+
+ final Class<?> existing = findLoadedClass(name);
+ if (existing != null) {
+ return existing;
+ }
+
+ try {
+ final String resourceName = name.replaceAll("\\.", "/") + ".class";
+ final InputStream is = getResourceAsStream(resourceName);
+ if (is == null) {
+ throw new ClassNotFoundException(name);
+ }
+
+ final String className = resourceName.replace(".class", "");
+
+ byte[] buffer = IOUtils.toByteArray(is);
+ for (final Class<?> t : transformers) {
+ if (SironaTransformer.class.equals(t)) {
+ final SironaTransformer transformer = new SironaTransformer(false);
+ 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;
+ }
+ }
+ }
+ } else {
+ buffer = ClassFileTransformer.class.cast(t.newInstance()).transform(this, className, null, null, buffer);
+ }
+ }
+ return defineClass(name, buffer, 0, buffer.length);
+ } catch (final Throwable t) {
+ throw new ClassNotFoundException(t.getMessage(), t);
+ }
+ }
+ }
}