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);