diff options
Diffstat (limited to 'sandbox/ant/relax-ws/src')
9 files changed, 809 insertions, 0 deletions
diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/Convert2Wsdl.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/Convert2Wsdl.java new file mode 100644 index 0000000000..33726a6f8c --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/Convert2Wsdl.java @@ -0,0 +1,342 @@ +/* + * Copyright 2008 Jason Sando + * + * Licensed 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.interfacedef.relaxws; + +import com.thaiopensource.relaxng.edit.SchemaCollection; +import com.thaiopensource.relaxng.input.InputFailedException; +import com.thaiopensource.relaxng.input.InputFormat; +import com.thaiopensource.relaxng.input.parse.compact.CompactParseInputFormat; +import com.thaiopensource.relaxng.output.LocalOutputDirectory; +import com.thaiopensource.relaxng.output.OutputDirectory; +import com.thaiopensource.relaxng.output.OutputFormat; +import com.thaiopensource.relaxng.output.xsd.XsdOutputFormat; +import com.thaiopensource.xml.sax.ErrorHandlerImpl; +import com.google.code.p.relaxws.parser.*; + +import java.io.*; +import java.net.URL; +import java.util.HashSet; +import java.util.Set; + +/** + * TUSCANY: change to support calling programatically + * - avoid using Files + * - add constructor + * - make convert method public + */ + +/** + * Convert from relaxws-wiz to wsdl. + * + * 1. parse the input file + * 2. append all rnc blocks into a single buffer, then convert to XSD, to be + * embedded in the wsdl. + * 3. Output wsdl. + */ +public class Convert2Wsdl { + + private PrintWriter out; + private ASTservice tree; + + private static void usage (String reason) { + if (reason != null) + System.err.println ("Command failed: " + reason); + System.err.println ("\nUSAGE:"); + System.err.println("Convert2Wsdl [-d output-folder] <input.rws>"); + System.exit (1); + } + + private static void fail (String reason) { + if (reason != null) + System.err.println ("Command failed: " + reason); + System.exit (1); + } + + private static String fileBase (String name) { + int dot = name.lastIndexOf('.'); + if (dot != -1) { + name = name.substring (0, dot); + } + return name; + } + + public static void main(String[] args) throws Exception { + + String outputPath = null; + String inputFilePath = null; + + int lastArg = args.length - 1; + for (int i = 0; i < args.length; i++) { + if ("-d".equals (args[i]) && (i < lastArg)) { + outputPath = args[i + 1]; + i++; + } else if (args[i].startsWith("-")) { + usage("unrecognized option " + args[i]); + } else { + if (inputFilePath != null) { + usage("Multiple input files specified: " + inputFilePath + "," + args[i]); + } + inputFilePath = args[i]; + } + } + + if (inputFilePath == null) { + usage(null); + } + + File inputFile = new File (inputFilePath); + if (!inputFile.exists()) { + fail ("'" + inputFilePath + "' not found."); + } + if (outputPath == null) { + outputPath = inputFile.getParent(); + } + + File outputFileDir = new File (outputPath); + if (!outputFileDir.exists()) { + if (!outputFileDir.mkdirs()) { + fail ("failed to create output folder '" + outputPath + "'"); + } + } + + BufferedReader rdr = new BufferedReader (new FileReader(inputFile)); + RelaxWizParser p = new RelaxWizParser (rdr); + ASTservice tree = p.service (); + + File outputFile = new File(outputFileDir, fileBase(inputFile.getName()) + ".wsdl"); + System.err.println("Convert2Wsdl: processing '" + inputFile.getName() + "' to '" + outputFile.getPath()); + + PrintWriter out = new PrintWriter(new FileWriter(outputFile)); + + Convert2Wsdl converter = new Convert2Wsdl(tree, out); + converter.convert(); + + out.close(); + } + + public Convert2Wsdl(ASTservice tree, PrintWriter out) { + this.tree = tree; + this.out = out; + } + + public void convert() throws Exception { + + if (tree.getNamespace() == null) { + tree.setNamespace("http://tempuri.org/" + tree.getName()); + } + String ns = tree.getNamespace(); + + out.print ("<?xml version=\"1.0\"?>\n"); + out.print ("<definitions name=\"" + tree.getName() + "\"\n" + + " targetNamespace=\"" + ns + "\"\n" + + " xmlns:tns=\"" + ns + "\"\n" + + " xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\"\n" + + " xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n" + + "\n" + + " <types>\n"); + + // Make a pass through and assign all message names, and build proper rnc block + Set<String> messageNames = new HashSet<String>(); + StringBuffer rncBuff = new StringBuffer(); + rncBuff.append ("default namespace = \"" + ns + "\"\n"); +// rncBuff.append ("(\n"); + for (Node portNode: tree.getChildren()) { + if (portNode instanceof ASTtypesDecl) { + rncBuff.append(((ASTtypesDecl) portNode).getRnc()); + continue; + } + + ASTportDecl port = (ASTportDecl) portNode; + + // patch up default name if not set. + if (port.getName() == null) { + port.setName (tree.getName() + "Port"); + } + + // enumerate operations in this port + for (Node opNode: port.getChildren()) { + ASToperationDecl op = (ASToperationDecl) opNode; + + // children of op node + for (Node msgNode: op.getChildren()) { + ASTMessageDef message = (ASTMessageDef) msgNode; + message.setDefaultMessageName(op.getName()); + + if (messageNames.contains(message.getMessageName())) { + // todo: loop searching for unique name + message.setMessageName(message.getMessageName() + "1"); + } else { + messageNames.add(message.getMessageName()); + } + + if (message.getName() == null) { + message.setDefaultName (op.getName()); + } + + rncBuff.append (message.getName() + " = "); + rncBuff.append ("element " + message.getName() + " {\n"); + String s = message.getRnc(); + if (s.trim().length() == 0) { + s = "text"; + } + rncBuff.append (s); + rncBuff.append ("}\n"); + } + } + } +// rncBuff.append (")"); + + // convert rnc to xsd + String xsdText = toXsd(rncBuff.toString()); + out.print (xsdText); + + out.print (" </types>\n"); + + // declare messages for each in and out of each operation for each port (must be unique) + out.println (); + for (Node portNode: tree.getChildren()) { + + if (portNode instanceof ASTtypesDecl) { + continue; + } + + ASTportDecl port = (ASTportDecl) portNode; + + // enumerate operations in this port + for (Node opNode: port.getChildren()) { + ASToperationDecl op = (ASToperationDecl) opNode; + + // children of op node + for (Node msgNode: op.getChildren()) { + ASTMessageDef message = (ASTMessageDef) msgNode; + // declare message type + out.println (" <message name=\"" + message.getMessageName() + "\">"); + out.println (" <part name=\"body\" element=\"tns:" + message.getName() + "\"/>"); + out.println (" </message>"); + } + + } + + out.println (); + out.println (" <portType name=\"" + port.getName() + "\">"); + for (Node opNode: port.getChildren()) { + ASToperationDecl op = (ASToperationDecl) opNode; + + out.println (" <operation name=\"" + op.getName() + "\">"); + + // children of op node + for (Node msgNode: op.getChildren()) { + ASTMessageDef message = (ASTMessageDef) msgNode; + + switch (message.getType()) { + case In: + out.println (" <input message=\"tns:" + message.getMessageName() + "\"/>"); + break; + + case Out: + out.println (" <output message=\"tns:" + message.getMessageName() + "\"/>"); + break; + + case Fault: + // todo + } + } + + out.println (" </operation>"); + } + out.println (" </portType>"); + + // binding to soap + out.println (); + out.println (" <binding name=\"" + port.getName() + "SoapBinding\" type=\"tns:" + port.getName() + "\">"); + out.println (" <soap:binding style=\"document\" transport=\"http://schemas.xmlsoap.org/soap/http\"/>"); + for (Node opNode: port.getChildren()) { + ASToperationDecl op = (ASToperationDecl) opNode; + + out.println (" <operation name=\"" + op.getName() + "\">"); + out.println (" <soap:operation soapAction=\"" + ns + "/" + port.getName() + "#" + op.getName() + "\"/>"); + out.println (" <input>\n" + + " <soap:body use=\"literal\"/>\n" + + " </input>\n" + + " <output>\n" + + " <soap:body use=\"literal\"/>\n" + + " </output>"); + out.println (" </operation>"); + } + out.println (" </binding>"); + + out.println(); + out.println (" <service name=\"" + tree.getName() + port.getName() + "Service\">\n" + + " <port name=\"" + port.getName() + "\" binding=\"tns:" + port.getName() + "SoapBinding\">\n" + + " <soap:address location=\"http://example.com/" + tree.getName() + "\"/>\n" + + " </port>\n" + + " </service>"); + } + + + out.print ("</definitions>\n"); + out.close(); + } + + private static String toXsd (String rnc) throws Exception { + + // write the rnc to a temp file + File rncInput = File.createTempFile("relaxwiz", ".rnc"); + FileWriter fw = new FileWriter (rncInput); + fw.write(rnc); + fw.close(); + + // Use Trang to convert to an XSD file + InputFormat inFormat = new CompactParseInputFormat(); + ErrorHandlerImpl handler = new ErrorHandlerImpl(); + SchemaCollection sc = null; + try { + sc = inFormat.load(new URL("file", "", rncInput.getAbsolutePath()).toString(), new String[0], "xsd", handler); + } catch (InputFailedException e) { + System.err.println("Error in RNC preprocessor, source follows:"); + int line = 0; + for (String s: rnc.split("\n")) { + line++; + System.err.printf("%3d: %s\n", line, s); + } + System.exit (1); + } + OutputFormat of = new XsdOutputFormat(); + File xsdOutput = File.createTempFile("relaxwiz", ".xsd"); + OutputDirectory od = new LocalOutputDirectory(sc.getMainUri(), + xsdOutput, + "xsd", + "UTF-8", + 80, + 2); + String[] outParams = new String[]{new URL("file", "", xsdOutput.getAbsolutePath()).toString()}; + of.output(sc, od, new String[]{}, "rnc", handler); + + // read in file and return as string. + BufferedReader reader = new BufferedReader(new FileReader (xsdOutput)); + String line; + StringBuffer buf = new StringBuffer(); + while ((line = reader.readLine()) != null) { + if (line.startsWith("<?xml")) { + continue; + } + buf.append (line).append ('\n'); + } + reader.close(); + return buf.toString(); + } + +} diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSDocumentProcessor.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSDocumentProcessor.java new file mode 100644 index 0000000000..0bf9ccbee8 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSDocumentProcessor.java @@ -0,0 +1,90 @@ +/* + * 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.interfacedef.relaxws; + +import java.net.URI; +import java.net.URL; + +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.xml.WSDLLocator; +import javax.wsdl.xml.WSDLReader; + +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.contribution.service.ContributionResolveException; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; + +/** + * An ArtifactProcessor for Relax WS documents. + * For files with the .rws suffix this creates a RelaxWSModel instance which will + * + * + * + */ +public class RelaxWSDocumentProcessor implements URLArtifactProcessor<RelaxWSModel> { + + private WSDLFactory factory; + + public RelaxWSDocumentProcessor(ModelFactoryExtensionPoint modelFactories) { + this.factory = modelFactories.getFactory(WSDLFactory.class); + } + + public RelaxWSModel read(URL contributionURL, URI artifactURI, URL artifactURL) throws ContributionReadException { + + try { + + javax.wsdl.factory.WSDLFactory wsdlFactory = javax.wsdl.factory.WSDLFactory.newInstance(); + WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); + wsdlReader.setFeature("javax.wsdl.verbose",false); + wsdlReader.setFeature("javax.wsdl.importDocuments",false); + + WSDLLocator locator = new RelaxWSWSDLLocator(artifactURL); + Definition definition = wsdlReader.readWSDL(locator); + WSDLDefinition wsdlDefinition = factory.createWSDLDefinition(); + + wsdlDefinition.setDefinition(definition); + wsdlDefinition.setUnresolved(true); + wsdlDefinition.setNamespace(definition.getTargetNamespace()); + wsdlDefinition.setUnresolved(false); + + RelaxWSModel rwsModel = new RelaxWSModel(wsdlDefinition); + return rwsModel; + + } catch (WSDLException e) { + throw new ContributionReadException(e); + } + } + + public String getArtifactType() { + return ".rws"; + } + + public Class<RelaxWSModel> getModelType() { + return RelaxWSModel.class; + } + + public void resolve(RelaxWSModel arg0, ModelResolver arg1) throws ContributionResolveException { + } + +} diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModel.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModel.java new file mode 100644 index 0000000000..c47a5853a5 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModel.java @@ -0,0 +1,41 @@ +/* + * 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.interfacedef.relaxws; + +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; + +/** + * Model object for Relax WS documents. + * Just a holder for a WSDLDefinition needed so the RelaxWSModelResolver + * can get a hook in to add the WSDLDefinition to the WSDLModelResolver + */ +public class RelaxWSModel { + + protected WSDLDefinition wsdlDefinition; + + public RelaxWSModel(WSDLDefinition wsdlDefinition) { + this.wsdlDefinition = wsdlDefinition; + } + + public WSDLDefinition getWsdlDefinition() { + return wsdlDefinition; + } + +} diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java new file mode 100644 index 0000000000..190f1d2b81 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java @@ -0,0 +1,151 @@ +/* + * 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.interfacedef.relaxws; + +import static org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLModelResolver.XSD_QNAME_LIST; + +import java.net.URI; +import java.util.List; + +import javax.wsdl.Definition; +import javax.wsdl.Types; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.UnknownExtensibilityElement; +import javax.wsdl.extensions.schema.Schema; + +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; +import org.apache.tuscany.sca.interfacedef.wsdl.XSDefinition; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +/** + * A ModelResolver that takes a RelaxWSModel object and gives the + * underlying WSDLDefinition to the WSDL model resolver. + */ +public class RelaxWSModelResolver implements ModelResolver { + + private ModelResolver modelresolver; + Contribution contribution; + private WSDLFactory wsdlFactory; + + public RelaxWSModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) { + modelresolver = contribution.getModelResolver(); + this.contribution = contribution; + this.wsdlFactory = modelFactories.getFactory(WSDLFactory.class); + } + + public void addModel(Object arg0) { + RelaxWSModel rwsModel = (RelaxWSModel)arg0; + readInlineSchemas(rwsModel.wsdlDefinition, rwsModel.wsdlDefinition.getDefinition()); + modelresolver.addModel(rwsModel.wsdlDefinition); + } + + public Object removeModel(Object arg0) { + RelaxWSModel rwsModel = (RelaxWSModel)arg0; + return modelresolver.removeModel(rwsModel.wsdlDefinition); + } + + public <T> T resolveModel(Class<T> arg0, T arg1) { + // nothing needed for RelaxWSModelResolver + return null; + } + + // TODO following methods are a direct copy from the WSDLModelResolver + // need to refactor so the code can be shared + + protected void readInlineSchemas(WSDLDefinition wsdlDefinition, Definition definition) { + if (contribution == null) { + // Check null for test cases + return; + } + Types types = definition.getTypes(); + if (types != null) { + int index = 0; + for (Object ext : types.getExtensibilityElements()) { + ExtensibilityElement extElement = (ExtensibilityElement)ext; + Element element = null; + if (XSD_QNAME_LIST.contains(extElement.getElementType())) { + if (extElement instanceof Schema) { + element = ((Schema)extElement).getElement(); + } else if (extElement instanceof UnknownExtensibilityElement) { + element = ((UnknownExtensibilityElement)extElement).getElement(); + } + } + if (element != null) { + Document doc = promote(element); + XSDefinition xsDefinition = wsdlFactory.createXSDefinition(); + xsDefinition.setUnresolved(true); + xsDefinition.setNamespace(element.getAttribute("targetNamespace")); + xsDefinition.setDocument(doc); + xsDefinition.setLocation(URI.create(doc.getDocumentURI() + "#" + index)); + XSDefinition resolved = + contribution.getModelResolver().resolveModel(XSDefinition.class, xsDefinition); + if (resolved != null && !resolved.isUnresolved()) { + if (!wsdlDefinition.getXmlSchemas().contains(resolved)) { + wsdlDefinition.getXmlSchemas().add(xsDefinition); + } + } + index++; + } + } + } + for (Object imports : definition.getImports().values()) { + List impList = (List)imports; + for (Object i : impList) { + javax.wsdl.Import anImport = (javax.wsdl.Import)i; + // Read inline schemas + if (anImport.getDefinition() != null) { + readInlineSchemas(wsdlDefinition, anImport.getDefinition()); + } + } + } + } + + private Document promote(Element element) { + Document doc = (Document)element.getOwnerDocument().cloneNode(false); + Element schema = (Element)doc.importNode(element, true); + doc.appendChild(schema); + Node parent = element.getParentNode(); + while (parent instanceof Element) { + Element root = (Element)parent; + NamedNodeMap nodeMap = root.getAttributes(); + for (int i = 0; i < nodeMap.getLength(); i++) { + Attr attr = (Attr)nodeMap.item(i); + String name = attr.getName(); + if ("xmlns".equals(name) || name.startsWith("xmlns:")) { + if (schema.getAttributeNode(name) == null) { + schema.setAttributeNodeNS((Attr)doc.importNode(attr, true)); + } + } + } + parent = parent.getParentNode(); + } + doc.setDocumentURI(element.getOwnerDocument().getDocumentURI()); + return doc; + } + +} diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSWSDLLocator.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSWSDLLocator.java new file mode 100644 index 0000000000..d5b12eef95 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSWSDLLocator.java @@ -0,0 +1,83 @@ +/* + * 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.interfacedef.relaxws; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringReader; +import java.net.URL; + +import javax.wsdl.xml.WSDLLocator; + +import org.xml.sax.InputSource; + +import com.google.code.p.relaxws.parser.RelaxWizParser; + +/** + * WSDLLocator for reading a Relax WS .rws file into a WSDL4J Definition + */ +public class RelaxWSWSDLLocator implements WSDLLocator { + + URL rwsURL; + String wsdlString; + + public RelaxWSWSDLLocator(URL rwsURL) { + this.rwsURL = rwsURL; + } + + public void close() { + } + + public InputSource getBaseInputSource() { + if (wsdlString == null) { + try { + convertRwsToWsdl(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return new InputSource(new StringReader(wsdlString)); + } + + protected void convertRwsToWsdl() throws Exception { + RelaxWizParser parser = new RelaxWizParser (new BufferedReader (new InputStreamReader(rwsURL.openStream()))); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Convert2Wsdl convertor = new Convert2Wsdl(parser.service(), new PrintWriter(baos)); + convertor.convert(); + wsdlString = baos.toString(); + } + + public String getBaseURI() { + return rwsURL.toString(); + } + + public InputSource getImportInputSource(String arg0, String arg1) { + return null; + } + + public String getLatestImportURI() { + return null; + } + +} diff --git a/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor b/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor new file mode 100644 index 0000000000..2a0baf793c --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor @@ -0,0 +1,19 @@ +# 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. + +# Implementation class for the artifact processor extension +org.apache.tuscany.sca.interfacedef.relaxws.RelaxWSDocumentProcessor;type=.rws,model=org.apache.tuscany.sca.interfacedef.relaxws.RelaxWSModel diff --git a/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver b/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver new file mode 100644 index 0000000000..a173f77a52 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.resolver.ModelResolver @@ -0,0 +1,18 @@ +# 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.
+
+org.apache.tuscany.sca.interfacedef.relaxws.RelaxWSModelResolver;model=org.apache.tuscany.sca.interfacedef.relaxws.RelaxWSModel
diff --git a/sandbox/ant/relax-ws/src/test/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSTestCase.java b/sandbox/ant/relax-ws/src/test/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSTestCase.java new file mode 100644 index 0000000000..30b53c0e7b --- /dev/null +++ b/sandbox/ant/relax-ws/src/test/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSTestCase.java @@ -0,0 +1,44 @@ +/* + * 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.interfacedef.relaxws; + +import java.net.URL; + +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.xml.WSDLReader; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.interfacedef.relaxws.RelaxWSWSDLLocator; + +public class RelaxWSTestCase extends TestCase { + + public void testConvert() throws WSDLException { + URL rwsURL = this.getClass().getClassLoader().getResource("org/apache/tuscany/sca/interfacedef/relaxws/helloworld.rws"); + RelaxWSWSDLLocator locator = new RelaxWSWSDLLocator(rwsURL); + javax.wsdl.factory.WSDLFactory wsdlFactory = javax.wsdl.factory.WSDLFactory.newInstance(); + WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); + wsdlReader.setFeature("javax.wsdl.verbose",false); + wsdlReader.setFeature("javax.wsdl.importDocuments",false); + Definition definition = wsdlReader.readWSDL(locator); + assertNotNull(definition); + } +} diff --git a/sandbox/ant/relax-ws/src/test/resources/org/apache/tuscany/sca/interfacedef/relaxws/helloworld.rws b/sandbox/ant/relax-ws/src/test/resources/org/apache/tuscany/sca/interfacedef/relaxws/helloworld.rws new file mode 100644 index 0000000000..602298e8ee --- /dev/null +++ b/sandbox/ant/relax-ws/src/test/resources/org/apache/tuscany/sca/interfacedef/relaxws/helloworld.rws @@ -0,0 +1,21 @@ +#
+# This is "hello world" in relax-ws.
+#
+namespace http://tuscany.apache.org/samples
+
+service HelloWorld {
+
+ port {
+ operation SayHello {
+ in {
+ element name {xsd:string}
+ }
+
+ out {
+ element message {xsd:string}
+ }
+
+ }
+
+ }
+}
\ No newline at end of file |