Author: nash
Date: Tue Aug 12 13:49:42 2008
New Revision: 685310

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

Added:
    
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceTypeHelper.java
Modified:
    
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponent.java
    
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponentImpl.java
    
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceRemoteTestCase.java
    
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceTestCase.java
    
tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
    
tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
    
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceDataBinding.java
    
tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java

Modified: 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponent.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponent.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponent.java
 (original)
+++ 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponent.java
 Tue Aug 12 13:49:42 2008
@@ -35,5 +35,5 @@
 
     String fooBC();
 
-    DComponent getDReference();
+    String invokeDReference();
 }

Modified: 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponentImpl.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponentImpl.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponentImpl.java
 (original)
+++ 
tuscany/java/sca/itest/callablereferences/src/main/java/org/apache/tuscany/sca/itest/callableref/AComponentImpl.java
 Tue Aug 12 13:49:42 2008
@@ -107,8 +107,8 @@
         return dReference1.fooString(aReferenceString);
     }    
 
-    public DComponent getDReference() {
-        return dReference;
+    public String invokeDReference() {
+        return dReference.foo(null);
     }
 
 }

Modified: 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceRemoteTestCase.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceRemoteTestCase.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceRemoteTestCase.java
 (original)
+++ 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceRemoteTestCase.java
 Tue Aug 12 13:49:42 2008
@@ -136,7 +136,7 @@
     @Test
     public void testRequiredFalseReference() {
         try {
-            acomponent.getDReference().foo(null);
+            acomponent.invokeDReference();
         } catch (Exception e) {
             Assert.assertTrue(true);
         }

Modified: 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceTestCase.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceTestCase.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceTestCase.java
 (original)
+++ 
tuscany/java/sca/itest/callablereferences/src/test/java/org/apache/tuscany/sca/itest/callableref/CallableReferenceTestCase.java
 Tue Aug 12 13:49:42 2008
@@ -74,7 +74,7 @@
     @Test
     public void testRequiredFalseReference() {
         try {
-            acomponent.getDReference().foo(null);
+            acomponent.invokeDReference();
         } catch (Exception e) {
             Assert.assertTrue(true);
         }

Modified: 
tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
 (original)
+++ 
tuscany/java/sca/modules/binding-ws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java
 Tue Aug 12 13:49:42 2008
@@ -528,10 +528,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/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
 (original)
+++ 
tuscany/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
 Tue Aug 12 13:49:42 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) 
$
@@ -153,6 +155,39 @@
         throw new WSDLGenerationException(problem.toString(), null, problem);
     }
     
