You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2011/08/12 17:11:10 UTC

svn commit: r1157148 - in /tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src: main/resources/org/apache/tuscany/sca/binding/ws/axis2/ test/java/org/apache/tuscany/sca/binding/ws/axis2/

Author: slaws
Date: Fri Aug 12 15:11:09 2011
New Revision: 1157148

URL: http://svn.apache.org/viewvc?rev=1157148&view=rev
Log:
Looking at answering Ant's question about serializing WSDL for enpoints as part of making cross domain interface matching work. Turns out to be more difficult that I would have thought. Mainly to do with how you re-build the Tuscany WSDL/XSD model from a string rather than from a set of files (which is where I think Ant got to). Any how I extended the WSDL test to experiment and have some code that works but isn't yet in the runtime (see WSDLSerializationTestCase). Don't want to loose it though. 

Added:
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java
Modified:
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java
    tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl Fri Aug 12 15:11:09 2011
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.    
+-->
+<wsdl:definitions targetNamespace="http://serialize-nested"
+                  xmlns:tns="http://serialize-nested"
+                  xmlns:account="http://accounts"
+                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+                  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
+                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	              name="serialize-nested">
+
+    <wsdl:types>
+        <xsd:schema elementFormDefault="qualified"
+                    targetNamespace="http://accounts"
+                    xmlns:account="http://accounts"
+                    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+            <xsd:import namespace="http://accounts" schemaLocation="wsdl-serialize.xsd" />
+
+            <xsd:element name="getCustomerProfile">
+                <xsd:complexType>
+                    <xsd:sequence>
+                        <xsd:element name="loginID" type="xsd:string" />
+                    </xsd:sequence>
+                </xsd:complexType>
+            </xsd:element>
+
+            <xsd:element name="getCustomerProfileResponse">
+                <xsd:complexType>
+                    <xsd:sequence>
+                        <xsd:element name="customerProfile"
+                            type="account:CustomerProfileData" />
+                    </xsd:sequence>
+                </xsd:complexType>
+            </xsd:element>
+            
+        </xsd:schema>
+    </wsdl:types>
+
+    <wsdl:message name="getCustomerProfileRequest">
+        <wsdl:part element="account:getCustomerProfile" name="parameters" />
+    </wsdl:message>
+
+    <wsdl:message name="getCustomerProfileResponse">
+        <wsdl:part element="account:getCustomerProfileResponse" name="parameters" />
+    </wsdl:message>
+
+    <wsdl:portType name="Account">
+        <wsdl:operation name="getCustomerProfile">
+            <wsdl:input message="tns:getCustomerProfileRequest" name="getCustomerProfileRequest" />
+            <wsdl:output message="tns:getCustomerProfileResponse" name="getCustomerProfileResponse" />
+        </wsdl:operation>
+    </wsdl:portType>
+
+</wsdl:definitions>

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd Fri Aug 12 15:11:09 2011
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.    
+-->
+<xsd:schema elementFormDefault="qualified"
+            targetNamespace="http://serialize"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+    <xsd:complexType name="SerializeCustomerProfileInfo">
+        <xsd:sequence>
+            <xsd:element name="firstName" type="xsd:string" />
+            <xsd:element name="lastName" type="xsd:string" />
+        </xsd:sequence>
+    </xsd:complexType>
+    
+</xsd:schema>

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl Fri Aug 12 15:11:09 2011
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.    
+-->
+<wsdl:definitions targetNamespace="http://serialize-top"
+                  xmlns:tns="http://serialize-top"
+                  xmlns:nested="http://serialize-nested"
+                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+                  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
+                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	              name="serialize-top">
+
+    <wsdl:import namespace="http://serialize-nested" location="wsdl-serialize-nested.wsdl" />
+
+    <wsdl:binding name="AccountSoapBinding" type="nested:Account">
+        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+        <wsdl:operation name="getCustomerProfile">
+            <wsdlsoap:operation soapAction="" />
+            <wsdl:input name="getCustomerProfileRequest">
+                <wsdlsoap:body use="literal" />
+            </wsdl:input>
+            <wsdl:output name="getCustomerProfileResponse">
+                <wsdlsoap:body use="literal" />
+            </wsdl:output>
+        </wsdl:operation>
+    </wsdl:binding>
+
+    <wsdl:service name="AccountService">
+        <wsdl:port binding="tns:AccountSoapBinding" name="AccountSoapPort">
+            <wsdlsoap:address location="http://localhost:8086/AccountService" />
+        </wsdl:port>
+    </wsdl:service>
+
+</wsdl:definitions>

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite Fri Aug 12 15:11:09 2011
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.    
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+			xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+			targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2"
+           name="WSDLSerialize">
+
+    <component name="AccountService">
+		<implementation.java class="org.apache.tuscany.sca.binding.ws.axis2.AccountService"/>
+		<service name="Account">
+	        <binding.ws uri="http://localhost:8085/services/AccountService" 
+	                    wsdlElement="http://serialize-top#wsdl.binding(AccountSoapBinding)"/>
+	    </service>
+    </component>
+
+</composite>

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd Fri Aug 12 15:11:09 2011
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.    
+-->
+<xsd:schema elementFormDefault="qualified"
+            targetNamespace="http://accounts"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+    <xsd:include schemaLocation="customerdata.xsd" />
+    <xsd:include schemaLocation="customerinfo.xsd" />
+    <xsd:import namespace="http://serialize" schemaLocation="wsdl-serialize-nested.xsd"/>
+    
+</xsd:schema>

