cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Peter Mortier" <morti...@hotmail.com>
Subject Java Continuation problem
Date Wed, 14 Apr 2004 15:19:45 GMT
Hello,

I'm trying out the new Java continuations stuff seperately from Cocoon.
However, I have run into a problem. The instrumented bytecode throws a 
ClassCastException In the case where I am trying to resume a Continuation 
from a Continuable which delegates to another Continuable.

I have inlined a couple of Java test files. These test different Continuable 
implementations. The first two Continuable types (SimpleContinuable and 
ExtendedContinuable) work. When I try it with a WrapperContinuable which 
delegates to a SimpleContinuable I'm in trouble.

Some deeper digging shows that it retrieves a WrapperContinuable from the 
ContinuationStack and tries to cast it to a SimpleContinuable. It looks like 
something is wrong with the bytecode instrumentation? Can you help me out?

Thanks,

Peter Mortier


------------------------- ContinuationTest.java 
------------------------------

import org.apache.cocoon.components.flow.java.Continuation;
import org.apache.cocoon.components.flow.java.ContinuationClassLoader;

public class ContinuationTest {

	static public void main( String args[] ) {
		try {
		    testSimpleContinuable();
		    System.out.println("SimpleContinuable test done");
		    testExtendedContinuable();
		    System.out.println("ExtendedContinuable test done");
		    testWrapperContinuable();
		    System.out.println("Wrapper continuable test done");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	protected static void testSimpleContinuable() throws Exception {
		ContinuationClassLoader cl = new 
ContinuationClassLoader(Thread.currentThread().getContextClassLoader());
		Continuation continuation = new Continuation(null);
		continuation.registerThread();
		Class clazz = cl.loadClass("SimpleContinuable");
		Object object = clazz.newInstance();
		clazz.getMethod("suspend", null).invoke(object, null);
		continuation = new Continuation(continuation, null);
		continuation.registerThread();
		clazz.getMethod("suspend", null).invoke(object, null);
	}

	protected static void testWrapperContinuable() throws Exception {
		ContinuationClassLoader cl = new 
ContinuationClassLoader(Thread.currentThread().getContextClassLoader());
		Continuation continuation = new Continuation(null);
		continuation.registerThread();
		Class clazz = cl.loadClass("WrapperContinuable");
		Object object = clazz.newInstance();
		clazz.getMethod("test", null).invoke(object, null);
		continuation = new Continuation(continuation, null);
		continuation.registerThread();
		clazz.getMethod("test", null).invoke(object, null);
	}

	protected static void testExtendedContinuable() throws Exception {
		ContinuationClassLoader cl = new 
ContinuationClassLoader(Thread.currentThread().getContextClassLoader());
		Continuation continuation = new Continuation(null);
		continuation.registerThread();
		Class clazz = cl.loadClass("ExtendedContinuable");
		Object object = clazz.newInstance();
		clazz.getMethod("test", null).invoke(object, null);
		continuation = new Continuation(continuation, null);
		continuation.registerThread();
		clazz.getMethod("test", null).invoke(object, null);
	}

}


------------------------- SimpleContinuable.java 
------------------------------

import org.apache.cocoon.components.flow.java.Continuable;
import org.apache.cocoon.components.flow.java.Continuation;

public class SimpleContinuable implements Continuable {

	public void suspend() {
		System.out.println("suspending");
		Continuation.suspend();
		System.out.println("continuing");
	}

}


------------------------- ExtendedContinuable.java 
------------------------------

public class ExtendedContinuable extends SimpleContinuable {

	public void test() {
		super.suspend();
	}

}

------------------------- WrapperContinuable.java 
------------------------------

import org.apache.cocoon.components.flow.java.Continuable;

public class WrapperContinuable implements Continuable {

	SimpleContinuable simple;

	public WrapperContinuable() {
		simple = new SimpleContinuable();
	}

	public void test() {
		simple.suspend();
	}

}

_________________________________________________________________
Vraag van de week: Welk soort project zou jij financieel ondersteunen? 
http://www.msn.be/microsoft/potential/default.asp


Mime
View raw message