+    private XMLTypeHelper getTypeHelper(DataType type, Map<String, 
XMLTypeHelper> helpers) {
+        if (type == null) {
+            return null;
+        }
+        String db = type.getDataBinding();
+        if (db == null) {
+            return null;
+        }
+        if ("java:array".equals(db)) {
+            DataType dt = (DataType)type.getLogical();
+            db = dt.getDataBinding();
+        }
+        return helpers.get(db);
+    }
+    
+    private boolean inputTypesCompatible(DataType wrapperType, 
DataType<List<DataType>> inputType, Map<String, XMLTypeHelper> helpers) {
+        XMLTypeHelper wrapperHelper = getTypeHelper(wrapperType, helpers);
+        for (DataType dt : inputType.getLogical()) {
+            if (getTypeHelper(dt, helpers) != wrapperHelper) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private boolean outputTypeCompatible(DataType wrapperType, DataType 
outputType, Map<String, XMLTypeHelper> helpers) {
+        if (getTypeHelper(outputType, helpers) != getTypeHelper(wrapperType, 
helpers)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+    
     private void addDataType(Map<XMLTypeHelper, List<DataType>> map, DataType 
type, Map<String, XMLTypeHelper> helpers) {
         if (type == null) {
             return;
@@ -178,18 +213,33 @@
         Map<XMLTypeHelper, List<DataType>> dataTypes = new 
HashMap<XMLTypeHelper, List<DataType>>();
         for (Operation op : intf.getOperations()) {
             WrapperInfo wrapper = op.getWrapper();
-            if (useWrapper && wrapper != null) {
-                DataType dt1 = wrapper.getInputWrapperType();
+            DataType dt1 = null;
+            boolean useInputWrapper = useWrapper & wrapper != null;
+            if (useInputWrapper) {
+                dt1 = wrapper.getInputWrapperType();
+                useInputWrapper &= inputTypesCompatible(dt1, 
op.getInputType(), helpers);
+            }
+            if (useInputWrapper) {
                 addDataType(dataTypes, dt1, helpers);
-                DataType dt2 = wrapper.getOutputWrapperType();
-                addDataType(dataTypes, dt2, helpers);
             } else {
-                for (DataType dt1 : op.getInputType().getLogical()) {
-                    addDataType(dataTypes, dt1, helpers);
+                for (DataType dt : op.getInputType().getLogical()) {
+                    addDataType(dataTypes, dt, helpers);
                 }
-                DataType dt2 = op.getOutputType();
+            }
+            
+            DataType dt2 = null;
+            boolean useOutputWrapper = useWrapper & wrapper != null;
+            if (useOutputWrapper) {
+                dt2 = wrapper.getOutputWrapperType();
+                useOutputWrapper &= outputTypeCompatible(dt2, 
op.getOutputType(), helpers);
+            }
+            if (useOutputWrapper) {
+                addDataType(dataTypes, dt2, helpers);
+            } else {
+                dt2 = op.getOutputType();
                 addDataType(dataTypes, dt2, helpers);
             }
+            
             for (DataType<DataType> dt3 : op.getFaultTypes()) {
                 DataType dt4 = dt3.getLogical();
                 addDataType(dataTypes, dt4, helpers);
@@ -325,7 +375,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 +389,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 +408,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/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceDataBinding.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceDataBinding.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceDataBinding.java
 (original)
+++ 
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceDataBinding.java
 Tue Aug 12 13:49:42 2008
@@ -19,6 +19,7 @@
 
 package org.apache.tuscany.sca.core.databinding.transformers;
 
+import org.apache.tuscany.sca.databinding.XMLTypeHelper;
 import org.apache.tuscany.sca.databinding.impl.BaseDataBinding;
 import org.osoa.sca.CallableReference;
 
@@ -27,8 +28,16 @@
     public static final String NAME = CallableReference.class.getName();
     public static final String[] ALIASES = new String[] {"callablereference"};
 
+    private CallableReferenceTypeHelper xmlTypeHelper;
+
     public CallableReferenceDataBinding() {
         super(NAME, ALIASES, CallableReference.class);
+        this.xmlTypeHelper = new CallableReferenceTypeHelper();
+    }
+
+    @Override
+    public XMLTypeHelper getXMLTypeHelper() {
+        return xmlTypeHelper;
     }
 
 }

Added: 
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceTypeHelper.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceTypeHelper.java?rev=685310&view=auto
==============================================================================
--- 
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceTypeHelper.java
 (added)
+++ 
tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/transformers/CallableReferenceTypeHelper.java
 Tue Aug 12 13:49:42 2008
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.core.databinding.transformers;
+
+import java.beans.Introspector;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.databinding.XMLTypeHelper;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;
+import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.xsd.XSDFactory;
+import org.apache.tuscany.sca.xsd.XSDefinition;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public class CallableReferenceTypeHelper implements XMLTypeHelper {
+    private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";;
+    private static final String ANYTYPE_NAME = "anyType";
+    private static final QName ANYTYPE_QNAME = new QName(SCHEMA_NS, 
ANYTYPE_NAME);
+
+    public CallableReferenceTypeHelper() {
+        super();
+    }
+
+    public TypeInfo getTypeInfo(Class javaType, Object logical) {
+        QName xmlType = JavaXMLMapper.getXMLType(javaType);
+        if (xmlType != null) {
+            return new TypeInfo(xmlType, true, null);
+        } else if (javaType.isInterface()) {
+            return new TypeInfo(ANYTYPE_QNAME, true, null);
+        } else {
+            if (logical instanceof XMLType) {
+                xmlType = ((XMLType)logical).getTypeName();
+            }
+            if (xmlType == null) {
+                xmlType = new 
QName(Introspector.decapitalize(javaType.getSimpleName()));
+            }
+            return new TypeInfo(xmlType, false, null);
+        }
+    }
+
+    public List<XSDefinition> getSchemaDefinitions(XSDFactory factory, 
ModelResolver resolver, Interface intf) {
+        return new ArrayList<XSDefinition>();
+    }
+
+    public List<XSDefinition> getSchemaDefinitions(XSDFactory factory, 
ModelResolver resolver, List<DataType> dataTypes) {
+        return new ArrayList<XSDefinition>();
+    }
+
+}

Modified: 
tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java?rev=685310&r1=685309&r2=685310&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 (original)
+++ 
tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 Tue Aug 12 13:49:42 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>();


Reply via email to