Modified: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java?rev=1157148&r1=1157147&r2=1157148&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java (original)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java Fri Aug 12 15:11:09 2011
@@ -19,6 +19,10 @@
 
 package org.apache.tuscany.sca.binding.ws.axis2;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
@@ -26,6 +30,7 @@ import org.apache.axiom.om.OMAbstractFac
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMText;
+import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl;
 import org.apache.tuscany.sca.node.Contribution;
 import org.apache.tuscany.sca.node.Node;
 import org.apache.tuscany.sca.node.NodeFactory;
@@ -60,7 +65,6 @@ public class HelloWorldWSDLMergedTestCas
         Assert.assertEquals("Hello petra", ((OMText)child.getFirstOMChild()).getText());
     }  
     
-    @Ignore
     public void testHelloWorldRepeating() throws Exception {
         for (int i = 0; i < 2; i++){
             OMFactory fac = OMAbstractFactory.getOMFactory();
@@ -78,6 +82,25 @@ public class HelloWorldWSDLMergedTestCas
             helloWorld = node.getService(HelloWorldOM.class, "HelloWorldWSDLMergedComponent");
         }
     }
+   
+    
+/*
+    public void testWSDLWrite(){
+        RuntimeEndpointImpl endpoint = (RuntimeEndpointImpl)node.getDomainComposite().getComponents().get(0).getServices().get(0).getEndpoints().get(0);
+        try
+        {
+            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
+            ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
+            objectStream.writeObject(endpoint);
+            objectStream.close();
+            System.out.println(byteStream.toString());
+        }
+        catch(IOException ex)
+        {
+            ex.printStackTrace();
+        }        
+    }
+*/     
     
     @Override
     protected void tearDown() throws Exception {

Modified: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java?rev=1157148&r1=1157147&r2=1157148&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java (original)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java Fri Aug 12 15:11:09 2011
@@ -20,8 +20,11 @@
 package org.apache.tuscany.sca.binding.ws.axis2;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.ObjectOutputStream;
 import java.net.URL;
 import java.util.List;
 
@@ -35,9 +38,12 @@ import javax.xml.namespace.QName;
 
 import junit.framework.TestCase;
 
+import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl;
 import org.apache.tuscany.sca.node.Contribution;
 import org.apache.tuscany.sca.node.Node;
 import org.apache.tuscany.sca.node.NodeFactory;
+import org.apache.tuscany.sca.node.impl.NodeImpl;
+import org.junit.Ignore;
 
 /**
  * Test ?wsdl works and that the returned WSDL has the correct endpoint
@@ -46,7 +52,7 @@ import org.apache.tuscany.sca.node.NodeF
  */
 public class QuestionMarkWSDLIncludeTestCase extends TestCase {
 
-    private Node node;
+    private NodeImpl node;
 
     /**
      * Tests ?wsdl works and returns the correct port endpoint from the WSDL
@@ -82,11 +88,29 @@ public class QuestionMarkWSDLIncludeTest
         }
         throw new RuntimeException("no SOAPAddress");
     }
+    
+/*
+    public void testWSDLWrite(){
+        RuntimeEndpointImpl endpoint = (RuntimeEndpointImpl)node.getDomainComposite().getComponents().get(0).getServices().get(0).getEndpoints().get(0);
+        try
+        {
+            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
+            ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
+            objectStream.writeObject(endpoint);
+            objectStream.close();
+            System.out.println(byteStream.toString());
+        }
+        catch(IOException ex)
+        {
+            ex.printStackTrace();
+        }        
+    } 
+*/
 
     @Override
     protected void setUp() throws Exception {
         String contribution = "target/classes";
-        node = NodeFactory.newInstance().createNode("org/apache/tuscany/sca/binding/ws/axis2/questionmark-wsdl-include.composite", new Contribution("test", contribution));
+        node = (NodeImpl)NodeFactory.newInstance().createNode("org/apache/tuscany/sca/binding/ws/axis2/questionmark-wsdl-include.composite", new Contribution("test", contribution));
         node.start();
     }
 

Added: tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java?rev=1157148&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java (added)
+++ tuscany/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java Fri Aug 12 15:11:09 2011
@@ -0,0 +1,463 @@
+/*
+ * 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.binding.ws.axis2;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.PortType;
+import javax.wsdl.Types;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLLocator;
+import javax.wsdl.xml.WSDLReader;
+import javax.wsdl.xml.WSDLWriter;
+
+
+import org.apache.tuscany.sca.common.xml.XMLDocumentHelper;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.processor.ProcessorContext;
+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+import org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLModelResolver;
+import org.apache.tuscany.sca.node.Contribution;
+import org.apache.tuscany.sca.node.NodeFactory;
+import org.apache.tuscany.sca.node.impl.NodeImpl;
+import org.apache.tuscany.sca.xsd.XSDFactory;
+import org.apache.tuscany.sca.xsd.XSDefinition;
+import org.apache.tuscany.sca.xsd.xml.XSDModelResolver;
+import org.apache.ws.commons.schema.XmlSchema;
+import org.apache.ws.commons.schema.XmlSchemaCollection;
+import org.apache.ws.commons.schema.XmlSchemaCollectionEnumerator;
+import org.apache.ws.commons.schema.XmlSchemaImport;
+import org.apache.ws.commons.schema.XmlSchemaInclude;
+import org.apache.ws.commons.schema.XmlSchemaObject;
+import org.apache.ws.commons.schema.resolver.DefaultURIResolver;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.xml.sax.InputSource;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests that WSDL can be serialized out in a form that can be passed
+ * across the registry in a single shot
+ */
+public class WSDLSerializationTestCase extends TestCase {
+    
+    private static byte separator[] = {'_', 'X', '_'};
+
+/*
+    public void testWSDL4JSerialization() throws Exception {
+        
+        // read WSDL in 
+        WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
+        wsdlReader.setFeature("javax.wsdl.verbose",false);
+        wsdlReader.setFeature("javax.wsdl.importDocuments",true);
+
+        Definition definition = wsdlReader.readWSDL("target/classes/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl");
+        assertNotNull(definition);
+        
+        // write WSDL out
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        try {
+            WSDLWriter writer = WSDLFactory.newInstance().newWSDLWriter();
+            writer.writeWSDL(definition, outStream);
+        } catch (Exception e){
+            throw new RuntimeException(e);
+        }
+
+        //System.out.println(outStream.toString());
+    }
+*/    
+    
+    public void testTuscanySerialization() throws Exception {  
+        // read in WSDL
+        String contributionLocation = "target/classes";
+        NodeImpl node = (NodeImpl)NodeFactory.newInstance().createNode("org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite", 
+                                                                       new Contribution("test", contributionLocation));
+        node.start();
+        
+        RuntimeEndpointImpl endpoint = (RuntimeEndpointImpl)node.getDomainComposite().getComponents().get(0).getServices().get(0).getEndpoints().get(0);
+        WSDLInterface wsdlInterface = (WSDLInterface)endpoint.getBindingInterfaceContract().getInterface();
+        
+        WSDLDefinition wsdlDefinition = wsdlInterface.getWsdlDefinition();
+        Definition definition = wsdlDefinition.getDefinition();
+        
+        // write out a flattened WSDL along with XSD
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        try {
+            WSDLWriter writer = WSDLFactory.newInstance().newWSDLWriter();
+            String baseURI = wsdlDefinition.getLocation().toString();
+            outStream.write(baseURI.getBytes());
+            outStream.write(separator);            
+            writer.writeWSDL(definition, outStream);
+            for (WSDLDefinition importedWSDLDefintion : wsdlDefinition.getImportedDefinitions()){
+                outStream.write(separator);
+                baseURI = importedWSDLDefintion.getLocation().toString();
+                outStream.write(baseURI.getBytes());
+                outStream.write(separator);
+                writer.writeWSDL(importedWSDLDefintion.getDefinition(), outStream);
+            }
+            for (XSDefinition xsdDefinition : wsdlDefinition.getXmlSchemas()){
+                // we store a reference to the schema schema. We don't need to write that out.
+                // also ignore schema that are extract from the original WSDL (have in their location)
+                if (!xsdDefinition.getNamespace().equals("http://www.w3.org/2001/XMLSchema") &&
+                    xsdDefinition.getSchema() != null){
+                    writeSchema(outStream, xsdDefinition.getSchema());
+                }
+            }           
+        } catch (Exception e){
+            throw new RuntimeException(e);
+        }
+
+        String wsdlString = outStream.toString();
+        //System.out.println(wsdlString);
+        
+        // Read the WSDL and XSD back in from the string
+        String xmlArray[] = wsdlString.split("_X_");
+        String topWSDLLocation = null;
+        Map<String, XMLString> xmlMap = new HashMap<String, XMLString>();
+        
+        for (int i = 0; i < xmlArray.length; i = i + 2){
+            String location = xmlArray[i];
+            String xml = xmlArray[i+1];
+            // strip the file name out of the location
+            location = location.substring(location.lastIndexOf("/") + 1);
+            
+            if (location.endsWith(".wsdl")){
+                xmlMap.put(location,
+                           new WSDLInfo(xmlArray[i],
+                                          xml));
+                
+                if (topWSDLLocation == null){
+                    topWSDLLocation = location;
+                }
+            } else {
+                xmlMap.put(location,
+                        new XSDInfo(xmlArray[i],
+                                      xml));
+            }
+        }
+        
+        ExtensionPointRegistry registry = endpoint.getCompositeContext().getExtensionPointRegistry();
+        FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+        org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory wsdlFactory = modelFactories.getFactory(org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory.class);
+        XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class);
+        XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
+        schemaCollection.setSchemaResolver(new XSDURIResolverImpl(xmlMap));
+        ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
+        final org.apache.tuscany.sca.contribution.Contribution contribution = contributionFactory.createContribution();
+        ProcessorContext processorContext = new ProcessorContext();
+        
+        ExtensibleModelResolver extensibleResolver = new ExtensibleModelResolver(contribution, registry.getExtensionPoint(ModelResolverExtensionPoint.class), modelFactories);
+        WSDLModelResolver wsdlResolver = (WSDLModelResolver)extensibleResolver.getModelResolverInstance(WSDLDefinition.class);
+        XSDModelResolver xsdResolver = (XSDModelResolver)extensibleResolver.getModelResolverInstance(XSDefinition.class);
+        contribution.setURI("temp");
+        contribution.setLocation(topWSDLLocation);
+        contribution.setModelResolver(extensibleResolver);
+
+        // read
+        for (XMLString xmlString : xmlMap.values()){
+            if (xmlString instanceof WSDLInfo){
+                WSDLReader reader =  WSDLFactory.newInstance().newWSDLReader();
+                reader.setFeature("javax.wsdl.verbose", false);
+                reader.setFeature("javax.wsdl.importDocuments", true);
+                WSDLLocatorImpl locator = new WSDLLocatorImpl(xmlString.getBaseURI(), xmlMap);
+                Definition readDefinition = reader.readWSDL(locator);
+                
+                wsdlDefinition = wsdlFactory.createWSDLDefinition();
+                wsdlDefinition.setDefinition(readDefinition);
+                wsdlDefinition.setLocation(new URI(xmlString.getBaseURI()));
+                
+                ((WSDLInfo)xmlString).setWsdlDefintion(wsdlDefinition);
+                wsdlResolver.addModel(wsdlDefinition, processorContext);
+                
+            } else {
+                InputStream inputStream = new ByteArrayInputStream(xmlString.getXmlString().getBytes());
+                InputSource inputSource = new InputSource(inputStream);
+                inputSource.setSystemId(xmlString.getBaseURI());
+                XmlSchema schema = schemaCollection.read(inputSource, null);
+                inputStream.close();
+                
+                XSDefinition xsdDefinition = xsdFactory.createXSDefinition();
+                xsdDefinition.setSchema(schema);
+                
+                ((XSDInfo)xmlString).setXsdDefinition(xsdDefinition);
+                xsdResolver.addModel(xsdDefinition, processorContext);
+            }
+        }
+        
+        // resolve
+        for (XMLString xmlString : xmlMap.values()){
+            if (xmlString instanceof WSDLInfo){
+               wsdlDefinition = ((WSDLInfo)xmlString).getWsdlDefintion();
+               
+               // link to imports
+               for (Map.Entry<String, List<javax.wsdl.Import>> entry :
+                   ((Map<String, List<javax.wsdl.Import>>)wsdlDefinition.getDefinition().getImports()).entrySet()) {
+                   for (javax.wsdl.Import imp : entry.getValue()) {
+                       String wsdlName = imp.getDefinition().getDocumentBaseURI();
+                       WSDLInfo wsdlInfo = (WSDLInfo)xmlMap.get(getFilenameWithoutPath(wsdlName));
+                       wsdlDefinition.getImportedDefinitions().add(wsdlInfo.getWsdlDefintion());
+                   }
+               }
+               
+               // link to in-line types
+               Types types = wsdlDefinition.getDefinition().getTypes();
+               if ( types != null){
+                   for (int i=0; i < types.getExtensibilityElements().size(); i++){
+                       String schemaName = xmlString.getBaseURI() + "#" + i++;
+                       XSDInfo xsdInfo = (XSDInfo)xmlMap.get(getFilenameWithoutPath(schemaName));
+                       wsdlDefinition.getXmlSchemas().add(xsdInfo.getXsdDefinition());
+                   }
+               }
+
+            } else {
+                
+            }
+        }
+        
+        WSDLInfo topWSDL = (WSDLInfo)xmlMap.get(topWSDLLocation);
+        WSDLDefinition topWSDLDefinition = topWSDL.getWsdlDefintion();
+        
+        PortType portType = (PortType)topWSDLDefinition.getDefinition().getAllPortTypes().values().iterator().next();
+        WSDLInterface readWSDLInterface = wsdlFactory.createWSDLInterface(portType, topWSDLDefinition, extensibleResolver, null);
+        
+        // now check what we have just read with what we started out with to see if the compatibility test passes
+        // in the real system have to check contracts not interfaces
+        UtilityExtensionPoint utils = registry.getExtensionPoint(UtilityExtensionPoint.class);
+        InterfaceContractMapper interfaceContractMapper = utils.getUtility(InterfaceContractMapper.class);
+        boolean match = interfaceContractMapper.isCompatibleSubset(wsdlInterface, readWSDLInterface);
+        Assert.assertTrue(match);
+        
+        node.stop();
+    }
+    
+    public void writeSchema(OutputStream outStream, XmlSchema schema) throws IOException {
+        if (!schema.getTargetNamespace().equals("http://www.w3.org/2001/XMLSchema") &&
+                schema.getNamespaceContext() != null){ 
+            outStream.write(separator);
+            String baseURI = schema.getSourceURI();
+            outStream.write(baseURI.getBytes());
+            outStream.write(separator);
+            schema.write(outStream);
+            
+            for (Iterator<?> i = schema.getIncludes().getIterator(); i.hasNext();) {
+                XmlSchemaObject obj = (XmlSchemaObject)i.next();
+                XmlSchema ext = null;
+                if (obj instanceof XmlSchemaInclude) {
+                    ext = ((XmlSchemaInclude)obj).getSchema();
+                }
+                if (obj instanceof XmlSchemaImport) {
+                    ext = ((XmlSchemaImport)obj).getSchema();
+                }
+                writeSchema(outStream, ext);
+            } 
+        }
+    }
+       
+    public String calculateUniquePrefix(Map<String, String> targetNamespaces, String prefix){
+        String newPrefix = prefix;
+        boolean notUnique = targetNamespaces.containsKey(newPrefix);
+        int i = 1;
+        
+        while(notUnique){
+            newPrefix = prefix + i++; 
+            notUnique = targetNamespaces.containsKey(newPrefix);
+        }
+        
+        return newPrefix;
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+
+    }
+    
+    private class XMLString {
+        private String baseURI;
+        private String xmlString;
+        
+        public XMLString(String baseURI, String xmlString){
+            this.baseURI = baseURI;
+            this.xmlString = xmlString;
+        }
+        
+        public String getBaseURI() {
+            return baseURI;
+        }
+        
+        public String getXmlString() {
+            return xmlString;
+        }
+    }
+    
+    private class XSDInfo extends XMLString {
+        
+        XSDefinition xsdDefinition;
+        
+        public XSDInfo(String baseURI, String xmlString) {
+            super(baseURI, xmlString);
+        }
+        
+        public void setXsdDefinition(XSDefinition xsdDefinition) {
+            this.xsdDefinition = xsdDefinition;
+        }
+        
+        public XSDefinition getXsdDefinition() {
+            return xsdDefinition;
+        }
+    }
+    
+    private class WSDLInfo extends XMLString {
+        
+        WSDLDefinition wsdlDefintion;
+        
+        public WSDLInfo(String baseURI, String xmlString) {
+            super(baseURI, xmlString);
+        }
+        
+        public void setWsdlDefintion(WSDLDefinition wsdlDefintion) {
+            this.wsdlDefintion = wsdlDefintion;
+        }
+        
+        public WSDLDefinition getWsdlDefintion() {
+            return wsdlDefintion;
+        }
+    }    
+
+    private class WSDLLocatorImpl implements WSDLLocator {
+        private Map<String, XMLString> xmlMap;
+        private String baseURI;
+        private String latestImportURI;
+
+        public WSDLLocatorImpl(String baseURI, Map<String, XMLString> xmlMap) {
+            this.baseURI = baseURI;
+            this.xmlMap = xmlMap;
+        }
+
+        public void close() {
+/*            
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                // Ignore
+            }
+*/            
+        }
+
+        public InputSource getBaseInputSource() {
+            return getInputSource(getFilenameWithoutPath(baseURI));
+        }
+
+        public String getBaseURI() {
+            return baseURI;
+        }
+
+        public InputSource getImportInputSource(String parentLocation, String importLocation) {
+            latestImportURI = importLocation;
+            return getInputSource(getFilenameWithoutPath(importLocation));
+        }
+
+        public String getLatestImportURI() {
+            return latestImportURI;
+        }
+        
+        private InputSource getInputSource(String uri){
+            String xmlString = xmlMap.get(uri).getXmlString();
+            InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
+            //InputSource inputSource = XMLDocumentHelper.getInputSource(uri, inputStream);
+            InputSource inputSource = new InputSource(inputStream);
+            inputSource.setSystemId(uri);
+            return inputSource;
+        } 
+    }
+    
+    private class XSDURIResolverImpl extends DefaultURIResolver {
+        
+        private Map<String, XMLString> xmlMap;
+        
+        public XSDURIResolverImpl(Map<String, XMLString> xmlMap) {
+            this.xmlMap = xmlMap;
+        }
+        
+        
+        @Override
+        protected URL getURL(URL contextURL, String spec) throws IOException {
+            return super.getURL(contextURL, spec);
+        }
+        @Override
+        public InputSource resolveEntity(String namespace,
+                                         String schemaLocation, 
+                                         String baseUri) {
+            return getInputSource(getFilenameWithoutPath(schemaLocation));
+        }
+        
+        private InputSource getInputSource(String uri){
+            String xmlString = xmlMap.get(uri).getXmlString();
+            InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
+            InputSource inputSource = new InputSource(inputStream);
+            inputSource.setSystemId(uri);
+            return inputSource;
+        }
+        
+    }
+    
+    private String getFilenameWithoutPath(String filename){
+        // work out what the file name is that is being imported
+        // XSDs imports are written out by Tuscany with an relative web address such as
+        //  /services/AccountService?xsd=wsdl-serialize.xsd
+        // for the time being just string the file name off the end. We are making
+        // assumption that the interface doesn't involve two files with the same
+        // name in different locations            
+        int xsdIndex = filename.lastIndexOf("?xsd="); 
+        int wsdlIndex = filename.lastIndexOf("/");
+        if ( xsdIndex >= 0){
+            return filename.substring(xsdIndex + 5);
+        } else {
+            return filename.substring(wsdlIndex + 1);
+        }
+        // What happens with generated WSDL?
+    }  
+}