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 {