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">
  
  
  

Reply via email to