Author: rr
Date: Fri Oct 2 21:56:21 2009
New Revision: 821182
URL: http://svn.apache.org/viewvc?rev=821182&view=rev
Log:
ODE-483: Added xquery mock response support for replayer + test case
Added:
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml
(with props)
Modified:
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/Replayer.java
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/ReplayerContext.java
ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/xsd/pmapi.xsd
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/test.properties
Modified:
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/Replayer.java
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/Replayer.java?rev=821182&r1=821181&r2=821182&view=diff
==============================================================================
---
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/Replayer.java
(original)
+++
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/Replayer.java
Fri Oct 2 21:56:21 2009
@@ -38,11 +38,11 @@
import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
import org.apache.ode.bpel.pmapi.CommunicationType;
import org.apache.ode.bpel.pmapi.ExchangeType;
+import org.apache.ode.bpel.pmapi.FaultType;
import org.apache.ode.bpel.pmapi.GetCommunication;
import org.apache.ode.bpel.pmapi.GetCommunicationResponse;
import org.apache.ode.bpel.pmapi.Replay;
import org.apache.ode.bpel.pmapi.CommunicationType.Exchange;
-import org.apache.ode.bpel.pmapi.CommunicationType.Exchange.Fault;
import org.apache.xmlbeans.XmlCalendar;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
@@ -145,7 +145,7 @@
try {
Status status = Status.valueOf(mexDao.getStatus());
if (status == Status.FAULT) {
- Fault f = e.addNewFault();
+ FaultType f = e.addNewFault();
f.setType(mexDao.getFault());
f.setExplanation(mexDao.getFaultExplanation());
if (mexDao.getResponse() != null) {
Modified:
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/ReplayerContext.java
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/ReplayerContext.java?rev=821182&r1=821181&r2=821182&view=diff
==============================================================================
---
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/ReplayerContext.java
(original)
+++
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/replayer/ReplayerContext.java
Fri Oct 2 21:56:21 2009
@@ -26,6 +26,14 @@
import java.util.concurrent.Callable;
import javax.xml.namespace.QName;
+import javax.xml.xquery.XQConnection;
+import javax.xml.xquery.XQConstants;
+import javax.xml.xquery.XQDataSource;
+import javax.xml.xquery.XQPreparedExpression;
+import javax.xml.xquery.XQResultSequence;
+
+import net.sf.saxon.xqj.SaxonXQConnection;
+import net.sf.saxon.xqj.SaxonXQDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -39,10 +47,18 @@
import org.apache.ode.bpel.iapi.MessageExchange.Status;
import org.apache.ode.bpel.pmapi.CommunicationType;
import org.apache.ode.bpel.pmapi.ExchangeType;
+import org.apache.ode.bpel.pmapi.MockQueryRequestDocument;
+import org.apache.ode.bpel.pmapi.MockQueryResponseDocument;
+import org.apache.ode.bpel.pmapi.ResponseType;
import org.apache.ode.bpel.pmapi.CommunicationType.Exchange;
+import org.apache.ode.bpel.pmapi.CommunicationType.ServiceConfig;
import org.apache.ode.bpel.runtime.PROCESS;
import org.apache.ode.utils.DOMUtils;
+import org.apache.xmlbeans.XmlAnySimpleType;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlOptions;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
/**
* Context holding replayer state (eg. invoke answers) for single instance
during replaying.
@@ -57,39 +73,52 @@
public BpelEngineImpl bpelEngine;
public ReplayerBpelRuntimeContextImpl runtimeContext;
+
+ public Map<QName, ServiceConfig> servicesConfig = new HashMap<QName,
ServiceConfig>();
public final Date replayStartDate;
public Answers answers = new Answers();
- public static class Answers {
+ public class Answers {
public Map<String, AnswersForKey> answersMap = new HashMap<String,
AnswersForKey>();
- public static String getAnswersKey(QName service, String operation) {
+ public String getAnswersKey(QName service, String operation) {
return service.toString() + ";" + operation;
}
public void add(Exchange e) {
- String key = getAnswersKey(e.getService(), e.getOperation());
- AnswersForKey v = answersMap.get(key);
- if (v == null) {
- v = new AnswersForKey();
- answersMap.put(key, v);
+ ServiceConfig cfg = getServiceConfig(e.getService());
+ if (cfg.getReplayType().isSetMock()) {
+ String key = getAnswersKey(e.getService(), e.getOperation());
+ AnswersForKey v = answersMap.get(key);
+ if (v == null) {
+ v = new AnswersForKey();
+ answersMap.put(key, v);
+ }
+ v.answers.add(e);
}
- v.answers.add(e);
}
- public Exchange fetchAnswer(QName service, String operation, Element
outgointMessage, Date currentEventDateTime) {
+ public Exchange fetchAnswer(QName service, String operation, Element
outgoingMessage, Date currentEventDateTime) {
__log.debug("fetching answer for " + service + " " + operation);
- String key = getAnswersKey(service, operation);
- AnswersForKey v = answersMap.get(key);
- Exchange e = v == null ? null : v.answerPos < v.answers.size() ?
v.answers.get(v.answerPos) : null;
- if (e == null) {
- throw new IllegalStateException("answer for " + service + " "
+ operation + " at time " + currentEventDateTime + " not found, outgoing
message was " + DOMUtils.domToString(outgointMessage));
- }
- v.answerPos++;
- __log.debug("fetched " + e);
- return e;
+
+ ServiceConfig cfg = getServiceConfig(service);
+
+ if (cfg.getReplayType().isSetMock()) {
+ String key = getAnswersKey(service, operation);
+ AnswersForKey v = answersMap.get(key);
+ Exchange e = v == null ? null : v.answerPos < v.answers.size()
? v.answers.get(v.answerPos) : null;
+ if (e == null) {
+ throw new IllegalStateException("answer for " + service +
" " + operation + " at time " + currentEventDateTime + " not found, outgoing
message was " + DOMUtils.domToString(outgoingMessage));
+ }
+ v.answerPos++;
+ __log.debug("fetched " + e);
+ return e;
+ } else if (cfg.getReplayType().isSetMockQuery()) {
+ return fetchMockQuery(service, operation, outgoingMessage,
cfg);
+ } else assert(false);
+ return null;
}
public void remainingExchanges(List<Exchange> e) {
@@ -97,6 +126,63 @@
v.remainingExchanges(e);
}
}
+
+ private Exchange fetchMockQuery(QName service, String operation,
Element outgoingMessage,
org.apache.ode.bpel.pmapi.CommunicationType.ServiceConfig serviceConfig) {
+ try {
+ MockQueryRequestDocument request =
MockQueryRequestDocument.Factory.newInstance();
+
request.addNewMockQueryRequest().addNewIn().set(XmlObject.Factory.parse(outgoingMessage));
+ String xquery = serviceConfig.getReplayType().getMockQuery();
+
+ XQDataSource xqds = new SaxonXQDataSource();
+ XQConnection xqconn = xqds.getConnection();
+
+ net.sf.saxon.Configuration configuration =
((SaxonXQConnection) xqconn).getConfiguration();
+
configuration.setHostLanguage(net.sf.saxon.Configuration.XQUERY);
+// XQStaticContext staticEnv = xqconn.getStaticContext();
+ XQPreparedExpression exp = xqconn.prepareExpression(xquery);
+ Node requestNode =
DOMUtils.parse(request.newXMLStreamReader());
+ if (__log.isDebugEnabled()) {
+ __log.debug("request " + request.toString());
+ }
+ exp.bindItem(XQConstants.CONTEXT_ITEM,
xqconn.createItemFromNode(requestNode, xqconn.createNodeType()));
+ XQResultSequence result = exp.executeQuery();
+ MockQueryResponseDocument response =
MockQueryResponseDocument.Factory.parse(result.getSequenceAsStream());
+ {
+ XmlOptions opts = new XmlOptions();
+ List<Object> errors = new ArrayList<Object>();
+ opts.setErrorListener(errors);
+ if (!response.validate(opts)) {
+ __log.error("MockQuery response doesn't validate.
Errors: " + errors + " Request: " + request.toString() + " Response: " +
response.toString(), new Exception());
+ throw new IllegalStateException("MockQuery response
doesn't validate.");
+ }
+ }
+ ResponseType response2 = response.getMockQueryResponse();
+
+ if (__log.isDebugEnabled()) {
+ __log.debug("mockQuery result " + response);
+ }
+
+
+ Exchange answer = Exchange.Factory.newInstance();
+ {
+ if (response2.isSetOut()) {
+ answer.setOut(response2.getOut());
+ }
+ if (response2.isSetFault()) {
+ answer.setFault(response2.getFault());
+ }
+ if (response2.isSetFailure()) {
+ answer.setFailure(response2.getFailure());
+ }
+ }
+
+ return answer;
+ } catch (Exception e) {
+ __log.error("", e);
+ __log.error(e.getCause());
+ throw new IllegalStateException(e.getMessage());
+ }
+ }
}
public static class AnswersForKey {
@@ -133,6 +219,11 @@
public void init(final CommunicationType r, ReplayerScheduler scheduler)
throws Exception {
this.scheduler = scheduler;
+
+ for (ServiceConfig s : r.getServiceConfigList()) {
+ servicesConfig.put(s.getService(), s);
+ }
+
final List<Exchange> exchangeList = r.getExchangeList();
for (int i = 1; i < exchangeList.size(); i++) {
@@ -202,4 +293,14 @@
super();
this.replayStartDate = replayStartDate;
}
+
+ public ServiceConfig getServiceConfig(QName service) {
+ ServiceConfig c = servicesConfig.get(service);
+ if (c == null) {
+ c = ServiceConfig.Factory.newInstance();
+ c.setService(service);
+
c.addNewReplayType().setMock(XmlAnySimpleType.Factory.newInstance());
+ return c;
+ } else return c;
+ }
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/xsd/pmapi.xsd
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/xsd/pmapi.xsd?rev=821182&r1=821181&r2=821182&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/xsd/pmapi.xsd (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-schemas/src/main/xsd/pmapi.xsd Fri Oct 2
21:56:21 2009
@@ -40,12 +40,41 @@
</restriction>
</simpleType>
- <simpleType name="ReplayType">
- <restriction base="string">
- <enumeration value="MOCK"/>
- <enumeration value="IGNORE"/>
- </restriction>
- </simpleType>
+ <xs:complexType name="ReplayType">
+ <xs:choice>
+ <xs:element name="mock" type="anySimpleType"></xs:element>
+ <xs:element name="mockQuery" type="string"></xs:element>
+ </xs:choice>
+ </xs:complexType>
+
+ <xs:element name="mockQueryRequest">
+ <xs:complexType>
+ <xs:sequence>
+ <element name="createTime" type="dateTime"/>
+ <element name="service" type="QName"/>
+ <element name="operation" type="string"/>
+ <element name="in" type="anyType"/>
+ <xs:element name="pattern">
+ <xs:simpleType>
+ <restriction base="string">
+ <enumeration value="IN_ONLY"/>
+ <enumeration value="IN_OUT"/>
+ </restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="mockQueryResponse" type="pmapi:ResponseType"/>
+
+ <xs:complexType name="ResponseType">
+ <choice>
+ <element name="out" type="anyType" />
+ <element name="fault" type="pmapi:FaultType" />
+ <element name="failure" type="pmapi:FailureType" />
+ </choice>
+ </xs:complexType>
<complexType name="GetCommunication">
<xs:sequence>
@@ -61,6 +90,20 @@
<element name="getCommunicationResponse"
type="pmapi:GetCommunicationResponse"/>
+ <complexType name="FaultType">
+ <sequence>
+ <element name="type" type="QName" />
+ <element name="explanation" type="string" />
+ <element name="message" type="anyType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="FailureType">
+ <sequence>
+ <element name="explanation" type="string" />
+ </sequence>
+ </complexType>
+
<complexType name="CommunicationType">
<sequence>
<element name="processType" type="QName" />
@@ -68,9 +111,8 @@
<element name="serviceConfig" maxOccurs="unbounded">
<complexType>
<sequence>
- <element name="name" type="QName" />
- <element name="replayingType"
- type="pmapi:ReplayType" />
+ <element name="service" type="QName" />
+ <xs:element name="replayType" type="pmapi:ReplayType"/>
</sequence>
</complexType>
</element>
@@ -83,26 +125,10 @@
<element name="service" type="QName" />
<element name="operation" type="string" />
<element name="in" type="anyType" />
- <choice>
+ <choice> <!-- ResponseType -->
<element name="out" type="anyType"/>
- <element name="fault">
- <complexType>
- <sequence>
- <element name="type" type="QName" />
- <element name="explanation"
- type="string" />
- <element name="message"
- type="anyType" />
- </sequence>
- </complexType>
- </element>
- <element name="failure">
- <complexType>
- <sequence>
- <element name="explanation"
type="string" />
- </sequence>
- </complexType>
- </element>
+ <element name="fault" type="pmapi:FaultType"/>
+ <element name="failure" type="pmapi:FailureType"/>
</choice>
</sequence>
</complexType>
Added:
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml?rev=821182&view=auto
==============================================================================
---
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml
(added)
+++
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml
Fri Oct 2 21:56:21 2009
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmap:replay xmlns:ns="http://www.apache.org/ode/pmapi/types/2006/08/02/"
xmlns:pmap="http://www.apache.org/ode/pmapi">
+ <replay>
+ <!--
+ <ns:replaceInstance>454277</ns:replaceInstance>
+ <ns:upgradeInstance>?</ns:upgradeInstance>
+-->
+ <ns:restoreInstance>
+ <ns:processType
xmlns:p="http://sample.bpel.org/bpel/sample">p:OnEventCorrelation</ns:processType>
+ <ns:serviceConfig>
+ <ns:service
xmlns:sam="http://sample.bpel.org/bpel/sample">sam:OnEventCorrelation</ns:service>
+ <ns:replayType>
+ <ns:mockQuery>
+ <ns:mockQueryResponse
xmlns:ns="http://www.apache.org/ode/pmapi/types/2006/08/02/">
+ <ns:out>
+ <message xmlns="">
+ <payload>test6</payload>
+ <payload2/>
+ </message>
+ </ns:out>
+ </ns:mockQueryResponse>
+ <!--
+ <![CDATA[
+ <ns:mockQueryResponse
xmlns:ns="http://www.apache.org/ode/pmapi/types/2006/08/02/">
+ <ns:out>
+ <message xmlns="">
+ <payload>test6</payload>
+ <payload2/>
+ </message>
+ </ns:out>
+ </ns:mockQueryResponse>
+ ]]> -->
+ </ns:mockQuery>
+ </ns:replayType>
+ </ns:serviceConfig>
+
+ <exchange
xmlns="http://www.apache.org/ode/pmapi/types/2006/08/02/">
+ <type>M</type>
+ <createTime>2009-04-01T16:41:29.873+02:00</createTime>
+ <service
xmlns:sam="http://sample.bpel.org/bpel/sample">sam:OnEventCorrelationInit</service>
+ <operation>initiate</operation>
+ <in>
+ <initiate xmlns:sam="http://sample.bpel.org/bpel/sample"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="">
+ <payload>abc7</payload>
+ <payload2>abc8</payload2>
+ </initiate>
+ </in>
+ <out>
+ <message xmlns="">
+ <payload>test1</payload>
+ <payload2 />
+ </message>
+ </out>
+ </exchange>
+
+ <exchange
xmlns="http://www.apache.org/ode/pmapi/types/2006/08/02/">
+ <type>P</type>
+ <createTime>2009-04-01T16:41:32.998+02:00</createTime>
+ <service
xmlns:sam="http://sample.bpel.org/bpel/sample">sam:OnEventCorrelation</service>
+ <operation>initiate</operation>
+ <in>
+ <initiate xmlns:sam="http://sample.bpel.org/bpel/sample"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="">
+ <payload>abc7</payload>
+ <payload2>abc8</payload2>
+ </initiate>
+ </in>
+ <out>
+ <message xmlns="">
+ <payload>test5</payload>
+ <payload2 />
+ </message>
+ </out>
+ </exchange>
+ <exchange
xmlns="http://www.apache.org/ode/pmapi/types/2006/08/02/">
+ <type>M</type>
+ <createTime>2009-04-01T16:41:40.873+02:00</createTime>
+ <service
xmlns:sam="http://sample.bpel.org/bpel/sample">sam:OnEventCorrelationInit</service>
+ <operation>initiate</operation>
+ <in>
+ <initiate xmlns:sam="http://sample.bpel.org/bpel/sample"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="">
+ <payload>abc7</payload>
+ <payload2>abc8</payload2>
+ </initiate>
+ </in>
+ <out>
+ <message xmlns="">
+ <payload>test1</payload>
+ <payload2 />
+ </message>
+ </out>
+ </exchange>
+ </ns:restoreInstance>
+ </replay>
+</pmap:replay>
+
Propchange:
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/replayXQueryRequest.xml
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/test.properties
URL:
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/test.properties?rev=821182&r1=821181&r2=821182&view=diff
==============================================================================
---
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/test.properties
(original)
+++
ode/branches/APACHE_ODE_1.X/jbi/src/test/resources/ReplayerJbiTest/test.properties
Fri Oct 2 21:56:21 2009
@@ -24,3 +24,12 @@
[email protected]
2response=.*>timer-2009-04-01T14:42:00.873Z;timer-2009-04-01T14:41:50.873Z;request-2009-04-01T14:41:40.873Z;timer-2009-04-01T14:41:39.873Z;first-2009-04-01T14:41:29.873Z;test5<.*
+3nmr.service={http://www.apache.org/ode/pmapi}InstanceManagementService
+3nmr.operation=replay
[email protected]
+3response=.*
+4nmr.service={http://sample.bpel.org/bpel/sample}OnEventCorrelationInit
+4nmr.operation=initiate
[email protected]
+4response=.*>timer-2009-04-01T14:42:00.873Z;timer-2009-04-01T14:41:50.873Z;request-2009-04-01T14:41:40.873Z;timer-2009-04-01T14:41:39.873Z;first-2009-04-01T14:41:29.873Z;test6<.*
+