You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by na...@apache.org on 2008/08/12 22:40:21 UTC

svn commit: r685307 - in /tuscany/branches/sca-java-1.3/modules: binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/ binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/ databinding-jaxb/src/main/java/org/apac...

Author: nash
Date: Tue Aug 12 13:40:20 2008
New Revision: 685307

URL: http://svn.apache.org/viewvc?rev=685307&view=rev
Log:
Fix TUSCANY-2531

Modified:
    tuscany/branches/sca-java-1.3/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
    tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
    tuscany/branches/sca-java-1.3/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java

Modified: tuscany/branches/sca-java-1.3/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java?rev=685307&r1=685306&r2=685307&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java (original)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java Tue Aug 12 13:40:20 2008
@@ -536,10 +536,12 @@
             if (obj instanceof XmlSchemaExternal) {
                 XmlSchemaExternal extSchema = (XmlSchemaExternal)obj;
                 String location = extSchema.getSchemaLocation();
-                if (location.indexOf(":/") < 0 & location.indexOf("?xsd=") < 0) {
+                if (location.length() > 0 && location.indexOf(":/") < 0 && location.indexOf("?xsd=") < 0) {
                     extSchema.setSchemaLocation(name + "?xsd=" + location);
                 }
-                updateSchemaRefs(extSchema.getSchema(), name);
+                if (extSchema.getSchema() != null) {
+                    updateSchemaRefs(extSchema.getSchema(), name);
+                }
             }
         }
     }

Modified: tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java?rev=685307&r1=685306&r2=685307&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java (original)
+++ tuscany/branches/sca-java-1.3/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java Tue Aug 12 13:40:20 2008
@@ -76,6 +76,8 @@
 import org.apache.ws.commons.schema.utils.NamespaceMap;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * @version $Rev: 670103 $ $Date: 2008-06-21 01:35:00 +0100 (Sat, 21 Jun 2008) $
@@ -325,7 +327,10 @@
                             }
                             QName typeName = element.getType().getQName();
                             String nsURI = typeName.getNamespaceURI();
-                            if ("".equals(nsURI) || targetNS.equals(nsURI)) {
+                            if ("".equals(nsURI)) {
+                                xsElement.setAttribute("type", typeName.getLocalPart());
+                                addSchemaImport(schema, "", schemaDoc);
+                            } else if (targetNS.equals(nsURI)) {
                                 xsElement.setAttribute("type", typeName.getLocalPart());
                             } else if (SCHEMA_NS.equals(nsURI)) {
                                 xsElement.setAttribute("type", "xs:" + typeName.getLocalPart());
@@ -336,6 +341,7 @@
                                     prefix = "ns" + i++;
                                     prefixMap.put(nsURI, prefix);
                                     schema.setAttributeNS(XMLNS_NS, "xmlns:" + prefix, nsURI);
+                                    addSchemaImport(schema, nsURI, schemaDoc);
                                 }
                                 xsElement.setAttribute("type", prefix + ":" + typeName.getLocalPart());
                             }
@@ -354,7 +360,26 @@
 
         return definition;
     }
-    
+
+    private static void addSchemaImport(Element schema, String nsURI, Document schemaDoc) {
+        Element imp = schemaDoc.createElementNS(SCHEMA_NS, "xs:import");
+        if (!"".equals(nsURI)) {
+            imp.setAttribute("namespace", nsURI);
+        }
+        NodeList childNodes = schema.getChildNodes();
+        for (int i = 0; i < childNodes.getLength(); i++) {
+            Node childNode = childNodes.item(i);
+            if (childNode instanceof Element) {
+                schema.insertBefore(imp, childNode);
+                imp = null;
+                break;
+            }
+        }
+        if (imp != null) {
+            schema.appendChild(imp);
+        }
+    }
+
     private void addSchemaExtension(XSDefinition xsDef,
                                     XmlSchemaCollection schemaCollection,
                                     WSDLDefinition wsdlDefinition,

Modified: tuscany/branches/sca-java-1.3/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.3/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java?rev=685307&r1=685306&r2=685307&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.3/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java (original)
+++ tuscany/branches/sca-java-1.3/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java Tue Aug 12 13:40:20 2008
@@ -19,7 +19,6 @@
 
 package org.apache.tuscany.sca.databinding.jaxb;
 
-import java.beans.Introspector;
 import java.io.IOException;
 import java.io.StringReader;
 import java.io.StringWriter;
@@ -74,13 +73,43 @@
                 xmlType = ((XMLType)logical).getTypeName();
             }
             if (xmlType == null) {
-                xmlType =
-                    new QName(JavaXMLMapper.getNamespace(javaType), Introspector.decapitalize(javaType.getSimpleName()));
+                xmlType = new QName(jaxbRIDecapitalize(javaType.getSimpleName()));
             }
             return new TypeInfo(xmlType, false, null);
         }
     }
 
+    /**
+     * The JAXB RI doesn't implement the decapitalization algorithm in the
+     * JAXB spec.  See Sun bug 6505643 for details.  This means that we need
+     * to mimic the incorrect algorithm for references from wrapper schemas.
+     */
+    private String jaxbRIDecapitalize(String name) {
+        // find first lower case char in name
+        int lower = name.length();
+        for (int i = 0; i < name.length(); i++) {
+            if (Character.isLowerCase(name.charAt(i))) {
+                lower = i;
+                break;
+            }
+        }
+
+        int decap;
+        if (name.length() == 0) {
+            decap = 0;  // empty string: nothing to do
+        } else if (lower == 0) {
+            decap = 0;  // first char is lower case: nothing to do
+        } else if (lower == 1) {
+            decap = 1;  // one upper followed by lower: decapitalize 1 char
+        } else if (lower < name.length()) { 
+            decap = lower - 1;  // n uppers followed by at least one lower: decapitalize n-1 chars
+        } else {
+            decap = name.length();  // all upper case: decapitalize all chars
+        }
+
+        return name.substring(0, decap).toLowerCase() + name.substring(decap);
+    }
+
     /*
     public List<XSDefinition> getSchemaDefinitions(XSDFactory factory, ModelResolver resolver) {
         List<XSDefinition> definitions = new ArrayList<XSDefinition>();