KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jbpm > bpel > service > exe > RequestListenerTest


1 package org.jbpm.bpel.service.exe;
2
3 import java.io.Serializable JavaDoc;
4 import java.io.StringReader JavaDoc;
5 import java.util.Map JavaDoc;
6
7 import javax.jms.*;
8 import javax.naming.Context JavaDoc;
9 import javax.naming.InitialContext JavaDoc;
10 import javax.wsdl.Definition;
11 import javax.xml.namespace.QName JavaDoc;
12
13 import junit.framework.TestCase;
14
15 import org.w3c.dom.Element JavaDoc;
16 import org.xml.sax.InputSource JavaDoc;
17
18 import com.ibm.wsdl.util.xml.DOMUtils;
19
20 import org.jbpm.graph.def.Action;
21 import org.jbpm.graph.def.ActionHandler;
22 import org.jbpm.graph.def.Event;
23 import org.jbpm.graph.exe.ExecutionContext;
24 import org.jbpm.graph.exe.Token;
25 import org.jbpm.instantiation.Delegation;
26
27 import org.jbpm.bpel.bar.BarApplication;
28 import org.jbpm.bpel.data.def.VariableDefinition;
29 import org.jbpm.bpel.def.BpelDefinition;
30 import org.jbpm.bpel.def.ImportsDefinition;
31 import org.jbpm.bpel.def.Receive;
32 import org.jbpm.bpel.messager.MessagerService;
33 import org.jbpm.bpel.messager.MessagerSession;
34 import org.jbpm.bpel.service.def.*;
35 import org.jbpm.bpel.wsdl.util.WsdlUtil;
36 import org.jbpm.bpel.xml.BpelReader;
37 import org.jbpm.bpel.xml.BarDescriptorReader;
38 import org.jbpm.bpel.xml.util.NodeUtil;
39
40 /**
41  * @author Alejandro Guízar
42  * @version $Revision: 1.15 $ $Date: 2005/06/23 02:17:27 $
43  */

