You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2007/12/19 01:39:26 UTC

svn commit: r605373 - in /ode/sandbox/simpel/src: main/antlr/org/apache/ode/simpel/antlr/ test/java/org/apache/ode/simpel/ test/resources/

Author: mriou
Date: Tue Dec 18 16:39:24 2007
New Revision: 605373

URL: http://svn.apache.org/viewvc?rev=605373&view=rev
Log:
Auction BPEL spec example. Fixed a few additional grammar bugs on the way. Support for compact notation (no braces for one liners) on most structured activities, which is pretty sweet.

Added:
    ode/sandbox/simpel/src/test/resources/auction.simpel
Modified:
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELCompilerTest.java
    ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel
    ode/sandbox/simpel/src/test/resources/loan-approval.simpel

Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g?rev=605373&r1=605372&r2=605373&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g Tue Dec 18 16:39:24 2007
@@ -90,51 +90,51 @@
 	:	funct | process | namespace;
 
 // Process
-process	:	'process' ns_id block -> ^(PROCESS ns_id block);
+process	:	'process' ns_id body -> ^(PROCESS ns_id body);
 
-process_stmt
-	:	(pick | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex
+proc_stmt
+	:	pick | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex
 		| receive | ((invoke | reply | assign | throw_ex | wait_ex | exit | signal | join
-		| variables) SEMI!) )+;
+		| variables | partner_link) SEMI!);
 
-namespace
-	:	'namespace' ID '=' STRING SEMI -> ^(NAMESPACE ID STRING);
-
-block	:	'{' process_stmt '}' -> ^(SEQUENCE process_stmt);
+block	:	'{' proc_stmt+ '}' -> ^(SEQUENCE proc_stmt+);
 param_block
-	:	'{' ('|' in+=ID (',' in+=ID)* '|')? process_stmt '}' -> ^($in process_stmt);
-		
+	:	'{' ('|' in+=ID (',' in+=ID)* '|')? proc_stmt+ '}' -> ^(SEQUENCE $in proc_stmt+);
+body	:	block | proc_stmt;
+
 // Structured activities
 pick	:	'pick' '{' receive* timeout* '}' -> ^(PICK receive* timeout*);
 timeout	:	'timeout' '(' expr ')' block -> ^(TIMEOUT expr block); 
 
 // TODO links
-flow	:	'parrallel' '{' exprs+=process_stmt '}' ('and' '{' exprs+=process_stmt '}')* -> ^(FLOW $exprs);
+flow	:	'parrallel' b+=body ('and' b+=body)* -> ^(FLOW $b);
 signal	:	'signal' '('ID (',' expr)? ')' -> ^(SIGNAL ID expr?);
 join	:	'join' '(' k+=ID (',' k+=ID)* (',' expr)? ')' -> ^(JOIN $k expr?);
 
-if_ex	:	'if' '(' expr ')' block
-		('else if' '(' expr ')' block)?
-		('else' block)? -> ^(IF expr block ^(ELSEIF expr block)? ^(ELSE expr block)?);
+//if_ex	:	'if' '(' expr ')' block
+//		('else if' '(' expr ')' block)*
+//		('else' block)? -> ^(IF expr block ^(ELSEIF expr block)* ^(ELSE expr block)?);
 
-while_ex:	'while' '(' expr ')' block -> ^(WHILE expr block);
+if_ex	:	'if' '(' expr ')' ifb=body ('else' eb=body)? -> ^(IF expr $ifb (^(ELSE $eb))?);
 
-until_ex:	'do' block 'until' '(' expr ')' -> ^(UNTIL expr block);
+while_ex:	'while' '(' expr ')' body -> ^(WHILE expr body);
 
-foreach	:	'for' '(' ID '=' init=expr ';' cond=expr ';' assign ')' block -> ^(FOREACH ID $init $cond assign block);
-forall	:	'forall' '(' ID '=' from=expr 'to' to=expr ')' block -> ^(FORALL ID $from $to block);
+until_ex:	'do' body 'until' '(' expr ')' -> ^(UNTIL expr body);
 
