Author: mriou
Date: Wed Mar 14 17:17:44 2007
New Revision: 518392
URL: http://svn.apache.org/viewvc?view=rev&rev=518392
Log:
Tests execution seems to work. Some tests fail but some work so I guess that's
a good sign. Since we changed a bit the way mex works and things are scheduled,
more had to be implemented there.
Modified:
incubator/ode/trunk/Rakefile
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
Modified: incubator/ode/trunk/Rakefile
URL:
http://svn.apache.org/viewvc/incubator/ode/trunk/Rakefile?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
--- incubator/ode/trunk/Rakefile (original)
+++ incubator/ode/trunk/Rakefile Wed Mar 14 17:17:44 2007
@@ -259,9 +259,20 @@
end
define "bpel-test" do
- compile.with project("ode:bpel-api"), project("ode:bpel-runtime"),
+ compile.with project("ode:bpel-api"), project("ode:bpel-compiler"),
+ project("ode:bpel-dao"), project("ode:bpel-runtime"),
project("ode:bpel-store"), project("ode:utils"),
DERBY, WSDL4J
+
+ tests.resources.into(path_to(:test_target_dir))
+ tests.compile.with *compile.classpath
+ tests.compile.with project("ode:bpel-schemas"),
project("ode:bpel-scheduler-quartz"),
+ project("ode:bpel-obj"), project("ode:dao-jpa"), project("ode:minerva"),
+ project("ode:jacob"),
+ COMMONS.pool, COMMONS.lang, COMMONS.logging, DERBY, JAVAX.connector,
+ JAVAX.transaction, JAVAX.stream, JAXEN, HSQLDB, JOTM, LOG4J, XERCES,
OpenJPA::REQUIRES,
+ QUARTZ, SAXON, XALAN, XMLBEANS
+
package :jar
end
Modified:
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL:
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
---
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
(original)
+++
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
Wed Mar 14 17:17:44 2007
@@ -734,8 +734,11 @@
partnerLink.partnerLink.partnerRolePortType, operation,
partnerEpr, myRoleEndpoint, _bpelProcess
.getPartnerRoleChannel(partnerLink.partnerLink));
+ BpelProcess p2pProcess = null;
Endpoint partnerEndpoint =
_bpelProcess.getInitialPartnerRoleEndpoint(partnerLink.partnerLink);
- BpelProcess p2pProcess =
_bpelProcess.getEngine().route(partnerEndpoint.serviceName, mex.getRequest());
+ if (partnerEndpoint != null)
+ p2pProcess =
_bpelProcess.getEngine().route(partnerEndpoint.serviceName, mex.getRequest());
+
if (p2pProcess != null) {
// Creating a my mex using the same message id as partner mex to
"pipe" them
MyRoleMessageExchange myRoleMex =
_bpelProcess.getEngine().createMessageExchange(
Modified:
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
URL:
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
---
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
(original)
+++
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
Wed Mar 14 17:17:44 2007
@@ -27,23 +27,52 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
+/**
+ * @author Matthieu Riou <mriou at apache dot org>
+ */
public class TestScheduler implements Scheduler {
+
+ private JobProcessor _processor;
+ private ExecutorService _executorSvc = Executors.newCachedThreadPool();
+ private ThreadLocal<Boolean> _transacted = new ThreadLocal<Boolean>();
+
ThreadLocal<List<Scheduler.Synchronizer>> _synchros = new
ThreadLocal<List<Scheduler.Synchronizer>>() {
@Override
protected List<Synchronizer> initialValue() {
return new ArrayList<Synchronizer>();
}
-
};
- public String schedulePersistedJob(Map<String, Object> arg0, Date arg1)
throws ContextException {
- return null;
+ public String schedulePersistedJob(Map<String, Object> detail, Date date)
throws ContextException {
+ return scheduleVolatileJob(true, detail);
}
- public String scheduleVolatileJob(boolean arg0, Map<String, Object> arg1)
throws ContextException {
+ public String scheduleVolatileJob(final boolean transacted, final
Map<String, Object> detail) throws ContextException {
+ registerSynchronizer(new Synchronizer() {
+ public void afterCompletion(boolean success) {
+ try {
+ if (transacted) {
+ execIsolatedTransaction(new Callable() {
+ public Object call() throws Exception {
+ JobInfo ji = new JobInfo("volatileJob",
detail, 0);
+ doExecute(ji);
+ return null;
+ }
+ });
+ } else {
+ JobInfo ji = new JobInfo("volatileJob", detail, 0);
+ doExecute(ji);
+ }
+ } catch (Exception e) {
+ throw new ContextException("Failure when starting a new
volatile job.", e);
+ }
+ }
+ public void beforeCompletion() { }
+ });
return null;
}
@@ -62,17 +91,15 @@
}
public <T> Future<T> execIsolatedTransaction(final Callable<T>
transaction) throws Exception, ContextException {
- FutureTask future = new FutureTask(new Callable<T>() {
+ return _executorSvc.submit(new Callable<T>() {
public T call() throws Exception {
return execTransaction(transaction);
}
});
- future.run();
- return future;
}
public boolean isTransacted() {
- return false;
+ return _transacted.get();
}
public void start() {
@@ -90,9 +117,11 @@
public void begin() {
_synchros.get().clear();
+ _transacted.set(Boolean.TRUE);
}
public void commit() {
+ System.out.println("COMMITING THREAD " +
Thread.currentThread().getName());
for (Synchronizer s : _synchros.get())
try {
s.beforeCompletion();
@@ -105,6 +134,7 @@
}
_synchros.get().clear();
+ _transacted.set(Boolean.FALSE);
}
public void rollback() {
@@ -119,10 +149,21 @@
} catch (Throwable t) {
}
_synchros.get().clear();
+ _transacted.set(Boolean.FALSE);
}
+ private void doExecute(JobInfo ji) {
+ JobProcessor processor = _processor;
+ if (processor == null)
+ throw new RuntimeException("No processor.");
+ try {
+ processor.onScheduledJob(ji);
+ } catch (Exception jpe) {
+ throw new RuntimeException("Scheduled transaction failed
unexpectedly: transaction will not be retried!.", jpe);
+ }
+ }
public void setJobProcessor(JobProcessor processor) throws
ContextException {
- // Nothing to do.
+ _processor = processor;
}
}
Modified:
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
URL:
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
---
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
(original)
+++
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
Wed Mar 14 17:17:44 2007
@@ -32,6 +32,7 @@
import org.apache.ode.store.ProcessStoreImpl;
import org.apache.ode.test.scheduler.TestScheduler;
import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.GUID;
import org.w3c.dom.Element;
import javax.persistence.EntityManager;
@@ -41,28 +42,29 @@
import java.io.File;
import java.util.Collection;
import java.util.Properties;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
public abstract class BPELTestAbstract extends TestCase {
- protected BpelServerImpl server;
+ protected BpelServerImpl server;
protected ProcessStore store;
- protected MessageExchangeContextImpl mexContext;
- protected EntityManager em;
- protected EntityManagerFactory emf;
+ protected MessageExchangeContextImpl mexContext;
+ protected EntityManager em;
+ protected EntityManagerFactory emf;
protected TestScheduler scheduler;
protected BpelDAOConnectionFactory _cf;
@Override
- protected void setUp() throws Exception {
- server = new BpelServerImpl();
- mexContext = new MessageExchangeContextImpl();
-
-
- if ( Boolean.getBoolean("org.apache.ode.test.persitent")) {
- emf =
Persistence.createEntityManagerFactory("ode-unit-test-embedded");
- em = emf.createEntityManager();
- String pr = Persistence.PERSISTENCE_PROVIDER;
+ protected void setUp() throws Exception {
+ server = new BpelServerImpl();
+ mexContext = new MessageExchangeContextImpl();
+
+ if ( Boolean.getBoolean("org.apache.ode.test.persistent")) {
+ emf =
Persistence.createEntityManagerFactory("ode-unit-test-embedded");
+ em = emf.createEntityManager();
+ String pr = Persistence.PERSISTENCE_PROVIDER;
_cf = new BPELDAOConnectionFactoryImpl();
server.setDaoConnectionFactory(_cf);
scheduler = new TestScheduler() {
@@ -82,17 +84,18 @@
super.rollback();
em.getTransaction().rollback();
}
-
+
};
- } else {
+ } else {
_cf = new BpelDAOConnectionFactoryImpl();
server.setDaoConnectionFactory(_cf);
scheduler = new TestScheduler();
- }
+ }
server.setInMemDaoConnectionFactory(new
BpelDAOConnectionFactoryImpl());
server.setScheduler(scheduler);
- server.setBindingContext(new BindingContextImpl());
- server.setMessageExchangeContext(mexContext);
+ server.setBindingContext(new BindingContextImpl());
+ server.setMessageExchangeContext(mexContext);
+ scheduler.setJobProcessor(server);
store = new ProcessStoreImpl(null, "jpa", true);
store.registerListener(new ProcessStoreListener() {
public void onProcessStoreEvent(ProcessStoreEvent event) {
@@ -103,196 +106,199 @@
}
});
server.init();
- server.start();
- }
+ server.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if ( em != null ) em.close();
+ if ( emf != null ) emf.close();
+ server.stop();
+ }
+
+ protected void negative(String deployDir) throws Throwable {
+ try {
+ go(deployDir);
+ } catch (junit.framework.AssertionFailedError ex) {
+ return;
+ }
+ fail("Expecting test to fail");
+ }
+
+ protected void go(String deployDir) throws Throwable {
+
+ /**
+ * The deploy directory must contain at least one "test.properties"
+ * file.
+ *
+ * The test.properties file identifies the service, operation and
+ * messages to be sent to the BPEL engine.
+ *
+ * The deploy directory may contain more than one file in the form of
+ * "testN.properties" where N represents a monotonic integer beginning
+ * with 1.
+ *
+ */
+
+ int propsFileCnt = 0;
+ File testPropsFile = new File(deployDir + "/test.properties");
+
+ if (!testPropsFile.exists()) {
+ propsFileCnt++;
+ testPropsFile = new File(deployDir + "/test" + propsFileCnt
+ + ".properties");
+ if (!testPropsFile.exists()) {
+ System.err.println("can't find " + testPropsFile.toString());
+ }
+ }
- @Override
- protected void tearDown() throws Exception {
- if ( em != null ) em.close();
- if ( emf != null ) emf.close();
- server.stop();
- }
-
- protected void negative(String deployDir) throws Throwable {
- try {
- go(deployDir);
- } catch (junit.framework.AssertionFailedError ex) {
- return;
- }
- fail("Expecting test to fail");
- }
-
- protected void go(String deployDir) throws Throwable {
-
- /**
- * The deploy directory must contain at least one
"test.properties"
- * file.
- *
- * The test.properties file identifies the service, operation
and
- * messages to be sent to the BPEL engine.
- *
- * The deploy directory may contain more than one file in the
form of
- * "testN.properties" where N represents a monotonic integer
beginning
- * with 1.
- *
- */
-
- int propsFileCnt = 0;
- File testPropsFile = new File(deployDir + "/test.properties");
-
- if (!testPropsFile.exists()) {
- propsFileCnt++;
- testPropsFile = new File(deployDir + "/test" +
propsFileCnt
- + ".properties");
- if (!testPropsFile.exists()) {
- System.err.println("can't find " +
testPropsFile.toString());
- }
- }
-
- scheduler.begin();
- try {
- Collection<QName> procs = store.deploy(new
File(deployDir));
+ scheduler.begin();
+ try {
+ Collection<QName> procs = store.deploy(new File(deployDir));
for (QName procName : procs) {
server.register(store.getProcessConfiguration(procName));
}
} catch (ContextException bpelE) {
- Properties testProps = new Properties();
- testProps.load(testPropsFile.toURL().openStream());
- String responsePattern =
testProps.getProperty("response1");
+ Properties testProps = new Properties();
+ testProps.load(testPropsFile.toURL().openStream());
+ String responsePattern = testProps.getProperty("response1");
bpelE.printStackTrace();
- testResponsePattern(bpelE.getMessage(),
responsePattern);
+ testResponsePattern(bpelE.getMessage(), responsePattern);
return;
- } catch ( Exception e ) {
- e.printStackTrace();
- fail();
- }
- scheduler.commit();
-
- while (testPropsFile.exists()) {
-
- scheduler.begin();
-
- Properties testProps = new Properties();
- testProps.load(testPropsFile.toURL().openStream());
-
- QName serviceId = new
QName(testProps.getProperty("namespace"),
- testProps.getProperty("service"));
- String operation = testProps.getProperty("operation");
-
- MyRoleMessageExchange mex = server.getEngine()
- .createMessageExchange("", serviceId,
operation);
-
- /**
- * Each property file must contain at least one
request/response
- * property tuple.
- *
- * The request/response tuple should be in the form
- *
- * requestN=<message>some XML input message</message>
- * responseN=.*some response message.*
- *
- * Where N is a monotonic integer beginning with 1.
- *
- * If a specific MEP is expected in lieu of a response
message use:
- * responseN=ASYNC responseN=ONE_WAY
responseN=COMPLETED_OK
- *
- */
- try {
- for (int i = 1; testProps.getProperty("request"
+ i) != null; i++) {
-
- String in =
testProps.getProperty("request" + i);
- String responsePattern =
testProps.getProperty("response" + i);
-
- mexContext.clearCurrentResponse();
-
- Message request =
mex.createMessage(null);
-
- Element elem = DOMUtils.stringToDOM(in);
- request.setMessage(elem);
-
-
- mex.invoke(request);
-
-
- switch (mex.getStatus()) {
- case RESPONSE:
-
testResponsePattern(mex.getResponse(), responsePattern);
- // TODO: test for response fault
- break;
- case ASYNC:
-
- switch
(mex.getMessageExchangePattern()) {
- case REQUEST_ONLY:
- if
(!responsePattern.equals("ASYNC"))
- fail();
- break;
- case REQUEST_RESPONSE:
-
testResponsePattern(mexContext.getCurrentResponse(),
-
responsePattern);
- default:
- break;
- }
-
- break;
- case COMPLETED_OK:
- if
(!responsePattern.equals("COMPLETED_OK"))
-
testResponsePattern(mexContext.getCurrentResponse(),
-
responsePattern);
- break;
- case FAULT:
- // TODO: handle Fault
- System.out.println("=> " +
mex.getFaultExplanation());
- fail();
- break;
- case COMPLETED_FAILURE:
- // TODO: handle Failure
- System.out.println("=> " +
mex.getFaultExplanation());
- fail();
- break;
- case COMPLETED_FAULT:
- // TODO: handle Failure
- System.out.println("=> " +
mex.getFaultExplanation());
- fail();
- break;
- case FAILURE:
- // TODO: handle Faulure
- System.out.println("=> " +
mex.getFaultExplanation());
- fail();
- break;
- default:
- fail();
- break;
- }
- }
- } catch ( Throwable e ) {
- e.printStackTrace();
- scheduler.rollback();
- throw e;
- }
- propsFileCnt++;
- testPropsFile = new File(deployDir + "/test" +
propsFileCnt
- + ".properties");
- scheduler.commit();
- }
- }
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ fail();
+ }
+ scheduler.commit();
+
+ while (testPropsFile.exists()) {
+
+ Properties testProps = new Properties();
+ testProps.load(testPropsFile.toURL().openStream());
+
+ QName serviceId = new QName(testProps.getProperty("namespace"),
+ testProps.getProperty("service"));
+ String operation = testProps.getProperty("operation");
+
+
+ /**
+ * Each property file must contain at least one request/response
+ * property tuple.
+ *
+ * The request/response tuple should be in the form
+ *
+ * requestN=<message>some XML input message</message>
+ * responseN=.*some response message.*
+ *
+ * Where N is a monotonic integer beginning with 1.
+ *
+ * If a specific MEP is expected in lieu of a response message use:
+ * responseN=ASYNC responseN=ONE_WAY responseN=COMPLETED_OK
+ *
+ */
+ for (int i = 1; testProps.getProperty("request" + i) != null; i++)
{
+ MyRoleMessageExchange mex = null;
+ Future running = null;
+ String responsePattern = null;
+ try {
+ scheduler.begin();
+
+ mex = server.getEngine().createMessageExchange(new
GUID().toString(), serviceId, operation);
+
+ String in = testProps.getProperty("request" + i);
+ responsePattern = testProps.getProperty("response" + i);
+
+ mexContext.clearCurrentResponse();
+
+ Message request = mex.createMessage(null);
+
+ Element elem = DOMUtils.stringToDOM(in);
+ request.setMessage(elem);
+
+
+ running = mex.invoke(request);
+ scheduler.commit();
+ } catch ( Throwable e ) {
+ e.printStackTrace();
+ scheduler.rollback();
+ throw e;
+ }
+
+ running.get(10000, TimeUnit.MILLISECONDS);
+
+ switch (mex.getStatus()) {
+ case RESPONSE:
+ testResponsePattern(mex.getResponse(),
responsePattern);
+ // TODO: test for response fault
+ break;
+ case ASYNC:
+
+ switch (mex.getMessageExchangePattern()) {
+ case REQUEST_ONLY:
+ if (!responsePattern.equals("ASYNC"))
+ fail();
+ break;
+ case REQUEST_RESPONSE:
+
testResponsePattern(mexContext.getCurrentResponse(),
+ responsePattern);
+ default:
+ break;
+ }
+
+ break;
+ case COMPLETED_OK:
+ if (!responsePattern.equals("COMPLETED_OK"))
+
testResponsePattern(mexContext.getCurrentResponse(),
+ responsePattern);
+ break;
+ case FAULT:
+ // TODO: handle Fault
+ System.out.println("=> " + mex.getFaultExplanation());
+ fail();
+ break;
+ case COMPLETED_FAILURE:
+ // TODO: handle Failure
+ System.out.println("=> " + mex.getFaultExplanation());
+ fail();
+ break;
+ case COMPLETED_FAULT:
+ // TODO: handle Failure
+ System.out.println("=> " + mex.getFaultExplanation());
+ fail();
+ break;
+ case FAILURE:
+ // TODO: handle Faulure
+ System.out.println("=> " + mex.getFaultExplanation());
+ fail();
+ break;
+ default:
+ fail();
+ break;
+ }
+ }
+ propsFileCnt++;
+ testPropsFile = new File(deployDir + "/test" + propsFileCnt
+ + ".properties");
+ }
+ }
private void testResponsePattern(Message response, String responsePattern)
{
- String resp = (response == null) ? "null" : DOMUtils
- .domToString(response.getMessage());
- testResponsePattern(resp, responsePattern);
- }
-
- private void testResponsePattern(String resp, String responsePattern) {
- boolean testValue = Pattern.compile(responsePattern,
Pattern.DOTALL)
- .matcher(resp).matches();
-
- if (!testValue) {
- System.out.println("=> Expected Response Pattern >> "
- + responsePattern);
- System.out.println("=> Acutal Response >> " + resp);
- }
- assertTrue(testValue);
- }
+ String resp = (response == null) ? "null" : DOMUtils
+ .domToString(response.getMessage());
+ testResponsePattern(resp, responsePattern);
+ }
+
+ private void testResponsePattern(String resp, String responsePattern) {
+ boolean testValue = Pattern.compile(responsePattern, Pattern.DOTALL)
+ .matcher(resp).matches();
+
+ if (!testValue) {
+ System.out.println("=> Expected Response Pattern >> "
+ + responsePattern);
+ System.out.println("=> Acutal Response >> " + resp);
+ }
+ assertTrue(testValue);
+ }
}