Mercurial > repos > uga-galaxy-group > webservice_toolsuite_v1_1
diff WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/xml/WADLWriterImpl.java @ 0:049760c677de default tip
Galaxy WSExtensions added successfully
author | uga-galaxy-group |
---|---|
date | Tue, 05 Jul 2011 19:34:18 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/xml/WADLWriterImpl.java Tue Jul 05 19:34:18 2011 -0400 @@ -0,0 +1,696 @@ +/* + * (c) Copyright IBM Corp 2001, 2005 + */ + +package edu.uga.cs.lsdis.meteors.wadls.xml; + +import java.io.*; +import java.net.URISyntaxException; +import java.util.*; +import javax.xml.namespace.*; +import javax.xml.parsers.*; +import org.w3c.dom.*; +import org.xml.sax.*; + +import javax.wadls.*; +import javax.wadls.extensions.*; +import javax.wadls.factory.*; +import javax.wadls.xml.*; + +import edu.uga.cs.lsdis.meteors.wadls.*; +import edu.uga.cs.lsdis.meteors.wadls.util.*; +import edu.uga.cs.lsdis.meteors.wadls.util.xml.*; + +/** + * This class describes a collection of methods + * that allow a WSDL-S model to be written to a writer + * in an XML format that follows the WSDL schema. + * + * @author Zixin Wu (wuzixin@uga.edu) + * @author Matthew J. Duftler + * @author Nirmal Mukhi + */ +public class WADLWriterImpl implements WADLWriter +{ + /** + * Sets the specified feature to the specified value. + * <p> + * There are no minimum features that must be supported. + * <p> + * All feature names must be fully-qualified, Java package style. All + * names starting with javax.wsdls. are reserved for features defined + * by the JWSDL specification. It is recommended that implementation- + * specific features be fully-qualified to match the package name + * of that implementation. For example: com.abc.featureName + * + * @param name the name of the feature to be set. + * @param value the value to set the feature to. + * @throws IllegalArgumentException if the feature name is not recognized. + * @see #getFeature(String) + */ + public void setFeature(String name, boolean value) + throws IllegalArgumentException + { + if (name == null) + { + throw new IllegalArgumentException("Feature name must not be null."); + } + else + { + throw new IllegalArgumentException("Feature name '" + name + + "' not recognized."); + } + } + + /** + * Gets the value of the specified feature. + * + * @param name the name of the feature to get the value of. + * @throws IllegalArgumentException if the feature name is not recognized. + * @see #setFeature(String, boolean) + */ + public boolean getFeature(String name) throws IllegalArgumentException + { + if (name == null) + { + throw new IllegalArgumentException("Feature name must not be null."); + } + else + { + throw new IllegalArgumentException("Feature name '" + name + + "' not recognized."); + } + } + + protected void printDefinition(Application def, PrintWriter pw) + throws WADLSException, URISyntaxException + { + if (def == null) + { + return; + } + + if (def.getPrefix(Constants.NS_URI_WADL) == null) + { + String prefix = "wsdl"; + int subscript = 0; + + while (def.getNamespace(prefix) != null) + { + prefix = "wsdl" + subscript++; + } + + def.addNamespace(prefix, Constants.NS_URI_WADL); + } + + if (def.getPrefix(Constants.NS_URI_WADLS) == null) + { + String prefix = Constants.PREFIX_WSDLS; + int subscript = 0; + + while (def.getNamespace(prefix) != null) + { + prefix = Constants.PREFIX_WSDLS + subscript++; + } + + def.addNamespace(prefix, Constants.NS_URI_WADLS); + } + + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_DEFINITIONS, + def); + + pw.print('<' + tagName); + + QName name = def.getQName(); + String targetNamespace = def.getTargetNamespace(); + Map namespaces = def.getNamespaces(); + + if (name != null) + { + DOMUtils.printAttribute(Constants.ATTR_NAME, name.getLocalPart(), pw); + } + + DOMUtils.printAttribute(Constants.ATTR_TARGET_NAMESPACE, + targetNamespace, + pw); + + printNamespaceDeclarations(namespaces, pw); + + pw.println('>'); + + printDocumentation(def.getDocumentationElement(), pw); + printIncludes(def.getIncludes(), def, pw); + printTypes(def.getParams(), def, pw); + printResources(def.getResources(), def, pw); + + + + + + pw.println("</" + tagName + '>'); + + pw.flush(); + } + + + + + + + + + protected void printResources(Map portTypes, + Application def, + PrintWriter pw) + throws WADLSException, URISyntaxException + { + if (portTypes != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_RESOURCE, + def); + Iterator portTypeIterator = portTypes.values().iterator(); + + while (portTypeIterator.hasNext()) + { + Resource portType = (Resource)portTypeIterator.next(); + + if (!portType.isUndefined()) + { + pw.print(" <" + tagName); + + QName name = portType.getQName(); + + if (name != null) + { + DOMUtils.printAttribute(Constants.ATTR_NAME, + name.getLocalPart(), + pw); + } + + + + pw.println('>'); + + printDocumentation(portType.getDocumentationElement(), pw); + printOperations(portType.getMethods(), def, pw); + pw.println(" </" + tagName + '>'); + } + } + } + } + + protected void printOperations(List operations, + Application def, + PrintWriter pw) + throws WADLSException, URISyntaxException + { + if (operations != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_OPERATION, + def); + Iterator operationIterator = operations.iterator(); + + while (operationIterator.hasNext()) + { + Method operation = (Method)operationIterator.next(); + + if (!operation.isUndefined()) + { + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAME, + operation.getName(), + pw); + //write modelReference + ModelReference mr = operation.getModelReference(); + if (mr != null){ + if (mr.getNamespace() != null) //has namespaceURI + mr.setPrefix(def.getPrefix(mr.getNamespace().toString())); + else //no namespaceURI, try prefix + mr.setNamespace(def.getNamespace(mr.getPrefix())); + if (mr.getNamespace() == null) //error + throw new WADLSException(WADLSException.UNBOUND_PREFIX, + "Cannot find the namespace for the prefix " + + mr.getPrefix()); + DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_MODELREF, + mr.value(), + def, + pw); + } + + DOMUtils.printAttribute(Constants.ATTR_PARAMETER_ORDER, + StringUtils.getNMTokens(operation.getParameterOrdering()), + pw); + + pw.println('>'); + + printDocumentation(operation.getDocumentationElement(), pw); + // Must be OperationType.REQUEST_RESPONSE. + printInput(operation.getRequest(), def, pw); + printOutput(operation.getResponse(), def, pw); + + printPreCondition(operation.getPreCondition(), def, pw); + printEffect(operation.getEffect(), def, pw); + + + + + + + + pw.println(" </" + tagName + '>'); + } + } + } + } + + protected void printPreCondition(PreCondition preCondition, + Application def, + PrintWriter pw) + throws WADLSException, URISyntaxException +{ + if (preCondition != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADLS, + Constants.ELEM_PRECON, + def); + + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAME, preCondition.getName(), pw); + + //write modelReference + ModelReference mr = preCondition.getModelReference(); + if (mr != null){ + if (mr.getNamespace() != null) //has namespaceURI + mr.setPrefix(def.getPrefix(mr.getNamespace().toString())); + else //no namespaceURI, try prefix + mr.setNamespace(def.getNamespace(mr.getPrefix())); + if (mr.getNamespace() == null) //error + throw new WADLSException(WADLSException.UNBOUND_PREFIX, + "Cannot find the namespace for the prefix " + + mr.getPrefix()); + DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_MODELREF, + mr.value(), + def, + pw); + } + + DOMUtils.printAttribute(Constants.ATTR_EXPRESSION, preCondition.getExpression(), pw); + +// printExtensibilityAttributes(PreCondition.class, preCondition, def, pw); + + Element docEl = preCondition.getDocumentationElement(); + + if (docEl == null) + { + pw.println("/>"); + } + else + { + pw.print('>'); + + printDocumentation(docEl, pw); + + pw.println("</" + tagName + '>'); + } + } +} + protected void printEffect(Effect effect, + Application def, + PrintWriter pw) + throws WADLSException, URISyntaxException +{ + if (effect != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADLS, + Constants.ELEM_EFFECT, + def); + + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAME, effect.getName(), pw); + + //write modelReference + ModelReference mr = effect.getModelReference(); + if (mr != null){ + if (mr.getNamespace() != null) //has namespaceURI + mr.setPrefix(def.getPrefix(mr.getNamespace().toString())); + else //no namespaceURI, try prefix + mr.setNamespace(def.getNamespace(mr.getPrefix())); + if (mr.getNamespace() == null) //error + throw new WADLSException(WADLSException.UNBOUND_PREFIX, + "Cannot find the namespace for the prefix " + + mr.getPrefix()); + DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_MODELREF, + mr.value(), + def, + pw); + } + + DOMUtils.printAttribute(Constants.ATTR_EXPRESSION, effect.getExpression(), pw); + +// printExtensibilityAttributes(Effect.class, effect, def, pw); + + Element docEl = effect.getDocumentationElement(); + + if (docEl == null) + { + pw.println("/>"); + } + else + { + pw.print('>'); + + printDocumentation(docEl, pw); + + pw.println("</" + tagName + '>'); + } + } +} + + protected void printInput(Request input, + Application def, + PrintWriter pw) + throws WADLSException + { + if (input != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_INPUT, + def); + + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAME, input.getName(), pw); + + Element docEl = input.getDocumentationElement(); + + if (docEl == null) + { + pw.println("/>"); + } + else + { + pw.println('>'); + + printDocumentation(docEl, pw); + + pw.println(" </" + tagName + '>'); + } + } + } + + protected void printOutput(Response output, + Application def, + PrintWriter pw) + throws WADLSException + { + if (output != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_OUTPUT, + def); + + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAME, output.getName(), pw); + + Element docEl = output.getDocumentationElement(); + + if (docEl == null) + { + pw.println("/>"); + } + else + { + pw.println('>'); + + printDocumentation(docEl, pw); + + pw.println(" </" + tagName + '>'); + } + } + } + + + + + + protected void printDocumentation(Element docElement, + PrintWriter pw) + throws WADLSException + { + if (docElement != null) + { + DOM2Writer.serializeAsXML(docElement, pw); + + pw.println(); + } + } + + protected void printTypes(Params types, Application def, PrintWriter pw) + throws WADLSException + { + if (types != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_TYPES, + def); + pw.print(" <" + tagName); + + pw.println('>'); + + printDocumentation(types.getDocumentationElement(), pw); + + + + + + pw.println(" </" + tagName + '>'); + } + } + + protected void printIncludes(Map imports, Application def, PrintWriter pw) + throws WADLSException + { + if (imports != null) + { + String tagName = + DOMUtils.getQualifiedValue(Constants.NS_URI_WADL, + Constants.ELEM_INCLUDE, + def); + Iterator importListIterator = imports.values().iterator(); + + while (importListIterator.hasNext()) + { + List importList = (List)importListIterator.next(); + Iterator importIterator = importList.iterator(); + + while (importIterator.hasNext()) + { + Include importDef = (Include)importIterator.next(); + + pw.print(" <" + tagName); + + DOMUtils.printAttribute(Constants.ATTR_NAMESPACE, + importDef.getNamespaceURI(), + pw); + DOMUtils.printAttribute(Constants.ATTR_LOCATION, + importDef.getLocationURI(), + pw); + + + + Element docEl = importDef.getDocumentationElement(); + + if (docEl == null) + { + pw.println("/>"); + } + else + { + pw.println('>'); + + printDocumentation(docEl, pw); + + pw.println(" </" + tagName + '>'); + } + } + } + } + } + + protected void printNamespaceDeclarations(Map namespaces, + PrintWriter pw) + throws WADLSException + { + if (namespaces != null) + { + Set keys = namespaces.keySet(); + Iterator keyIterator = keys.iterator(); + + while (keyIterator.hasNext()) + { + String prefix = (String)keyIterator.next(); + + if (prefix == null) + { + prefix = ""; + } + + DOMUtils.printAttribute(Constants.ATTR_XMLNS + + (!prefix.equals("") ? ":" + prefix : ""), + (String)namespaces.get(prefix), + pw); + } + } + } + + + private static Document getDocument(InputSource inputSource, + String desc) throws WADLSException + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + + factory.setNamespaceAware(true); + factory.setValidating(false); + + try + { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(inputSource); + + return doc; + } + catch (Throwable t) + { + throw new WADLSException(WADLSException.XSDPARSER_ERROR, + "Problem parsing '" + desc + "'.", + t); + } + } + + /** + * Return a document generated from the specified WSDL model. + * @throws URISyntaxException + */ + public Document getDocument(Application wsdlDef) throws WADLSException, URISyntaxException + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + + writeWADL(wsdlDef, pw); + + StringReader sr = new StringReader(sw.toString()); + InputSource is = new InputSource(sr); + + return getDocument(is, "- WSDL Document -"); + } + + /** + * Write the specified WSDL definition to the specified Writer. + * + * @param wsdlDef the WSDL definition to be written. + * @param sink the Writer to write the xml to. + * @throws URISyntaxException + */ + public void writeWADL(Application wsdlDef, Writer sink) + throws WADLSException, URISyntaxException + { + PrintWriter pw = new PrintWriter(sink); + String javaEncoding = (sink instanceof OutputStreamWriter) + ? ((OutputStreamWriter)sink).getEncoding() + : null; + + String xmlEncoding = DOM2Writer.java2XMLEncoding(javaEncoding); + + if (xmlEncoding == null) + { + throw new WADLSException(WADLSException.CONFIGURATION_ERROR, + "Unsupported Java encoding for writing " + + "wsdl file: '" + javaEncoding + "'."); + } + + pw.println(Constants.XML_DECL_START + + xmlEncoding + + Constants.XML_DECL_END); + + printDefinition(wsdlDef, pw); + } + + /** + * Write the specified WSDL definition to the specified OutputStream. + * + * @param wsdlDef the WSDL definition to be written. + * @param sink the OutputStream to write the xml to. + * @throws URISyntaxException + */ + public void writeWADL(Application wsdlDef, OutputStream sink) + throws WADLSException, URISyntaxException + { + Writer writer = null; + + try + { + writer = new OutputStreamWriter(sink, "UTF8"); + } + catch (UnsupportedEncodingException e) + { + e.printStackTrace(); + + writer = new OutputStreamWriter(sink); + } + + writeWADL(wsdlDef, writer); + } + + /** + * A test driver. + *<code> + *<pre>Usage:</pre> + *<p> + *<pre> java edu.uga.cs.lsdis.meteors.wsdls.xml.WSDLWriterImpl filename|URL</pre> + *<p> + *<pre> This test driver simply reads a WSDL document into a model + * (using a WSDLReader), and then serializes it back to + * standard out. In effect, it performs a round-trip test on + * the specified WSDL document.</pre> + * @throws URISyntaxException + */ + public static void main(String[] argv) throws WADLSException, URISyntaxException + { + if (argv.length == 1) + { + WADLFactory wsdlFactory = WADLFactory.newInstance(); + WADLReader wsdlReader = wsdlFactory.newWADLReader(); + WADLWriter wsdlWriter = wsdlFactory.newWADLWriter(); + + wsdlWriter.writeWADL(wsdlReader.readWADL(null, argv[0]), System.out); + } + else + { + System.err.println("Usage:"); + System.err.println(); + System.err.println(" java " + WADLWriterImpl.class.getName() + + " filename|URL"); + System.err.println(); + System.err.println("This test driver simply reads a WSDL document " + + "into a model (using a WSDLReader), and then " + + "serializes it back to standard out. In effect, " + + "it performs a round-trip test on the specified " + + "WSDL document."); + } + } +}