-try_ex	:	'try' tb=block catch_ex* -> ^(TRY $tb catch_ex*);		
+foreach	:	'for' '(' ID '=' init=expr ';' cond=expr ';' assign ')' body -> ^(FOREACH ID $init $cond assign body);
+forall	:	'forall' '(' ID '=' from=expr 'to' to=expr ')' body -> ^(FORALL ID $from $to body);
+
+try_ex	:	'try' body catch_ex* -> ^(TRY body catch_ex*);		
 catch_ex:	'catch' '(' ns_id ')' param_block -> ^(CATCH ns_id param_block);
 
-scope_ex:	'scope' ('(' ID ')')? block scope_stmt* -> ^(SCOPE ID? block scope_stmt*);
+scope_ex:	'scope' ('(' ID ')')? body scope_stmt* -> ^(SCOPE ID? body scope_stmt*);
 scope_stmt
 	:	event | alarm | compensation;
 
 event	:	'event' '(' p=ID ',' o=ID ')' param_block -> ^(EVENT $p $o param_block);
-alarm	:	'alarm' '(' expr ')' block -> ^(ALARM expr block);
+alarm	:	'alarm' '(' expr ')' body -> ^(ALARM expr body);
 compensation
-	:	'compensation' block -> ^(COMPENSATION block);
+	:	'compensation' body -> ^(COMPENSATION body);
 
 // Simple activities
 invoke	:	'invoke' '(' p=ID ',' o=ID (',' in=ID)? ')' -> ^(INVOKE $p $o $in?);
@@ -161,6 +161,9 @@
 
 
 // Others
+namespace
+	:	'namespace' ID '=' STRING SEMI -> ^(NAMESPACE ID STRING);
+		
 variables
 	:	'var'! v+=variable (','! v+=variable)*;
 variable:	ID VAR_MODS* -> ^(VARIABLE ID VAR_MODS*);

Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g?rev=605373&r1=605372&r2=605373&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g Tue Dec 18 16:39:24 2007
@@ -50,49 +50,49 @@
 	:	^(NAMESPACE ID STRING);
 
 // Process
-process	:	^(PROCESS ^(NS pr=ID? nm=ID) block) { System.out.println("PROCESS " + $nm.text); };
+process	:	^(PROCESS ^(NS pr=ID? nm=ID) body) { System.out.println("PROCESS " + $nm.text); };
 
-process_stmt
-	:	(pick | sequence | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex
+proc_stmt
+	:	pick | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex
 		| invoke | receive | reply | assign | throw_ex | wait_ex | exit | signal | join
-		| variable)+;
-		
-block	:	^(SEQUENCE process_stmt);
+		| variable | partner_link;
+block	:	^(SEQUENCE proc_stmt+);
 param_block
-	:	^(ID* process_stmt);
+	:	^(SEQUENCE ID+ proc_stmt+);
+body	:	block | proc_stmt;
+		
 
 // Structured activities
 pick	:	^(PICK receive* timeout*);
 timeout	:	^(TIMEOUT expr block); 
 
-sequence:	^(SEQUENCE block);
-
 // TODO links
-flow	:	^(FLOW process_stmt);
+flow	:	^(FLOW body*);
 signal	:	^(SIGNAL ID expr?);
 join	:	^(JOIN ID* expr?);
 
 
-if_ex	:	^(IF expr block ^(ELSEIF expr block) ^(ELSE expr block));
+//if_ex	:	^(IF expr block (^(ELSEIF expr block))* (^(ELSE expr block))?);
+if_ex	:	^(IF expr body (^(ELSE body))?);
 
-while_ex:	^(WHILE expr block);
+while_ex:	^(WHILE expr body);
 
-until_ex:	^(UNTIL expr block);
+until_ex:	^(UNTIL expr body);
 
-foreach	:	^(FOREACH ID init=expr cond=expr assign block);
-forall	:	^(FORALL ID from=expr to=expr);
+foreach	:	^(FOREACH ID init=expr cond=expr assign body);
+forall	:	^(FORALL ID from=expr to=expr body);
 
-try_ex	:	^(TRY block catch_ex*);
+try_ex	:	^(TRY body catch_ex*);
 catch_ex:	^(CATCH ^(NS ID ID?) param_block);
 
-scope_ex:	^(SCOPE ID? block scope_stmt*);
+scope_ex:	^(SCOPE ID? body scope_stmt*);
 scope_stmt
 	:	event | alarm | compensation;
 
