1 package org.jbpm.bpel.service.exe; 2 3 import java.io.Serializable ; 4 import java.io.StringReader ; 5 import java.util.Map ; 6 7 import javax.jms.*; 8 import javax.naming.Context ; 9 import javax.naming.InitialContext ; 10 import javax.wsdl.Definition; 11 import javax.xml.namespace.QName ; 12 13 import junit.framework.TestCase; 14 15 import org.w3c.dom.Element ; 16 import org.xml.sax.InputSource ; 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 44 public abstract class RequestListenerTest extends TestCase { 45 46 private BpelDefinition process; 47 private Receiver receiver; 48 private MessagerService messagerService; 49 private Context initialContext; 50 51 MessagerSession messagerSession; 52 Token token; 53 RequestListener listener; 54 55 private static final String 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 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 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 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 NS_DEF = "http://jbpm.org/wsdl"; 132 static final QName ID_PROP = new QName (NS_DEF, "idProperty"); 133 static final String ID_VALUE = "30"; 134 135 protected void setUp() throws Exception { 136 process = new BpelDefinition(); 137 Definition def = WsdlUtil.readText(WSDL_TEXT); 139 ImportsDefinition imports = process.getImports(); 140 imports.addImport(WsdlUtil.createImport(def)); 141 BpelReader.getInstance().read(process, new InputSource ( new StringReader (BPEL_TEXT)) ); 143 Receive receive = (Receive) process.getRoot(); 145 receiver = receive.getReceiver(); 146 Event event = new Event(Event.EVENTTYPE_NODE_LEAVE); 148 event.addAction(new Action(new Delegation(new RequestNotifier()))); 149 receive.addEvent(event); 150 BarApplication application = new BarApplication(); 152 InputSource input = new InputSource ( new StringReader (BAR_DESCRIPTOR_TEXT)); 153 BarDescriptorReader.getInstance().read(application, input); 154 initialContext = new InitialContext (); 155 messagerService = MessagerService.buildMessagerService(application, process, initialContext); 156 messagerService.getConnection().start(); 157 messagerSession = messagerService.openSession(); 159 listener = createListener(process, receiver); 161 } 162 163 protected abstract RequestListener createListener(BpelDefinition process, Receiver receiver); 164 165 protected void tearDown() throws Exception { 166 MessagerSession.unsetCurrentSession(); 167 messagerService.destroy(initialContext); 168 initialContext.close(); 169 } 170 171 public void testReceiveBeforeSend() throws Exception { 172 listener.receiveRequest(messagerSession); 174 sendRequest(); 176 synchronized (listener) { 178 listener.wait(); 179 } 180 assertReception(); 181 } 182 183 public void testReceiveAfterSend() throws Exception { 184 sendRequest(); 186 listener.receiveRequest(messagerSession); 188 synchronized (listener) { 190 listener.wait(); 191 } 192 assertReception(); 193 } 194 195 public void testClose() throws Exception { 196 listener.receiveRequest(messagerSession); 198 listener.close(); 199 sendRequest(); 201 boolean receptionSucceeded = true; 202 try { 203 assertReception(); 204 } 205 catch (RuntimeException e) { 206 receptionSucceeded = false; 207 } 208 if (receptionSucceeded) fail("listener should not have received the message"); 209 listener.receiveRequest(messagerSession); 211 synchronized (listener) { 213 listener.wait(); 214 } 215 assertReception(); 217 } 218 219 void assertReception() { 220 VariableDefinition variable = receiver.getVariable(); 222 Element messageElement = (Element ) variable.getInstance(token).getValue(); 223 Element simplePart = DOMUtils.getFirstChildElement(messageElement); 225 assertEquals("simplePart", simplePart.getLocalName()); 226 Element elementPart = DOMUtils.getNextSiblingElement(simplePart); 228 assertEquals("elementPart", elementPart.getLocalName()); 229 assertNull(DOMUtils.getNextSiblingElement(elementPart)); 231 Correlations correlations = receiver.getCorrelations(); 233 CorrelationSetDefinition set = correlations.getCorrelation("csId").getSet(); 235 Map properties = set.getInstance(token).getProperties(); 236 assertEquals(1, properties.size()); 237 assertEquals(ID_VALUE, properties.get(ID_PROP)); 238 set = correlations.getCorrelation("csName").getSet(); 240 properties = set.getInstance(token).getProperties(); 241 assertEquals(1, properties.size()); 242 assertEquals("venus", properties.get(new QName (NS_DEF, "nameProperty"))); 243 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 { 251 PartnerLinkDefinition partnerLink = receiver.getPartnerLink(); 253 Destination destination = messagerService.getPartnerLinkInfo(partnerLink).getDestination(); 254 Session session = null; 255 try { 256 session = messagerService.getConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE); 258 MessageProducer producer = session.createProducer(destination); 259 Element messageElement = NodeUtil.parseElement(REQUEST_TEXT); 261 Message message = session.createObjectMessage((Serializable ) messageElement); 262 message.setJMSReplyTo(destination); 264 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 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 { 286 token = exeContext.getToken(); 287 synchronized (listener) { 288 listener.notify(); 289 } 290 } 291 } 292 } 293 | Popular Tags |