You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tc...@apache.org on 2005/10/06 02:06:41 UTC
svn commit: r295143 - in /jakarta/commons/sandbox/javaflow/trunk: ./
src/java/org/apache/commons/javaflow/
src/java/org/apache/commons/javaflow/bytecode/
src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/
src/java/org/apache/commons/jav...
Author: tcurdt
Date: Wed Oct 5 17:06:30 2005
New Revision: 295143
URL: http://svn.apache.org/viewcvs?rev=295143&view=rev
Log:
more verbose debugging for the moment
Modified:
jakarta/commons/sandbox/javaflow/trunk/project.properties
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/StackRecorder.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java
Modified: jakarta/commons/sandbox/javaflow/trunk/project.properties
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/project.properties?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/project.properties (original)
+++ jakarta/commons/sandbox/javaflow/trunk/project.properties Wed Oct 5 17:06:30 2005
@@ -20,6 +20,7 @@
maven.jar.excludes=**/package.html
maven.junit.fork=true
maven.test.failure.ignore = true
+maven.test.skip = true
maven.junit.sysproperties=org.xml.sax.driver
org.xml.sax.driver=org.apache.xerces.parsers.SAXParser
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java Wed Oct 5 17:06:30 2005
@@ -15,12 +15,12 @@
*/
package org.apache.commons.javaflow;
+import java.io.Serializable;
import org.apache.commons.javaflow.bytecode.StackRecorder;
+import org.apache.commons.javaflow.utils.ReflectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import java.io.Serializable;
-
/**
* Snapshot of a thread execution state.
*
@@ -45,6 +45,8 @@
private final StackRecorder stack;
+ private static final long serialVersionUID = 1L;
+
/**
* Create a new continuation, which continue a previous continuation.
@@ -124,7 +126,7 @@
throw new IllegalArgumentException("target is null");
}
- log.debug("starting new flow from " + target);
+ log.debug("starting new flow from " + ReflectionUtils.getClassName(target) + "/" + ReflectionUtils.getClassLoaderName(target));
return execute(new StackRecorder(target), context);
}
@@ -162,7 +164,7 @@
throw new IllegalArgumentException("continuation parameter must not be null.");
}
- log.debug("continueing with continuation " + resumed);
+ log.debug("continueing with continuation " + ReflectionUtils.getClassName(resumed) + "/" + ReflectionUtils.getClassLoaderName(resumed));
return execute(new StackRecorder(resumed.stack),context);
}
@@ -192,8 +194,6 @@
}
public String toString() {
- return "Continuation@" + hashCode() + " in " + getClass().getClassLoader();
+ return "Continuation@" + hashCode() + "/" + ReflectionUtils.getClassLoaderName(this);
}
-
- private static final long serialVersionUID = 1L;
}
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java Wed Oct 5 17:06:30 2005
@@ -15,11 +15,11 @@
*/
package org.apache.commons.javaflow.bytecode;
-import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-
+import java.io.Serializable;
+import org.apache.commons.javaflow.utils.ReflectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -43,14 +43,16 @@
private Object[] ostack;
private Object[] rstack;
private int iTop, fTop, dTop, lTop, oTop, rTop;
+ public Runnable runnable;
- public Stack() {
+ public Stack(Runnable pRunnable) {
istack = new int[10];
lstack = new long[5];
dstack = new double[5];
fstack = new float[5];
ostack = new Object[10];
rstack = new Object[5];
+ runnable = pRunnable;
}
public Stack(final Stack parent) {
@@ -72,6 +74,7 @@
System.arraycopy(parent.lstack, 0, lstack, 0, lTop);
System.arraycopy(parent.ostack, 0, ostack, 0, oTop);
System.arraycopy(parent.rstack, 0, rstack, 0, rTop);
+ runnable = parent.runnable;
}
public boolean hasDouble() {
@@ -84,7 +87,7 @@
}
final double d = dstack[--dTop];
- log.debug("pop double " + d + " " + toString());
+ log.debug("pop double " + d + " " + getStats());
return d;
}
@@ -98,7 +101,7 @@
}
final float f = fstack[--fTop];
- log.debug("pop float " + f + " " + toString());
+ log.debug("pop float " + f + " " + getStats());
return f;
}
@@ -112,7 +115,7 @@
}
final int i = istack[--iTop];
- log.debug("pop int " + i + " " + toString());
+ log.debug("pop int " + i + " " + getStats());
return i;
}
@@ -126,7 +129,7 @@
}
final long l = lstack[--lTop];
- log.debug("pop long " + l + " " + toString());
+ log.debug("pop long " + l + " " + getStats());
return l;
}
@@ -143,10 +146,10 @@
ostack[oTop]=null; // avoid unnecessary reference to object
if(log.isDebugEnabled()) {
- final String clazz = getClassName(o);
- final String clazzLoader = getClassLoaderName(o);
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
- log.debug("pop object "+ clazz + "/" + clazzLoader + " [" + o + "] " + toString());
+ log.debug("pop object "+ clazz + "/" + clazzLoader + " [" + o + "] ");
}
return o;
@@ -165,17 +168,17 @@
rstack[rTop]=null; // avoid unnecessary reference to object
if(log.isDebugEnabled()) {
- final String clazz = getClassName(o);
- final String clazzLoader = getClassLoaderName(o);
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
- log.debug("pop reference "+ clazz + "/" + clazzLoader + " [" + o + "] " + toString());
+ log.debug("pop reference "+ clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
}
return o;
}
public void pushDouble(double d) {
- log.debug("push double " + d + " " + toString());
+ log.debug("push double " + d + " " + getStats());
if (dTop == dstack.length) {
double[] hlp = new double[dstack.length*2];
@@ -186,7 +189,7 @@
}
public void pushFloat(float f) {
- log.debug("push float " + f + " " + toString());
+ log.debug("push float " + f + " " + getStats());
if (fTop == fstack.length) {
float[] hlp = new float[fstack.length*2];
@@ -197,7 +200,7 @@
}
public void pushInt(int i) {
- log.debug("push int " + i + " " + toString());
+ log.debug("push int " + i + " " + getStats());
if (iTop == istack.length) {
int[] hlp = new int[istack.length*2];
@@ -208,7 +211,7 @@
}
public void pushLong(long l) {
- log.debug("push long " + l + " " + toString());
+ log.debug("push long " + l + " " + getStats());
if (lTop == lstack.length) {
long[] hlp = new long[lstack.length*2];
@@ -220,10 +223,10 @@
public void pushObject(Object o) {
- final String clazz = getClassName(o);
- final String clazzLoader = getClassLoaderName(o);
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
- log.debug("push object " + clazz + "/" + clazzLoader + " [" + o + "] " + toString());
+ log.debug("push object " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
if (o != null && !(o instanceof Serializable)) {
@@ -239,10 +242,10 @@
}
public void pushReference(Object o) {
- final String clazz = getClassName(o);
- final String clazzLoader = getClassLoaderName(o);
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
- log.debug("push reference " + clazz + "/" + clazzLoader + " [" + o + "] " + toString());
+ log.debug("push reference " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
if (o != null && !(o instanceof Serializable)) {
log.warn("continuation is referencing class " + clazz + " which is not serializable");
@@ -256,36 +259,48 @@
rstack[rTop++] = o;
}
- private static String getClassName(final Object o) {
- if (o == null) {
- return "unknown";
- }
-
- return o.getClass().getName() + "@" + o.hashCode();
- }
-
- private static String getClassLoaderName(final Object o) {
- if (o == null) {
- return "unknown";
- }
-
- return String.valueOf(o.getClass().getClassLoader());
- }
public boolean isEmpty() {
return iTop==0 && lTop==0 && dTop==0 && fTop==0 && oTop==0 && rTop==0;
}
-
+ private String getStats() {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("i[").append(iTop).append("],");
+ sb.append("l[").append(lTop).append("],");
+ sb.append("d[").append(dTop).append("],");
+ sb.append("f[").append(fTop).append("],");
+ sb.append("o[").append(oTop).append("],");
+ sb.append("r[").append(rTop).append("]");
+ return sb.toString();
+ }
+
+ private String getContent() {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("i[").append(iTop).append("]\n");
+ sb.append("l[").append(lTop).append("]\n");
+ sb.append("d[").append(dTop).append("]\n");
+ sb.append("f[").append(fTop).append("]\n");
+ sb.append("o[").append(oTop).append("]\n");
+ for(int i=0; i<oTop;i++) {
+ sb.append(' ').append(i).append(": ");
+ sb.append(ReflectionUtils.getClassName(ostack[i])).append('/').append(ReflectionUtils.getClassLoaderName(ostack[i]));
+ sb.append('\n');
+ }
+ sb.append("r[").append(rTop).append("]\n");
+ for(int i=0; i<rTop;i++) {
+ sb.append(' ').append(i).append(": ");
+ sb.append(ReflectionUtils.getClassName(rstack[i])).append('/').append(ReflectionUtils.getClassLoaderName(rstack[i]));
+ sb.append('\n');
+ }
+
+ return sb.toString();
+ }
+
public String toString() {
- return
- "i=" + iTop +
- ",l=" + lTop +
- ",d=" + dTop +
- ",f=" + fTop +
- ",o=" + oTop +
- ",r=" + rTop;
+ return getContent();
}
+
private void writeObject(ObjectOutputStream s) throws IOException {
s.writeInt(iTop);
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/StackRecorder.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/StackRecorder.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/StackRecorder.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/StackRecorder.java Wed Oct 5 17:06:30 2005
@@ -15,6 +15,7 @@
*/
package org.apache.commons.javaflow.bytecode;
+import org.apache.commons.javaflow.utils.ReflectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -42,7 +43,7 @@
* Creates a new empty {@link StackRecorder} that runs the given target.
*/
public StackRecorder(Runnable target) {
- pushReference(target);
+ super(target);
}
/**
@@ -82,19 +83,34 @@
public StackRecorder execute(final Object context) {
final StackRecorder old = registerThread();
- Runnable target = (Runnable)popReference();
try {
+ Object target = runnable;
+
restoring = !isEmpty(); // start restoring if we have a filled stack
this.context = context;
- target.run();
- if (!capturing) {
- return null;
+
+ if (restoring) {
+ log.debug("Restoring state of " + ReflectionUtils.getClassName(target) + "/" + ReflectionUtils.getClassLoaderName(target));
}
+
+ if (target instanceof Runnable) {
+ log.debug("calling runnable");
+ ((Runnable)target).run();
+ } else {
+ log.error("No runnable on stack. " + ReflectionUtils.getClassName(target) + "/" + ReflectionUtils.getClassLoaderName(target));
+ }
+
+ if (capturing) {
+ return this;
+ }
+ } catch(Throwable t) {
+ log.error(t.getMessage(),t);
} finally {
this.context = null;
deregisterThread(old);
}
- return this;
+
+ return null;
}
public Object getContext() {
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java Wed Oct 5 17:06:30 2005
@@ -97,11 +97,11 @@
private static final String CAPURING_METHOD = "isCapturing";
private boolean currentMethodStatic = false;
- public static boolean debug = false;
+ public static boolean debug = true;
static {
try {
- debug = System.getProperty(BcelClassTransformer.class.getName()+".debug")!=null;
+ //debug = System.getProperty(BcelClassTransformer.class.getName()+".debug")!=null;
} catch (SecurityException e) {
// assume no debugging
}
@@ -197,6 +197,9 @@
FileOutputStream out = null;
try {
out = new FileOutputStream(path);
+
+ log.debug("writing " + path);
+
out.write(orig);
out.flush();
} catch (final IOException e) {
@@ -215,6 +218,9 @@
try {
out = new FileOutputStream(path + ".java");
+
+ log.debug("writing " + path + ".java");
+
final DecompilingVisitor v = new DecompilingVisitor(javaClazz, out);
v.start();
} catch (final Exception e) {
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java Wed Oct 5 17:06:30 2005
@@ -139,4 +139,19 @@
return result;
}
+ public static String getClassName(final Object o) {
+ if (o == null) {
+ return "unknown";
+ }
+
+ return o.getClass().getName() + "@" + o.hashCode();
+ }
+
+ public static String getClassLoaderName(final Object o) {
+ if (o == null) {
+ return "unknown";
+ }
+
+ return getClassName(o.getClass().getClassLoader());
+ }
}
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java?rev=295143&r1=295142&r2=295143&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java Wed Oct 5 17:06:30 2005
@@ -17,6 +17,8 @@
import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
@@ -25,6 +27,7 @@
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
+import org.apache.commons.javaflow.bytecode.transformation.bcel.BcelClassTransformer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,16 +51,24 @@
os.close();
}
+ public static boolean isMatching(final String name, final String pattern) {
+ //FIXME proper matching
+ return "org/apache/cocoon/components/flow/java/AbstractContinuable.class".equals(name);
+ //|| "org/apache/cocoon/components/flow/java/Invoker.class".equals(name);
+ }
+
/*
- * @todo recurse
* @todo multiple transformers
*/
- public static void rewriteJar(
+ public static boolean rewriteJar(
final JarInputStream input,
final ResourceTransformer transformer,
- final JarOutputStream output
+ final JarOutputStream output,
+ final String pattern
) throws IOException {
+ boolean changed = false;
+
while(true) {
final JarEntry entry = input.getNextJarEntry();
@@ -66,31 +77,76 @@
}
if (entry.isDirectory()) {
+ output.putNextEntry(new JarEntry(entry));
continue;
}
final String name = entry.getName();
- final byte[] original = IOUtils.toByteArray(input);
-
output.putNextEntry(new JarEntry(name));
if (name.endsWith(".class")) {
-
- if (log.isDebugEnabled()) {
- log.debug("transforming " + name);
+ if (isMatching(name, pattern)) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("transforming " + name);
+ }
+
+ System.out.println(name);
+
+ final byte[] original = IOUtils.toByteArray(input);
+
+ final byte[] transformed = transformer.transform(original);
+ IOUtils.copy(new ByteArrayInputStream(transformed), output);
+
+ changed |= transformed.length != original.length;
+
+ continue;
}
-
- final byte[] transformed = transformer.transform(original);
- IOUtils.copy(new ByteArrayInputStream(transformed), output);
-
- } else {
+ } else if (name.endsWith(".jar")
+ || name.endsWith(".ear")
+ || name.endsWith(".zip")
+ || name.endsWith(".war")) {
+
+ changed |= rewriteJar(
+ new JarInputStream(input),
+ transformer,
+ new JarOutputStream(output),
+ pattern
+ );
- IOUtils.copy(new ByteArrayInputStream(original), output);
+ continue;
}
+
+ final byte[] original = IOUtils.toByteArray(input);
+ IOUtils.copy(new ByteArrayInputStream(original), output);
+
+ System.out.println("copied " + name + "(" + original.length + ")");
}
input.close();
output.close();
+
+ return changed;
}
+
+ public static void main(final String[] args) throws FileNotFoundException, IOException {
+ System.out.println("rewriting");
+
+ ResourceTransformer transformer = new BcelClassTransformer();
+
+ for (int i=0; i<args.length; i+=2) {
+ System.out.println("rewriting " + args[i]);
+
+ RewritingUtils.rewriteJar(
+ new JarInputStream(new FileInputStream(args[i])),
+ new BcelClassTransformer(),
+ new JarOutputStream(new FileOutputStream(args[i+1])),
+ "");
+ }
+
+ System.out.println("done");
+
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org