-event	:	^(EVENT ID ID ID param_block);
-alarm	:	^(ALARM expr block);
+event	:	^(EVENT ID ID param_block);
+alarm	:	^(ALARM expr body);
 compensation
-	:	^(COMPENSATION block);
+	:	^(COMPENSATION body);
 
 // Simple activities
 invoke	:	^(INVOKE p=ID o=ID in=ID?);

Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELCompilerTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELCompilerTest.java?rev=605373&r1=605372&r2=605373&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELCompilerTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELCompilerTest.java Tue Dec 18 16:39:24 2007
@@ -81,22 +81,38 @@
     }
 
     public void testLoanApproval() throws Exception {
+        SimPELCompiler c = compiler();
+        c.compileProcess(readProcess("loan-approval.simpel"));
+        reportErrors("Loan approval", c);
+    }
+
+    public void testAuction() throws Exception {
+        SimPELCompiler c = compiler();
+        c.compileProcess(readProcess("auction.simpel"));
+        reportErrors("Auction service", c);
+    }
+
+    private String readProcess(String fileName) throws Exception {
         BufferedReader reader = new BufferedReader(new FileReader(
-                getClass().getClassLoader().getResource("loan-approval.simpel").getFile()));
+                getClass().getClassLoader().getResource(fileName).getFile()));
 
         String line;
         StringBuffer processText = new StringBuffer();
         while ((line = reader.readLine()) != null) processText.append(line).append("\n");
+        return processText.toString();
+    }
 
+    private SimPELCompiler compiler() {
         TestErrorListener l = new TestErrorListener();
         SimPELCompiler comp = new SimPELCompiler();
         comp.setErrorListener(l);
+        return comp;
+    }
 
-        comp.compileProcess(processText.toString());
-
-        if (l.messages.toString().length() > 0) {
-            System.out.println("Loan approval failed to compile:\n");
-            System.out.println(l.messages.toString());
+    private void reportErrors(String testName, SimPELCompiler c) {
+        if (((TestErrorListener)c.getErrorListener()).messages.toString().length() > 0) {
+            System.out.println(testName+" failed to compile:\n");
+            System.out.println(((TestErrorListener)c.getErrorListener()).messages.toString());
             fail("There were failures.");
         }
     }

Added: ode/sandbox/simpel/src/test/resources/auction.simpel
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/resources/auction.simpel?rev=605373&view=auto
==============================================================================
--- ode/sandbox/simpel/src/test/resources/auction.simpel (added)
+++ ode/sandbox/simpel/src/test/resources/auction.simpel Tue Dec 18 16:39:24 2007
@@ -0,0 +1,57 @@
+namespace sref=" http://docs.oasis-open.org/wsbpel/2.0/serviceref";
+namespace addr="http://example.com/addressing";
+
+# Correlation functions
+function auctionIdFromAnswer(answer) {
+  answer.auctionId;
+}
+function auctionIdFromBuyer(answer) {
+  answer.auctionId;
+}
+function auctionIdFromSeller(answer) {
+  answer.auctionId;
+}
+
+# Auction process as defined in chapter 15.4 of the BPEL 2.0 specification
+process Auction {
+  partnerLink buyerOrSeller, auctionRegistrar, seller;
+  var auctionId unique, buyerData, sellerData;
+
+  # The original BPEL spec example for the auctions process uses a join pattern which
+  # we chose to not support in SimPEL. This is equivalent.
+  receive(buyerOrSeller, submit) { |startData|
+    if (startData.buyer) {
+      buyerData = startData;
+      auctionId = auctionIdFromBuyer(buyerData);
+      sellerData = receive(seller, submit, {auctionIdFromSeller: auctionId});
+    } else {
+      sellerData = startData;
+      auctionId = auctionIdFromSeller(sellerData);
+      buyerData = receive(buyer, submit, {auctionIdFromBuyer: auctionId});
+    }
+  }
+
+  # The endpoint hardcoded in the process is kind of evil but heck, that's the example.
+  auctionRegistrar = <sref:service-ref>
+                       <addr:EndpointReference>
+                         <addr:Address>http://example.com/auction/RegistrationService/</addr:Address>
+                         <addr:ServiceName>as:RegistrationService</addr:ServiceName>
+                       </addr:EndpointReference>
+                     </sref:service-ref>;
+  auctionData.auctionHouseEPR = auctionRegistrar.myRole;
+  auctionData.auctionId = sellerData.auctionId;
+  auctionData.amount = 1;
+
+  invoke(actionRegistrar, processData, auctionData);
+  answerData = receive(actionRegistrar, answer, {auctionIdFromAnswer: auctionId});
+
+  parrallel {
+     seller = sellerData.endpointReference;
+     sellerAnswerData.thankYouText = "Thank you!";
+     invoke(seller, answer, sellerAnswerData);
+  } and {
+     buyer = buyerData.endpointReference;
+     buyerAnswerData.thankYouText = "Thank you!";
+     invoke(buyer, answer, sellerAnswerData);
+  }
+}
\ No newline at end of file

Modified: ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel?rev=605373&r1=605372&r2=605373&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel (original)
+++ ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel Tue Dec 18 16:39:24 2007
@@ -46,6 +46,17 @@
 }
 
 #=============================================================
