All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.wsdl.xml.WSDLWriterImpl Maven / Gradle / Ivy

There is a newer version: 0.10.0
Show newest version
/*
 * (c) Copyright IBM Corp 2001, 2006 
 */

package com.ibm.wsdl.xml;

import java.io.*;
import java.util.*;
import javax.xml.namespace.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.wsdl.*;
import javax.wsdl.extensions.*;
import javax.wsdl.factory.*;
import javax.wsdl.xml.*;
import com.ibm.wsdl.*;
import com.ibm.wsdl.util.*;
import com.ibm.wsdl.util.xml.*;

/**
 * This class describes a collection of methods
 * that allow a WSDL model to be written to a writer
 * in an XML format that follows the WSDL schema.
 *
 * @author Matthew J. Duftler
 * @author Nirmal Mukhi
 */
public class WSDLWriterImpl implements WSDLWriter
{
  /**
   * Sets the specified feature to the specified value.
   * 

* There are no minimum features that must be supported. *

* All feature names must be fully-qualified, Java package style. All * names starting with javax.wsdl. 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. * @return the value of the feature. * @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(Definition def, PrintWriter pw) throws WSDLException { if (def == null) { return; } if (def.getPrefix(Constants.NS_URI_WSDL) == null) { String prefix = "wsdl"; int subscript = 0; while (def.getNamespace(prefix) != null) { prefix = "wsdl" + subscript++; } def.addNamespace(prefix, Constants.NS_URI_WSDL); } String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, 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); printExtensibilityAttributes(Definition.class, def, def, pw); printNamespaceDeclarations(namespaces, pw); pw.println('>'); printDocumentation(def.getDocumentationElement(), def, pw); printImports(def.getImports(), def, pw); printTypes(def.getTypes(), def, pw); printMessages(def.getMessages(), def, pw); printPortTypes(def.getPortTypes(), def, pw); printBindings(def.getBindings(), def, pw); printServices(def.getServices(), def, pw); List extElements = def.getExtensibilityElements(); printExtensibilityElements(Definition.class, extElements, def, pw); pw.println("'); pw.flush(); } protected void printServices(Map services, Definition def, PrintWriter pw) throws WSDLException { if (services != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_SERVICE, def); Iterator serviceIterator = services.values().iterator(); while (serviceIterator.hasNext()) { Service service = (Service)serviceIterator.next(); pw.print(" <" + tagName); QName name = service.getQName(); if (name != null) { DOMUtils.printAttribute(Constants.ATTR_NAME, name.getLocalPart(), pw); } printExtensibilityAttributes(Service.class, service, def, pw); pw.println('>'); printDocumentation(service.getDocumentationElement(), def, pw); printPorts(service.getPorts(), def, pw); List extElements = service.getExtensibilityElements(); printExtensibilityElements(Service.class, extElements, def, pw); pw.println(" '); } } } protected void printPorts(Map ports, Definition def, PrintWriter pw) throws WSDLException { if (ports != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_PORT, def); Iterator portIterator = ports.values().iterator(); while (portIterator.hasNext()) { Port port = (Port)portIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, port.getName(), pw); Binding binding = port.getBinding(); if (binding != null) { DOMUtils.printQualifiedAttribute(Constants.ATTR_BINDING, binding.getQName(), def, pw); } printExtensibilityAttributes(Port.class, port, def, pw); pw.println('>'); printDocumentation(port.getDocumentationElement(), def, pw); List extElements = port.getExtensibilityElements(); printExtensibilityElements(Port.class, extElements, def, pw); pw.println(" '); } } } protected void printBindings(Map bindings, Definition def, PrintWriter pw) throws WSDLException { if (bindings != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_BINDING, def); Iterator bindingIterator = bindings.values().iterator(); while (bindingIterator.hasNext()) { Binding binding = (Binding)bindingIterator.next(); if (!binding.isUndefined()) { pw.print(" <" + tagName); QName name = binding.getQName(); if (name != null) { DOMUtils.printAttribute(Constants.ATTR_NAME, name.getLocalPart(), pw); } PortType portType = binding.getPortType(); if (portType != null) { DOMUtils.printQualifiedAttribute(Constants.ATTR_TYPE, portType.getQName(), def, pw); } pw.println('>'); printDocumentation(binding.getDocumentationElement(), def, pw); List extElements = binding.getExtensibilityElements(); printExtensibilityElements(Binding.class, extElements, def, pw); printBindingOperations(binding.getBindingOperations(), def, pw); pw.println(" '); } } } } protected void printBindingOperations(List bindingOperations, Definition def, PrintWriter pw) throws WSDLException { if (bindingOperations != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_OPERATION, def); Iterator bindingOperationIterator = bindingOperations.iterator(); while (bindingOperationIterator.hasNext()) { BindingOperation bindingOperation = (BindingOperation)bindingOperationIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, bindingOperation.getName(), pw); printExtensibilityAttributes(BindingOperation.class, bindingOperation, def, pw); pw.println('>'); printDocumentation(bindingOperation.getDocumentationElement(), def, pw); List extElements = bindingOperation.getExtensibilityElements(); printExtensibilityElements(BindingOperation.class, extElements, def, pw); printBindingInput(bindingOperation.getBindingInput(), def, pw); printBindingOutput(bindingOperation.getBindingOutput(), def, pw); printBindingFaults(bindingOperation.getBindingFaults(), def, pw); pw.println(" '); } } } protected void printBindingInput(BindingInput bindingInput, Definition def, PrintWriter pw) throws WSDLException { if (bindingInput != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_INPUT, def); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, bindingInput.getName(), pw); printExtensibilityAttributes(BindingInput.class, bindingInput, def, pw); pw.println('>'); printDocumentation(bindingInput.getDocumentationElement(), def, pw); List extElements = bindingInput.getExtensibilityElements(); printExtensibilityElements(BindingInput.class, extElements, def, pw); pw.println(" '); } } protected void printBindingOutput(BindingOutput bindingOutput, Definition def, PrintWriter pw) throws WSDLException { if (bindingOutput != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_OUTPUT, def); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, bindingOutput.getName(), pw); pw.println('>'); printDocumentation(bindingOutput.getDocumentationElement(), def, pw); List extElements = bindingOutput.getExtensibilityElements(); printExtensibilityElements(BindingOutput.class, extElements, def, pw); pw.println(" '); } } protected void printBindingFaults(Map bindingFaults, Definition def, PrintWriter pw) throws WSDLException { if (bindingFaults != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_FAULT, def); Iterator bindingFaultIterator = bindingFaults.values().iterator(); while (bindingFaultIterator.hasNext()) { BindingFault bindingFault = (BindingFault)bindingFaultIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, bindingFault.getName(), pw); printExtensibilityAttributes(BindingFault.class, bindingFault, def, pw); pw.println('>'); printDocumentation(bindingFault.getDocumentationElement(), def, pw); List extElements = bindingFault.getExtensibilityElements(); printExtensibilityElements(BindingFault.class, extElements, def, pw); pw.println(" '); } } } protected void printPortTypes(Map portTypes, Definition def, PrintWriter pw) throws WSDLException { if (portTypes != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_PORT_TYPE, def); Iterator portTypeIterator = portTypes.values().iterator(); while (portTypeIterator.hasNext()) { PortType portType = (PortType)portTypeIterator.next(); if (!portType.isUndefined()) { pw.print(" <" + tagName); QName name = portType.getQName(); if (name != null) { DOMUtils.printAttribute(Constants.ATTR_NAME, name.getLocalPart(), pw); } printExtensibilityAttributes(PortType.class, portType, def, pw); pw.println('>'); printDocumentation(portType.getDocumentationElement(), def, pw); printOperations(portType.getOperations(), def, pw); List extElements = portType.getExtensibilityElements(); printExtensibilityElements(PortType.class, extElements, def, pw); pw.println(" '); } } } } protected void printOperations(List operations, Definition def, PrintWriter pw) throws WSDLException { if (operations != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_OPERATION, def); Iterator operationIterator = operations.iterator(); while (operationIterator.hasNext()) { Operation operation = (Operation)operationIterator.next(); if (!operation.isUndefined()) { pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, operation.getName(), pw); DOMUtils.printAttribute(Constants.ATTR_PARAMETER_ORDER, StringUtils.getNMTokens(operation.getParameterOrdering()), pw); printExtensibilityAttributes(Operation.class, operation, def, pw); pw.println('>'); printDocumentation(operation.getDocumentationElement(), def, pw); OperationType operationType = operation.getStyle(); if (operationType == OperationType.ONE_WAY) { printInput(operation.getInput(), def, pw); } else if (operationType == OperationType.SOLICIT_RESPONSE) { printOutput(operation.getOutput(), def, pw); printInput(operation.getInput(), def, pw); } else if (operationType == OperationType.NOTIFICATION) { printOutput(operation.getOutput(), def, pw); } else { // Must be OperationType.REQUEST_RESPONSE. printInput(operation.getInput(), def, pw); printOutput(operation.getOutput(), def, pw); } printFaults(operation.getFaults(), def, pw); List extElements = operation.getExtensibilityElements(); printExtensibilityElements(Operation.class, extElements, def, pw); pw.println(" '); } } } } protected void printInput(Input input, Definition def, PrintWriter pw) throws WSDLException { if (input != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_INPUT, def); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, input.getName(), pw); Message message = input.getMessage(); if (message != null) { DOMUtils.printQualifiedAttribute(Constants.ATTR_MESSAGE, message.getQName(), def, pw); } printExtensibilityAttributes(Input.class, input, def, pw); pw.println('>'); printDocumentation(input.getDocumentationElement(), def, pw); List extElements = input.getExtensibilityElements(); printExtensibilityElements(Input.class, extElements, def, pw); pw.println(" '); } } protected void printOutput(Output output, Definition def, PrintWriter pw) throws WSDLException { if (output != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_OUTPUT, def); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, output.getName(), pw); Message message = output.getMessage(); if (message != null) { DOMUtils.printQualifiedAttribute(Constants.ATTR_MESSAGE, message.getQName(), def, pw); } printExtensibilityAttributes(Output.class, output, def, pw); pw.println('>'); printDocumentation(output.getDocumentationElement(), def, pw); List extElements = output.getExtensibilityElements(); printExtensibilityElements(Output.class, extElements, def, pw); pw.println(" '); } } protected void printFaults(Map faults, Definition def, PrintWriter pw) throws WSDLException { if (faults != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_FAULT, def); Iterator faultIterator = faults.values().iterator(); while (faultIterator.hasNext()) { Fault fault = (Fault)faultIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, fault.getName(), pw); Message message = fault.getMessage(); if (message != null) { DOMUtils.printQualifiedAttribute(Constants.ATTR_MESSAGE, message.getQName(), def, pw); } printExtensibilityAttributes(Fault.class, fault, def, pw); pw.println('>'); printDocumentation(fault.getDocumentationElement(), def, pw); List extElements = fault.getExtensibilityElements(); printExtensibilityElements(Fault.class, extElements, def, pw); pw.println(" '); } } } protected void printMessages(Map messages, Definition def, PrintWriter pw) throws WSDLException { if (messages != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_MESSAGE, def); Iterator messageIterator = messages.values().iterator(); while (messageIterator.hasNext()) { Message message = (Message)messageIterator.next(); if (!message.isUndefined()) { pw.print(" <" + tagName); QName name = message.getQName(); if (name != null) { DOMUtils.printAttribute(Constants.ATTR_NAME, name.getLocalPart(), pw); } printExtensibilityAttributes(Message.class, message, def, pw); pw.println('>'); printDocumentation(message.getDocumentationElement(), def, pw); printParts(message.getOrderedParts(null), def, pw); List extElements = message.getExtensibilityElements(); printExtensibilityElements(Message.class, extElements, def, pw); pw.println(" '); } } } } protected void printParts(List parts, Definition def, PrintWriter pw) throws WSDLException { if (parts != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_PART, def); Iterator partIterator = parts.iterator(); while (partIterator.hasNext()) { Part part = (Part)partIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAME, part.getName(), pw); DOMUtils.printQualifiedAttribute(Constants.ATTR_ELEMENT, part.getElementName(), def, pw); DOMUtils.printQualifiedAttribute(Constants.ATTR_TYPE, part.getTypeName(), def, pw); printExtensibilityAttributes(Part.class, part, def, pw); pw.println('>'); printDocumentation(part.getDocumentationElement(), def, pw); List extElements = part.getExtensibilityElements(); printExtensibilityElements(Part.class, extElements, def, pw); pw.println(" '); } } } protected void printExtensibilityAttributes(Class parentType, AttributeExtensible attrExt, Definition def, PrintWriter pw) throws WSDLException { Map extensionAttributes = attrExt.getExtensionAttributes(); Iterator attrNames = extensionAttributes.keySet().iterator(); while (attrNames.hasNext()) { QName attrName = (QName)attrNames.next(); Object attrValue = extensionAttributes.get(attrName); String attrStrValue = null; QName attrQNameValue = null; if (attrValue instanceof String) { attrStrValue = (String)attrValue; } else if (attrValue instanceof QName) { attrQNameValue = (QName)attrValue; } else if (attrValue instanceof List) { List attrValueList = (List)attrValue; int size = attrValueList.size(); if (size > 0) { Object tempAttrVal = attrValueList.get(0); if (tempAttrVal instanceof String) { attrStrValue = StringUtils.getNMTokens(attrValueList); } else if (tempAttrVal instanceof QName) { StringBuffer strBuf = new StringBuffer(); for (int i = 0; i < size; i++) { QName tempQName = (QName)attrValueList.get(i); strBuf.append((i > 0 ? " " : "") + DOMUtils.getQualifiedValue(tempQName.getNamespaceURI(), tempQName.getLocalPart(), def)); } attrStrValue = strBuf.toString(); } else { throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "Unknown type of extension attribute '" + attrName + "': " + tempAttrVal.getClass().getName()); } } else { attrStrValue = ""; } } else { throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "Unknown type of extension attribute '" + attrName + "': " + attrValue.getClass().getName()); } if (attrQNameValue != null) { DOMUtils.printQualifiedAttribute(attrName, attrQNameValue, def, pw); } else { DOMUtils.printQualifiedAttribute(attrName, attrStrValue, def, pw); } } } protected void printDocumentation(Element docElement, Definition def, PrintWriter pw) throws WSDLException { if (docElement != null) { DOM2Writer.serializeAsXML(docElement, def.getNamespaces(), pw); pw.println(); } } protected void printTypes(Types types, Definition def, PrintWriter pw) throws WSDLException { if (types != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_TYPES, def); pw.print(" <" + tagName); printExtensibilityAttributes(Types.class, types, def, pw); pw.println('>'); printDocumentation(types.getDocumentationElement(), def, pw); List extElements = types.getExtensibilityElements(); printExtensibilityElements(Types.class, extElements, def, pw); pw.println(" '); } } protected void printImports(Map imports, Definition def, PrintWriter pw) throws WSDLException { if (imports != null) { String tagName = DOMUtils.getQualifiedValue(Constants.NS_URI_WSDL, Constants.ELEM_IMPORT, def); Iterator importListIterator = imports.values().iterator(); while (importListIterator.hasNext()) { List importList = (List)importListIterator.next(); Iterator importIterator = importList.iterator(); while (importIterator.hasNext()) { Import importDef = (Import)importIterator.next(); pw.print(" <" + tagName); DOMUtils.printAttribute(Constants.ATTR_NAMESPACE, importDef.getNamespaceURI(), pw); DOMUtils.printAttribute(Constants.ATTR_LOCATION, importDef.getLocationURI(), pw); printExtensibilityAttributes(Import.class, importDef, def, pw); pw.println('>'); printDocumentation(importDef.getDocumentationElement(), def, pw); List extElements = importDef.getExtensibilityElements(); printExtensibilityElements(Import.class, extElements, def, pw); pw.println(" '); } } } } protected void printNamespaceDeclarations(Map namespaces, PrintWriter pw) throws WSDLException { 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); } } } protected void printExtensibilityElements(Class parentType, List extensibilityElements, Definition def, PrintWriter pw) throws WSDLException { if (extensibilityElements != null) { Iterator extensibilityElementIterator = extensibilityElements.iterator(); while (extensibilityElementIterator.hasNext()) { ExtensibilityElement ext = (ExtensibilityElement)extensibilityElementIterator.next(); QName elementType = ext.getElementType(); ExtensionRegistry extReg = def.getExtensionRegistry(); if (extReg == null) { throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "No ExtensionRegistry set for this " + "Definition, so unable to serialize a '" + elementType + "' element in the context of a '" + parentType.getName() + "'."); } // If the wsdl was parsed using the parseSchema feature set to false // then the extensibility will be an UnknownExtensibilityElement rather // than a schema. Serialize this using the default serializer. ExtensionSerializer extSer; if (ext instanceof UnknownExtensibilityElement) { extSer = extReg.getDefaultSerializer(); } else { extSer = extReg.querySerializer(parentType,elementType); } extSer.marshall(parentType, elementType, ext, pw, def, extReg); } } } private static Document getDocument(InputSource inputSource, String desc) throws WSDLException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(false); try { DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(inputSource); return doc; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new WSDLException(WSDLException.PARSER_ERROR, "Problem parsing '" + desc + "'.", e); } } /** * Return a document generated from the specified WSDL model. */ public Document getDocument(Definition wsdlDef) throws WSDLException { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); writeWSDL(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. */ public void writeWSDL(Definition wsdlDef, Writer sink) throws WSDLException { PrintWriter pw = new PrintWriter(sink); String javaEncoding = (sink instanceof OutputStreamWriter) ? ((OutputStreamWriter)sink).getEncoding() : null; String xmlEncoding = DOM2Writer.java2XMLEncoding(javaEncoding); if (xmlEncoding == null) { throw new WSDLException(WSDLException.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. */ public void writeWSDL(Definition wsdlDef, OutputStream sink) throws WSDLException { Writer writer = null; try { writer = new OutputStreamWriter(sink, "UTF8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); writer = new OutputStreamWriter(sink); } writeWSDL(wsdlDef, writer); } /** * A test driver. * *

Usage:
*

*

  java com.ibm.wsdl.xml.WSDLWriterImpl filename|URL
*

*

    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.
*/ public static void main(String[] argv) throws WSDLException { if (argv.length == 1) { WSDLFactory wsdlFactory = WSDLFactory.newInstance(); WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); WSDLWriter wsdlWriter = wsdlFactory.newWSDLWriter(); wsdlWriter.writeWSDL(wsdlReader.readWSDL(null, argv[0]), System.out); } else { System.err.println("Usage:"); System.err.println(); System.err.println(" java " + WSDLWriterImpl.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."); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy