[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