You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/01/22 23:37:34 UTC
svn commit: r736835 - in /labs/magma/trunk/maven-magma-plugin: ./
src/main/java/org/apache/magma/tools/classloading/
src/main/java/org/apache/magma/tools/classloading/caching/
src/main/java/org/apache/magma/tools/maven/
Author: simoneg
Date: Thu Jan 22 14:37:33 2009
New Revision: 736835
URL: http://svn.apache.org/viewvc?rev=736835&view=rev
Log:
LABS-280 : rewrote LTW class loading system (quite radically) to proper support pipelining of more than one enhancer (aspectj + openjpa)
Added:
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/AspectJClassTransformer.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/BytecodeProvider.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/CachingTransformingProvider.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassLoaderBytecodeProvider.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformationReceiver.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformer.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JPAClassTransformer.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JettyTransformingClassLoader.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ServletTransformingClassLoader.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/TransformingClassloader.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLConnection.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandler.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandlerFactory.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/ClassCache.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/SavedEntity.java
Modified:
labs/magma/trunk/maven-magma-plugin/pom.xml
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRunWar.java
labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaTestMojo.java
Modified: labs/magma/trunk/maven-magma-plugin/pom.xml
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/pom.xml?rev=736835&r1=736834&r2=736835&view=diff
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/pom.xml (original)
+++ labs/magma/trunk/maven-magma-plugin/pom.xml Thu Jan 22 14:37:33 2009
@@ -20,7 +20,7 @@
<groupId>org.apache.magma.tools</groupId>
<artifactId>maven-magma-plugin</artifactId>
<name>Magma Extension Mojo</name>
- <version>0.0.3-r1</version>
+ <version>0.0.3-r3</version>
<description>
Provides mojos to compile and test a magma package.
</description>
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/AspectJClassTransformer.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/AspectJClassTransformer.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/AspectJClassTransformer.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/AspectJClassTransformer.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,60 @@
+package org.apache.magma.tools.classloading;
+
+import java.io.IOException;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import org.aspectj.bridge.AbortException;
+import org.aspectj.weaver.tools.WeavingAdaptor;
+import org.aspectj.weaver.tools.WeavingClassLoader;
+
+public class AspectJClassTransformer extends ClassLoader implements ClassTransformer, WeavingClassLoader {
+
+ protected WeavingAdaptor adaptor = null;
+ protected boolean ignoreAborts = true;
+ protected ClassTransformationReceiver receiver = null;
+ protected URL[] aspects;
+
+ public AspectJClassTransformer(ClassLoader parent, URL[] aspects) {
+ super(parent);
+ this.aspects = aspects;
+ adaptor = new WeavingAdaptor(this);
+ }
+
+
+ public byte[] transform(String classname, byte[] classbytecode, ProtectionDomain domain) {
+ try {
+ byte[] nbuff = adaptor.weaveClass(classname, classbytecode);
+ return nbuff.length == classbytecode.length ? null : nbuff;
+ } catch (AbortException ae) {
+ if (ignoreAborts) return null;
+ throw new RuntimeException("Error weaving " + classname, ae);
+ } catch (IOException e) {
+ throw new RuntimeException("Error weaving " + classname, e);
+ }
+ }
+
+
+ public void acceptClass(String name, byte[] bytes) {
+ this.receiver.acceptClass(name, bytes);
+ }
+
+ public void setReceiver(ClassTransformationReceiver receiver) {
+ this.receiver = receiver;
+ }
+
+ public URL[] getAspectURLs() {
+ return this.aspects;
+ }
+
+
+ public boolean isIgnoreAborts() {
+ return ignoreAborts;
+ }
+
+
+ public void setIgnoreAborts(boolean ignoreAborts) {
+ this.ignoreAborts = ignoreAborts;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/BytecodeProvider.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/BytecodeProvider.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/BytecodeProvider.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/BytecodeProvider.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,9 @@
+package org.apache.magma.tools.classloading;
+
+import java.net.URL;
+
+public interface BytecodeProvider {
+
+ public URL findBytecode(String className);
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/CachingTransformingProvider.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/CachingTransformingProvider.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/CachingTransformingProvider.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/CachingTransformingProvider.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,138 @@
+package org.apache.magma.tools.classloading;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.magma.tools.classloading.caching.ClassCache;
+import org.apache.magma.tools.classloading.caching.SavedEntity;
+
+public class CachingTransformingProvider implements ClassTransformationReceiver, BytecodeProvider {
+
+ protected BytecodeProvider fixedPart = null;
+ protected File cacheDir = null;
+ //protected Set<String> missings = new HashSet<String>();
+ protected ClassTransformer transformer;
+ protected String context = null;
+
+ public CachingTransformingProvider(File cacheDir, ClassTransformer transformer) {
+ this.transformer = transformer;
+ transformer.setReceiver(this);
+ this.cacheDir = cacheDir;
+ context = cacheDir.getName();
+ }
+
+ public void setChainProvider(BytecodeProvider provider) {
+ this.fixedPart = provider;
+ }
+
+ protected boolean shouldWeave(String name) {
+ if (name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("sun.")) return false;
+ return true;
+ }
+
+ public URL findBytecode(String name) {
+ //if (missings.contains(name)) return fixedPart.findBytecode(name);
+ URL ret = findResourceInCache(name);
+ if (ret != null) return ret;
+ try {
+ ret = weave(name);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ return ret;
+ }
+
+ private URL weave(String name) throws ClassNotFoundException {
+ if (!shouldWeave(name)) {
+ //missings.add(name);
+ return null;
+ }
+ URL res = fixedPart.findBytecode(name);
+ if (res == null) throw new ClassNotFoundException(name);
+ InputStream stream = null;
+ try {
+ byte[] buff = ClassCache.rawRetrieve(res);
+ if (buff == null) {
+ stream = res.openStream();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
+ buff = new byte[2048];
+ int len = 0;
+ while ((len = stream.read(buff)) > 0) {
+ baos.write(buff, 0, len);
+ }
+ buff = baos.toByteArray();
+ }
+ buff = transformer.transform(name, buff, null);
+ URL ret = acceptClass(name, buff);
+ return ret == null ? res : ret;
+ } catch (IOException e1) {
+ throw new RuntimeException("Error reading class " + name, e1);
+ } finally {
+ try {
+ if (stream != null) stream.close();
+ } catch (IOException e1) {
+ }
+ }
+ }
+
+ public URL acceptClass(String name, byte[] bytes) {
+ if (bytes == null) {
+ //missings.add(name);
+ return null;
+ } else {
+ //missings.remove(name);
+ }
+ return ClassCache.save(context, name, bytes);
+ /*
+ name = name.replace('.', File.separatorChar);
+ name += ".class";
+ FileOutputStream fos = null;
+ File cachefile = null;
+ try {
+ cachefile = new File(cacheDir, name);
+ if (!cachefile.getParentFile().exists() && !cachefile.getParentFile().mkdirs()) throw new RuntimeException("Cannot create directory for " + cachefile.getAbsolutePath());
+ fos = new FileOutputStream(cachefile);
+ fos.write(bytes);
+ ramCache.put(cachefile.toURI().toURL().toString(), bytes);
+ } catch (Exception e) {
+ if (cachefile != null) {
+ cachefile.delete();
+ }
+ throw new RuntimeException("Error caching " + name, e);
+ } finally {
+ try {
+ if (fos != null) fos.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ */
+ }
+
+ protected URL findResourceInCache(String name) {
+ SavedEntity entity = ClassCache.retrieve(context + ":" + name);
+ if (entity == null) return null;
+ return entity.url;
+ /*
+ name = name.replace('.', File.separatorChar);
+ name += ".class";
+ File cachefile = new File(cacheDir, name);
+ if (!cachefile.exists()) return null;
+ try {
+ return cachefile.toURI().toURL();
+ } catch (MalformedURLException e) {
+ // Should never happen
+ throw new RuntimeException("Internal error on " + name, e);
+ }
+ */
+ }
+
+
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassLoaderBytecodeProvider.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassLoaderBytecodeProvider.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassLoaderBytecodeProvider.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassLoaderBytecodeProvider.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,42 @@
+package org.apache.magma.tools.classloading;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.magma.tools.classloading.caching.ClassCache;
+
+public class ClassLoaderBytecodeProvider implements BytecodeProvider {
+
+ private ClassLoader loader = null;
+
+ private byte[] buff = new byte[20480];
+ private ByteArrayOutputStream baos = new ByteArrayOutputStream(20480);
+
+
+ public ClassLoaderBytecodeProvider(ClassLoader loader) {
+ this.loader = loader;
+ }
+
+ public synchronized URL findBytecode(String className) {
+ String resname = className.replace('.', '/');
+ resname += ".class";
+
+ URL res = loader.getResource(resname);
+ if (res == null) return null;
+ try {
+ InputStream stream = res.openStream();
+ int len = 0;
+ baos.reset();
+ while ((len = stream.read(buff)) > 0) {
+ baos.write(buff, 0, len);
+ }
+ return ClassCache.save("raw", className, baos.toByteArray());
+ } catch (IOException e) {
+ throw new RuntimeException("Error loading " + resname, e);
+ }
+
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformationReceiver.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformationReceiver.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformationReceiver.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformationReceiver.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,9 @@
+package org.apache.magma.tools.classloading;
+
+import java.net.URL;
+
+public interface ClassTransformationReceiver {
+
+ public URL acceptClass(String name, byte[] bytecode);
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformer.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformer.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformer.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ClassTransformer.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,10 @@
+package org.apache.magma.tools.classloading;
+
+import java.security.ProtectionDomain;
+
+public interface ClassTransformer {
+
+ public void setReceiver(ClassTransformationReceiver receiver);
+ public byte[] transform(String classname, byte[] classbytecode, ProtectionDomain domain);
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JPAClassTransformer.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JPAClassTransformer.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JPAClassTransformer.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JPAClassTransformer.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,63 @@
+package org.apache.magma.tools.classloading;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.reflect.Method;
+import java.security.ProtectionDomain;
+
+public class JPAClassTransformer implements ClassTransformer {
+
+ protected ClassTransformationReceiver receiver = null;
+ protected ClassFileTransformer transformer = null;
+ protected String transformerClassName = null;
+ protected String transformerArguments;
+
+ protected Method transformermethod = null;
+
+ protected ClassLoader loader = null;
+ protected boolean resolving = false;
+ protected boolean reentring = false;
+
+ public JPAClassTransformer(ClassFileTransformer transformer, ClassLoader loader) {
+ this.transformer = transformer;
+ this.loader = loader;
+ }
+
+ public JPAClassTransformer(ClassLoader loader, String transformerClassName, String transformerArguments) {
+ this.loader = loader;
+ this.transformerClassName = transformerClassName;
+ this.transformerArguments = transformerArguments;
+ }
+
+
+ public void setReceiver(ClassTransformationReceiver receiver) {
+ this.receiver = receiver;
+ }
+
+ public byte[] transform(String classname, byte[] classbytecode, ProtectionDomain domain) {
+ if (reentring) return null;
+ if (classname.startsWith("org.apache.openjpa")) return null;
+ if (classname.startsWith("java.")) return null;
+ if (classname.startsWith("javax.")) return null;
+ if (classname.startsWith("sun.")) return null;
+ if (resolving) return null;
+ try {
+ resolving = true;
+ if (transformer == null) {
+ Class transformerFactory = loader.loadClass(transformerClassName);
+ Method factoryMethod = transformerFactory.getMethod("getTransformer", String.class);
+ this.transformer = (ClassFileTransformer) factoryMethod.invoke(null, transformerArguments);
+ }
+ resolving = false;
+ reentring = true;
+ byte[] result = transformer.transform(loader, classname, null, null, classbytecode);
+ return result;
+ } catch (Exception e) {
+ throw new RuntimeException("Error JPA transforming " + classname, e);
+ } finally {
+ resolving = false;
+ reentring = false;
+ }
+ }
+
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JettyTransformingClassLoader.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JettyTransformingClassLoader.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JettyTransformingClassLoader.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/JettyTransformingClassLoader.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,70 @@
+package org.apache.magma.tools.classloading;
+
+import org.mortbay.jetty.webapp.WebAppContext;
+
+public class JettyTransformingClassLoader extends
+ ServletTransformingClassLoader {
+
+ private WebAppContext context;
+
+ public JettyTransformingClassLoader(WebAppContext context) {
+ this.context = context;
+ }
+
+ public JettyTransformingClassLoader(ClassLoader parent, WebAppContext context) {
+ super(parent);
+ this.context = context;
+ }
+
+ protected boolean isSystemPath(String name) {
+ name = name.replace('/', '.');
+ while (name.startsWith("."))
+ name = name.substring(1);
+ if (name.startsWith("sun.")) return true;
+ String[] system_classes = context.getSystemClasses();
+ if (system_classes != null) {
+ for (int i = 0; i < system_classes.length; i++) {
+ boolean result = true;
+ String c = system_classes[i];
+
+ if (c.startsWith("-")) {
+ c = c.substring(1); // TODO cache
+ result = false;
+ }
+
+ if (c.endsWith(".")) {
+ if (name.startsWith(c))
+ return result;
+ } else if (name.equals(c))
+ return result;
+ }
+ }
+ return false;
+ }
+
+ public boolean isServerPath(String name) {
+ name = name.replace('/', '.');
+ while (name.startsWith("."))
+ name = name.substring(1);
+
+ String[] server_classes = context.getServerClasses();
+ if (server_classes != null) {
+ for (int i = 0; i < server_classes.length; i++) {
+ boolean result = true;
+ String c = server_classes[i];
+ if (c.startsWith("-")) {
+ c = c.substring(1); // TODO cache
+ result = false;
+ }
+
+ if (c.endsWith(".")) {
+ if (name.startsWith(c))
+ return result;
+ } else if (name.equals(c))
+ return result;
+ }
+ }
+ return false;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ServletTransformingClassLoader.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ServletTransformingClassLoader.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ServletTransformingClassLoader.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/ServletTransformingClassLoader.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,63 @@
+package org.apache.magma.tools.classloading;
+
+public class ServletTransformingClassLoader extends TransformingClassloader {
+
+ private ClassLoader parent = null;
+
+ public ServletTransformingClassLoader() {
+ }
+
+ public ServletTransformingClassLoader(ClassLoader parent) {
+ super(parent);
+ this.parent = getParent();
+ }
+
+ /* ------------------------------------------------------------ */
+ public synchronized Class loadClass(String name) throws ClassNotFoundException {
+ return loadClass(name, false);
+ }
+
+ /* ------------------------------------------------------------ */
+ protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ Class c = findLoadedClass(name);
+ ClassNotFoundException ex = null;
+ boolean doneparent = false;
+
+ if (c == null && parent != null && isSystemPath(name)) {
+ doneparent = true;
+ try {
+ c = parent.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ ex = e;
+ }
+ }
+
+ if (c == null) {
+ try {
+ c = this.findClass(name);
+ } catch (ClassNotFoundException e) {
+ ex = e;
+ }
+ }
+
+ if (c == null && parent != null && !doneparent && !isServerPath(name))
+ c = parent.loadClass(name);
+
+ if (c == null)
+ throw ex;
+
+ if (resolve)
+ resolveClass(c);
+
+ return c;
+ }
+
+ protected boolean isSystemPath(String name) {
+ return false;
+ }
+
+ protected boolean isServerPath(String name) {
+ return false;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/TransformingClassloader.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/TransformingClassloader.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/TransformingClassloader.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/TransformingClassloader.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,83 @@
+package org.apache.magma.tools.classloading;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.apache.magma.tools.classloading.caching.ClassCache;
+
+public class TransformingClassloader extends ClassLoader {
+
+ protected BytecodeProvider provider = null;
+ protected ClassLoader rawResources;
+
+ public TransformingClassloader() {
+ }
+
+ public TransformingClassloader(ClassLoader parent) {
+ super(parent);
+ }
+
+ public void setChainProvider(BytecodeProvider provider) {
+ this.provider = provider;
+ }
+
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ URL url = provider.findBytecode(name);
+ if (url == null)
+ throw new ClassNotFoundException(name);
+
+ try {
+ byte[] classBytes = ClassCache.rawRetrieve(url);
+ if (classBytes == null) {
+ InputStream resource = url.openStream();
+
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ byte[] b = new byte[1024];
+ for (int n = 0; (n = resource.read(b, 0, b.length)) != -1;
+ bout.write(b, 0, n))
+ ;
+ classBytes = bout.toByteArray();
+ }
+ try {
+ int i = name.lastIndexOf('.');
+ String pkgname = name.substring(0, i);
+ // Check if package already loaded.
+ Package pkg = getPackage(pkgname);
+ if (pkg == null) {
+ super.definePackage(pkgname, null, null, null, null, null, null, null);
+ }
+ return defineClass(name, classBytes, 0, classBytes.length);
+ } catch (SecurityException e) {
+ // possible prohibited package: defer to the parent
+ return super.findClass(name);
+ }
+ } catch (IOException ioe) {
+ // defer to the parent
+ return super.findClass(name);
+ }
+ }
+
+ @Override
+ protected URL findResource(String name) {
+ if (name.endsWith(".class")) {
+ String classname = name.replace('/', '.');
+ classname = classname.substring(0, classname.length() - 6);
+ return provider.findBytecode(classname);
+ }
+ return rawResources.getResource(name);
+ }
+
+ @Override
+ protected Enumeration<URL> findResources(String name) throws IOException {
+ return rawResources.getResources(name);
+ }
+
+ public void setRawResources(ClassLoader rawResources) {
+ this.rawResources = rawResources;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLConnection.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLConnection.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLConnection.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLConnection.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,27 @@
+package org.apache.magma.tools.classloading.caching;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+public class CacheURLConnection extends URLConnection {
+
+ private SavedEntity entity = null;
+
+ public CacheURLConnection(URL url, SavedEntity entity) {
+ super(url);
+ this.entity = entity;
+ }
+
+ @Override
+ public void connect() throws IOException {
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return new ByteArrayInputStream(entity.content);
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandler.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandler.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandler.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandler.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,18 @@
+package org.apache.magma.tools.classloading.caching;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+public class CacheURLStreamHandler extends URLStreamHandler {
+
+ @Override
+ protected URLConnection openConnection(URL u) throws IOException {
+ String path = u.getPath();
+ SavedEntity entity = ClassCache.retrieve(path);
+ if (entity == null) throw new IOException("No element in cache for " + path);
+ return new CacheURLConnection(u, entity);
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandlerFactory.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandlerFactory.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandlerFactory.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/CacheURLStreamHandlerFactory.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,13 @@
+package org.apache.magma.tools.classloading.caching;
+
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+
+public class CacheURLStreamHandlerFactory implements URLStreamHandlerFactory {
+
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (protocol.equals("classcache")) return new CacheURLStreamHandler();
+ return null;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/ClassCache.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/ClassCache.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/ClassCache.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/ClassCache.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,55 @@
+package org.apache.magma.tools.classloading.caching;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ClassCache {
+
+ private static Map<URL, SavedEntity> cache = new HashMap<URL, SavedEntity>();
+
+ static {
+ URL.setURLStreamHandlerFactory(new CacheURLStreamHandlerFactory());
+ }
+
+ public static SavedEntity retrieve(String path) {
+ try {
+ return cache.get(new URL("classcache:" + path));
+ } catch (MalformedURLException e) {
+ // should never happen
+ throw new RuntimeException("Error creating url ", e);
+ }
+ }
+
+ public static SavedEntity retrieve(URL url) {
+ return cache.get(url);
+ }
+
+ public static byte[] rawRetrieve(URL url) {
+ SavedEntity entity = cache.get(url);
+ if (entity == null) return null;
+ return entity.content;
+ }
+
+ public static URL save(String context, String name, byte[] content) {
+ SavedEntity entity = new SavedEntity();
+ entity.context = context;
+ entity.classname = name;
+ entity.content = content;
+
+ String ckey = context + ":" + name;
+ URL ret;
+ try {
+ ret = new URL("classcache:" + ckey);
+ } catch (MalformedURLException e) {
+ // should never happen
+ throw new RuntimeException("Error creating url ", e);
+ }
+ entity.url = ret;
+ cache.put(ret, entity);
+
+ return ret;
+ }
+
+}
Added: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/SavedEntity.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/SavedEntity.java?rev=736835&view=auto
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/SavedEntity.java (added)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/classloading/caching/SavedEntity.java Thu Jan 22 14:37:33 2009
@@ -0,0 +1,13 @@
+package org.apache.magma.tools.classloading.caching;
+
+import java.net.URL;
+
+public final class SavedEntity {
+
+ public URL url;
+ public String classname;
+ public String context;
+ public byte[] content;
+ public long lastget;
+
+}
Modified: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java?rev=736835&r1=736834&r2=736835&view=diff
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java (original)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRun.java Thu Jan 22 14:37:33 2009
@@ -21,6 +21,7 @@
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -28,21 +29,26 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
+import org.apache.magma.tools.classloading.AspectJClassTransformer;
+import org.apache.magma.tools.classloading.CachingTransformingProvider;
+import org.apache.magma.tools.classloading.ClassLoaderBytecodeProvider;
+import org.apache.magma.tools.classloading.JPAClassTransformer;
+import org.apache.magma.tools.classloading.JettyTransformingClassLoader;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.util.FileUtils;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.handler.DefaultHandler;
import org.mortbay.jetty.handler.HandlerCollection;
import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.webapp.WebAppClassLoader;
import org.mortbay.jetty.webapp.WebAppContext;
import org.mortbay.resource.Resource;
-import org.mortbay.util.Scanner;
-import org.mortbay.jetty.webapp.WebAppContext;
/**
* @goal run
@@ -93,6 +99,7 @@
public static int DEFAULT_PORT = 8080;
public static int DEFAULT_MAX_IDLE_TIME = 30000;
+ @SuppressWarnings("unchecked")
public void execute() throws MojoExecutionException, MojoFailureException {
System.setProperty("magma.env", System.getProperty("magma.env", "devel"));
Server server = new Server();
@@ -113,7 +120,7 @@
tmpDirectory.deleteOnExit();
webapp.addServlet("org.apache.magma.website.Dispatch", "/*");
- // Setup the classloader
+ // Setup the classloader chain
List urls = new ArrayList();
try {
List resources = project.getResources();
@@ -176,9 +183,51 @@
} catch (Exception e) {
}
}
- JettyWeavingURLClassLoader cl = new JettyWeavingURLClassLoader(urlarray, aspects.toArray(new URL[] {}), Thread.currentThread().getContextClassLoader(), webapp);
- webapp.setClassLoader(cl);
-
+
+ StringBuilder jettypath = new StringBuilder();
+ for (URL acurl : urlarray) {
+ jettypath.append(acurl.toString());
+ jettypath.append(',');
+ }
+ webapp.setExtraClasspath(jettypath.toString());
+
+ try {
+ WebAppClassLoader rootrepo = new WebAppClassLoader(webapp);
+ URLClassLoader limitedrepo = new URLClassLoader(urlarray, null);
+ JettyTransformingClassLoader root = new JettyTransformingClassLoader(Thread.currentThread().getContextClassLoader(), webapp);
+ root.setRawResources(rootrepo);
+ ClassLoaderBytecodeProvider rootprovider = new ClassLoaderBytecodeProvider(limitedrepo);
+
+ File ajccache = new File(project.getBasedir(), "ajccache");
+ ajccache.mkdirs();
+ FileUtils.cleanDirectory(ajccache);
+ AspectJClassTransformer ajctransformer = new AspectJClassTransformer(rootrepo, aspects.toArray(new URL[] {}));
+ CachingTransformingProvider ajcprovider = new CachingTransformingProvider(ajccache, ajctransformer);
+ root.setChainProvider(ajcprovider);
+ ajcprovider.setChainProvider(rootprovider);
+
+ Class support = root.loadClass("org.apache.magma.database.openjpa.SupportTransformer");
+ if (support != null) {
+ StringBuilder paths = new StringBuilder();
+ for (URL acurl : urlarray) {
+ paths.append(acurl.toString());
+ paths.append(';');
+ }
+ Class jpact = root.loadClass(JPAClassTransformer.class.getName());
+ JPAClassTransformer jpatransformer = (JPAClassTransformer) jpact.
+ getConstructor(ClassLoader.class, String.class, String.class)
+ .newInstance(root, "org.apache.magma.database.openjpa.SupportTransformer", paths.toString());
+ File jpacache = new File(project.getBasedir(), "jpacache");
+ jpacache.mkdirs();
+ FileUtils.cleanDirectory(jpacache);
+ CachingTransformingProvider jpaprovider = new CachingTransformingProvider(jpacache, jpatransformer);
+ jpaprovider.setChainProvider(ajcprovider);
+ root.setChainProvider(jpaprovider);
+ }
+ webapp.setClassLoader(root);
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error setting up classloaders ", e);
+ }
// Setup the handler chains
ContextHandlerCollection contexts = new ContextHandlerCollection();
@@ -192,7 +241,7 @@
SelectChannelConnector connector = new SelectChannelConnector();
String portnum = System.getProperty(PORT_SYSPROPERTY, null);
int port = ((portnum==null||portnum.equals(""))?DEFAULT_PORT:Integer.parseInt(portnum.trim()));
- connector.setAcceptors(50);
+ connector.setAcceptors(5);
connector.setPort(port);
connector.setMaxIdleTime(DEFAULT_MAX_IDLE_TIME);
Modified: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRunWar.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRunWar.java?rev=736835&r1=736834&r2=736835&view=diff
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRunWar.java (original)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaJettyRunWar.java Thu Jan 22 14:37:33 2009
@@ -92,7 +92,7 @@
SelectChannelConnector connector = new SelectChannelConnector();
String portnum = System.getProperty(PORT_SYSPROPERTY, null);
int port = ((portnum==null||portnum.equals(""))?DEFAULT_PORT:Integer.parseInt(portnum.trim()));
- connector.setAcceptors(50);
+ connector.setAcceptors(100);
connector.setPort(port);
connector.setMaxIdleTime(DEFAULT_MAX_IDLE_TIME);
Modified: labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaTestMojo.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaTestMojo.java?rev=736835&r1=736834&r2=736835&view=diff
==============================================================================
--- labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaTestMojo.java (original)
+++ labs/magma/trunk/maven-magma-plugin/src/main/java/org/apache/magma/tools/maven/MagmaTestMojo.java Thu Jan 22 14:37:33 2009
@@ -853,9 +853,9 @@
String key = ArtifactUtils.versionlessKey( "org.apache.openjpa", "openjpa");
Artifact art = (Artifact) projectArtifactMap.get(key);
if (art != null) {
- art = artifactFactory.createPluginArtifact("org.apache.magma.tools", "maven-magma-plugin", VersionRange.createFromVersion("0.0.3-r1"));
+ art = artifactFactory.createPluginArtifact("org.apache.magma.tools", "maven-magma-plugin", VersionRange.createFromVersion("0.0.3-r3"));
try {
- artifactResolver.resolve(art, Collections.EMPTY_LIST, localRepository);
+ artifactResolver.resolve(art, Collections.EMPTY_LIST, localRepository);
} catch (ArtifactResolutionException e) {
e.printStackTrace();
} catch (ArtifactNotFoundException e) {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org