You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2007/08/14 21:40:33 UTC
svn commit: r565873 - in /incubator/servicemix/trunk:
common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/
common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/
common/servicemix-soap...
Author: gnodet
Date: Tue Aug 14 12:40:31 2007
New Revision: 565873
URL: http://svn.apache.org/viewvc?view=rev&rev=565873
Log:
SM-995: JmsProviderEndpoint in-out mode need to be implemented
Added:
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Output.xml
Modified:
incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/SoapOutInterceptor.java
incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiInInterceptor.java
incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutInterceptor.java
incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutWsdl1Interceptor.java
incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/wsdl/validator/WSIBPValidator.java
incubator/servicemix/trunk/common/servicemix-soap2/src/test/java/org/apache/servicemix/soap/interceptors/jbi/MockExchangeFactory.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractConsumerEndpoint.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderEndpoint.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderMarshaler.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC.wsdl
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/SoapOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/SoapOutInterceptor.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/SoapOutInterceptor.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/bindings/soap/interceptors/SoapOutInterceptor.java Tue Aug 14 12:40:31 2007
@@ -26,6 +26,7 @@
import org.apache.servicemix.soap.api.Message;
import org.apache.servicemix.soap.bindings.soap.SoapVersion;
import org.apache.servicemix.soap.core.AbstractInterceptor;
+import org.apache.servicemix.soap.util.DomUtil;
import org.apache.servicemix.soap.util.stax.DOMStreamReader;
import org.apache.servicemix.soap.util.stax.StaxUtil;
import org.w3c.dom.DocumentFragment;
@@ -66,7 +67,7 @@
StaxUtil.writeStartElement(writer, soapVersion.getHeader());
for (Iterator it = message.getSoapHeaders().values().iterator(); it.hasNext();) {
DocumentFragment df = (DocumentFragment) it.next();
- Element e = (Element) df.getFirstChild();
+ Element e = DomUtil.getFirstChildElement(df);
StaxUtil.copy(new DOMStreamReader(e), writer);
}
writer.writeEndElement();
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiInInterceptor.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiInInterceptor.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiInInterceptor.java Tue Aug 14 12:40:31 2007
@@ -73,8 +73,11 @@
throw new IllegalStateException("Content of type " + MessageExchange.class + " not found on message");
}
if (message.getContent(Exception.class) == null) {
- nm = exchange.createMessage();
- exchange.setMessage(nm, "out");
+ nm = exchange.getMessage("out");
+ if (nm == null) {
+ nm = exchange.createMessage();
+ exchange.setMessage(nm, "out");
+ }
} else {
exchange.setFault(exchange.createFault());
nm = exchange.getFault();
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutInterceptor.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutInterceptor.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutInterceptor.java Tue Aug 14 12:40:31 2007
@@ -26,6 +26,8 @@
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
+import org.apache.servicemix.jbi.FaultException;
+import org.apache.servicemix.soap.api.Fault;
import org.apache.servicemix.soap.api.Message;
import org.apache.servicemix.soap.api.model.Binding;
import org.apache.servicemix.soap.api.model.Operation;
@@ -57,6 +59,11 @@
Binding binding = message.get(Binding.class);
Operation operation = binding.getOperation(me.getOperation());
if (operation != null) {
+ if (!me.getPattern().equals(operation.getMep())) {
+ throw new Fault("Received incorrect exchange mep. Received " + me.getPattern()
+ + " but expected " + operation.getMep() + " for operation "
+ + operation.getName());
+ }
message.put(Operation.class, operation);
if (operation instanceof SoapOperation<?>) {
String soapAction = ((SoapOperation<?>) operation).getSoapAction();
@@ -81,6 +88,7 @@
/**
* Copy NormalizedMessage headers to SoapMessage headers
*/
+ @SuppressWarnings("unchecked")
private void fromNMSHeaders(Message message, NormalizedMessage normalizedMessage) {
if (normalizedMessage.getProperty(JbiConstants.PROTOCOL_HEADERS) != null) {
Map<String, ?> headers = (Map<String, ?>) normalizedMessage.getProperty(JbiConstants.PROTOCOL_HEADERS);
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutWsdl1Interceptor.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutWsdl1Interceptor.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutWsdl1Interceptor.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/interceptors/jbi/JbiOutWsdl1Interceptor.java Tue Aug 14 12:40:31 2007
@@ -72,7 +72,7 @@
while (partWrapper != null) {
if (!JbiConstants.WSDL11_WRAPPER_NAMESPACE.equals(element.getNamespaceURI()) ||
!JbiConstants.WSDL11_WRAPPER_PART_LOCALNAME.equals(partWrapper.getLocalName())) {
- throw new Fault("Unexpected part wrapper element '" + QNameUtil.toString(element)
+ throw new Fault("Unexpected part wrapper element '" + QNameUtil.toString(partWrapper)
+ "' expected '{" + JbiConstants.WSDL11_WRAPPER_NAMESPACE + "}part'");
}
NodeList nodes = partWrapper.getChildNodes();
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/wsdl/validator/WSIBPValidator.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/wsdl/validator/WSIBPValidator.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/wsdl/validator/WSIBPValidator.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/main/java/org/apache/servicemix/soap/wsdl/validator/WSIBPValidator.java Tue Aug 14 12:40:31 2007
@@ -226,9 +226,11 @@
validateHeaderParts(binding,
WSDLUtils.getExtensions(bop.getBindingInput(), SOAPHeader.class),
bop.getOperation().getInput().getMessage());
- validateHeaderParts(binding,
- WSDLUtils.getExtensions(bop.getBindingOutput(), SOAPHeader.class),
- bop.getOperation().getOutput().getMessage());
+ if (bop.getOperation().getOutput() != null) {
+ validateHeaderParts(binding,
+ WSDLUtils.getExtensions(bop.getBindingOutput(), SOAPHeader.class),
+ bop.getOperation().getOutput().getMessage());
+ }
/*
for (BindingFault fault : getBindingFaults(bop)) {
validateFaultParts(binding,
Modified: incubator/servicemix/trunk/common/servicemix-soap2/src/test/java/org/apache/servicemix/soap/interceptors/jbi/MockExchangeFactory.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/common/servicemix-soap2/src/test/java/org/apache/servicemix/soap/interceptors/jbi/MockExchangeFactory.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/common/servicemix-soap2/src/test/java/org/apache/servicemix/soap/interceptors/jbi/MockExchangeFactory.java (original)
+++ incubator/servicemix/trunk/common/servicemix-soap2/src/test/java/org/apache/servicemix/soap/interceptors/jbi/MockExchangeFactory.java Tue Aug 14 12:40:31 2007
@@ -38,17 +38,20 @@
str = str.replace("http://www.w3.org/2006/01/wsdl/", "http://www.w3.org/2004/08/wsdl/");
pattern = URI.create(str);
}
+ MessageExchange me;
if (JbiConstants.IN_ONLY.equals(pattern)) {
- return createInOnlyExchange();
+ me = createInOnlyExchange();
} else if (JbiConstants.IN_OUT.equals(pattern)) {
- return createInOutExchange();
+ me = createInOutExchange();
} else if (JbiConstants.IN_OPTIONAL_OUT.equals(pattern)) {
- return createInOptionalOutExchange();
+ me = createInOptionalOutExchange();
} else if (JbiConstants.ROBUST_IN_ONLY.equals(pattern)) {
- return createRobustInOnlyExchange();
+ me = createRobustInOnlyExchange();
} else {
throw new IllegalArgumentException("Unhandled pattern: " + pattern);
}
+ ((MockMessageExchange) me).setPattern(pattern);
+ return me;
}
public InOnly createInOnlyExchange() throws MessagingException {
return new MockInOnly();
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractConsumerEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractConsumerEndpoint.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractConsumerEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/AbstractConsumerEndpoint.java Tue Aug 14 12:40:31 2007
@@ -46,6 +46,8 @@
import org.springframework.jms.support.destination.DynamicDestinationResolver;
public abstract class AbstractConsumerEndpoint extends ConsumerEndpoint {
+
+ protected static final String PROP_JMS_CONTEXT = JmsContext.class.getName();
private JmsConsumerMarshaler marshaler = new DefaultConsumerMarshaler();
private boolean synchronous = true;
@@ -65,6 +67,7 @@
private long replyTimeToLive = Message.DEFAULT_TIME_TO_LIVE;
private Map replyProperties;
+ private boolean stateless;
private StoreFactory storeFactory;
private Store store;
@@ -276,6 +279,14 @@
this.synchronous = synchronous;
}
+ public boolean isStateless() {
+ return stateless;
+ }
+
+ public void setStateless(boolean stateless) {
+ this.stateless = stateless;
+ }
+
public Store getStore() {
return store;
}
@@ -302,7 +313,7 @@
if (template == null) {
template = new JmsTemplate(getConnectionFactory());
}
- if (store == null) {
+ if (store == null && !stateless) {
if (storeFactory == null) {
storeFactory = new MemoryStoreFactory();
}
@@ -321,7 +332,12 @@
}
public void process(MessageExchange exchange) throws Exception {
- JmsContext context = (JmsContext) store.load(exchange.getExchangeId());
+ JmsContext context;
+ if (stateless) {
+ context = (JmsContext) exchange.getProperty(PROP_JMS_CONTEXT);
+ } else {
+ context = (JmsContext) store.load(exchange.getExchangeId());
+ }
processExchange(exchange, null, context);
}
@@ -398,8 +414,8 @@
logger.trace("Received: " + jmsMessage);
}
try {
- JmsContext context = marshaler.createContext(jmsMessage, getContext());
- MessageExchange exchange = marshaler.createExchange(context);
+ JmsContext context = marshaler.createContext(jmsMessage);
+ MessageExchange exchange = marshaler.createExchange(context, getContext());
configureExchangeTarget(exchange);
if (synchronous) {
sendSync(exchange);
@@ -407,7 +423,11 @@
processExchange(exchange, session, context);
}
} else {
- store.store(exchange.getExchangeId(), context);
+ if (stateless) {
+ exchange.setProperty(PROP_JMS_CONTEXT, context);
+ } else {
+ store.store(exchange.getExchangeId(), context);
+ }
send(exchange);
}
} catch (JMSException e) {
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultConsumerMarshaler.java Tue Aug 14 12:40:31 2007
@@ -16,6 +16,10 @@
*/
package org.apache.servicemix.jms.endpoints;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
import java.net.URI;
import javax.jbi.component.ComponentContext;
@@ -57,13 +61,13 @@
this.mep = mep;
}
- public JmsContext createContext(Message message, ComponentContext context) throws Exception {
- return new Context(message, context);
+ public JmsContext createContext(Message message) throws Exception {
+ return new Context(message);
}
- public MessageExchange createExchange(JmsContext context) throws Exception {
- Context ctx = (Context) context;
- MessageExchange exchange = ctx.componentContext.getDeliveryChannel().createExchangeFactory().createExchange(mep);
+ public MessageExchange createExchange(JmsContext jmsContext, ComponentContext jbiContext) throws Exception {
+ Context ctx = (Context) jmsContext;
+ MessageExchange exchange = jbiContext.getDeliveryChannel().createExchangeFactory().createExchange(mep);
NormalizedMessage inMessage = exchange.createMessage();
populateMessage(ctx.message, inMessage);
exchange.setMessage(inMessage, "in");
@@ -94,15 +98,19 @@
}
}
- protected static class Context implements JmsContext {
+ protected static class Context implements JmsContext, Serializable {
Message message;
- ComponentContext componentContext;
- Context(Message message, ComponentContext componentContext) {
+ Context(Message message) {
this.message = message;
- this.componentContext = componentContext;
}
public Message getMessage() {
return this.message;
+ }
+ private void writeObject(ObjectOutputStream out) throws IOException {
+ out.writeObject(message);
+ }
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ message = (Message) in.readObject();
}
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/DefaultProviderMarshaler.java Tue Aug 14 12:40:31 2007
@@ -23,8 +23,10 @@
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
+import javax.xml.transform.Source;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
public class DefaultProviderMarshaler implements JmsProviderMarshaler {
@@ -56,9 +58,14 @@
return text;
}
- public Object getDestination(MessageExchange exchange) {
- // TODO Auto-generated method stub
- return null;
+ public void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception {
+ if (message instanceof TextMessage) {
+ TextMessage textMessage = (TextMessage) message;
+ Source source = new StringSource(textMessage.getText());
+ normalizedMessage.setContent(source);
+ } else {
+ throw new UnsupportedOperationException("JMS message is not a TextMessage");
+ }
}
-
+
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerMarshaler.java Tue Aug 14 12:40:31 2007
@@ -29,9 +29,9 @@
Message getMessage();
}
- JmsContext createContext(Message message, ComponentContext context) throws Exception;
+ JmsContext createContext(Message message) throws Exception;
- MessageExchange createExchange(JmsContext context) throws Exception;
+ MessageExchange createExchange(JmsContext jmsContext, ComponentContext jbiContext) throws Exception;
Message createOut(MessageExchange exchange,
NormalizedMessage outMsg,
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderEndpoint.java Tue Aug 14 12:40:31 2007
@@ -27,10 +27,16 @@
import org.apache.servicemix.common.endpoints.ProviderEndpoint;
import org.apache.servicemix.jms.JmsEndpointType;
+import org.apache.servicemix.store.Store;
+import org.apache.servicemix.store.StoreFactory;
+import org.apache.servicemix.store.memory.MemoryStoreFactory;
+import org.springframework.jms.UncategorizedJmsException;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.JmsTemplate102;
import org.springframework.jms.core.MessageCreator;
+import org.springframework.jms.core.SessionCallback;
import org.springframework.jms.support.destination.DestinationResolver;
+import org.springframework.jms.support.destination.DynamicDestinationResolver;
/**
*
@@ -40,6 +46,9 @@
*/
public class JmsProviderEndpoint extends ProviderEndpoint implements JmsEndpointType {
+ private static final String MSG_SELECTOR_START = "JMSCorrelationID='";
+ private static final String MSG_SELECTOR_END = "'";
+
private JmsProviderMarshaler marshaler = new DefaultProviderMarshaler();
private DestinationChooser destinationChooser = new SimpleDestinationChooser();
private JmsTemplate template;
@@ -47,7 +56,7 @@
private boolean jms102;
private ConnectionFactory connectionFactory;
private boolean pubSubDomain;
- private DestinationResolver destinationResolver;
+ private DestinationResolver destinationResolver = new DynamicDestinationResolver();
private Destination destination;
private String destinationName;
private boolean messageIdEnabled = true;
@@ -59,6 +68,13 @@
private int priority = Message.DEFAULT_PRIORITY;
private long timeToLive = Message.DEFAULT_TIME_TO_LIVE;
+ private Destination replyDestination;
+ private String replyDestinationName;
+
+ private boolean stateless;
+ private StoreFactory storeFactory;
+ private Store store;
+
/**
* @return the destination
*/
@@ -289,6 +305,46 @@
this.timeToLive = timeToLive;
}
+ public boolean isStateless() {
+ return stateless;
+ }
+
+ public void setStateless(boolean stateless) {
+ this.stateless = stateless;
+ }
+
+ public StoreFactory getStoreFactory() {
+ return storeFactory;
+ }
+
+ public void setStoreFactory(StoreFactory storeFactory) {
+ this.storeFactory = storeFactory;
+ }
+
+ public Store getStore() {
+ return store;
+ }
+
+ public void setStore(Store store) {
+ this.store = store;
+ }
+
+ public Destination getReplyDestination() {
+ return replyDestination;
+ }
+
+ public void setReplyDestination(Destination replyDestination) {
+ this.replyDestination = replyDestination;
+ }
+
+ public String getReplyDestinationName() {
+ return replyDestinationName;
+ }
+
+ public void setReplyDestinationName(String replyDestinationName) {
+ this.replyDestinationName = replyDestinationName;
+ }
+
protected void processInOnly(final MessageExchange exchange, final NormalizedMessage in) throws Exception {
MessageCreator creator = new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
@@ -316,16 +372,114 @@
}
}
- protected void processInOut(MessageExchange exchange, NormalizedMessage in) throws Exception {
-
+ protected void processInOut(final MessageExchange exchange, final NormalizedMessage in, final NormalizedMessage out) throws Exception {
+ SessionCallback callback = new SessionCallback() {
+ public Object doInJms(Session session) throws JMSException {
+ try {
+ processInOutInSession(exchange, in, out, session);
+ return null;
+ } catch (JMSException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new UncategorizedJmsException(e);
+ }
+ }
+ };
+ template.execute(callback, true);
+ }
+
+ protected void processInOutInSession(final MessageExchange exchange,
+ final NormalizedMessage in,
+ final NormalizedMessage out,
+ final Session session) throws Exception {
+ // Create destinations
+ final Destination dest = getDestination(exchange, in, session);
+ final Destination replyDest = getReplyDestination(exchange, out, session);
+ // Create message and send it
+ final Message sendJmsMsg = marshaler.createMessage(exchange, in, session);
+ //setCorrelationID(sendJmsMsg, exchange);
+ sendJmsMsg.setJMSReplyTo(replyDest);
+ template.send(dest, new MessageCreator() {
+ public Message createMessage(Session session) throws JMSException {
+ return sendJmsMsg;
+ }
+ });
+ // Create selector
+ String jmsId = sendJmsMsg.getJMSMessageID();
+ String selector = MSG_SELECTOR_START + jmsId + MSG_SELECTOR_END;
+ //Receiving JMS Message, Creating and Returning NormalizedMessage out
+ Message receiveJmsMsg = template.receiveSelected(replyDest, selector);
+ if (receiveJmsMsg == null) {
+ throw new IllegalStateException("Unable to receive response");
+ }
+ marshaler.populateMessage(receiveJmsMsg, exchange, out);
+ }
+
+ protected Destination getDestination(MessageExchange exchange, Object message, Session session) throws JMSException {
+ Object dest = null;
+ // Let the destinationChooser a chance to choose the destination
+ if (destinationChooser != null) {
+ dest = destinationChooser.chooseDestination(exchange, message);
+ }
+ // Default to destinationName properties
+ if (dest == null) {
+ dest = destinationName;
+ }
+ // Resolve destination if needed
+ if (dest instanceof Destination) {
+ return (Destination) dest;
+ } else if (dest instanceof String) {
+ return destinationResolver.resolveDestinationName(session,
+ (String) dest,
+ isPubSubDomain());
+ }
+ throw new IllegalStateException("Unable to choose destination for exchange " + exchange);
+ }
+
+ protected Destination getReplyDestination(MessageExchange exchange, Object message, Session session) throws JMSException {
+ Object dest = null;
+ // Let the destinationChooser a chance to choose the destination
+ if (destinationChooser != null) {
+ dest = destinationChooser.chooseDestination(exchange, message);
+ }
+ // Default to replyDestination / replyDestinationName properties
+ if (dest == null) {
+ dest = replyDestination;
+ }
+ if (dest == null) {
+ dest = replyDestinationName;
+ }
+ // Resolve destination if needed
+ if (dest instanceof Destination) {
+ return (Destination) dest;
+ } else if (dest instanceof String) {
+ return destinationResolver.resolveDestinationName(session,
+ (String) dest,
+ isPubSubDomain());
+ }
+ throw new IllegalStateException("Unable to choose replyDestination for exchange " + exchange);
}
public synchronized void start() throws Exception {
template = createTemplate();
+ if (store == null && !stateless) {
+ if (storeFactory == null) {
+ storeFactory = new MemoryStoreFactory();
+ }
+ store = storeFactory.open(getService().toString() + getEndpoint());
+ }
super.start();
}
public synchronized void stop() throws Exception {
+ if (store != null) {
+ if (storeFactory != null) {
+ storeFactory.close(store);
+ }
+ store = null;
+ }
super.stop();
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsProviderMarshaler.java Tue Aug 14 12:40:31 2007
@@ -23,7 +23,8 @@
public interface JmsProviderMarshaler {
- Object getDestination(MessageExchange exchange);
-
Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session) throws Exception;
+
+ void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception;
+
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java Tue Aug 14 12:40:31 2007
@@ -20,6 +20,7 @@
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.Serializable;
import javax.jbi.component.ComponentContext;
import javax.jbi.messaging.Fault;
@@ -86,16 +87,16 @@
this.useJbiWrapper = useJbiWrapper;
}
- public JmsContext createContext(Message message, ComponentContext context) throws Exception {
- return new Context(message, context);
+ public JmsContext createContext(Message message) throws Exception {
+ return new Context(message);
}
- public MessageExchange createExchange(JmsContext context) throws Exception {
+ public MessageExchange createExchange(JmsContext jmsContext, ComponentContext jbiContext) throws Exception {
org.apache.servicemix.soap.api.Message msg = binding.createMessage();
- ((Context) context).msg = msg;
- msg.put(ComponentContext.class, ((Context) context).componentContext);
+ ((Context) jmsContext).msg = msg;
+ msg.put(ComponentContext.class, jbiContext);
msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
- msg.setContent(InputStream.class, new ByteArrayInputStream(((TextMessage) context.getMessage()).getText().getBytes()));
+ msg.setContent(InputStream.class, new ByteArrayInputStream(((TextMessage) jmsContext.getMessage()).getText().getBytes()));
InterceptorChain phase = getChain(Phase.ServerIn);
phase.doIntercept(msg);
return msg.getContent(MessageExchange.class);
@@ -163,13 +164,11 @@
return chain;
}
- protected static class Context implements JmsContext {
+ protected static class Context implements JmsContext, Serializable {
Message message;
- ComponentContext componentContext;
org.apache.servicemix.soap.api.Message msg;
- Context(Message message, ComponentContext componentContext) {
+ Context(Message message) {
this.message = message;
- this.componentContext = componentContext;
}
public Message getMessage() {
return this.message;
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderEndpoint.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderEndpoint.java Tue Aug 14 12:40:31 2007
@@ -16,6 +16,31 @@
*/
package org.apache.servicemix.jms.endpoints;
+import java.io.IOException;
+
+import javax.jbi.management.DeploymentException;
+import javax.wsdl.Definition;
+import javax.wsdl.Port;
+import javax.wsdl.Service;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.soap12.SOAP12Address;
+
+import org.w3c.dom.Element;
+
+import org.apache.servicemix.soap.api.Policy;
+import org.apache.servicemix.soap.util.DomUtil;
+import org.apache.servicemix.soap.wsdl.BindingFactory;
+import org.apache.servicemix.soap.wsdl.WSDLUtils;
+import org.apache.servicemix.soap.wsdl.validator.WSIBPValidator;
+import org.apache.woden.WSDLFactory;
+import org.apache.woden.WSDLReader;
+import org.apache.woden.types.NCName;
+import org.apache.woden.wsdl20.Description;
+import org.apache.woden.wsdl20.Endpoint;
+import org.apache.woden.wsdl20.xml.DescriptionElement;
+import org.springframework.core.io.Resource;
+
/**
*
* @author gnodet
@@ -24,20 +49,149 @@
*/
public class JmsSoapProviderEndpoint extends JmsProviderEndpoint {
- public JmsSoapProviderEndpoint() {
- setMarshaler(new JmsSoapProviderMarshaler());
+ private Resource wsdl;
+ private boolean useJbiWrapper = true;
+ private boolean validateWsdl = true;
+ private Policy[] policies;
+
+ public Resource getWsdl() {
+ return wsdl;
}
-
- protected JmsSoapProviderMarshaler getSoapMarshaler() {
- return (JmsSoapProviderMarshaler) getMarshaler();
+
+ public void setWsdl(Resource wsdl) {
+ this.wsdl = wsdl;
+ }
+
+ public boolean isValidateWsdl() {
+ return validateWsdl;
+ }
+
+ public void setValidateWsdl(boolean validateWsdl) {
+ this.validateWsdl = validateWsdl;
+ }
+
+ public boolean isUseJbiWrapper() {
+ return useJbiWrapper;
+ }
+
+ public void setUseJbiWrapper(boolean useJbiWrapper) {
+ this.useJbiWrapper = useJbiWrapper;
+ }
+
+ public Policy[] getPolicies() {
+ return policies;
+ }
+
+ public void setPolicies(Policy[] policies) {
+ this.policies = policies;
+ }
+
+
+ @Override
+ public void validate() throws DeploymentException {
+ if (wsdl == null) {
+ throw new DeploymentException("wsdl property must be set");
+ }
+ JmsSoapProviderMarshaler marshaler = new JmsSoapProviderMarshaler();
+ try {
+ description = DomUtil.parse(wsdl.getInputStream());
+ Element elem = description.getDocumentElement();
+ if (WSDLUtils.WSDL1_NAMESPACE.equals(elem.getNamespaceURI())) {
+ validateWsdl1(marshaler);
+ } else if (WSDLUtils.WSDL2_NAMESPACE.equals(elem.getNamespaceURI())) {
+ validateWsdl2(marshaler);
+ } else {
+ throw new DeploymentException("Unrecognized wsdl namespace: " + elem.getNamespaceURI());
+ }
+ marshaler.setUseJbiWrapper(useJbiWrapper);
+ marshaler.setPolicies(policies);
+ setMarshaler(marshaler);
+ } catch (DeploymentException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new DeploymentException("Unable to read WSDL from: " + wsdl, e);
+ }
+ super.validate();
+ }
+
+ protected void validateWsdl1(JmsSoapProviderMarshaler marshaler) throws WSDLException, IOException, DeploymentException {
+ Definition def = WSDLUtils.createWSDL11Reader().readWSDL(wsdl.getURL().toString());
+ if (validateWsdl) {
+ WSIBPValidator validator = new WSIBPValidator(def);
+ if (!validator.isValid()) {
+ throw new DeploymentException("WSDL is not WS-I BP compliant: " + validator.getErrors());
+ }
+ }
+ Service svc;
+ if (getService() != null) {
+ svc = def.getService(getService());
+ if (svc == null) {
+ throw new DeploymentException("Could not find service '" + getService() + "' in wsdl");
+ }
+ } else if (def.getServices().size() == 1) {
+ svc = (Service) def.getServices().values().iterator().next();
+ setService(svc.getQName());
+ } else {
+ throw new DeploymentException("If service is not set, the WSDL must contain a single service definition");
+ }
+ Port port;
+ if (getEndpoint() != null) {
+ port = svc.getPort(getEndpoint());
+ if (port == null) {
+ throw new DeploymentException("Cound not find port '" + getEndpoint() + "' "
+ + "in wsdl for service '" + getService() + "'");
+ }
+ } else if (svc.getPorts().size() == 1) {
+ port = (Port) svc.getPorts().values().iterator().next();
+ setEndpoint(port.getName());
+ } else {
+ throw new DeploymentException("If endpoint is not set, the WSDL service '" + getService() + "' "
+ + "must contain a single port definition");
+ }
+ SOAPAddress sa11 = WSDLUtils.getExtension(port, SOAPAddress.class);
+ SOAP12Address sa12 = WSDLUtils.getExtension(port, SOAP12Address.class);
+ if (sa11 != null) {
+ marshaler.setBaseUrl(sa11.getLocationURI());
+ } else if (sa12 != null) {
+ marshaler.setBaseUrl(sa12.getLocationURI());
+ } else {
+ throw new DeploymentException("No SOAP address defined on port '" + port.getName() + "'");
+ }
+ description = WSDLUtils.getWSDL11Factory().newWSDLWriter().getDocument(def);
+ marshaler.setBinding(BindingFactory.createBinding(port));
}
- public final void setMarshaler(JmsProviderMarshaler marshaler) {
- if (marshaler instanceof JmsSoapProviderMarshaler) {
- super.setMarshaler(marshaler);
+ protected void validateWsdl2(JmsSoapProviderMarshaler marshaler) throws
+ org.apache.woden.WSDLException, IOException, DeploymentException {
+ WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
+ DescriptionElement descElement = reader.readWSDL(wsdl.getURL().toString());
+ Description desc = descElement.toComponent();
+ org.apache.woden.wsdl20.Service svc;
+ if (getService() != null) {
+ svc = desc.getService(getService());
+ if (svc == null) {
+ throw new DeploymentException("Could not find service '" + getService() + "' in wsdl");
+ }
+ } else if (desc.getServices().length == 1) {
+ svc = desc.getServices()[0];
+ setService(svc.getName());
+ } else {
+ throw new DeploymentException("If service is not set, the WSDL must contain a single service definition");
+ }
+ Endpoint endpoint;
+ if (getEndpoint() != null) {
+ endpoint = svc.getEndpoint(new NCName(getEndpoint()));
+ if (endpoint == null) {
+ throw new DeploymentException("Cound not find endpoint '" + getEndpoint() + "' in wsdl for service '" + getService() + "'");
+ }
+ } else if (svc.getEndpoints().length == 1) {
+ endpoint = svc.getEndpoints()[0];
+ setEndpoint(endpoint.getName().toString());
} else {
- throw new IllegalArgumentException("marhaler must be a SOAP marshaler");
+ throw new DeploymentException("If endpoint is not set, the WSDL service '" + getService() + "' "
+ + "must contain a single port definition");
}
+ marshaler.setBinding(BindingFactory.createBinding(endpoint));
}
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderMarshaler.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderMarshaler.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderMarshaler.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapProviderMarshaler.java Tue Aug 14 12:40:31 2007
@@ -16,21 +16,102 @@
*/
package org.apache.servicemix.jms.endpoints;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import javax.jms.Message;
import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.servicemix.soap.api.InterceptorChain;
+import org.apache.servicemix.soap.api.InterceptorProvider.Phase;
+import org.apache.servicemix.soap.api.Policy;
+import org.apache.servicemix.soap.api.model.Binding;
+import org.apache.servicemix.soap.interceptors.jbi.JbiConstants;
public class JmsSoapProviderMarshaler implements JmsProviderMarshaler {
+ private Binding<?> binding;
+ private boolean useJbiWrapper = true;
+ private Policy[] policies;
+ private String baseUrl;
+
+ public Binding<?> getBinding() {
+ return binding;
+ }
+
+ public void setBinding(Binding<?> binding) {
+ this.binding = binding;
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
+ }
+
+ public void setBaseUrl(String baseUrl) {
+ this.baseUrl = baseUrl;
+ }
+
+ public boolean isUseJbiWrapper() {
+ return useJbiWrapper;
+ }
+
+ public void setUseJbiWrapper(boolean useJbiWrapper) {
+ this.useJbiWrapper = useJbiWrapper;
+ }
+
+ public Policy[] getPolicies() {
+ return policies;
+ }
+
+ public void setPolicies(Policy[] policies) {
+ this.policies = policies;
+ }
+
public Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session) throws Exception {
- // TODO Auto-generated method stub
- return null;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ org.apache.servicemix.soap.api.Message msg = binding.createMessage();
+ exchange.setProperty(org.apache.servicemix.soap.api.Message.class.getName(), null);
+ msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
+ msg.setContent(MessageExchange.class, exchange);
+ msg.setContent(NormalizedMessage.class, in);
+ msg.setContent(OutputStream.class, baos);
+ exchange.setProperty(Message.class.getName(), msg);
+
+ InterceptorChain phaseOut = getChain(Phase.ClientOut);
+ phaseOut.doIntercept(msg);
+ TextMessage jmsMessage = session.createTextMessage();
+ jmsMessage.setText(baos.toString());
+ return jmsMessage;
+ }
+
+ public void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception {
+ org.apache.servicemix.soap.api.Message req = (org.apache.servicemix.soap.api.Message) exchange.getProperty(Message.class.getName());
+ exchange.setProperty(org.apache.servicemix.soap.api.Message.class.getName(), null);
+ org.apache.servicemix.soap.api.Message msg = binding.createMessage(req);
+ msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
+ msg.setContent(MessageExchange.class, exchange);
+ msg.setContent(NormalizedMessage.class, normalizedMessage);
+ String str = ((TextMessage) message).getText();
+ msg.setContent(InputStream.class, new ByteArrayInputStream(str.getBytes()));
+
+ InterceptorChain phaseIn = getChain(Phase.ClientIn);
+ phaseIn.doIntercept(msg);
}
- public Object getDestination(MessageExchange exchange) {
- // TODO Auto-generated method stub
- return null;
+ protected InterceptorChain getChain(Phase phase) {
+ InterceptorChain chain = binding.getInterceptorChain(phase);
+ if (policies != null) {
+ for (int i = 0; i < policies.length; i++) {
+ chain.add(policies[i].getInterceptors(phase));
+ }
+ }
+ return chain;
}
}
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsConsumerEndpointTest.java Tue Aug 14 12:40:31 2007
@@ -77,6 +77,23 @@
receiver.getMessageList().assertMessagesReceived(1);
}
+ public void testConsumerStateless() throws Exception {
+ JmsComponent component = new JmsComponent();
+ JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
+ endpoint.setService(new QName("jms"));
+ endpoint.setEndpoint("endpoint");
+ endpoint.setTargetService(new QName("receiver"));
+ endpoint.setListenerType("simple");
+ endpoint.setConnectionFactory(connectionFactory);
+ endpoint.setDestinationName("destination");
+ endpoint.setStateless(true);
+ component.setEndpoints(new JmsConsumerEndpoint[] {endpoint});
+ container.activateComponent(component, "servicemix-jms");
+
+ jmsTemplate.convertAndSend("destination", "<hello>world</hello>");
+ receiver.getMessageList().assertMessagesReceived(1);
+ }
+
public void testConsumerSimpleJmsTx() throws Exception {
JmsComponent component = new JmsComponent();
JmsConsumerEndpoint endpoint = new JmsConsumerEndpoint();
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/java/org/apache/servicemix/jms/JmsProviderEndpointTest.java Tue Aug 14 12:40:31 2007
@@ -16,13 +16,24 @@
*/
package org.apache.servicemix.jms;
+import java.io.ByteArrayOutputStream;
+
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
+import javax.jms.JMSException;
import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
import javax.xml.namespace.QName;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jbi.util.FileUtil;
import org.apache.servicemix.jms.endpoints.JmsProviderEndpoint;
+import org.apache.servicemix.jms.endpoints.JmsSoapProviderEndpoint;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.jms.core.MessageCreator;
public class JmsProviderEndpointTest extends AbstractJmsTestSupport {
@@ -44,6 +55,82 @@
Message msg = jmsTemplate.receive("destination");
assertNotNull(msg);
+ }
+
+ public void testSoapProviderInOnly() throws Exception {
+ JmsComponent component = new JmsComponent();
+
+ JmsSoapProviderEndpoint endpoint = new JmsSoapProviderEndpoint();
+ endpoint.setService(new QName("uri:HelloWorld", "HelloService"));
+ endpoint.setEndpoint("HelloPort");
+ endpoint.setConnectionFactory(connectionFactory);
+ endpoint.setDestinationName("destination");
+ endpoint.setWsdl(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC.wsdl"));
+ component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
+ container.activateComponent(component, "servicemix-jms");
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml").getInputStream(), baos);
+ InOnly me = client.createInOnlyExchange();
+ me.getInMessage().setContent(new StringSource(baos.toString()));
+ me.setOperation(new QName("uri:HelloWorld", "OneWay"));
+ me.setService(new QName("uri:HelloWorld", "HelloService"));
+ client.sendSync(me);
+ assertEquals(ExchangeStatus.DONE, me.getStatus());
+
+ Message msg = jmsTemplate.receive("destination");
+ assertNotNull(msg);
+ System.err.println(((TextMessage) msg).getText());
+ }
+
+ public void testSoapProviderInOut() throws Exception {
+ JmsComponent component = new JmsComponent();
+
+ JmsSoapProviderEndpoint endpoint = new JmsSoapProviderEndpoint();
+ endpoint.setService(new QName("uri:HelloWorld", "HelloService"));
+ endpoint.setEndpoint("HelloPort");
+ endpoint.setConnectionFactory(connectionFactory);
+ endpoint.setDestinationName("destination");
+ endpoint.setReplyDestinationName("reply");
+ endpoint.setWsdl(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC.wsdl"));
+ component.setEndpoints(new JmsProviderEndpoint[] {endpoint});
+ container.activateComponent(component, "servicemix-jms");
+
+ Thread th = new Thread() {
+ public void run() {
+ try {
+ final Message msg = jmsTemplate.receive("destination");
+ assertNotNull(msg);
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Output.xml")
+ .getInputStream(), baos);
+ jmsTemplate.send("reply", new MessageCreator() {
+ public Message createMessage(Session session) throws JMSException {
+ TextMessage rep = session.createTextMessage(baos.toString());
+ rep.setJMSCorrelationID(msg.getJMSMessageID());
+ return rep;
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ };
+ th.start();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ FileUtil.copyInputStream(new ClassPathResource("org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml").getInputStream(), baos);
+ InOut me = client.createInOutExchange();
+ me.getInMessage().setContent(new StringSource(baos.toString()));
+ me.setOperation(new QName("uri:HelloWorld", "Hello"));
+ me.setService(new QName("uri:HelloWorld", "HelloService"));
+ client.sendSync(me);
+ assertEquals(ExchangeStatus.ACTIVE, me.getStatus());
+ assertNotNull(me.getOutMessage());
+ assertNotNull(me.getOutMessage().getContent());
+ System.err.println(new SourceTransformer().contentToString(me.getOutMessage()));
+ client.done(me);
+
}
}
Added: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml?view=auto&rev=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml (added)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-Hello.xml Tue Aug 14 12:40:31 2007
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper">
+
+ <jbi:part>
+ <HelloHeader1 xmlns="uri:HelloWorld">
+ <id1>abcdefghij</id1>
+ </HelloHeader1>
+ </jbi:part>
+
+ <jbi:part>
+ <HelloHeader2 xmlns="uri:HelloWorld">
+ <id2>1234567890</id2>
+ </HelloHeader2>
+ </jbi:part>
+
+ <jbi:part>
+ foo
+ </jbi:part>
+
+ <jbi:part>
+ bar
+ </jbi:part>
+
+</jbi:message>
Added: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml?view=auto&rev=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml (added)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Input-OneWay.xml Tue Aug 14 12:40:31 2007
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper">
+
+ <jbi:part>
+ Hello
+ </jbi:part>
+
+</jbi:message>
Added: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Output.xml
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Output.xml?view=auto&rev=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Output.xml (added)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC-Output.xml Tue Aug 14 12:40:31 2007
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
+
+ <SOAP-ENV:Body>
+ <HelloResponse xmlns="uri:HelloWorld">
+ <text xmlns="uri:HelloWorld">foo</text>
+ </HelloResponse>
+ </SOAP-ENV:Body>
+
+</SOAP-ENV:Envelope>
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC.wsdl
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC.wsdl?view=diff&rev=565873&r1=565872&r2=565873
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC.wsdl (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/test/resources/org/apache/servicemix/jms/HelloWorld-RPC.wsdl Tue Aug 14 12:40:31 2007
@@ -44,6 +44,10 @@
</schema>
</types>
+ <message name="OneWayRequest">
+ <part name="param1" type="xsd:string"/>
+ </message>
+
<message name="HelloRequest">
<part name="header1" element="tns:HelloHeader1"/>
<part name="header2" element="tns:HelloHeader2"/>
@@ -56,6 +60,9 @@
</message>
<portType name="HelloPortType">
+ <operation name="OneWay">
+ <input message="tns:OneWayRequest"/>
+ </operation>
<operation name="Hello">
<input message="tns:HelloRequest"/>
<output message="tns:HelloResponse"/>
@@ -64,6 +71,12 @@
<binding name="HelloSoapBinding" type="tns:HelloPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="OneWay">
+ <soap:operation soapAction=""/>
+ <input>
+ <soap:body use="literal" parts="param1" namespace="uri:HelloWorld"/>
+ </input>
+ </operation>
<operation name="Hello">
<soap:operation soapAction=""/>
<input>