Author: tcurdt Date: Mon Feb 7 10:11:45 2005 New Revision: 151735 URL: http://svn.apache.org/viewcvs?view=rev&rev=151735 Log: major API change, lazy method lookups, updated the TODO
Added: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/MethodLookup.java Modified: jakarta/commons/sandbox/javaflow/trunk/TODO jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationCompilingClassLoader.java jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationContext.java jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationClassLoaderTestCase.java Modified: jakarta/commons/sandbox/javaflow/trunk/TODO URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/TODO?view=diff&r1=151734&r2=151735 ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/TODO (original) +++ jakarta/commons/sandbox/javaflow/trunk/TODO Mon Feb 7 10:11:45 2005 @@ -4,8 +4,7 @@ o website o testcases!!!! o documentation of the rewriting process. - maybe re-evaluate and talk to the RIFE - guys about joining forces + maybe re-evaluate o make the Stack class use a hierarchical approach to support differential continuations o make the Stack and Continuation classes @@ -17,6 +16,7 @@ o fix bugs: o use of "suspend" in constructors o inner classes + o how to handle "finally" o implement an ANT task for build time class rewriting (already have something on my disk) o addition to async ContinuationCompilingClassLoader @@ -38,7 +38,13 @@ o BCEL o push some bug fixes in BCEL + + http://issues.apache.org/bugzilla/show_bug.cgi?id=27646 + http://issues.apache.org/bugzilla/show_bug.cgi?id=27854 + http://issues.apache.org/bugzilla/show_bug.cgi?id=27855 + o get rid of the static repository approach +o talk to the RIFE guys about joining forces o talk to the aspectwerkz and aspectj folks about working together 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?view=diff&r1=151734&r2=151735 ============================================================================== --- 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 Mon Feb 7 10:11:45 2005 @@ -35,39 +35,60 @@ public class Continuation implements Serializable { private final static Log log = LogFactory.getLog(Continuation.class); - - private final Stack stack; - private final static transient Map continuationsMap = new HashMap(); + private transient Object context; + + private transient boolean restoring = false; + private transient boolean capturing = false; - private boolean restoring = false; + private transient Method method; + private transient Object instance; + + private String methodName; + private final Stack stack; + private final Continuation root; - private boolean capturing = false; + + private Continuation() { + stack = new Stack(); + root = this; + } /** * Create a new continuation, which continue a previous continuation. */ private Continuation( final Continuation parent ) { - if (parent != null) { - stack = new Stack(parent.stack); - } else { - stack = new Stack(); - } + stack = new Stack(parent.stack); + methodName = parent.methodName; + method = parent.method; + instance = parent.instance; + root = parent.root; } + /** - * Return the stack, which is used to store the frame information. private - * Stack getStack() { return stack; } + * get the current contex. only valid + * while calling "continueWith" + * + * @return context object */ - - // REVISIT - private Object context; - public Object getContext() { return context; } + + public static Continuation startWith( final String methodName, final ContinuationContext context ) { + + final Continuation newContinuation = new Continuation(); + + newContinuation.methodName = methodName; + + log.debug("starting new flow from " + methodName); + + return execute(newContinuation, context); + } + /** * Creates a new continuation to capture the * next state. Resume where the old one was @@ -77,42 +98,51 @@ * @param context context of the continuation * @return new child continuation */ - public static Continuation continueWith(final Continuation parent, final ContinuationContext context) { + public static Continuation continueWith(final Continuation oldContinuation, final ContinuationContext context) { - final Continuation newContinuation = new Continuation(parent); + log.debug("continueing with continuation " + oldContinuation); - if (parent != null) { - log.debug("resuming continuation " + parent); - newContinuation.restoring = true; - } else { - log.debug("starting new flow"); - // create continuable instance - } - - newContinuation.registerThread(); - newContinuation.context = context; + final Continuation newContinuation = new Continuation(oldContinuation); - final Object instance = context.getInstance(); - final Method method = context.getMethod(); + newContinuation.restoring = true; + + return execute(newContinuation, context); + } + private static Continuation execute(final Continuation continuation, final ContinuationContext context) { try { + continuation.registerThread(); + + // REVISIT: use instance from root continuation + + if (continuation.method == null) { + final MethodLookup lookup = context.getMethodLookup(); + continuation.method = lookup.getMethod(continuation.methodName); + } - method.invoke(instance, new Object[0]); + if (continuation.instance == null) { + continuation.instance = continuation.method.getDeclaringClass().newInstance(); + } + + continuation.context = context; + + continuation.method.invoke(continuation.instance, new Object[0]); } catch (final Exception e) { - log.error("could not execute " + instance + " " + method, e); + log.error("could not execute " + continuation, e); } finally { - if (newContinuation.capturing) { - newContinuation.stack.popReference(); + if (continuation.capturing) { + continuation.stack.popReference(); } - newContinuation.context = null; - newContinuation.deregisterThread(); + continuation.context = null; + + continuation.deregisterThread(); } - return newContinuation; + return continuation; } - + /** * Stop the running continuation. */ @@ -124,7 +154,8 @@ if (continuation == null) throw new IllegalStateException("no continuation is running"); - continuation.capturing = !continuation.restoring; + continuation.capturing = !continuation.restoring; + continuation.restoring = false; } @@ -173,5 +204,10 @@ synchronized (continuationsMap) { return (Continuation) continuationsMap.get(Thread.currentThread()); } + } + + + public String toString() { + return "Continuation@" + hashCode(); } } Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationCompilingClassLoader.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationCompilingClassLoader.java?view=diff&r1=151734&r2=151735 ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationCompilingClassLoader.java (original) +++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationCompilingClassLoader.java Mon Feb 7 10:11:45 2005 @@ -18,6 +18,8 @@ import java.io.File; import org.apache.commons.javaflow.bytecode.RewritingResourceStore; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.jci.CompilingClassLoader; import org.apache.jci.stores.MemoryResourceStore; @@ -27,12 +29,18 @@ */ public final class ContinuationCompilingClassLoader extends CompilingClassLoader { + private final static Log log = LogFactory.getLog(ContinuationCompilingClassLoader.class); + public ContinuationCompilingClassLoader(final ClassLoader pParent) { - this(pParent, new File("WEB-INF/classes")); + this(pParent, new File("WEB-INF/compile")); } - public ContinuationCompilingClassLoader(final ClassLoader pParent, final File pRepository) { + public ContinuationCompilingClassLoader(final ClassLoader pParent, final File pRepository) { super(pParent, pRepository, new RewritingResourceStore(new MemoryResourceStore())); + + if (log.isDebugEnabled()) { + log.debug("monitoring directory " + pRepository.getAbsolutePath()); + } } } Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationContext.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationContext.java?view=diff&r1=151734&r2=151735 ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationContext.java (original) +++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ContinuationContext.java Mon Feb 7 10:11:45 2005 @@ -15,36 +15,26 @@ */ package org.apache.commons.javaflow; -import java.lang.reflect.Method; /** * Helper class to associate cocoon flow informations to the continuation. * * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> - * @version CVS $Id: ContinuationContext.java,v 1.1 2005/01/23 03:55:21 tcurdt Exp $ + * @version CVS $Id$ */ public class ContinuationContext { - private Object instance; - private Method method; - + private MethodLookup lookup; + public ContinuationContext() { } - public void setInstance( final Object instance ) { - this.instance = instance; - } - - public Object getInstance() { - return instance; + public void setMethodLookup( final MethodLookup lookup ) { + this.lookup = lookup; } - - public void setMethod(Method method) { - this.method = method; - } - - public Method getMethod() { - return method; + + public MethodLookup getMethodLookup() { + return lookup; } } Added: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/MethodLookup.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/MethodLookup.java?view=auto&rev=151735 ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/MethodLookup.java (added) +++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/MethodLookup.java Mon Feb 7 10:11:45 2005 @@ -0,0 +1,27 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.javaflow; + +import java.lang.reflect.Method; + + +/** + * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a> + * + */ +public interface MethodLookup { + Method getMethod( final String method ); +} 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?view=diff&r1=151734&r2=151735 ============================================================================== --- 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 Mon Feb 7 10:11:45 2005 @@ -42,13 +42,13 @@ private static Indexer defaultIndexer = new DefaultIndexer(); private static Matcher defaultMatcher = new DefaultMatcher(); - private static class DefaultMatcher implements Matcher { + public static class DefaultMatcher implements Matcher { public boolean matches(final String pName) { return true; } } - private static class DefaultIndexer implements Indexer { + public static class DefaultIndexer implements Indexer { public void put(final Map pMap, final String pKey, final Object pObject) { pMap.put(pKey, pObject); } Modified: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationClassLoaderTestCase.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationClassLoaderTestCase.java?view=diff&r1=151734&r2=151735 ============================================================================== --- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationClassLoaderTestCase.java (original) +++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationClassLoaderTestCase.java Mon Feb 7 10:11:45 2005 @@ -43,42 +43,45 @@ final ClassLoader cl = new ContinuationClassLoader(getClass().getClassLoader()); final Class clazz = cl.loadClass(calculatorTestClass); assertNotNull(clazz); - final Object instance = clazz.newInstance(); - assertNotNull(instance); - - // get method called "main" + + // get all methods final Map methods = ReflectionUtils.discoverMethods(clazz); assertNotNull(methods); - final Method method = (Method) methods.get("main"); - assertNotNull(method); + assertTrue(methods.size() > 0); + + final MethodLookup lookup = new MethodLookup() { + public Method getMethod(final String methodName) { + final Method method = (Method) methods.get(methodName); + return method; + } + }; + Continuation continuation = null; ContinuationContext context = null; context = new ContinuationContext(); - context.setMethod(method); - context.setInstance(instance); + context.setMethodLookup(lookup); - assertTrue(instance.toString(), "0.0".equals(instance.toString())); + //assertTrue(instance.toString(), "0.0".equals(instance.toString())); log.debug("Continuation 1"); - continuation = Continuation.continueWith(continuation, context); - assertTrue(instance.toString(), "1.1".equals(instance.toString())); + continuation = Continuation.startWith("main", context); + //assertTrue(instance.toString(), "1.1".equals(instance.toString())); final Continuation parent = continuation; context = new ContinuationContext(); - context.setMethod(method); - context.setInstance(instance); + context.setMethodLookup(lookup); log.debug("Continuation 1.1"); final Continuation continuation11 = Continuation.continueWith(parent, context); - assertTrue("" + instance, "2.2".equals(instance.toString())); + //assertTrue("" + instance, "2.2".equals(instance.toString())); log.debug("Continuation 1.2"); final Continuation continuation12 = Continuation.continueWith(parent, context); - assertTrue("" + instance, "3.2".equals(instance.toString())); + //assertTrue("" + instance, "3.2".equals(instance.toString())); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]