[jboss-svn-commits] JBL Code SVN: r23109 - in labs/jbosstm/workspace/adinn/orchestration: dd and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Sep 26 12:17:23 EDT 2008


Author: adinn
Date: 2008-09-26 12:17:23 -0400 (Fri, 26 Sep 2008)
New Revision: 23109

Added:
   labs/jbosstm/workspace/adinn/orchestration/dd/scripts/
   labs/jbosstm/workspace/adinn/orchestration/dd/scripts/HeuristicSaveAndRecover.txt
   labs/jbosstm/workspace/adinn/orchestration/docs/
   labs/jbosstm/workspace/adinn/orchestration/docs/ProgrammersGuide.odt
Modified:
   labs/jbosstm/workspace/adinn/orchestration/handler.txt
   labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/Transformer.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
Log:
added a programmers manual, a few more builtins a a prototype of a script for participant recovery which is currently not workgin thanks to a problem in JBossWS

Added: labs/jbosstm/workspace/adinn/orchestration/dd/scripts/HeuristicSaveAndRecover.txt
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/dd/scripts/HeuristicSaveAndRecover.txt	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/dd/scripts/HeuristicSaveAndRecover.txt	2008-09-26 16:17:23 UTC (rev 23109)
@@ -0,0 +1,225 @@
+##############################################################################
+#
+# Heuristic Recovery After Delayed Commit in Single JVM
+#
+# This script automates testing of a specific recovery scenario for the
+# JBossTS XTS implementation of the WS-AT 1.1 protocol using orchestration
+# rules. The scenario is as follows:
+#
+# AS boots
+# Client starts a WS-AT transaction
+# Client invokes web service 1
+# Web service 1 registers as participant P1
+# Client invokes web service 2
+# Web service 2 registers as participant P2
+# Client commits WS-AT transaction
+# Coordinator initiates commit of participant P1
+# ** Rule system intercepts commit and crahses JVM
+#
+# AS reboots
+# Recovery system starts after 2 minutes
+# Recovery system recreates PREPARED WS-AT transaction coordinator
+# Recovery system recreates participant stub for P1
+# ** Rule system adds countdown(2) for P1
+# Recovery system recreates participant stub for P2
+# ** Rule system adds countdown for P2
+# Recovery system calls replay of PREPARED transaction
+# ** Rule system traces PREPARED replay invocation
+# Coordinator sends commit to P1
+# ** Rule system decrements P1's countdown to 1
+#
+# P1 replies with committed
+# ** Rule system intercepts committed message handler and aborts thread
+#
+# Coordinator sends commit to P2
+# ** Rule system decrements P2's countdown to 1
+# (last 2 steps repeated while countdown is active)
+#
+# P2 replies with committed
+# ** Rule system intercepts committed message handler and aborts thread
+# (last 2 steps repeated while countdown is active)
+#
+# Coordinator times out commit and writes heuristic transaction to log
+# Recovery system sleeps
+
+# Recovery system restarts after 2 minutes
+# Recovery system recreates HEURISTIC WS-AT transaction coordinator
+# Recovery system detects existing participant stub for P1
+# Recovery system detects existing participant stub for P2
+#
+# Coordinator sends commit to P1
+# ** Rule system decrements P1's countdown to 0 and removes countdown
+# P1 replies with committed
+# Coordinator sends commit to P2
+# ** Rule system decrements P2's countdown to 0 and removes countdown
+# P2 replies with committed
+# Coordinator clears heuristic log record and copletes commit
+# ** Rule system detects completed commit and kills JVM
+#
+# The number of participants must be at least 2 but can actually be
+# more. One way of exercising the test is to start the AS and run the
+# XTS demo. It should crash at the point of commit. At reboot the
+# rest of the test shoudl run automatically and the server should be
+# killed after a the heuristic transaction is successfuly killed. The
+# console (or server) log should contain messages indicating replays of
+# the prepared and then the heuristic transactions and then a message
+# indicating that the heuristic transacton has committed.
+
+#######################################################################
+# This rule is triggered when a participant stub (CoordinatorEngine) is
+# created from details located in the log record. It adds a countdown
+# which is tripped each time a commit is tried on the participant.
+# While the countdown is active committed messages will be blocked.
+# Note that it calls isRecovered() to detect that the stub has been
+# recreated from the log.
+# The line number is the line immediately following the invocation of
+# the super class constructor. Placing the trigger after the super
+# constructor call is vital for constructors since the rule cannot call
+# methods on the instance until after it has been initialized. In theory
+# it should be possible to set line = -1 and have the rule system compile
+# in the trigger call at the correct place. However, it is not smart enough
+# to do this just yet
+
+RULE add coordinator engine countdown
+CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine
+METHOD <init>(String, boolean, W3CEndpointReference, boolean, State)
+LINE 96
+BIND engine:CoordinatorEngine = $0,
+     recovered:boolean = engine.isRecovered(),
+     identifier:String = engine.getId()
+IF recovered
+DO debug("adding countdown for " + identifier),
+   addCountDown(identifier, 1)
+ENDRULE
+
+#######################################################################
+# This rule is triggered when a non-recovered participant stub
+# (CoordinatorEngine) is sent a commit message i.e. immediately
+# after a successful prepare. It exits the JVM, simulating a crash.
+# The line number is the first executable line in the method (it
+# could be specified as -1)
+
+RULE kill JVM
+CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine
+METHOD commit
+LINE 316
+BIND engine:CoordinatorEngine = $0,
+     recovered:boolean = engine.isRecovered(), 
+     identifier:String = engine.getId()
+IF (NOT recovered)
+   AND
+   debug("commit on non-recovered engine " + identifier)
+DO debug("!!!killing JVM!!!"),
+   killJVM()
+ENDRULE
+
+#######################################################################
+# This rule is triggered when a recovered participant stub
+# (CoordinatorEngine) is sent a commit message i.e. immediately
+# after a successful prepare. It decrements the countdown. First
+# time round this takes it from 1 to 0 but leaves it in place. Second
+# time round it removes it allowing committed messages to flow.
+# The line number is the first executable line in the method (it
+# could be specified as -1)
+
+RULE countdown at commit
+CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine
+METHOD commit
+LINE 316
+BIND engine:CoordinatorEngine = $0,
+     recovered:boolean = engine.isRecovered(),
+     identifier:String = engine.getId()
+IF recovered
+   AND
+   debug("commit on recovered engine " + identifier)
+   AND
+   debug("counting down")
+   AND
+   countDown(identifier)
+DO debug("countdown completed for " + identifier)
+ENDRULE
+
+#######################################################################
+# This rule is triggered when a recovered participant stub
+# (CoordinatorEngine) is sent a committed message i.e. in the handler
+# thread which responds to a COMMITTED message from a participant.
+# If it detects a countdown registered using the participant id it
+# throws a runtime exception causing the thread to abort and stopping
+# delivery of the COMMITTED message. The line number is -1 so the
+# rule code gets run as soon as the method is entered.
+
+RULE kill committed thread
+CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine
+METHOD committed(Notification, AddressingProperties, ArjunaContext)
+LINE -1
+BIND engine:CoordinatorEngine = $0,
+     recovered:boolean = engine.isRecovered(),
+     identifier:String = engine.getId()
+IF recovered
+   AND
+   debug("committed on recovered engine " + identifier)
+   AND
+   getCountDown(identifier)
+DO debug("!!!killing committed thread for " + identifier + "!!!"),
+   return
+ENDRULE
+
+#######################################################################
+# This rule is triggered when the recovery system finds the PREPARED
+# transaction in the log and reruns the phase 2 commit operation.
+# It prints a message which can be used to verify that the test has
+# worked correctly. The line number is the one where the call to
+# phase2Commit is called but actually the test would also work with
+# line = -1 since the condition selects the correct case.
+
+RULE trace prepared replay
+CLASS org.jboss.jbossts.xts.recovery.RecoverACCoordinator
+METHOD replayPhase2
+LINE 76
+BIND coordinator = $0,
+     uid : Uid = coordinator.identifier(),
+     status : int = coordinator.status(),
+IF (status == com.arjuna.ats.arjuna.coordinator.ActionStatus.PREPARED)
+     OR
+     (status == com.arjuna.ats.arjuna.coordinator.ActionStatus.COMMITTING)
+DO debug("replaying commit for prepared transaction " + uid)
+ENDRULE
+
+#######################################################################
+# This rule is triggered when the recovery system finds the COMMITTED
+# transaction in the log and reruns the phase 2 commit operation.
+# It prints a message which can be used to verify that the test has
+# worked correctly. The line number is the one where the call to
+# phase2Commit is called but actually the test would also work with
+# line = -1 since the condition selects the correct case.
+
+RULE trace heuristic committed replay
+CLASS org.jboss.jbossts.xts.recovery.RecoverACCoordinator
+METHOD replayPhase2
+LINE 76
+BIND coordinator = $0,
+     uid : Uid = coordinator.identifier(),
+     status : int = coordinator.status()
+IF status == com.arjuna.ats.arjuna.coordinator.ActionStatus.COMMITTED
+DO debug("replaying commit for heuristic committed transaction " + uid)
+ENDRULE
+
+#######################################################################
+# This rule is triggered when the recovery system deletes the COMMITTED
+# transaction from the log. It prints a message which can be used to
+# verify that the test has worked correctly. It also kills the JVM to
+# halt the test. The line number is the one just following the delete
+# of the record from the TX object store, ensuring that the JVM is not
+# exited until the log has actually been cleaned up.
+
+RULE trace remove committed state
+CLASS com.arjuna.ats.arjuna.coordinator.BasicAction
+METHOD updateState
+LINE 3513
+BIND action : BasicAction = $0,
+     uid  = action.get_uid()
+IF TRUE
+DO debug("removed committed transaction " + uid),
+   debug("!!!killing JVM!!!"),
+   killJVM()
+ENDRULE

Added: labs/jbosstm/workspace/adinn/orchestration/docs/ProgrammersGuide.odt
===================================================================
(Binary files differ)


Property changes on: labs/jbosstm/workspace/adinn/orchestration/docs/ProgrammersGuide.odt
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbosstm/workspace/adinn/orchestration/handler.txt
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/handler.txt	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/handler.txt	2008-09-26 16:17:23 UTC (rev 23109)
@@ -1,5 +1,7 @@
 ##############################################################################
 #
+# Heuristic Recovery After Delayed Commit in Single JVM
+#
 # This script automates testing of a specific recovery scenario for the
 # JBossTS XTS implementation of the WS-AT 1.1 protocol using orchestration
 # rules. The scenario is as follows:

Modified: labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java	2008-09-26 16:17:23 UTC (rev 23109)
@@ -86,7 +86,7 @@
                 String[] lines = script.split("\n");
                 String targetClassName;
                 String targetMethodName;
-                int targetLine;
+                int targetLine = -1;
                 String text = "";
                 String sepr = "";
                 int idx = 0;
@@ -96,7 +96,7 @@
                     idx++;
                 }
                 if (lines[idx].startsWith("RULE ")) {
-                    ruleName = lines[idx].substring(5);
+                    ruleName = lines[idx].substring(5).trim();
                     idx++;
                 } else {
                     throw new ParseException("Rule should start with RULE : " + lines[idx]);
@@ -105,7 +105,7 @@
                     idx++;
                 }
                 if (lines[idx].startsWith("CLASS ")) {
-                    targetClassName = lines[idx].substring(6);
+                    targetClassName = lines[idx].substring(6).trim();
                     idx++;
                 } else {
                     throw new ParseException("CLASS should follow RULE : " + lines[idx]) ;
@@ -114,7 +114,7 @@
                     idx++;
                 }
                 if (lines[idx].startsWith("METHOD ")) {
-                    targetMethodName = lines[idx].substring(7);
+                    targetMethodName = lines[idx].substring(7).trim();
                     idx++;
                 } else {
                     throw new ParseException("METHOD should follow CLASS : " + lines[idx]) ;
@@ -123,11 +123,9 @@
                     idx++;
                 }
                 if (lines[idx].startsWith("LINE ")) {
-                    String targetLineString = lines[idx].substring(5);
+                    String targetLineString = lines[idx].substring(5).trim();
                     targetLine = Integer.valueOf(targetLineString);
                     idx++;
-                } else {
-                    throw new ParseException("LINE should follow METHOD : " + lines[idx]) ;
                 }
                 for (;idx < len; idx++) {
                     if (lines[idx].trim().startsWith("#")) {
@@ -139,6 +137,9 @@
                     text += sepr + lines[idx];
                     sepr = "\n";
                 }
+                if (targetMethodName.startsWith("<init>") && (targetLine < 0)) {
+                    throw new ParseException("constructor method " + targetMethodName + " must specify target line in rule " + ruleName);
+                }
                 Rule rule = Rule.create(ruleName, targetClassName, targetMethodName, targetLine, text, loader);
                 System.err.println("TestScript: parsed rule " + rule.getName());
                 System.err.println(rule);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/Transformer.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/Transformer.java	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/Transformer.java	2008-09-26 16:17:23 UTC (rev 23109)
@@ -91,6 +91,8 @@
                             throw new Exception("org.jboss.jbossts.orchestration.agent.Transformer: no CLASS for RULE  " + name + " in script " + scriptPaths.get(scriptIdx));
                         } else if (targetMethod == null) {
                             throw new Exception("org.jboss.jbossts.orchestration.agent.Transformer: no METHOD for RULE  " + name + " in script " + scriptPaths.get(scriptIdx));
+                        } else if (targetMethod.startsWith("<init>") && targetLine < 0) {
+                            throw new Exception("org.jboss.jbossts.orchestration.agent.Transformer: rule for constructor METHOD " + targetMethod + " must specify source LINE in RULE " + name + " in script " + scriptPaths.get(scriptIdx));
                         } else {
                             List<Script> scripts = targetToScriptMap.get(targetClass);
                             if (scripts == null) {
@@ -234,7 +236,7 @@
 
         if (newBuffer != classfileBuffer) {
             // switch on to dump transformed bytecode for checking
-            if (false) {
+            if (true) {
                 String name = (dotIdx < 0 ? internalClassName : internalClassName.substring(dotIdx + 1));
                 name += ".class";
                 System.out.println("Saving transformed bytes to " + name);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2008-09-26 16:17:23 UTC (rev 23109)
@@ -21,10 +21,7 @@
 import static org.jboss.jbossts.orchestration.rule.grammar.ECAGrammarParser.*;
 
 import java.io.StringWriter;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.*;
 
 /**
  * A rule ties together an event, condition and action. It also maintains a TypeGroup
@@ -560,6 +557,43 @@
             return true;
         }
 
+        // flag support
+        /**
+         * set a flag keyed by the supplied object if it is not already set
+         * @param identifier the object identifying the relevant flag
+         * @return true if the flag was clear before this call otherwise false
+         */
+        public boolean flag(Object identifier)
+        {
+            synchronized (flagSet) {
+                return flagSet.add(identifier);
+            }
+        }
+
+        /**
+         * test the state of the flag keyed by the supplied object
+         * @param identifier the object identifying the relevant flag
+         * @return true if the flag is set otherwise false
+         */
+        public boolean flagged(Object identifier)
+        {
+            synchronized (flagSet) {
+                return flagSet.contains(identifier);
+            }
+        }
+
+        /**
+         * clear the flag keyed by the supplied object if it is not already clear
+         * @param identifier the object identifying the relevant flag
+         * @return true if the flag was clear before this call otherwise false
+         */
+        public boolean clear(Object identifier)
+        {
+            synchronized (flagSet) {
+                return flagSet.remove(identifier);
+            }
+        }
+
         // countdown support
         /**
          * builtin to test test if a countdown has been installed
@@ -624,13 +658,23 @@
 
         // wait/notify support
         /**
+         * test if there are threads waiting for an event identified by the supplied object to
+         * be signalled
+         * @param identifier an object identifying the event to be signalled
+         * @return true if threads are waiting for the associated event to be signalled
+         */
+        public boolean waiting(Object identifier)
+        {
+            return (getWaiter(identifier, false) != null);
+        }
+        /**
          * wait for another thread to signal an event with no timeout. see
          * @link{#waitFor(Object, long)} for details and caveats regarding calling this builtin.
-         * @param object an object used to identify the signal that is to be waited on.
+         * @param identifier an object used to identify the signal that is to be waited on.
          */
-        public void waitFor(Object object)
+        public void waitFor(Object identifier)
         {
-            waitFor(object, 0);
+            waitFor(identifier, 0);
         }
 
         /**
@@ -644,32 +688,32 @@
          * waiting threads has the desired effect. n.b. care must also be employed if the current
          * thread is inside a synchronized block since there is a potential for the waitFor call to
          * cause deadlock.
-         * @param object an object used to identify the signal that is to be waited on. n.b. the
+         * @param identifier an object used to identify the signal that is to be waited on. n.b. the
          * wait operation is not performed using synchronization on the supplied object as the rule
          * system cannot safely release and reobtain locks on application data. this argument is used
          * as a key to identify a synchronization object private to the rule system.
          */
-        public void waitFor(Object object, long millisecs)
+        public void waitFor(Object identifier, long millisecs)
         {
-            Waiter waiter = getWaiter(object, true);
+            Waiter waiter = getWaiter(identifier, true);
 
             waiter.waitFor(millisecs);
         }
 
         /**
-         * signal an event identified by the suppied object, causing all waiting threads to resume
+         * signal an event identified by the supplied object, causing all waiting threads to resume
          * rule processing and clearing the event. if there are no threads waiting either because
          * there has been no call to @link{#waitFor} or because some other thread has sent the signal
          * then this call returns false, otherwise it returns true. This operation is atomic,
          * allowing the builtin to be used in rule conditions.
-         * @param object an object used to identify the which waiting threads the signal should
+         * @param identifier an object used to identify the which waiting threads the signal should
          * be delivered to. n.b. the operation is not performed using a notify on the supplied object.
          * this argument is used as a key to identify a synchronization object private to the rule
          * system.
          */
-        public boolean signal(Object object)
+        public boolean signal(Object identifier)
         {
-            Waiter waiter = removeWaiter(object);
+            Waiter waiter = removeWaiter(identifier);
 
             if (waiter != null) {
                 return waiter.signal();
@@ -684,14 +728,14 @@
          * no call to @link{#waitFor} or because some other thread has already sent the signal, then this
          * call returns false, otherwise it returns true. This operation is atomic, allowing the builtin
          * to be used safely in rule conditions.
-         * @param object an object used to identify the which waiting threads the signal should
+         * @param identifier an object used to identify the which waiting threads the signal should
          * be delivered to. n.b. the operation is not performed using a notify on the supplied object.
          * this argument is used as a key to identify a synchronization object private to the rule
          * system.
          */
-        public boolean signalKill(Object object)
+        public boolean signalKill(Object identifier)
         {
-            Waiter waiter = removeWaiter(object);
+            Waiter waiter = removeWaiter(identifier);
 
             if (waiter != null) {
                 return waiter.signalKill();
@@ -718,6 +762,16 @@
 
         public void killJVM()
         {
+            killJVM(-1);
+        }
+
+        /**
+         * cause the current JVM to halt immediately, simulating a crash as near as possible. exit code -1
+         * is returned
+         */
+
+        public void killJVM(int exitCode)
+        {
             java.lang.Runtime.getRuntime().halt(-1);
         }
 
@@ -874,8 +928,15 @@
             return rule.getName();
         }
     }
-    
+
     /**
+     * a set used to identify settings for boolean flags associated with arbitrary objects. if
+     * an object is in the set then the flag associated with the object is set (true) otherwise
+     * it is clear (false).
+     */
+    private static Set<Object> flagSet = new HashSet<Object>();
+
+    /**
      * a hash map used to identify countdowns from their identifying objects
      */
     private static HashMap<Object, CountDown> countDownMap = new HashMap<Object, CountDown>();

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2008-09-26 16:17:23 UTC (rev 23109)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 dd/grammar/ECAGrammar.g 2008-09-23 13:29:23
+// $ANTLR 3.0.1 dd/grammar/ECAGrammar.g 2008-09-25 12:22:36
 
 package org.jboss.jbossts.orchestration.rule.grammar;
 
@@ -314,7 +314,7 @@
 
 
             // AST REWRITE
-            // elements: n, cl, l, m, a, c, e, RULE
+            // elements: RULE, c, e, a, l, n, cl, m
             // token labels: cl, m, n, l
             // rule labels: a, c, retval, e
             // token list labels: 
@@ -749,7 +749,7 @@
             if ( backtracking==0 ) stream_action.add(a.getTree());
 
             // AST REWRITE
-            // elements: BIND, a, c, e
+            // elements: e, BIND, a, c
             // token labels: 
             // rule labels: a, c, retval, e
             // token list labels: 
@@ -921,7 +921,7 @@
                     if ( backtracking==0 ) stream_bindings.add(bindings24.getTree());
 
                     // AST REWRITE
-                    // elements: binding, bindings, SEPR
+                    // elements: SEPR, bindings, binding
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -1025,7 +1025,7 @@
             if ( backtracking==0 ) stream_expr.add(expr28.getTree());
 
             // AST REWRITE
-            // elements: expr, bind_sym, ASSIGN
+            // elements: ASSIGN, expr, bind_sym
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -1143,7 +1143,7 @@
 
 
                     // AST REWRITE
-                    // elements: COLON, t, v
+                    // elements: v, COLON, t
                     // token labels: t, v
                     // rule labels: retval
                     // token list labels: 
@@ -1663,7 +1663,7 @@
                     if ( backtracking==0 ) stream_action_expr_list.add(action_expr_list38.getTree());
 
                     // AST REWRITE
-                    // elements: SEPR, action_expr_list, action_expr
+                    // elements: action_expr_list, SEPR, action_expr
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2233,7 +2233,7 @@
                     if ( backtracking==0 ) stream_expr.add(expr46.getTree());
 
                     // AST REWRITE
-                    // elements: simple_expr, expr, infix_oper
+                    // elements: expr, infix_oper, simple_expr
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2291,7 +2291,7 @@
                     if ( backtracking==0 ) stream_expr.add(expr49.getTree());
 
                     // AST REWRITE
-                    // elements: expr, unary_oper
+                    // elements: unary_oper, expr
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2348,16 +2348,16 @@
                     if ( backtracking==0 ) stream_expr.add(iffalse.getTree());
 
                     // AST REWRITE
-                    // elements: cond, iffalse, iftrue
+                    // elements: iffalse, cond, iftrue
                     // token labels: 
-                    // rule labels: iftrue, iffalse, cond, retval
+                    // rule labels: iftrue, cond, iffalse, retval
                     // token list labels: 
                     // rule list labels: 
                     if ( backtracking==0 ) {
                     retval.tree = root_0;
                     RewriteRuleSubtreeStream stream_iftrue=new RewriteRuleSubtreeStream(adaptor,"token iftrue",iftrue!=null?iftrue.tree:null);
+                    RewriteRuleSubtreeStream stream_cond=new RewriteRuleSubtreeStream(adaptor,"token cond",cond!=null?cond.tree:null);
                     RewriteRuleSubtreeStream stream_iffalse=new RewriteRuleSubtreeStream(adaptor,"token iffalse",iffalse!=null?iffalse.tree:null);
-                    RewriteRuleSubtreeStream stream_cond=new RewriteRuleSubtreeStream(adaptor,"token cond",cond!=null?cond.tree:null);
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
@@ -2977,7 +2977,7 @@
                     if ( backtracking==0 ) stream_expr_list.add(expr_list63.getTree());
 
                     // AST REWRITE
-                    // elements: expr, SEPR, expr_list
+                    // elements: expr_list, expr, SEPR
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2008-09-26 13:15:53 UTC (rev 23108)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2008-09-26 16:17:23 UTC (rev 23109)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 dd/grammar/ECAToken.g 2008-09-23 13:29:19
+// $ANTLR 3.0.1 dd/grammar/ECAToken.g 2008-09-25 12:22:32
 
 package org.jboss.jbossts.orchestration.rule.grammar;
 




More information about the jboss-svn-commits mailing list