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/03/15 18:06:09 UTC
svn commit: r518691 -
/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/
Author: gnodet
Date: Thu Mar 15 10:06:08 2007
New Revision: 518691
URL: http://svn.apache.org/viewvc?view=rev&rev=518691
Log:
Work on jms soap endpoints
Modified:
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/JmsConsumerEndpoint.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerEndpoint.java
incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerMarshaler.java
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=518691&r1=518690&r2=518691
==============================================================================
--- 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 Thu Mar 15 10:06:08 2007
@@ -23,13 +23,17 @@
import javax.jbi.JBIException;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
+import javax.jbi.servicedesc.ServiceEndpoint;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
+import javax.xml.namespace.QName;
+import org.apache.servicemix.common.DefaultComponent;
+import org.apache.servicemix.common.ServiceUnit;
import org.apache.servicemix.common.endpoints.ConsumerEndpoint;
import org.apache.servicemix.jms.endpoints.JmsConsumerMarshaler.JmsContext;
import org.springframework.jms.core.JmsTemplate;
@@ -61,6 +65,18 @@
private Map<String, JmsContext> pendingExchanges;
+ public AbstractConsumerEndpoint() {
+ super();
+ }
+
+ public AbstractConsumerEndpoint(DefaultComponent component, ServiceEndpoint endpoint) {
+ super(component, endpoint);
+ }
+
+ public AbstractConsumerEndpoint(ServiceUnit serviceUnit, QName service, String endpoint) {
+ super(serviceUnit, service, endpoint);
+ }
+
/**
* @return the destinationChooser
*/
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerEndpoint.java?view=diff&rev=518691&r1=518690&r2=518691
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsConsumerEndpoint.java Thu Mar 15 10:06:08 2007
@@ -17,13 +17,17 @@
package org.apache.servicemix.jms.endpoints;
import javax.jbi.management.DeploymentException;
+import javax.jbi.servicedesc.ServiceEndpoint;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.transaction.TransactionManager;
+import javax.xml.namespace.QName;
+import org.apache.servicemix.common.DefaultComponent;
+import org.apache.servicemix.common.ServiceUnit;
import org.apache.servicemix.jms.JmsEndpointType;
import org.springframework.jms.connection.JmsTransactionManager;
import org.springframework.jms.connection.JmsTransactionManager102;
@@ -86,6 +90,20 @@
private ServerSessionFactory serverSessionFactory;
private AbstractMessageListenerContainer listenerContainer;
+
+
+ public JmsConsumerEndpoint() {
+ super();
+ }
+
+ public JmsConsumerEndpoint(DefaultComponent component, ServiceEndpoint endpoint) {
+ super(component, endpoint);
+ }
+
+ public JmsConsumerEndpoint(ServiceUnit serviceUnit, QName service, String endpoint) {
+ super(serviceUnit, service, endpoint);
+ }
+
/**
* @return the transacted
Modified: incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerEndpoint.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerEndpoint.java?view=diff&rev=518691&r1=518690&r2=518691
==============================================================================
--- incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerEndpoint.java (original)
+++ incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/endpoints/JmsSoapConsumerEndpoint.java Thu Mar 15 10:06:08 2007
@@ -16,6 +16,31 @@
*/
package org.apache.servicemix.jms.endpoints;
+import javax.jbi.management.DeploymentException;
+import javax.jbi.servicedesc.ServiceEndpoint;
+import javax.wsdl.Definition;
+import javax.wsdl.Port;
+import javax.wsdl.Service;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.soap12.SOAP12Address;
+import javax.xml.namespace.QName;
+
+import org.apache.servicemix.common.DefaultComponent;
+import org.apache.servicemix.common.ServiceUnit;
+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;
+import org.w3c.dom.Element;
+
/**
*
* @author gnodet
@@ -24,20 +49,152 @@
*/
public class JmsSoapConsumerEndpoint extends JmsConsumerEndpoint {
+ private Resource wsdl;
+ private boolean useJbiWrapper = true;
+ private boolean validateWsdl = true;
+ private Policy[] policies;
+
public JmsSoapConsumerEndpoint() {
- setMarshaler(new JmsSoapConsumerMarshaler());
+ super();
}
-
- protected JmsSoapConsumerMarshaler getSoapMarshaler() {
- return (JmsSoapConsumerMarshaler) getMarshaler();
+
+ public JmsSoapConsumerEndpoint(DefaultComponent component, ServiceEndpoint endpoint) {
+ super(component, endpoint);
}
-
- public void setMarshaler(JmsConsumerMarshaler marshaler) {
- if (marshaler instanceof JmsSoapConsumerMarshaler) {
- super.setMarshaler(marshaler);
- } else {
- throw new IllegalArgumentException("marhaler must be a SOAP marshaler");
- }
+
+ public JmsSoapConsumerEndpoint(ServiceUnit serviceUnit, QName service, String endpoint) {
+ super(serviceUnit, service, endpoint);
}
+ public Resource getWsdl() {
+ return wsdl;
+ }
+
+ 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");
+ }
+ JmsSoapConsumerMarshaler marshaler = new JmsSoapConsumerMarshaler();
+ try {
+ description = DomUtil.parse(wsdl.getInputStream());
+ Element elem = description.getDocumentElement();
+ if (WSDLUtils.WSDL1_NAMESPACE.equals(elem.getNamespaceURI())) {
+ 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 soapAddress = WSDLUtils.getExtension(port, SOAPAddress.class);
+ if (soapAddress != null) {
+ soapAddress.setLocationURI(getLocationURI());
+ } else {
+ SOAP12Address soap12Address = WSDLUtils.getExtension(port, SOAP12Address.class);
+ if (soap12Address != null) {
+ soap12Address.setLocationURI(getLocationURI());
+ }
+ }
+ description = WSDLUtils.getWSDL11Factory().newWSDLWriter().getDocument(def);
+ marshaler.setBinding(BindingFactory.createBinding(port));
+ } else if (WSDLUtils.WSDL2_NAMESPACE.equals(elem.getNamespaceURI())) {
+ 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 DeploymentException("If endpoint is not set, the WSDL service '" + getService() + "' must contain a single port definition");
+ }
+ marshaler.setBinding(BindingFactory.createBinding(endpoint));
+ } 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);
+ }
+ if (getTargetService() == null && getTargetInterface() == null && getTargetUri() == null) {
+ setTargetService(getService());
+ setTargetEndpoint(getEndpoint());
+ }
+ super.validate();
+ }
+
}
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=518691&r1=518690&r2=518691
==============================================================================
--- 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 Thu Mar 15 10:06:08 2007
@@ -16,62 +16,86 @@
*/
package org.apache.servicemix.jms.endpoints;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+
import javax.jbi.component.ComponentContext;
import javax.jbi.messaging.Fault;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import javax.jms.Message;
import javax.jms.Session;
-import javax.wsdl.Definition;
-import javax.wsdl.Port;
-import javax.wsdl.Service;
-import javax.wsdl.xml.WSDLReader;
+import javax.jms.TextMessage;
+import org.apache.servicemix.soap.api.InterceptorChain;
+import org.apache.servicemix.soap.api.Policy;
+import org.apache.servicemix.soap.api.InterceptorProvider.Phase;
import org.apache.servicemix.soap.api.model.Binding;
-import org.apache.servicemix.soap.util.DomUtil;
-import org.apache.servicemix.soap.wsdl.BindingFactory;
-import org.apache.servicemix.soap.wsdl.WSDLUtils;
-import org.springframework.core.io.Resource;
-import org.w3c.dom.Document;
+import org.apache.servicemix.soap.interceptors.jbi.JbiConstants;
public class JmsSoapConsumerMarshaler implements JmsConsumerMarshaler {
- private Resource wsdlResource;
private Binding<?> binding;
+ private boolean useJbiWrapper = true;
+ private Policy[] policies;
/**
- * @return the wsdlResource
+ * @return the binding
*/
- public Resource getWsdlResource() {
- return wsdlResource;
+ public Binding<?> getBinding() {
+ return binding;
}
/**
- * @param wsdlResource the wsdlResource to set
+ * @param binding the binding to set
*/
- public void setWsdlResource(Resource wsdlResource) {
- this.wsdlResource = wsdlResource;
+ public void setBinding(Binding<?> binding) {
+ this.binding = binding;
}
-
- public void init() throws Exception {
- Document doc = DomUtil.parse(wsdlResource.getInputStream());
- if (WSDLUtils.WSDL1_NAMESPACE.equals(doc.getDocumentElement().getNamespaceURI())) {
- WSDLReader reader = WSDLUtils.createWSDL11Reader();
- Definition def = reader.readWSDL(wsdlResource.getURL() != null ? wsdlResource.getURL().toString() : null, doc.getDocumentElement());
- Service svc = (Service) def.getServices().values().iterator().next();
- Port port = (Port) svc.getPorts().values().iterator().next();
- binding = BindingFactory.createBinding(port);
- }
+
+ /**
+ * @return the policies
+ */
+ public Policy[] getPolicies() {
+ return policies;
+ }
+
+ /**
+ * @param policies the policies to set
+ */
+ public void setPolicies(Policy[] policies) {
+ this.policies = policies;
+ }
+
+ /**
+ * @return the useJbiWrapper
+ */
+ public boolean isUseJbiWrapper() {
+ return useJbiWrapper;
+ }
+
+ /**
+ * @param useJbiWrapper the useJbiWrapper to set
+ */
+ public void setUseJbiWrapper(boolean useJbiWrapper) {
+ this.useJbiWrapper = useJbiWrapper;
}
public JmsContext createContext(Message message, ComponentContext context) throws Exception {
- binding.createMessage();
- return null;
+ return new Context(message, context);
}
public MessageExchange createExchange(JmsContext context) throws Exception {
- // TODO Auto-generated method stub
- return null;
+ org.apache.servicemix.soap.api.Message msg = binding.createMessage();
+ msg.put(ComponentContext.class, ((Context) context).componentContext);
+ msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
+ msg.setContent(InputStream.class, new ByteArrayInputStream(((TextMessage) context.getMessage()).getText().getBytes()));
+ InterceptorChain phase = getChain(Phase.ServerIn);
+ phase.doIntercept(msg);
+ MessageExchange me = msg.getContent(MessageExchange.class);
+ return me;
}
public Message createOut(MessageExchange exchange, NormalizedMessage outMsg, Session session, JmsContext context) throws Exception {
@@ -87,6 +111,16 @@
public Message createError(MessageExchange exchange, Exception error, Session session, JmsContext context) throws Exception {
// 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;
}
protected static class Context implements JmsContext {