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>
+                        &lt;ns:mockQueryResponse 
xmlns:ns="http://www.apache.org/ode/pmapi/types/2006/08/02/"&gt;
+                            &lt;ns:out&gt;
+                                &lt;message xmlns=""&gt;
+                                    &lt;payload&gt;test6&lt;/payload&gt;
+                                    &lt;payload2/&gt;
+                                &lt;/message&gt;
+                            &lt;/ns:out&gt;
+                        &lt;/ns:mockQueryResponse&gt;
+                    <!-- 
+                    <![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<.*
+


Reply via email to