crafterm    2002/12/07 13:53:57

  Modified:    src/java/org/apache/cocoon/components/flow flow.xconf
               src/java/org/apache/cocoon/components/flow/javascript
                        JavaScriptInterpreter.java
  Log:
  Added support for using the Rhino JavaScript debugger with Cocoon
  flowscript.
  
  To use the debugger, add the following commented line to your
  flow.xconf/cocoon.xconf:
  
  <component-instance name="JavaScript"
    class="org.apache.cocoon.components.flow.javascript.JavaScriptInterpreter">
    
<load-on-startup>resource://org/apache/cocoon/components/flow/javascript/system.js</load-on-startup>
    <reload-scripts>true</reload-scripts>
    <check-time>4000</check-time>
    <debugger>enabled</debugger>  <!-- this line enables the flow debugger -->
  </component-instance>
  
  When the <debugger/> element is present, all threads that create a javascript
  interpreter will operate via a Rhino visual debugger instance.
  
  Revision  Changes    Path
  1.4       +1 -0      
xml-cocoon2/src/java/org/apache/cocoon/components/flow/flow.xconf
  
  Index: flow.xconf
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/flow/flow.xconf,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- flow.xconf        6 Dec 2002 18:20:15 -0000       1.3
  +++ flow.xconf        7 Dec 2002 21:53:57 -0000       1.4
  @@ -48,6 +48,7 @@
         
<load-on-startup>resource://org/apache/cocoon/components/flow/javascript/system.js</load-on-startup>
         <reload-scripts>true</reload-scripts>
         <check-time>4000</check-time>
  +    <!--  <debugger>enabled</debugger> -->  <!-- JavaScript Debugger support -->
       </component-instance>
   
   <!--
  
  
  
  1.11      +68 -11    
xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java
  
  Index: JavaScriptInterpreter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JavaScriptInterpreter.java        1 Oct 2002 07:30:43 -0000       1.10
  +++ JavaScriptInterpreter.java        7 Dec 2002 21:53:57 -0000       1.11
  @@ -73,11 +73,13 @@
   import org.mozilla.javascript.ScriptRuntime;
   import org.mozilla.javascript.Scriptable;
   import org.mozilla.javascript.ScriptableObject;
  +import org.mozilla.javascript.tools.debugger.ScopeProvider;
   
   /**
    * Interface with the JavaScript interpreter.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Ovidiu Predescu</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Marcus Crafter</a>
    * @since March 25, 2002
    */
   public class JavaScriptInterpreter extends AbstractInterpreter
  @@ -103,6 +105,8 @@
     JSGlobal scope;
     Script compiledScript;
     JSErrorReporter errorReporter;
  +  boolean enableDebugger = false;
  +  org.mozilla.javascript.tools.debugger.Main debugger;
   
     public void configure(Configuration config)
       throws ConfigurationException
  @@ -111,13 +115,39 @@
   
       String loadOnStartup
         = config.getChild("load-on-startup", true).getValue(null);
  -    if (loadOnStartup != null)
  +    if (loadOnStartup != null) {
         register(loadOnStartup);
  +    }
  +
  +    String debugger
  +      = config.getChild("debugger").getValue(null);
  +    if ("enabled".equalsIgnoreCase(debugger)) {
  +      enableDebugger = true;
  +    }
     }
   
     public void initialize()
       throws Exception
     {
  +    if (enableDebugger) {
  +
  +      if (getLogger().isDebugEnabled()) {
  +        getLogger().debug("Flow debugger enabled, creating");
  +      }
  +
  +      final org.mozilla.javascript.tools.debugger.Main db
  +          = new org.mozilla.javascript.tools.debugger.Main("Cocoon Flow Debugger");
  +      db.pack();
  +      db.setSize(600,460);
  +      db.setExitAction(
  +        new Runnable() { public void run() { db.setVisible(false); } }
  +      );
  +      db.setVisible(true);
  +
  +      debugger = db;
  +      Context.addContextListener(debugger);
  +    }
  +
       Context context = Context.enter();
       context.setOptimizationLevel(OPTIMIZATION_LEVEL);
   
  @@ -152,7 +182,6 @@
         Scriptable log = context.newObject(scope, "Log", args);
         ((JSLog)log).enableLogging(getLogger());
         scope.put("log", scope, log);
  -
       }
       catch (Exception e) {
         context.exit();
  @@ -177,14 +206,16 @@
       Request request = ObjectModelHelper.getRequest(objectModel);
       Session session = request.getSession(false);
   
  -    if (session == null)
  +    if (session == null) {
         return null;
  +    }
   
       Scriptable scope;
       HashMap userScopes = (HashMap)session.getAttribute(USER_GLOBAL_SCOPE);
   
  -    if (userScopes == null)
  +    if (userScopes == null) {
         return null;
  +    }
   
       scope = (Scriptable)userScopes.get(environment.getURIPrefix());
   
  @@ -248,6 +279,7 @@
       throws Exception
     {
       Context context = Context.enter();
  +    context.setGeneratingDebug(true);
       context.setOptimizationLevel(OPTIMIZATION_LEVEL);
       context.setCompileFunctionsWithDynamicScope(true);
       context.setErrorReporter(errorReporter);
  @@ -285,11 +317,12 @@
         ((JSCocoon)cocoon).setScope(thrScope);
         thrScope.put("cocoon", thrScope, cocoon);
   
  -      if (compiledScript != null)
  +      if (compiledScript != null) {
           compiledScript.exec(context, thrScope);
  -    }
  -    else
  +      }
  +    } else {
         cocoon = (JSCocoon)thrScope.get("cocoon", thrScope);
  +    }
   
       // We need to setup the JSCocoon object according to the current
       // request. Everything else remains the same.
  @@ -315,7 +348,9 @@
     {
       Scriptable thrScope = null;
   
  -    System.out.println("Reading scripts");
  +    if (getLogger().isDebugEnabled()) {
  +        getLogger().debug("Reading scripts");
  +    }
   
       try {
         thrScope = enterContext(environment);
  @@ -424,9 +459,19 @@
       try {
         thrScope = enterContext(environment);
         Context context = Context.getCurrentContext();
  -
         JSCocoon cocoon = (JSCocoon)thrScope.get("cocoon", thrScope);
   
  +      if (enableDebugger) {
  +        final Scriptable s = thrScope;
  +        debugger.setScopeProvider(
  +            new ScopeProvider()
  +            { public Scriptable getScope() {return s;} }
  +        );
  +        debugger.doBreak();
  +        if (!debugger.isVisible())
  +            debugger.setVisible(true);
  +      }
  +
         Object callFunction = thrScope.get("callFunction", thrScope);
         if (callFunction == Scriptable.NOT_FOUND)
           throw new RuntimeException("Cannot find 'callFunction' "
  @@ -457,6 +502,7 @@
       }
       catch (Exception ex) {
         ex.printStackTrace();
  +      throw ex;
       }
       finally {
         exitContext(thrScope);
  @@ -473,6 +519,7 @@
         throw new RuntimeException("No continuation with id " + id);
   
       Context context = Context.enter();
  +    context.setGeneratingDebug(true);
       context.setOptimizationLevel(OPTIMIZATION_LEVEL);
       context.setCompileFunctionsWithDynamicScope(true);
   
  @@ -482,7 +529,17 @@
       JSWebContinuation jswk = (JSWebContinuation)wk.getUserObject();
       JSCocoon cocoon = jswk.getJSCocoon();
       cocoon.setContext(manager, environment);
  -    Scriptable kScope = cocoon.getScope();
  +    final Scriptable kScope = cocoon.getScope();
  +
  +    if (enableDebugger) {
  +      debugger.setScopeProvider(
  +        new ScopeProvider()
  +          { public Scriptable getScope() {return kScope;} }
  +      );
  +      debugger.doBreak();
  +      if (!debugger.isVisible())
  +          debugger.setVisible(true);
  +    }
   
       // We can now resume the processing from the state saved by the
       // continuation object. Setup the JavaScript Context object.
  @@ -508,7 +565,7 @@
       try {
         ((Function)handleContFunction).call(context, kScope, kScope, args);
       }
  -    catch (Exception ex) {
  +    catch (final Exception ex) {
         ex.printStackTrace();
         throw ex;
       }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to