You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2011/12/12 21:30:18 UTC

svn commit: r1213421 - /cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java

Author: dkulp
Date: Mon Dec 12 20:30:18 2011
New Revision: 1213421

URL: http://svn.apache.org/viewvc?rev=1213421&view=rev
Log:
[CXF-3968] If a schema is imported from multiple places via different
paths, make some attempt to rationalize all the various imports into
a single import url.

Modified:
    cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java

Modified: cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java?rev=1213421&r1=1213420&r2=1213421&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java (original)
+++ cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/frontend/WSDLGetUtils.java Mon Dec 12 20:30:18 2011
@@ -56,10 +56,10 @@ import org.apache.cxf.catalog.OASISCatal
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.helpers.DOMUtils;
-import org.apache.cxf.helpers.XMLUtils;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.wsdl.WSDLManager;
 import org.apache.cxf.wsdl11.ResourceManagerWSDLLocator;
 import org.apache.cxf.wsdl11.ServiceWSDLBuilder;
@@ -236,7 +236,7 @@ public class WSDLGetUtils {
                                                                                 bus);
                 
                 InputSource src = rml.getBaseInputSource();
-                doc = XMLUtils.getParser().parse(src);
+                doc = StaxUtils.read(src);
             }
             
             updateDoc(doc, base, mp, smp, message);
@@ -251,6 +251,15 @@ public class WSDLGetUtils {
         }
     }
     
+    protected String mapUri(String base, Map<String, SchemaReference> smp, String loc)
+        throws UnsupportedEncodingException {
+        SchemaReference ref = smp.get(URLDecoder.decode(loc, "utf-8"));
+        if (ref != null) {
+            return base + "?xsd=" + ref.getSchemaLocationURI().replace(" ", "%20");
+        }
+        return null;
+    }
+    
     protected void updateDoc(Document doc, 
                            String base,
                            Map<String, Definition> mp,
@@ -265,8 +274,9 @@ public class WSDLGetUtils {
                                                                            "import");
             for (Element el : elementList) {
                 String sl = el.getAttribute("schemaLocation");
-                if (smp.containsKey(URLDecoder.decode(sl, "utf-8"))) {
-                    el.setAttribute("schemaLocation", base + "?xsd=" + sl.replace(" ", "%20"));
+                sl = mapUri(base, smp, sl);
+                if (sl != null) {
+                    el.setAttribute("schemaLocation", sl);
                 }
             }
             
@@ -451,7 +461,7 @@ public class WSDLGetUtils {
         for (List<?> lst : imports) {
             List<SchemaImport> impLst = CastUtils.cast(lst);
             for (SchemaImport imp : impLst) {
-                String start = imp.getSchemaLocationURI();
+                String start = findSchemaLocation(doneSchemas, imp);
                 
                 if (start != null) {
                     String decodedStart = null;
@@ -490,7 +500,7 @@ public class WSDLGetUtils {
         
         List<SchemaReference> includes = CastUtils.cast(schema.getIncludes());
         for (SchemaReference included : includes) {
-            String start = included.getSchemaLocationURI();
+            String start = findSchemaLocation(doneSchemas, included);
 
             if (start != null) {
                 String decodedStart = null;
@@ -527,7 +537,7 @@ public class WSDLGetUtils {
         }
         List<SchemaReference> redefines = CastUtils.cast(schema.getRedefines());
         for (SchemaReference included : redefines) {
-            String start = included.getSchemaLocationURI();
+            String start = findSchemaLocation(doneSchemas, included);
 
             if (start != null) {
                 String decodedStart = null;
@@ -564,4 +574,16 @@ public class WSDLGetUtils {
         }
     }
 
+    private String findSchemaLocation(Map<String, SchemaReference> doneSchemas, SchemaReference imp) {
+        for (Map.Entry<String, SchemaReference> e : doneSchemas.entrySet()) {
+            if (e.getValue().getReferencedSchema().getElement() 
+                == imp.getReferencedSchema().getElement()) {
+                doneSchemas.put(imp.getSchemaLocationURI(), imp);
+                imp.setSchemaLocationURI(e.getKey());
+                return e.getKey();
+            }
+        }
+        return imp.getSchemaLocationURI();
+    }
+
 }