+# Partner links declaration
+#
+
+process ReceiveInvoke {
+  partnerLink my_pl, other_pl;
+
+  msg_in = receive(my_pl, start_op);
+  invoke(other_pl, other_op, msg_in);
+}
+
+#=============================================================
 # Scope with alarm
 #
 
@@ -102,6 +113,20 @@
 }
 
 #=============================================================
+# Compact scope
+#
+
+process ScopeAll {
+  msg_in = receive(my_pl, start_op);
+  scope
+    wait([PT60S]);
+  alarm([PT60S])
+    exit;
+  compensation
+    invoke(pl, op, msg);
+}
+
+#=============================================================
 # Hello World (basic assignment)
 #
 
@@ -146,6 +171,18 @@
 }
 
 #=============================================================
+# Compact process
+#
+
+process CompactProcess
+  while(count < 10)
+    receive(p, o) { |m|
+      count = count + 1;
+      if (count == 10)
+        invoke(count_partner, count_done);
+    }
+
+#=============================================================
 # External Counter
 #
 
@@ -222,6 +259,18 @@
 }
 
 #=============================================================
+# Compact flow
+#
+
+process CompactFlow {
+  orderMsg = receive(my_pl, start_op);
+  parrallel
+    invoke(partner1_pl, partner1_op, orderMsg);
+  and
+    invoke(partner2_pl, partner2_op, orderMsg);
+}
+
+#=============================================================
 # Flow with signals
 #
 
@@ -243,13 +292,38 @@
 # Naming Conflicts
 #
 
-process NamingConflicts {
+process SimilarNames {
   try {
     parrallel {
       receive_var = receive(receive_pl, receive_op);
-      signal(receive_done, [$foo > 1]);
+      signal(signal-done, [$foo > 1]);
     }
-  } catch(foons::Foo) { |foo_var|
-    invoke(pl, op, foo_var);
+  } catch(catchns::Catch) { |catch_var|
+    invoke(invoke_pl, invoke_op, catch_var);
+  }
+}
+
+#=============================================================
+# Different condition combinations
+#
+
+process ConditionsCombo {
+  receive(my_pl, start_op) { |msg_in|
+    if (msg_in.foo) {
+      wait([PT1S]);
+    } else if (msg_in.bar) {
+      wait([PT1S]);
+    } else {
+      wait([PT1S]);
+    }
+
+    if (msg_in.baz) {
+      wait([PT1S]);
+    }
+
+    if (msg_in.baz) wait([PT1S]);
+    else wait([PT1S]);
+
+    reply(msg_in);
   }
 }

Modified: ode/sandbox/simpel/src/test/resources/loan-approval.simpel
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/resources/loan-approval.simpel?rev=605373&r1=605372&r2=605373&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/resources/loan-approval.simpel (original)
+++ ode/sandbox/simpel/src/test/resources/loan-approval.simpel Tue Dec 18 16:39:24 2007
@@ -1,7 +1,9 @@
 namespace lns = "http://example.com/loan-approval/wsdl/";
 namespace pns = "http://example.com/loan-approval";
 
+# Loan approval process as defined in chapter 15.3 of the BPEL 2.0 specification
 process pns::LoanApproval {
+  partnerLink customer, assessor, approver;
   try {
     parrallel {
       request = receive(customer, request);