From e3e3d53c72d0bcf3584c845f5e626b2484e6bbea Mon Sep 17 00:00:00 2001 From: slaws Date: Fri, 12 Aug 2011 15:11:09 +0000 Subject: 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. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1157148 13f79535-47bb-0310-9956-ffa450edef68 --- .../binding/ws/axis2/wsdl-serialize-nested.wsdl | 71 ++++ .../sca/binding/ws/axis2/wsdl-serialize-nested.xsd | 31 ++ .../sca/binding/ws/axis2/wsdl-serialize-top.wsdl | 49 +++ .../sca/binding/ws/axis2/wsdl-serialize.composite | 33 ++ .../sca/binding/ws/axis2/wsdl-serialize.xsd | 28 ++ .../ws/axis2/HelloWorldWSDLMergedTestCase.java | 25 +- .../ws/axis2/QuestionMarkWSDLIncludeTestCase.java | 28 +- .../ws/axis2/WSDLSerializationTestCase.java | 463 +++++++++++++++++++++ 8 files changed, 725 insertions(+), 3 deletions(-) create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd create mode 100644 sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java (limited to 'sca-java-2.x/trunk/testing/itest') diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl new file mode 100644 index 0000000000..ec72fbd1a6 --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.wsdl @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd new file mode 100644 index 0000000000..c24bd92eff --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-nested.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl new file mode 100644 index 0000000000..6c91e62baf --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize-top.wsdl @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite new file mode 100644 index 0000000000..07f7608bfa --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd new file mode 100644 index 0000000000..ce9e017492 --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.xsd @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java index bc69473abe..74998379c4 100644 --- a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/HelloWorldWSDLMergedTestCase.java @@ -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.OMAbstractFactory; 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 HelloWorldWSDLMergedTestCase extends TestCase { 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 HelloWorldWSDLMergedTestCase extends TestCase { 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 { diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java index 173d952b0e..ab5713a0ae 100644 --- a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/QuestionMarkWSDLIncludeTestCase.java @@ -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.NodeFactory; */ 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 QuestionMarkWSDLIncludeTestCase extends TestCase { } 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(); } diff --git a/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java new file mode 100644 index 0000000000..c4f4e55899 --- /dev/null +++ b/sca-java-2.x/trunk/testing/itest/ws/wsdl/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/WSDLSerializationTestCase.java @@ -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 xmlMap = new HashMap(); + + 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> entry : + ((Map>)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 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 xmlMap; + private String baseURI; + private String latestImportURI; + + public WSDLLocatorImpl(String baseURI, Map 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 xmlMap; + + public XSDURIResolverImpl(Map 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? + } +} -- cgit v1.2.3