44 public abstract class RequestListenerTest extends TestCase {
45
46   private BpelDefinition process;
47   private Receiver receiver;
48   private MessagerService messagerService;
49   private Context JavaDoc initialContext;
50   
51   MessagerSession messagerSession;
52   Token token;
53   RequestListener listener;
54
55   private static final String JavaDoc WSDL_TEXT =
56     "<definitions targetNamespace='http://jbpm.org/wsdl'" +
57     " xmlns:tns='http://jbpm.org/wsdl'" +
58     " xmlns:sns='http://jbpm.org/xsd'" +
59     " xmlns:xsd='http://www.w3.org/2001/XMLSchema'" +
60     " xmlns:bpws='http://schemas.xmlsoap.org/ws/2004/03/business-process/'" +
61     " xmlns:plnk='http://schemas.xmlsoap.org/ws/2004/03/partner-link/'" +
62     " xmlns='http://schemas.xmlsoap.org/wsdl/'>" +
63     " <message name='request'>" +
64     " <part name='simplePart' type='xsd:string'/>" +
65     " <part name='elementPart' element='sns:surpriseElement'/>" +
66     " </message>" +
67     " <message name='response'>" +
68     " <part name='intPart' type='xsd:int'/>" +
69     " <part name='complexPart' type='sns:complexType'/>" +
70     " </message>" +
71     " <portType name='pt'>" +
72     " <operation name='op'>" +
73     " <input message='tns:request'/>" +
74     " <output message='tns:response'/>" +
75     " </operation>" +
76     " </portType>" +
77     " <plnk:partnerLinkType name='plt'>" +
78     " <plnk:role name='r1' portType='tns:pt'/>" +
79     " </plnk:partnerLinkType>" +
80     " <bpws:property name='nameProperty' type='xsd:string'/>" +
81     " <bpws:property name='idProperty' type='xsd:int'/>" +
82     " <bpws:propertyAlias propertyName='tns:nameProperty' messageType='tns:request'>" +
83     " <bpws:query>elementPart/sns:surpriseElement/c/@name</bpws:query>" +
84     " </bpws:propertyAlias>" +
85     " <bpws:propertyAlias propertyName='tns:idProperty' messageType='tns:request'>" +
86     " <bpws:query>elementPart/sns:surpriseElement/e</bpws:query>" +
87     " </bpws:propertyAlias>" +
88     "</definitions>";
89   private static final String JavaDoc BPEL_TEXT =
90     "<process xmlns:def='http://jbpm.org/wsdl' xmlns:vendor='http://jbpm.org'" +
91     " xmlns='http://schemas.xmlsoap.org/ws/2004/03/business-process/'>" +
92     " <partnerLinks>" +
93     " <partnerLink name='pl' partnerLinkType='def:plt' myRole='r1'/>" +
94     " </partnerLinks>" +
95     " <variables>" +
96     " <variable name='req' messageType='def:request'/>" +
97     " </variables>" +
98     " <correlationSets>" +
99     " <correlationSet name='csId' properties='def:idProperty'/>" +
100     " <correlationSet name='csName' properties='def:nameProperty'/>" +
101     " </correlationSets>" +
102     " <receive partnerLink='pl' operation='op' variable='req' messageExchange='swing'" +
103     " createInstance='yes'>" +
104     " <correlations>" +
105     " <correlation set='csId' initiate='rendezvous'/>" +
106     " <correlation set='csName' initiate='yes'/>'" +
107     " </correlations>" +
108     " </receive> " +
109     "</process>";
110   private static final String JavaDoc BAR_DESCRIPTOR_TEXT =
111     "<bpelApplication xmlns='http://jbpm.org/bpel'>" +
112     " <connectionFactory name='ConnectionFactory'/>" +
113     " <partnerLinks>" +
114     " <partnerLink name='pl'>" +
115     " <destination name='queue/testQueue'/>" +
116     " </partnerLink>" +
117     " </partnerLinks>" +
118     "</bpelApplication>";
119   private static final String JavaDoc REQUEST_TEXT =
120     "<vendor:msg0 xmlns:vendor='http://jbpm.org/bpel'>" +
121     "<simplePart>wazabi</simplePart>" +
122     "<elementPart>" +
123     "<sns:surpriseElement xmlns:sns='http://jbpm.org/xsd'>" +
124     "<b on=\"true\">true</b>" +
125     "<c name=\"venus\"/>" +
126     "<d amount=\"20\"/>" +
127     "<e>30</e>" +
128     "</sns:surpriseElement>" +
129     "</elementPart>" +
130     "</vendor:msg0>";
131   private static final String JavaDoc NS_DEF = "http://jbpm.org/wsdl";
132   static final QName JavaDoc ID_PROP = new QName JavaDoc(NS_DEF, "idProperty");
133   static final String JavaDoc ID_VALUE = "30";
134   
135   protected void setUp() throws Exception JavaDoc {
136     process = new BpelDefinition();
137     // read wsdl
138
Definition def = WsdlUtil.readText(WSDL_TEXT);
139     ImportsDefinition imports = process.getImports();
140     imports.addImport(WsdlUtil.createImport(def));
141     // read bpel
142
BpelReader.getInstance().read(process, new InputSource JavaDoc( new StringReader JavaDoc(BPEL_TEXT)) );
143     // get the receiver
144
Receive receive = (Receive) process.getRoot();
145     receiver = receive.getReceiver();
146     // intercept process end
147
Event event = new Event(Event.EVENTTYPE_NODE_LEAVE);
148     event.addAction(new Action(new Delegation(new RequestNotifier())));
149     receive.addEvent(event);
150     // build messager service
151
BarApplication application = new BarApplication();
152     InputSource JavaDoc input = new InputSource JavaDoc( new StringReader JavaDoc(BAR_DESCRIPTOR_TEXT));
153     BarDescriptorReader.getInstance().read(application, input);
154     initialContext = new InitialContext JavaDoc();
155     messagerService = MessagerService.buildMessagerService(application, process, initialContext);
156     messagerService.getConnection().start();
157     // open a messager session
158
messagerSession = messagerService.openSession();
159     // create the request listener
160
listener = createListener(process, receiver);
161   }
162   
163   protected abstract RequestListener createListener(BpelDefinition process, Receiver receiver);
164   
165   protected void tearDown() throws Exception JavaDoc {
166     MessagerSession.unsetCurrentSession();
167     messagerService.destroy(initialContext);
168     initialContext.close();
169   }
170   
171   public void testReceiveBeforeSend() throws Exception JavaDoc {
172     // prepare the listener for reception
173
listener.receiveRequest(messagerSession);
174     // now send the request
175
sendRequest();
176     // wait until the listener receives the message
177
synchronized (listener) {
178       listener.wait();
179     }
180     assertReception();
181   }
182   
183   public void testReceiveAfterSend() throws Exception JavaDoc {
184     // send the request
185
sendRequest();
186     // now prepare the listener for reception
187
listener.receiveRequest(messagerSession);
188     // wait until the listener receives the message
189
synchronized (listener) {
190       listener.wait();
191     }
192     assertReception();
193   }
194
195   public void testClose() throws Exception JavaDoc {
196     // prepare the listener for reception, then close it
197
listener.receiveRequest(messagerSession);
198     listener.close();
199     // send request - the listener should not receive it
200
sendRequest();
201     boolean receptionSucceeded = true;
202     try {
203       assertReception();
204     }
205     catch (RuntimeException JavaDoc e) {
206       receptionSucceeded = false;
207     }
208     if (receptionSucceeded) fail("listener should not have received the message");
209     // reopen the listener - it should now receive the message
210
listener.receiveRequest(messagerSession);
211     // wait until the listener receives the message
212
synchronized (listener) {
213       listener.wait();
214     }
215     // assertions
216
assertReception();
217   }
218
219   void assertReception() {
220     // variable
221
VariableDefinition variable = receiver.getVariable();
222     Element JavaDoc messageElement = (Element JavaDoc) variable.getInstance(token).getValue();
223     // simple part
224
Element JavaDoc simplePart = DOMUtils.getFirstChildElement(messageElement);
225     assertEquals("simplePart", simplePart.getLocalName());
226     // element part
227
Element JavaDoc elementPart = DOMUtils.getNextSiblingElement(simplePart);
228     assertEquals("elementPart", elementPart.getLocalName());
229     // no more parts
230
assertNull(DOMUtils.getNextSiblingElement(elementPart));
231     // correlation sets
232
Correlations correlations = receiver.getCorrelations();
233     // id cset
234
CorrelationSetDefinition set = correlations.getCorrelation("csId").getSet();
235     Map JavaDoc properties = set.getInstance(token).getProperties();
236     assertEquals(1, properties.size());
237     assertEquals(ID_VALUE, properties.get(ID_PROP));
238     // name cset
239
set = correlations.getCorrelation("csName").getSet();
240     properties = set.getInstance(token).getProperties();
241     assertEquals(1, properties.size());
242     assertEquals("venus", properties.get(new QName JavaDoc(NS_DEF, "nameProperty")));
243     // outstanding request
244
PartnerLinkInstance plinkInstance = receiver.getPartnerLink().getInstance(token);
245     OutstandingRequest request = plinkInstance.unregisterRequest(
246         receiver.getOperation().getName(), receiver.getMessageExchange());
247     assertSame(receiver, request.getReceiver());
248   }
249
250   void sendRequest() throws Exception JavaDoc {
251     // get connection and destination
252
PartnerLinkDefinition partnerLink = receiver.getPartnerLink();
253     Destination destination = messagerService.getPartnerLinkInfo(partnerLink).getDestination();
254     Session session = null;
255     try {
256       // create session and producer
257
session = messagerService.getConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE);
258       MessageProducer producer = session.createProducer(destination);
259       // create and fill a message
260
Element JavaDoc messageElement = NodeUtil.parseElement(REQUEST_TEXT);
261       Message message = session.createObjectMessage((Serializable JavaDoc) messageElement);
262       // set a reply destination so that the outstanding request is created
263
message.setJMSReplyTo(destination);
264       // set properties
265
message.setLongProperty(BpelEndpointHandler.PARTNER_LINK_ID_PROP, partnerLink.getId());
266       message.setStringProperty(BpelEndpointHandler.OPERATION_NAME_PROP, receiver.getOperation().getName());
267       message.setObjectProperty(ID_PROP.getLocalPart(), ID_VALUE);
268       // send message
269
producer.send(message);
270     }
271     finally {
272       if (session != null) {
273         try {
274           session.close();
275         }
276         catch (JMSException e) {
277           e.printStackTrace();
278         }
279       }
280     }
281   }
282   
283   class RequestNotifier implements ActionHandler {
284
285     public void execute(ExecutionContext exeContext) throws Exception JavaDoc {
286       token = exeContext.getToken();
287       synchronized (listener) {
288         listener.notify();
289       }
290     }
291   }
292 }
293
Popular Tags