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 2006/04/04 22:33:18 UTC

svn commit: r391401 - /incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java

Author: gnodet
Date: Tue Apr  4 13:33:17 2006
New Revision: 391401

URL: http://svn.apache.org/viewcvs?rev=391401&view=rev
Log:
SM-382: enerate valid wsdl (with only the PortType) when the interface namespace does not match the service namespace

Modified:
    incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java

Modified: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java?rev=391401&r1=391400&r2=391401&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java Tue Apr  4 13:33:17 2006
@@ -23,10 +23,13 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
 
 import javax.jbi.component.ComponentContext;
 import javax.jbi.messaging.MessageExchange.Role;
 import javax.jbi.servicedesc.ServiceEndpoint;
+import javax.wsdl.Message;
 import javax.wsdl.Port;
 import javax.wsdl.factory.WSDLFactory;
 import javax.xml.namespace.QName;
@@ -233,7 +236,14 @@
                                                    new AegisBindingProvider(tm));
         }
         String svcLocalName = (service != null) ? service.getLocalPart() : null;
-        String svcNamespace = (service != null) ? service.getNamespaceURI() : null;
+        String svcNamespace;
+        if (interfaceName != null) {
+            svcNamespace = interfaceName.getNamespaceURI();
+        } else if (service != null) {
+            svcNamespace = service.getNamespaceURI();
+        } else {
+            svcNamespace = null;
+        }
         Map props = new HashMap();
         props.put(ObjectServiceFactory.PORT_TYPE, interfaceName);
         props.put(ObjectServiceFactory.STYLE, SoapConstants.STYLE_WRAPPED);
@@ -247,6 +257,33 @@
         xfire.getServiceRegistry().register(xfireService);
         this.description = generateWsdl();
         
+        // If the both interfaceName and serviceName are provided with non matching namespaces,
+        // the generated wsdl is bad. We have to keep only the port type definition.
+        if (this.service != null && interfaceName != null &&
+            !this.service.getNamespaceURI().equals(interfaceName.getNamespaceURI())) {
+            // Parse the WSDL
+            definition = WSDLFactory.newInstance().newWSDLReader().readWSDL(null, description);
+            // Get the service and port definition
+            javax.wsdl.Service svc = definition.getService(new QName(this.interfaceName.getNamespaceURI(), this.service.getLocalPart()));
+            Port port = svc != null && svc.getPorts().size() == 1 ? (Port) svc.getPorts().values().iterator().next() : null;
+            if (port != null) {
+                // If the endpoint name has not been defined, retrieve it now
+                if (endpoint == null) {
+                    endpoint = port.getName();
+                }
+                // Now, remove binding and service infos and change target namespace
+                definition.removeBinding(port.getBinding().getQName());
+                definition.removeService(svc.getQName());
+                description = WSDLFactory.newInstance().newWSDLWriter().getDocument(definition);
+            }
+        }
+        // Write WSDL
+        if (logger.isTraceEnabled()) {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            WSDLFactory.newInstance().newWSDLWriter().writeWSDL(definition, baos);
+            logger.trace(baos.toString());
+        }
+        
         // Check service name and endpoint name
         QName serviceName = xfireService.getName();
         QName interfName = xfireService.getServiceInfo().getPortType();
@@ -266,10 +303,10 @@
                     "). WSDL description may be unusable.");
         }
         definition = WSDLFactory.newInstance().newWSDLReader().readWSDL(null, description);
-        javax.wsdl.Service service = definition.getService(serviceName);
-        if (service != null) {
-            if (service.getPorts().values().size() == 1) {
-                Port port = (Port) service.getPorts().values().iterator().next();
+        javax.wsdl.Service svc = definition.getService(serviceName);
+        if (svc != null) {
+            if (svc.getPorts().values().size() == 1) {
+                Port port = (Port) svc.getPorts().values().iterator().next();
                 // Check if this is the same as defined in endpoint spec
                 endpointName = port.getName();
                 if (endpoint == null) {
@@ -289,9 +326,6 @@
     protected Document generateWsdl() throws SAXException, IOException, ParserConfigurationException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         getXFire().generateWSDL(xfireService.getSimpleName(), baos);
-        if (logger.isTraceEnabled()) {
-            logger.trace(baos.toString());
-        }
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         factory.setNamespaceAware(true);
         Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(baos.toByteArray()));