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