You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by st...@apache.org on 2004/06/26 20:29:31 UTC

cvs commit: cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/javascript JavaScriptFlowTestCase.xtest

stephan     2004/06/26 11:29:31

  Modified:    src/blocks/javaflow/java/org/apache/cocoon/components/flow/java
                        AbstractContinuable.java Continuation.java
                        ContinuationClassLoader.java
                        DecompilingVisitor.java JavaInterpreter.java
               src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/analyser
                        ControlFlowGraph.java Subroutines.java
               src/blocks/javaflow/java/org/apache/cocoon/components/flow/javascript
                        JavaScriptHelper.java JavaScriptInterpreter.java
               src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test
                        JavaFlowTestCase.java JavaFlowTestCase.xtest
                        SimpleFlow.java
               src/blocks/javaflow/test/org/apache/cocoon/components/flow/javascript
                        JavaScriptFlowTestCase.xtest
  Added:       src/blocks/javaflow/java/org/apache/cocoon/components/flow/java
                        ContinuationHelper.java
               src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test
                        InnerContinuable.java
  Log:
  Fixing problem with "Class c = xxx.class", was caused due a strange combination
  of dup_x1 and swap.
  Fixing problem with instantiated but unsed objects.
  The current problem is a
  java.lang.LinkageError: loader constraints violated when linking
  org/mozilla/javascript/IdFunction class
  
  Revision  Changes    Path
  1.7       +22 -19    cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/AbstractContinuable.java
  
  Index: AbstractContinuable.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/AbstractContinuable.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AbstractContinuable.java	24 Jun 2004 16:48:53 -0000	1.6
  +++ AbstractContinuable.java	26 Jun 2004 18:29:30 -0000	1.7
  @@ -39,37 +39,39 @@
    */
   public abstract class AbstractContinuable implements Continuable {
   
  -    private ContinuationContext getContext() {
  +    private static ContinuationContext getContext() {
           if (Continuation.currentContinuation()==null)
               throw new IllegalStateException("No continuation is running");
           return (ContinuationContext) Continuation.currentContinuation().getContext();
       }
     
  -    public Logger getLogger() {
  +    public static Logger getLogger() {
           return getContext().getLogger();
       }
       
  -    public Context getAvalonContext() {
  +    public static Context getAvalonContext() {
           return getContext().getAvalonContext();
       }
   
  -    public ServiceManager getServiceManager() {
  +    public static ServiceManager getServiceManager() {
           return getContext().getServiceManager();
       }
    
  -    public Redirector getRedirector() {
  +    public static Redirector getRedirector() {
           return getContext().getRedirector();
       }
   
  -    public void sendPageAndWait(String uri) {
  +    public static void sendPageAndWait(String uri) {
           sendPageAndWait(uri, new VarMap());
       }
   
  -    public void sendPageAndWait(String uri, Object bizdata) {
  +    public static void sendPageAndWait(String uri, Object bizdata) {
  +    	
  +    	System.out.println("sendPageAndWait("+uri+", "+bizdata+")");
   
           ContinuationContext context = getContext();
   
  -				if (context.getLogger()!=null)
  +		if (context.getLogger()!=null)
               context.getLogger().debug("send page and wait '" + uri + "'");
   
           FlowHelper.setContextObject(ContextHelper.getObjectModel(context.getAvalonContext()), bizdata);
  @@ -91,11 +93,11 @@
           Continuation.suspend();
       }
   
  -    public void sendPage(String uri) {
  +    public static void sendPage(String uri) {
           sendPage(uri, new VarMap());
       }
   
  -    public void sendPage(String uri, Object bizdata) {
  +    public static void sendPage(String uri, Object bizdata) {
   
           ContinuationContext context = getContext();
   
  @@ -119,19 +121,20 @@
           }
       }
   
  -    public Request getRequest() {
  +    public static Request getRequest() {
  +    	System.out.println("getRequest()");
           return ContextHelper.getRequest(getContext().getAvalonContext());
       }
       
  -    public Map getObjectModel() {
  +    public static Map getObjectModel() {
           return ContextHelper.getObjectModel(getContext().getAvalonContext());
       }
       
  -    public Parameters getParameters() {
  +    public static Parameters getParameters() {
       	return getContext().getParameters();
       }
   
  -    public void processPipelineTo(String uri, Object bizdata, OutputStream out) {
  +    public static void processPipelineTo(String uri, Object bizdata, OutputStream out) {
   
           ContinuationContext context = getContext();
   
  @@ -147,7 +150,7 @@
           }
       }
   
  -    public void redirectTo(String uri) {
  +    public static void redirectTo(String uri) {
           try {
               getContext().getRedirector().redirect(false, uri);
           } catch (Exception e) {
  @@ -155,14 +158,14 @@
           }
       }
   
  -    public void sendStatus(int sc) {
  +    public static void sendStatus(int sc) {
           getContext().getRedirector().sendStatus(sc);
       }
   
       /**
        * Access components.
        */
  -    public Object getComponent(String id) {
  +    public static Object getComponent(String id) {
           try {
               return getContext().getServiceManager().lookup(id);
           } catch (Exception e) {
  @@ -175,7 +178,7 @@
        *
        * @param component a component
        */
  -    public void releaseComponent( Object component ) {
  +    public static void releaseComponent( Object component ) {
           if (component != null) {
               getContext().getServiceManager().release(component);
           }
  
  
  
  1.3       +3 -1      cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/Continuation.java
  
  Index: Continuation.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/Continuation.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Continuation.java	23 Apr 2004 23:07:07 -0000	1.2
  +++ Continuation.java	26 Jun 2004 18:29:30 -0000	1.3
  @@ -72,6 +72,8 @@
        * Stop the running continuation.
        */
       public static void suspend() {
  +    	
  +    	System.out.println("suspend()");
   
           Continuation continuation = Continuation.currentContinuation();
   
  
  
  
  1.12      +28 -21    cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/ContinuationClassLoader.java
  
  Index: ContinuationClassLoader.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/ContinuationClassLoader.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ContinuationClassLoader.java	24 Jun 2004 16:48:53 -0000	1.11
  +++ ContinuationClassLoader.java	26 Jun 2004 18:29:30 -0000	1.12
  @@ -15,6 +15,7 @@
    */
   package org.apache.cocoon.components.flow.java;
   
  +import java.io.File;
   import java.io.FileOutputStream;
   import java.util.*;
   
  @@ -143,9 +144,12 @@
           ClassGen clazz = new ClassGen(javaclazz);
           ConstantPoolGen cp = clazz.getConstantPool();
           
  +        String path = "build/rewritten/"+clazz.getClassName().replace('.', '/');
  +        
           if (debug) {
           	try {
  -                FileOutputStream fos = new FileOutputStream(javaclazz.getClassName() + ".orig.j");
  +        		new File(path).mkdirs();
  +                FileOutputStream fos = new FileOutputStream(path + ".orig.j");
                   DecompilingVisitor v = new DecompilingVisitor(javaclazz, fos);
                   v.start();
               } catch (Exception e) {
  @@ -177,18 +181,6 @@
                   rewrite(method, cfg);
                   
                   // make last optional check for consistency
  -                /*System.out.println("check " + methods[i].getName());
  -
  -                try {
  -                    cfg = new ControlFlowGraph(method);
  -                    analyse(clazz, method, cfg, ev);
  -                    printFrameInfo(method, cfg);
  -                } catch (Exception e) {
  -                    e.printStackTrace();
  -                    throw new ClassNotFoundException("Rewritten method is not consistent", e);
  -                }*/
  -                
  -                // make last optional check for consistency
                   clazz.replaceMethod(methods[i], method.getMethod());
               }
           }
  @@ -196,7 +188,7 @@
           if (debug) {
           	byte[] changed = clazz.getJavaClass().getBytes();
           	try {
  -        		FileOutputStream out = new FileOutputStream(clazz.getClassName() + ".rewritten.class");
  +        		FileOutputStream out = new FileOutputStream(path + ".class");
           		out.write(changed);
           		out.flush();
           		out.close();
  @@ -205,7 +197,7 @@
           	}
           	
           	try {
  -                FileOutputStream fos = new FileOutputStream(clazz.getClassName() + ".rewritten.j");
  +                FileOutputStream fos = new FileOutputStream(path + ".rewritten.j");
                   DecompilingVisitor v = new DecompilingVisitor(clazz.getJavaClass(), fos);
                   v.start();
               } catch (Exception e) {
  @@ -280,6 +272,7 @@
                   // We can only follow _one_ successor, the one after the
                   // JSR that was recently executed.
                   RET ret = (RET)u.getInstruction().getInstruction();
  +                System.out.println("type="+u.getOutFrame(oldchain).getLocals().get(ret.getIndex()));
                   ReturnaddressType t = (ReturnaddressType)u.getOutFrame(oldchain).getLocals().get(ret.getIndex());
                   InstructionContext theSuccessor = cfg.contextOf(t.getTarget());
   
  @@ -392,13 +385,25 @@
                   // remove all new's                
                   if (ins.getInstruction().getOpcode() == Constants.NEW) {
                       try {
  -                        // remove additional dup's
  -                        while (next != null && next.getInstruction().getOpcode() == Constants.DUP) {
  +                    	// TODO: Replace new hack by a generic secure method to handle uninitialze objects
  +                        
  +                    	// remove additional dup or the dup_x1&swap combination
  +                    	if (next != null && next.getInstruction().getOpcode() == Constants.DUP) { 
                               context = cfg.contextOf(next);
                               frame = context.getOutFrame(new ArrayList());
                               InstructionHandle newnext = next.getNext();
                               insList.delete(next);
                               next = newnext;
  +                        } else if (next != null && next.getInstruction().getOpcode() == Constants.DUP_X1 && 
  +                        		   next.getNext().getInstruction().getOpcode() == Constants.SWAP) {
  +                        	InstructionHandle newnext = next.getNext();
  +                            insList.delete(next);
  +                            next = newnext;
  +                        	context = cfg.contextOf(next);
  +                            frame = context.getOutFrame(new ArrayList());
  +                            newnext = next.getNext();
  +                            insList.delete(next);
  +                            next = newnext;
                           }
                           InstructionTargeter[] targeter = ins.getTargeters();
                           if (targeter != null) {
  @@ -421,7 +426,7 @@
                       Type type = os.peek(arguments.length);
                       if (type instanceof UninitializedObjectType) {
                           ObjectType objecttype = ((UninitializedObjectType) type).getInitialized();
  -                        InstructionList duplicator = duplicateStack(method, invoke, objecttype);
  +                        InstructionList duplicator = duplicateStack(method, invoke, objecttype, os);
                           InstructionTargeter[] targeter = ins.getTargeters();
   
                           if (targeter!=null) {
  @@ -487,7 +492,7 @@
       }
   
       private InstructionList duplicateStack(MethodGen method, InvokeInstruction invoke,
  -            ObjectType objecttype) throws ClassNotFoundException {
  +            ObjectType objecttype, OperandStack os) throws ClassNotFoundException {
           // reconstruction of an uninitialed object to call the constructor.
           InstructionFactory insFactory = new InstructionFactory(method.getConstantPool());
           InstructionList insList = new InstructionList();
  @@ -519,7 +524,9 @@
           }
           // create uninitialzed object
           insList.append(insFactory.createNew(objecttype));
  -        insList.append(InstructionFactory.createDup(objecttype.getSize()));
  +        // test for more occurrences in the stack
  +        if ((os.size()>=arguments.length+2) && (os.peek(arguments.length+1) instanceof UninitializedObjectType))
  +        	insList.append(InstructionFactory.createDup(objecttype.getSize()));
           // return the arguments into the stack
           for (int i = 0; i < arguments.length; i++) {
               Type type = arguments[i];
  
  
  
  1.2       +7 -27     cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/DecompilingVisitor.java
  
  Index: DecompilingVisitor.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/DecompilingVisitor.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DecompilingVisitor.java	24 Jun 2004 16:48:53 -0000	1.1
  +++ DecompilingVisitor.java	26 Jun 2004 18:29:30 -0000	1.2
  @@ -20,7 +20,6 @@
   import java.util.Hashtable;
   
   import org.apache.bcel.Constants;
  -import org.apache.bcel.classfile.Attribute;
   import org.apache.bcel.classfile.Code;
   import org.apache.bcel.classfile.ConstantValue;
   import org.apache.bcel.classfile.Deprecated;
  @@ -80,10 +79,10 @@
   	}
   
   	public void visitField(Field field) {
  -		out.print("  " + Utility.accessToString(field.getAccessFlags()) + " "
  -				+ field.getName() + " " + field.getSignature());
  -		if (field.getAttributes().length == 0)
  -			out.print("\n");
  +		out.println("  " + Utility.accessToString(field.getAccessFlags()) + " "	
  +				+ field.getType() + " " + field.getName() + ";");
  +		/*if (field.getAttributes().length == 0)
  +			out.print("\n");*/
   	}
   
   	public void visitConstantValue(ConstantValue cv) {
  @@ -92,30 +91,17 @@
   
   	private Method _method;
   
  -	/**
  -	 * Unfortunately Jasmin expects ".end method" after each method. Thus we've
  -	 * to check for every of the method's attributes if it's the last one and
  -	 * print ".end method" then.
  -	 */
  -	private final void printEndMethod(Attribute attr) {
  -		Attribute[] attributes = _method.getAttributes();
  -
  -	}
  -
   	public void visitDeprecated(Deprecated attribute) {
  -		printEndMethod(attribute);
   	}
   
   	public void visitSynthetic(Synthetic attribute) {
  -		if (_method != null)
  -			printEndMethod(attribute);
   	}
   
   	public void visitMethod(Method method) {
   		this._method = method; // Remember for use in subsequent visitXXX calls
   
   		out.println("\n  " + Utility.accessToString(_method.getAccessFlags())
  -				+ " " + _method.getName() + _method.getSignature());
  +				+ " " + _method.getReturnType() + " " + _method.getName());
   
   	}
   
  @@ -123,15 +109,11 @@
   		String[] names = e.getExceptionNames();
   		for (int i = 0; i < names.length; i++)
   			out.println("    throws " + names[i].replace('.', '/'));
  -
  -		printEndMethod(e);
   	}
   
   	private Hashtable map;
   
   	public void visitCode(Code code) {
  -		int label_counter = 0;
  -
   		MethodGen mg = new MethodGen(_method, clazzname, cp);
   		InstructionList il = mg.getInstructionList();
   		InstructionHandle[] ihs = il.getInstructionHandles();
  @@ -142,8 +124,8 @@
   
   		for (int i = 0; i < lvs.length; i++) {
   			LocalVariableGen l = lvs[i];
  -			out.println("    // var " + l.getIndex() + " is \"" + l.getName()
  -					+ "\" " + l.getType().getSignature() + " from "
  +			out.println("    // local variable " + l.getIndex() + " is \"" + l.getName()
  +					+ "\" " + l.getType() + " from "
   					+ l.getStart().getPosition() + " to "
   					+ l.getEnd().getPosition());
   		}
  @@ -206,8 +188,6 @@
   					+ c.getEndPC().getPosition() + " using "
   					+ c.getHandlerPC().getPosition());
   		}
  -
  -		printEndMethod(code);
   	}
   }
   
  
  
  
  1.11      +10 -9     cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java
  
  Index: JavaInterpreter.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/JavaInterpreter.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JavaInterpreter.java	24 Jun 2004 16:48:53 -0000	1.10
  +++ JavaInterpreter.java	26 Jun 2004 18:29:30 -0000	1.11
  @@ -94,8 +94,6 @@
           if (getLogger().isDebugEnabled())
               getLogger().debug("initialize java flow interpreter");
   
  -        initialized = true;
  -
           for (Iterator scripts = needResolve.iterator(); scripts.hasNext();) {
   
               String name = (String) scripts.next();
  @@ -105,12 +103,13 @@
                   name = JavaScriptCompilingClassLoader.getClassName(name);
               }
   
  +            System.out.println("registered java class \"" + name + "\" for flow");
               if (getLogger().isDebugEnabled())
                   getLogger().debug("registered java class \"" + name + "\" for flow");
               
               Class clazz = continuationclassloader.loadClass(name);
   
  -            if (!Continuable.class.isAssignableFrom(clazz)) {
  +            if (!ContinuationCapable.class.isAssignableFrom(clazz)) {
                   getLogger().error("java class \"" + name + "\" doesn't implement Continuable");
                   continue;
               }
  @@ -126,9 +125,9 @@
                           String function = removePrefix(methodName);
                           this.methods.put(function, methods[i]);
   
  +                        System.out.println("registered method \"" + methodName + "\" as function \"" + function + "\"");
                           if (getLogger().isDebugEnabled())
  -                            getLogger().debug(
  -                                    "registered method \"" + methodName + "\" as function \"" + function + "\"");
  +                            getLogger().debug("registered method \"" + methodName + "\" as function \"" + function + "\"");
                       }
                   }
               } catch (Exception e) {
  @@ -136,6 +135,8 @@
               }
   
           }
  +        
  +        initialized = true;
       }
   
       /**
  @@ -168,7 +169,7 @@
           if (userScopes == null)
               userScopes = new HashMap();
   
  -        Continuable flow = (Continuable) userScopes.get(method.getDeclaringClass());
  +        ContinuationCapable flow = (ContinuationCapable) userScopes.get(method.getDeclaringClass());
   
           ContinuationContext context = new ContinuationContext();
           context.setObject(flow);
  @@ -195,7 +196,7 @@
                   if (getLogger().isDebugEnabled())
                       getLogger().debug("create new instance of \"" + method.getDeclaringClass() + "\"");
   
  -                flow = (Continuable) method.getDeclaringClass().newInstance();
  +                flow = (ContinuationCapable) method.getDeclaringClass().newInstance();
                   context.setObject(flow);
               }
   
  @@ -260,7 +261,7 @@
           Session session = request.getSession(true);
           HashMap userScopes = (HashMap) session.getAttribute(USER_GLOBAL_SCOPE);
   
  -        Continuable flow = (Continuable) context.getObject();
  +        ContinuationCapable flow = (ContinuationCapable) context.getObject();
           Method method = context.getMethod();
   
           WebContinuation wk = continuationsMgr.createWebContinuation(continuation, parentwk, timeToLive, null);
  
  
  
  1.1                  cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/ContinuationHelper.java
  
  Index: ContinuationHelper.java
  ===================================================================
  
  package org.apache.cocoon.components.flow.java;
  
  public class ContinuationHelper extends AbstractContinuable {
  
  }
  
  
  
  1.2       +5 -3      cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/analyser/ControlFlowGraph.java
  
  Index: ControlFlowGraph.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/analyser/ControlFlowGraph.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ControlFlowGraph.java	3 Jun 2004 12:43:27 -0000	1.1
  +++ ControlFlowGraph.java	26 Jun 2004 18:29:30 -0000	1.2
  @@ -159,10 +159,12 @@
   
   			//sanity check
   			if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){
  -				throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?");
  +				//throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?");
  +				return false;
   			}
   			if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){
  -				throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?");
  +				//throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?");
  +				return false;
   			}
   
   			Frame inF = (Frame) inFrames.get(lastExecutionJSR());
  
  
  
  1.3       +19 -6     cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/analyser/Subroutines.java
  
  Index: Subroutines.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/java/analyser/Subroutines.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Subroutines.java	24 Jun 2004 16:48:53 -0000	1.2
  +++ Subroutines.java	26 Jun 2004 18:29:30 -0000	1.3
  @@ -15,15 +15,29 @@
    */
   package org.apache.cocoon.components.flow.java.analyser;
   
  -import org.apache.bcel.generic.*;
  -import org.apache.bcel.verifier.exc.*;
   import java.awt.Color;
   import java.util.ArrayList;
  -import java.util.Enumeration;
   import java.util.HashSet;
   import java.util.Hashtable;
   import java.util.Iterator;
   
  +import org.apache.bcel.generic.ASTORE;
  +import org.apache.bcel.generic.ATHROW;
  +import org.apache.bcel.generic.BranchInstruction;
  +import org.apache.bcel.generic.CodeExceptionGen;
  +import org.apache.bcel.generic.GotoInstruction;
  +import org.apache.bcel.generic.IndexedInstruction;
  +import org.apache.bcel.generic.Instruction;
  +import org.apache.bcel.generic.InstructionHandle;
  +import org.apache.bcel.generic.JsrInstruction;
  +import org.apache.bcel.generic.LocalVariableInstruction;
  +import org.apache.bcel.generic.MethodGen;
  +import org.apache.bcel.generic.RET;
  +import org.apache.bcel.generic.ReturnInstruction;
  +import org.apache.bcel.generic.Select;
  +import org.apache.bcel.verifier.exc.AssertionViolatedException;
  +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException;
  +
   	/**
   	 * Instances of this class contain information about the subroutines
   	 * found in a code array of a method.
  @@ -356,7 +370,6 @@
   
   		// Calculate "real" subroutines.
   		HashSet sub_leaders = new HashSet(); // Elements: InstructionHandle
  -		InstructionHandle ih = all[0];
   		for (int i=0; i<all.length; i++){
   			Instruction inst = all[i].getInstruction();
   			if (inst instanceof JsrInstruction){
  @@ -435,7 +448,7 @@
   				if (colors.get(all[i]) == Color.black){
   					((SubroutineImpl) (actual==all[0]?getTopLevel():getSubroutine(actual))).addInstruction(all[i]);
   					if (instructions_assigned.contains(all[i])){
  -						throw new StructuralCodeConstraintException("Instruction '"+all[i]+"' is part of more than one subroutine (or of the top level and a subroutine).");
  +						//throw new StructuralCodeConstraintException("Instruction '"+all[i]+"' is part of more than one subroutine (or of the top level and a subroutine).");
   					}
   					else{
   						instructions_assigned.add(all[i]);
  
  
  
  1.2       +27 -14    cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/javascript/JavaScriptHelper.java
  
  Index: JavaScriptHelper.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/javascript/JavaScriptHelper.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JavaScriptHelper.java	24 Jun 2004 16:48:53 -0000	1.1
  +++ JavaScriptHelper.java	26 Jun 2004 18:29:30 -0000	1.2
  @@ -15,9 +15,14 @@
    */
   package org.apache.cocoon.components.flow.javascript;
   
  +import java.io.BufferedReader;
  +import java.io.InputStream;
  +import java.io.InputStreamReader;
  +import java.io.Reader;
   import java.util.ArrayList;
   import java.util.HashMap;
   import java.util.List;
  +import java.util.Map;
   
   import org.apache.avalon.framework.CascadingRuntimeException;
   import org.apache.avalon.framework.configuration.Configuration;
  @@ -26,6 +31,8 @@
   import org.apache.cocoon.ResourceNotFoundException;
   import org.apache.cocoon.components.flow.Interpreter;
   import org.apache.cocoon.components.flow.java.AbstractContinuable;
  +import org.apache.cocoon.components.flow.java.Continuable;
  +import org.apache.cocoon.components.flow.java.ContinuationHelper;
   import org.apache.cocoon.environment.Redirector;
   import org.apache.cocoon.environment.Request;
   import org.apache.cocoon.environment.Session;
  @@ -41,6 +48,7 @@
   import org.mozilla.javascript.NativeJavaClass;
   import org.mozilla.javascript.NativeJavaPackage;
   import org.mozilla.javascript.PropertyException;
  +import org.mozilla.javascript.Script;
   import org.mozilla.javascript.ScriptRuntime;
   import org.mozilla.javascript.Scriptable;
   import org.mozilla.javascript.ScriptableObject;
  @@ -81,7 +89,7 @@
       /**
        * Mapping of String objects (source uri's) to ScriptSourceEntry's
        */
  -    //protected Map compiledScripts = new HashMap();
  +    protected Map compiledScripts = new HashMap();
   
       /**
        * LAST_EXEC_TIME
  @@ -150,6 +158,7 @@
        */
       public void register(String source)
       {
  +    	System.out.println("register source "+source);
           synchronized(this) {
               needResolve.add(source);
           }
  @@ -196,6 +205,8 @@
               e.printStackTrace();
               throw e;
           }
  +        
  +        sourceresolver = (SourceResolver)getServiceManager().lookup(SourceResolver.ROLE);
       }
   
       /**
  @@ -275,7 +286,7 @@
           ClassLoader classLoader;
   
           /* true if this scope has assigned any global vars */
  -        boolean useSession = false;
  +        public boolean useSession = false;
   
           public ThreadScope() {
               final String[] names = { "importClass"};
  @@ -302,7 +313,7 @@
               super.put(index, start, value);
           }
   
  -        void reset() {
  +        public void reset() {
               useSession = false;
           }
   
  @@ -345,7 +356,7 @@
       }
   
       private ThreadScope createThreadScope() throws Exception {
  -        Context context = Context.getCurrentContext();
  +        //Context context = Context.getCurrentContext();
   
           ThreadScope thrScope = new ThreadScope();
   
  @@ -357,7 +368,7 @@
           // Put in the thread scope the Cocoon object, which gives access
           // to the interpreter object, and some Cocoon objects. See
           // FOM_Cocoon for more details.
  -        Object[] args = {};
  +        //Object[] args = {};
           thrScope.defineProperty(LAST_EXEC_TIME,
                                   new Long(0),
                                   ScriptableObject.DONTENUM | ScriptableObject.PERMANENT);
  @@ -409,7 +420,7 @@
           //thrScope.setupPackages(classLoader);
   
           // Check if we need to compile and/or execute scripts
  -        /*synchronized (compiledScripts) {
  +        synchronized (compiledScripts) {
               List execList = new ArrayList();
               // If we've never executed scripts in this scope or
               // if reload-scripts is true and the check interval has expired
  @@ -452,7 +463,9 @@
                       thrScope.reset();
                   }
               }
  -        }*/
  +        }
  +        
  +        thrScope.put("cocoon", thrScope, new ContinuationHelper());
       }
   
       /**
  @@ -462,7 +475,7 @@
        * @param fileName resource uri
        * @return compiled script
        */
  -    /*Script compileScript(Context cx, String fileName) throws Exception {
  +    Script compileScript(Context cx, String fileName) throws Exception {
           Source src = this.sourceresolver.resolveURI(fileName);
           if (src != null) {
               synchronized (compiledScripts) {
  @@ -481,9 +494,9 @@
           } else {
               throw new ResourceNotFoundException(fileName + ": not found");
           }
  -    }*/
  +    }
   
  -    /*protected Script compileScript(Context cx, Scriptable scope, Source src)
  +    protected Script compileScript(Context cx, Scriptable scope, Source src)
               throws Exception {
           InputStream is = src.getInputStream();
           if (is != null) {
  @@ -498,7 +511,7 @@
           } else {
               throw new ResourceNotFoundException(src.getURI() + ": not found");
           }
  -    }*/
  +    }
   
       /**
        * Calls a JavaScript function, passing <code>params</code> as its
  @@ -679,7 +692,7 @@
           }
       }*/
       
  -    /*protected class ScriptSourceEntry {
  +    protected class ScriptSourceEntry implements Continuable {
           final private Source source;
           private Script script;
           private long compileTime;
  @@ -710,5 +723,5 @@
               }
               return script;
           }
  -    }*/
  +    }
   }
  
  
  
  1.2       +3 -3      cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java
  
  Index: JavaScriptInterpreter.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JavaScriptInterpreter.java	24 Jun 2004 16:48:53 -0000	1.1
  +++ JavaScriptInterpreter.java	26 Jun 2004 18:29:30 -0000	1.2
  @@ -15,7 +15,6 @@
    */
   package org.apache.cocoon.components.flow.javascript;
   
  -import java.util.HashMap;
   import java.util.Iterator;
   import java.util.List;
   
  @@ -67,6 +66,7 @@
           super.configure(config);
           
           continuationclassloader = new ContinuationClassLoader(Thread.currentThread().getContextClassLoader());
  +        continuationclassloader.addIncludeClass("org.mozilla.**");
           continuationclassloader.setDebug(config.getAttributeAsBoolean("debug", false));
   
           Configuration[] includes = config.getChildren("include");
  @@ -185,7 +185,7 @@
   
           Request request = ContextHelper.getRequest(this.avalonContext);
           Session session = request.getSession(true);
  -        HashMap userScopes = (HashMap) session.getAttribute(USER_GLOBAL_SCOPE);
  +        //HashMap userScopes = (HashMap) session.getAttribute(USER_GLOBAL_SCOPE);
   
           ScriptHelper flow = (ScriptHelper) context.getObject();
   
  
  
  
  1.4       +29 -20    cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/JavaFlowTestCase.java
  
  Index: JavaFlowTestCase.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/JavaFlowTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JavaFlowTestCase.java	24 Jun 2004 16:48:53 -0000	1.3
  +++ JavaFlowTestCase.java	26 Jun 2004 18:29:30 -0000	1.4
  @@ -39,18 +39,17 @@
           String id = callFunction("java", source, "simpleTest", new HashMap());
           
           getRequest().addParameter("a", "2.3");
  -        getRedirector().reset();
           
           callContinuation("java", source, id, new HashMap());
   
           VarMap map = (VarMap)getFlowContextObject();
           
  -        assertEquals(((Float)map.getMap().get("result")).floatValue(), 3.3f, 0.1f);
  +        assertEquals(3.3f, ((Float)map.getMap().get("result")).floatValue(), 0.1f);
   
           JXPathContext jxcontext = JXPathContext.newContext(getFlowContextObject());
           Float result = (Float)jxcontext.getValue("result");
   
  -        assertEquals(result.floatValue(), 3.3f, 0.1f);
  +        assertEquals(3.3f, result.floatValue(), 0.1f);
       }
       
       public void testNew() throws Exception {
  @@ -63,20 +62,17 @@
           String source = "org.apache.cocoon.components.flow.java.test.SimpleFlow";
           String id = callFunction("java", source, "catchTest", new HashMap());
           
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/getNumberA");
  +        assertEquals("cocoon:/getNumberA", getRedirector().getRedirect());
           
           getRequest().addParameter("a", "bla");
  -        getRedirector().reset();
           
           id = callContinuation("java", source, id, new HashMap());
           
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/error");
  -        
  -        getRedirector().reset();
  +        assertEquals("cocoon:/error", getRedirector().getRedirect());
           
           id = callContinuation("java", source, id, new HashMap());
           
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/result");
  +        assertEquals("cocoon:/result", getRedirector().getRedirect());
           
       }
       
  @@ -85,7 +81,7 @@
           String source = "org.apache.cocoon.components.flow.java.test.SimpleFlow";
           String id = callFunction("java", source, "abstractTest", new HashMap());
   
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/parent");
  +        assertEquals("cocoon:/parent", getRedirector().getRedirect());
       }
       
       public void testDelegate() throws Exception {
  @@ -93,35 +89,32 @@
           String source = "org.apache.cocoon.components.flow.java.test.SimpleFlow";
           String id = callFunction("java", source, "delegateTest", new HashMap());
   
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/page/getNumberA");
  +        assertEquals("cocoon:/page/getNumberA", getRedirector().getRedirect());
   
           getRequest().addParameter("a", "2");
  -        getRedirector().reset();
   
           id = callContinuation("java", source, id, new HashMap());
           
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/page/getNumberB");
  +        assertEquals("cocoon:/page/getNumberB", getRedirector().getRedirect());
   
           getRequest().addParameter("b", "2");
  -        getRedirector().reset();
           
           id = callContinuation("java", source, id, new HashMap());
   
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/page/getOperator");
  +        assertEquals("cocoon:/page/getOperator", getRedirector().getRedirect());
           
           getRequest().addParameter("operator", "plus");
  -        getRedirector().reset();
           
           id = callContinuation("java", source, id, new HashMap());
   
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/page/displayResult");
  +        assertEquals("cocoon:/page/displayResult", getRedirector().getRedirect());
       }
   
       public void testException() throws Exception {
           String source = "org.apache.cocoon.components.flow.java.test.SimpleFlow";
           String id = callFunction("java", source, "exceptionTest", new HashMap());
           
  -        assertEquals(getRedirector().getRedirect(), "cocoon:/test.jxt");
  +        assertEquals("cocoon:/test.jxt", getRedirector().getRedirect());
           
           try {
               callContinuation("java", source, id, new HashMap());
  @@ -163,6 +156,22 @@
       
       public void testClass() throws Exception {
           String source = "org.apache.cocoon.components.flow.java.test.SimpleFlow";
  -        String id = callFunction("java", source, "forClassTest", new HashMap());
  +        String id = callFunction("java", source, "classTest", new HashMap());
  +    }
  +    
  +    public void testInnerClass() throws Exception {
  +        String source = "org.apache.cocoon.components.flow.java.test.InnerContinuable";
  +        String id = callFunction("java", source, "innerClassTest1", new HashMap());
  +        
  +        assertEquals("cocoon:/test1", getRedirector().getRedirect());
  +        
  +        callContinuation("java", source, id, new HashMap());
  +        
  +        // second test
  +        id = callFunction("java", source, "innerClassTest2", new HashMap());
  +        
  +        assertEquals("cocoon:/test2", getRedirector().getRedirect());
  +        
  +        callContinuation("java", source, id, new HashMap());
       }
   }
  
  
  
  1.3       +3 -1      cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/JavaFlowTestCase.xtest
  
  Index: JavaFlowTestCase.xtest
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/JavaFlowTestCase.xtest,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JavaFlowTestCase.xtest	24 Jun 2004 16:48:53 -0000	1.2
  +++ JavaFlowTestCase.xtest	26 Jun 2004 18:29:30 -0000	1.3
  @@ -78,7 +78,9 @@
     <source-resolver class="org.apache.excalibur.source.impl.SourceResolverImpl"/>
   
     <flow-interpreters default="java">
  -    <component-instance class="org.apache.cocoon.components.flow.java.JavaInterpreter" name="java" debug="false"/>
  +    <component-instance class="org.apache.cocoon.components.flow.java.JavaInterpreter" name="java" debug="true">
  +     <include class="org.apache.cocoon.components.flow.java.test.Inner*"/>
  +    </component-instance>
     </flow-interpreters>
   
     <continuations-manager time-to-live="3600000">
  
  
  
  1.8       +17 -0     cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/SimpleFlow.java
  
  Index: SimpleFlow.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/SimpleFlow.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SimpleFlow.java	24 Jun 2004 16:48:53 -0000	1.7
  +++ SimpleFlow.java	26 Jun 2004 18:29:30 -0000	1.8
  @@ -50,6 +50,14 @@
       public void doNewTest() {
           Locale locale = null;
           FormContext formContext = new FormContext(getRequest(), locale);
  +        
  +        //second test
  +        new Double("2.3");
  +        
  +        //third test
  +        new String(new char[]{'a','b','c'}, 0, 3);
  +        
  +        Assert.assertNotNull(formContext);
       }
   
       public void doCatchTest() {
  @@ -58,6 +66,15 @@
               float a = Float.parseFloat(getRequest().getParameter("a"));
           } catch (NumberFormatException nfe) {
               sendPageAndWait("error");
  +        }
  +        sendPage("result");
  +    }
  +    
  +    public void doCatchTest2() {
  +        try {
  +            sendPageAndWait("getNumberA");
  +            float a = Float.parseFloat(getRequest().getParameter("a"));
  +        } catch (NumberFormatException nfe) {
           }
           sendPage("result");
       }
  
  
  
  1.1                  cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/java/test/InnerContinuable.java
  
  Index: InnerContinuable.java
  ===================================================================
  package org.apache.cocoon.components.flow.java.test;
  
  import org.apache.cocoon.components.flow.java.ContinuationHelper;
  
  public class InnerContinuable {
  	
  	private String result2 ="test2";
  	
  	public void doInnerClassTest1() {
  		InnerClass ic = new InnerClass();
  		ic.sendResult1();
  	}
  	
  	public void doInnerClassTest2() {
  		InnerClass ic = new InnerClass();
  		ic.sendResult2();
  	}
  	
  	public class InnerClass {
  		public void sendResult1() {
  			ContinuationHelper.sendPageAndWait("test1");
  		}
  		
  		public void sendResult2() {
  			ContinuationHelper.sendPageAndWait(result2);
  		}
  	}
  }
  
  
  
  1.3       +1 -1      cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/javascript/JavaScriptFlowTestCase.xtest
  
  Index: JavaScriptFlowTestCase.xtest
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/javaflow/test/org/apache/cocoon/components/flow/javascript/JavaScriptFlowTestCase.xtest,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JavaScriptFlowTestCase.xtest	24 Jun 2004 16:48:53 -0000	1.2
  +++ JavaScriptFlowTestCase.xtest	26 Jun 2004 18:29:31 -0000	1.3
  @@ -79,7 +79,7 @@
   
     <flow-interpreters default="javascript">
       <component-instance class="org.apache.cocoon.components.flow.java.JavaInterpreter" name="java"/>
  -    <component-instance class="org.apache.cocoon.components.flow.javascript.JavaScriptInterpreter" name="javascript" debug="false"/>
  +    <component-instance class="org.apache.cocoon.components.flow.javascript.JavaScriptInterpreter" name="javascript" debug="true"/>
     </flow-interpreters>
     
     <continuations-manager time-to-live="3600000">