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 2008/12/01 09:31:02 UTC

svn commit: r721996 - /servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java

Author: gnodet
Date: Mon Dec  1 00:31:02 2008
New Revision: 721996

URL: http://svn.apache.org/viewvc?rev=721996&view=rev
Log:
SM-1036: SoapEndpoint loadWsdl() does not support importing from relative paths

Modified:
    servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java

Modified: servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java?rev=721996&r1=721995&r2=721996&view=diff
==============================================================================
--- servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java (original)
+++ servicemix/components/shared-libraries/trunk/servicemix-soap/src/main/java/org/apache/servicemix/soap/SoapEndpoint.java Mon Dec  1 00:31:02 2008
@@ -35,6 +35,7 @@
 import javax.wsdl.extensions.ExtensionRegistry;
 import javax.wsdl.extensions.schema.Schema;
 import javax.wsdl.extensions.schema.SchemaImport;
+import javax.wsdl.extensions.schema.SchemaReference;
 import javax.wsdl.factory.WSDLFactory;
 import javax.wsdl.xml.WSDLReader;
 import javax.wsdl.xml.WSDLWriter;
@@ -420,10 +421,10 @@
     
     protected void mapDefinition(Definition def) throws WSDLException {
         wsdls.put("main.wsdl", createWsdlWriter().getDocument(def));
-        mapImports(def);
+        mapImports(def, "");
     }
 
-    protected void mapImports(Definition def) throws WSDLException {
+    protected void mapImports(Definition def, String contextPath) throws WSDLException {
         // Add other imports to mapping
         Map imports = def.getImports();
         for (Iterator iter = imports.values().iterator(); iter.hasNext();) {
@@ -433,8 +434,9 @@
                 Definition impDef = imp.getDefinition();
                 String impLoc = imp.getLocationURI();
                 if (impDef != null && impLoc != null && !URI.create(impLoc).isAbsolute()) {
+                    impLoc = resolveRelativeURI(contextPath, impLoc);
                     wsdls.put(impLoc, createWsdlWriter().getDocument(impDef));
-                    mapImports(impDef);
+                    mapImports(impDef, getURIParent(impLoc));
                 }
             }
         }
@@ -445,13 +447,13 @@
                 ExtensibilityElement ee = (ExtensibilityElement) it.next();
                 if (ee instanceof Schema) {
                     Schema schema = (Schema) ee;
-                    mapSchemaImport(schema);                
+                    mapSchema(schema, "");
                 }
             }
         }
     }
 
-    private void mapSchemaImport(Schema schema) {
+    private void mapSchema(Schema schema, String contextPath) {
         Map schemaImports = schema.getImports();
         for (Iterator iter = schemaImports.values().iterator(); iter.hasNext();) {
             List imps = (List) iter.next();
@@ -460,14 +462,60 @@
                 Schema schemaImp = schemaImport.getReferencedSchema();
                 String schemaLoc = schemaImport.getSchemaLocationURI();
                 if (schemaLoc != null && schemaImp != null && schemaImp.getElement() != null && !URI.create(schemaLoc).isAbsolute()) {
+                    schemaLoc = resolveRelativeURI(contextPath, schemaLoc);
                     wsdls.put(schemaLoc, schemaImp.getElement());
-                    mapSchemaImport(schemaImp);
+                    // recursively map imported schemas
+                    mapSchema(schemaImp, getURIParent(schemaLoc));
                 }
             }
         }
+        List schemaIncludes = schema.getIncludes();
+        for (Iterator iter = schemaIncludes.iterator(); iter.hasNext();) {
+            SchemaReference schemaInclude = (SchemaReference) iter.next();
+            Schema schemaImp = schemaInclude.getReferencedSchema();
+            String schemaLoc = schemaInclude.getSchemaLocationURI();
+            if (schemaLoc != null && schemaImp != null && schemaImp.getElement() != null && !URI.create(schemaLoc).isAbsolute()) {
+                schemaLoc = resolveRelativeURI(contextPath, schemaLoc);
+                wsdls.put(schemaLoc, schemaImp.getElement());
+                // recursively map included schemas
+                mapSchema(schemaImp, getURIParent(schemaLoc));
+            }
+        }
     }
     
     /**
+     * Combines a relative path with a current directory, normalising any
+     * relative pathnames like "." and "..".
+     * <p>
+     * Example:
+     * <table>
+     * <tr><th>context</th><th>path</th><th>resolveRelativeURI(context, path)</th></tr>
+     * <tr><td>addressModification</td><td>../common/DataType.xsd</td><td>common/DataType.xsd</td></tr>
+     * </table>
+     *
+     * @param context The current directory.
+     * @param path The relative path to resolve against the current directory.
+     * @return the normalised path.
+     */
+    private static String resolveRelativeURI(String context, String path) {
+        if (context.length() > 0) {
+            return URI.create(context + "/" + path).normalize().getPath();
+        } else {
+            return path;
+        }
+    }
+
+    /**
+     * Removes the filename part of a URI path.
+     *
+     * @param path A URI path part.
+     * @return The URI path part with the filename part removed.
+     */
+    private static String getURIParent(String path) {
+        return URI.create(path + "/..").normalize().getPath();
+    }
+
+    /**
      * @return Returns the wsdls.
      */
     public Map getWsdls() {