diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2be00c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,252 @@ +### SublimeText template +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### NetBeans template +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +## File-based project format: +*.iws +*.iml + +## Folder-based project format: +.idea/ + +# User-specific stuff: +#.idea/**/workspace.xml +#.idea/**/tasks.xml +#.idea/dictionaries + +# Sensitive or high-churn files: +#.idea/**/dataSources/ +#.idea/**/dataSources.ids +#.idea/**/dataSources.xml +#.idea/**/dataSources.local.xml +#.idea/**/sqlDataSources.xml +#.idea/**/dynamic.xml +#.idea/**/uiDesigner.xml + +# Gradle: +#.idea/**/gradle.xml +#.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Eclipse template + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Maven template +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9560fbe --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# libre-wsdl4j (A fork of WSDL4J 1.6.3) + +A fork of WSDL4J 1.6.3, with Tripletex specific changes. +Source code downloaded from: https://sourceforge.net/projects/wsdl4j/ +License: Common Public License 1.0 + +##Changes: +* Modified PopulatedExtensionRegistry, so that external HTTP requests +to fetch .xsd files references in the .wsdl files are not fetched. +This would cause connection refused errors when the .xsd files are not +available. +* Ported from Ant to Maven. + + diff --git a/license.html b/license.html new file mode 100644 index 0000000..961e480 --- /dev/null +++ b/license.html @@ -0,0 +1,229 @@ + + +
Common Public License - v 1.0 +
+
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER +THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT. +
+
1. DEFINITIONS +
"Contribution" means: +
+
"Contributor" means any person or entity that distributes the +Program. +
+
"Licensed Patents " mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program. +
+
"Program" means the Contributions +distributed in accordance with this Agreement. +
+
"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. +
+
2. GRANT OF RIGHTS +
3. REQUIREMENTS +
A Contributor may choose to distribute the Program in +object code form under its own license agreement, provided that: +
When the Program is made available in source code form: +
+
Contributors
+may not remove or alter any copyright notices contained within the Program.
+
+
+
Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent Recipients +to identify the originator of the Contribution. +
+
4. COMMERCIAL DISTRIBUTION +
Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the like. +While this license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product offering should +do so in a manner which does not create potential liability for other +Contributors. Therefore, if a Contributor includes the Program in a commercial +product offering, such Contributor ("Commercial Contributor") hereby agrees to +defend and indemnify every other Contributor ("Indemnified Contributor") against +any losses, damages and costs (collectively "Losses") arising from claims, +lawsuits and other legal actions brought by a third party against the +Indemnified Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program in a +commercial product offering. The obligations in this section do not apply to any +claims or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial Contributor +in, the defense and any related settlement negotiations. The Indemnified +Contributor may participate in any such claim at its own expense. +
+
For example, a Contributor might include the Program in a +commercial product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance claims, or +offers warranties related to Product X, those performance claims and warranties +are such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. +
+
5. NO WARRANTY +
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR +CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A +PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement, including but not +limited to the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. +
+
6. DISCLAIMER OF LIABILITY +
EXCEPT AS EXPRESSLY SET FORTH IN THIS +AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR +THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. +
+
7. GENERAL +
If any provision of this Agreement is +invalid or unenforceable under applicable law, it shall not affect the validity +or enforceability of the remainder of the terms of this Agreement, and without +further action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. +
+
If Recipient institutes patent litigation against a Contributor +with respect to a patent applicable to software (including a cross-claim or +counterclaim in a lawsuit), then any patent licenses granted by that Contributor +to such Recipient under this Agreement shall terminate as of the date such +litigation is filed. In addition, if Recipient institutes patent litigation +against any entity (including a cross-claim or counterclaim in a lawsuit) +alleging that the Program itself (excluding combinations of the Program with +other software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the date +such litigation is filed. +
+
All Recipient's rights under this Agreement shall terminate if +it fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time after +becoming aware of such noncompliance. If all Recipient's rights under this +Agreement terminate, Recipient agrees to cease use and distribution of the +Program as soon as reasonably practicable. However, Recipient's obligations +under this Agreement and any licenses granted by Recipient relating to the +Program shall continue and survive. +
+
Everyone is permitted +to copy and distribute copies of this Agreement, but in order to avoid +inconsistency the Agreement is copyrighted and may only be modified in the +following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement +Steward has the right to modify this Agreement. IBM is the initial Agreement +Steward. IBM may assign the responsibility to serve as the Agreement Steward to +a suitable separate entity. Each new version of the +Agreement will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the Agreement +is published, Contributor may elect to distribute the Program (including its +Contributions) under the new version. +Except as expressly stated in Sections 2(a) and 2(b) above, +Recipient receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by +implication, estoppel or otherwise. All +rights in the Program not expressly granted under this Agreement are +reserved. +
+
This Agreement is governed by the laws of the State of New York +and the intellectual property laws of the United States of America. No party to +this Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. +
+
diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9aa9877 --- /dev/null +++ b/pom.xml @@ -0,0 +1,103 @@ + +
+ * The search criteria will be the operation name parameter and any
+ * non-null input or output message name parameters.
+ * To exclude the input or output message name from the search criteria,
+ * specify a null value for the input or output message name parameter.
+ * To search for operations with unnamed input or output messages
+ * (i.e. <input> or <output> elements with the 'name' attribute omitted),
+ * specify the string ":none
" for the input or output message name parameter.
+ *
+ * Note: the use of a string value ":none
" rather than null to search for
+ * unnamed input or output messages is necessary to retain backward compatibility
+ * with earlier versions of the JWSDL API, which defined a null value to
+ * mean 'ignore this parameter'.
+ * The colon in ":none
" is to avoid name clashes with input or output
+ * message names, which must be of type NCName (i.e. they cannot contain colons).
+ *
+ * @param name the name of the desired operation binding.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the corresponding operation binding, or null if there wasn't
+ * any matching operation binding
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ */
+ public BindingOperation getBindingOperation(String name,
+ String inputName,
+ String outputName)
+ {
+ boolean found = false;
+ BindingOperation ret = null;
+ Iterator opBindingIterator = bindingOperations.iterator();
+
+ while (opBindingIterator.hasNext())
+ {
+ BindingOperation op = (BindingOperation)opBindingIterator.next();
+ String opName = op.getName();
+
+ if (name != null && opName != null)
+ {
+ if (!name.equals(opName))
+ {
+ op = null;
+ }
+ }
+ else if (name != null || opName != null)
+ {
+ op = null;
+ }
+
+ if (op != null && inputName != null)
+ {
+ PortType pt = getPortType();
+ OperationType opStyle = null;
+
+ if (pt != null)
+ {
+ Operation tempOp = pt.getOperation(name, inputName, outputName);
+
+ if (tempOp != null)
+ {
+ opStyle = tempOp.getStyle();
+ }
+ }
+
+ String defaultInputName = opName;
+
+ if (opStyle == OperationType.REQUEST_RESPONSE)
+ {
+ defaultInputName = opName + "Request";
+ }
+ else if (opStyle == OperationType.SOLICIT_RESPONSE)
+ {
+ defaultInputName = opName + "Solicit";
+ }
+
+ boolean specifiedDefault = inputName.equals(defaultInputName);
+
+ BindingInput input = op.getBindingInput();
+
+ if (input != null)
+ {
+ String opInputName = input.getName();
+
+ if (opInputName == null)
+ {
+ if (!specifiedDefault && !inputName.equals(Constants.NONE))
+ {
+ op = null;
+ }
+ }
+ else if (!opInputName.equals(inputName))
+ {
+ op = null;
+ }
+ }
+ else
+ {
+ op = null;
+ }
+ }
+
+ if (op != null && outputName != null)
+ {
+ PortType pt = getPortType();
+ OperationType opStyle = null;
+
+ if (pt != null)
+ {
+ Operation tempOp = pt.getOperation(name, inputName, outputName);
+
+ if (tempOp != null)
+ {
+ opStyle = tempOp.getStyle();
+ }
+ }
+
+ String defaultOutputName = opName;
+
+ if (opStyle == OperationType.REQUEST_RESPONSE
+ || opStyle == OperationType.SOLICIT_RESPONSE)
+ {
+ defaultOutputName = opName + "Response";
+ }
+
+ boolean specifiedDefault = outputName.equals(defaultOutputName);
+
+ BindingOutput output = op.getBindingOutput();
+
+ if (output != null)
+ {
+ String opOutputName = output.getName();
+
+ if (opOutputName == null)
+ {
+ if (!specifiedDefault && !outputName.equals(Constants.NONE))
+ {
+ op = null;
+ }
+ }
+ else if (!opOutputName.equals(outputName))
+ {
+ op = null;
+ }
+ }
+ else
+ {
+ op = null;
+ }
+ }
+
+ if (op != null)
+ {
+ if (found)
+ {
+ throw new IllegalArgumentException("Duplicate operation with " +
+ "name=" + name +
+ (inputName != null
+ ? ", inputName=" + inputName
+ : "") +
+ (outputName != null
+ ? ", outputName=" + outputName
+ : "") +
+ ", found in binding '" +
+ getQName() + "'.");
+ }
+ else
+ {
+ found = true;
+ ret = op;
+ }
+ }
+ } //end while loop
+
+ return ret;
+ }
+
+ /**
+ * Get all the operation bindings defined here.
+ */
+ public List getBindingOperations()
+ {
+ return bindingOperations;
+ }
+
+ /**
+ * Remove the specified operation binding. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ *
+ * Usage of the input and output message name parameters is as
+ * described for the getBindingOperation
method.
+ *
+ * @param name the name of the operation binding to be removed.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the binding operation which was removed, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ *
+ * @see #getBindingOperation(String, String, String)
+ */
+ public BindingOperation removeBindingOperation(String name,
+ String inputName,
+ String outputName)
+ {
+ BindingOperation op = getBindingOperation(name,inputName,outputName);
+ if(bindingOperations.remove(op))
+ {
+ return op;
+ }
+ else return null;
+ }
+
+ public void setUndefined(boolean isUndefined)
+ {
+ this.isUndefined = isUndefined;
+ }
+
+ public boolean isUndefined()
+ {
+ return isUndefined;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Binding: name=");
+ strBuf.append(name);
+
+ if (portType != null)
+ {
+ strBuf.append("\n");
+ strBuf.append(portType);
+ }
+
+ if (bindingOperations != null)
+ {
+ Iterator bindingOperationIterator = bindingOperations.iterator();
+
+ while (bindingOperationIterator.hasNext())
+ {
+ strBuf.append("\n");
+ strBuf.append(bindingOperationIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/BindingInputImpl.java b/src/main/java/com/ibm/wsdl/BindingInputImpl.java
new file mode 100644
index 0000000..fa8e920
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/BindingInputImpl.java
@@ -0,0 +1,73 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents an input binding. That is, it contains
+ * the information that would be specified in an input element
+ * contained within an operation element contained within a
+ * binding element.
+ *
+ * @author Matthew J. Duftler
+ */
+public class BindingInputImpl extends AbstractWSDLElement implements BindingInput
+{
+ protected String name = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.BINDING_INPUT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this input binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this input binding.
+ *
+ * @return the input binding name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("BindingInput: name=" + name);
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/BindingOperationImpl.java b/src/main/java/com/ibm/wsdl/BindingOperationImpl.java
new file mode 100644
index 0000000..aaeb1de
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/BindingOperationImpl.java
@@ -0,0 +1,200 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents a WSDL operation binding.
+ * That is, it holds the information that would be
+ * specified in the operation element contained within
+ * a binding element.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class BindingOperationImpl extends AbstractWSDLElement implements BindingOperation
+{
+ protected String name = null;
+ protected Operation operation = null;
+ protected BindingInput bindingInput = null;
+ protected BindingOutput bindingOutput = null;
+ protected Map bindingFaults = new HashMap();
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.BINDING_OPERATION_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this operation binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this operation binding.
+ *
+ * @return the operation binding name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Set the operation that this operation binding binds.
+ *
+ * @param operation the operation this operation binding binds
+ */
+ public void setOperation(Operation operation)
+ {
+ this.operation = operation;
+ }
+
+ /**
+ * Get the operation that this operation binding binds.
+ *
+ * @return the operation that this operation binding binds
+ */
+ public Operation getOperation()
+ {
+ return operation;
+ }
+
+ /**
+ * Set the input binding for this operation binding.
+ *
+ * @param bindingInput the new input binding
+ */
+ public void setBindingInput(BindingInput bindingInput)
+ {
+ this.bindingInput = bindingInput;
+ }
+
+ /**
+ * Get the input binding for this operation binding.
+ *
+ * @return the input binding
+ */
+ public BindingInput getBindingInput()
+ {
+ return bindingInput;
+ }
+
+ /**
+ * Set the output binding for this operation binding.
+ *
+ * @param bindingOutput the new output binding
+ */
+ public void setBindingOutput(BindingOutput bindingOutput)
+ {
+ this.bindingOutput = bindingOutput;
+ }
+
+ /**
+ * Get the output binding for this operation binding.
+ *
+ * @return the output binding for the operation binding
+ */
+ public BindingOutput getBindingOutput()
+ {
+ return bindingOutput;
+ }
+
+ /**
+ * Add a fault binding.
+ *
+ * @param bindingFault the new fault binding
+ */
+ public void addBindingFault(BindingFault bindingFault)
+ {
+ bindingFaults.put(bindingFault.getName(), bindingFault);
+ }
+
+ /**
+ * Get the specified fault binding.
+ *
+ * @param name the name of the desired fault binding.
+ * @return the corresponding fault binding, or null if there wasn't
+ * any matching fault binding
+ */
+ public BindingFault getBindingFault(String name)
+ {
+ return (BindingFault)bindingFaults.get(name);
+ }
+
+ /**
+ * Remove the specified fault binding.
+ *
+ * @param name the name of the fault binding to be removed.
+ * @return the fault binding which was removed
+ */
+ public BindingFault removeBindingFault(String name)
+ {
+ return (BindingFault)bindingFaults.remove(name);
+ }
+
+ /**
+ * Get all the fault bindings associated with this operation binding.
+ *
+ * @return names of fault bindings
+ */
+ public Map getBindingFaults()
+ {
+ return bindingFaults;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("BindingOperation: name=" + name);
+
+ if (bindingInput != null)
+ {
+ strBuf.append("\n" + bindingInput);
+ }
+
+ if (bindingOutput != null)
+ {
+ strBuf.append("\n" + bindingOutput);
+ }
+
+ if (bindingFaults != null)
+ {
+ Iterator faultIterator = bindingFaults.values().iterator();
+
+ while (faultIterator.hasNext())
+ {
+ strBuf.append("\n" + faultIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/BindingOutputImpl.java b/src/main/java/com/ibm/wsdl/BindingOutputImpl.java
new file mode 100644
index 0000000..8178928
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/BindingOutputImpl.java
@@ -0,0 +1,73 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents an output binding. That is, it contains
+ * the information that would be specified in an output element
+ * contained within an operation element contained within a
+ * binding element.
+ *
+ * @author Matthew J. Duftler
+ */
+public class BindingOutputImpl extends AbstractWSDLElement implements BindingOutput
+{
+ protected String name = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.BINDING_OUTPUT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this output binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this output binding.
+ *
+ * @return the output binding name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("BindingOutput: name=" + name);
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/Constants.java b/src/main/java/com/ibm/wsdl/Constants.java
new file mode 100644
index 0000000..c86e308
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/Constants.java
@@ -0,0 +1,138 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class Constants
+{
+ // Namespace URIs.
+ public static final String NS_URI_WSDL =
+ "http://schemas.xmlsoap.org/wsdl/";
+ public static final String NS_URI_XMLNS =
+ "http://www.w3.org/2000/xmlns/";
+
+ // Top-level element names.
+ public static final String ELEM_DEFINITIONS = "definitions";
+ public static final String ELEM_IMPORT = "import";
+ public static final String ELEM_TYPES = "types";
+ public static final String ELEM_MESSAGE = "message";
+ public static final String ELEM_PORT_TYPE = "portType";
+ public static final String ELEM_BINDING = "binding";
+ public static final String ELEM_SERVICE = "service";
+
+ // Non top-level element names.
+ public static final String ELEM_PART = "part";
+ public static final String ELEM_OPERATION = "operation";
+ public static final String ELEM_INPUT = "input";
+ public static final String ELEM_OUTPUT = "output";
+ public static final String ELEM_FAULT = "fault";
+ public static final String ELEM_PORT = "port";
+ public static final String ELEM_DOCUMENTATION = "documentation";
+
+ // Top-level qualified element names.
+ public static final QName Q_ELEM_DEFINITIONS =
+ new QName(NS_URI_WSDL, ELEM_DEFINITIONS);
+ public static final QName Q_ELEM_IMPORT =
+ new QName(NS_URI_WSDL, ELEM_IMPORT);
+ public static final QName Q_ELEM_TYPES =
+ new QName(NS_URI_WSDL, ELEM_TYPES);
+ public static final QName Q_ELEM_MESSAGE =
+ new QName(NS_URI_WSDL, ELEM_MESSAGE);
+ public static final QName Q_ELEM_PORT_TYPE =
+ new QName(NS_URI_WSDL, ELEM_PORT_TYPE);
+ public static final QName Q_ELEM_BINDING =
+ new QName(NS_URI_WSDL, ELEM_BINDING);
+ public static final QName Q_ELEM_SERVICE =
+ new QName(NS_URI_WSDL, ELEM_SERVICE);
+
+ // Non top-level qualified element names.
+ public static final QName Q_ELEM_PART =
+ new QName(NS_URI_WSDL, ELEM_PART);
+ public static final QName Q_ELEM_OPERATION =
+ new QName(NS_URI_WSDL, ELEM_OPERATION);
+ public static final QName Q_ELEM_INPUT =
+ new QName(NS_URI_WSDL, ELEM_INPUT);
+ public static final QName Q_ELEM_OUTPUT =
+ new QName(NS_URI_WSDL, ELEM_OUTPUT);
+ public static final QName Q_ELEM_FAULT =
+ new QName(NS_URI_WSDL, ELEM_FAULT);
+ public static final QName Q_ELEM_PORT =
+ new QName(NS_URI_WSDL, ELEM_PORT);
+ public static final QName Q_ELEM_DOCUMENTATION =
+ new QName(NS_URI_WSDL, ELEM_DOCUMENTATION);
+
+ // Attribute names.
+ public static final String ATTR_NAME = "name";
+ public static final String ATTR_TARGET_NAMESPACE = "targetNamespace";
+ public static final String ATTR_ELEMENT = "element";
+ public static final String ATTR_TYPE = "type";
+ public static final String ATTR_MESSAGE = "message";
+ public static final String ATTR_PARAMETER_ORDER = "parameterOrder";
+ public static final String ATTR_BINDING = "binding";
+ public static final String ATTR_XMLNS = "xmlns";
+ public static final String ATTR_NAMESPACE = "namespace";
+ public static final String ATTR_LOCATION = "location";
+ public static final String ATTR_REQUIRED = "required";
+
+ // Lists of native attribute names.
+ public static final String[] DEFINITION_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_TARGET_NAMESPACE};
+ public static final String[] PART_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_TYPE, ATTR_ELEMENT};
+ public static final String[] BINDING_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_TYPE};
+ public static final String[] BINDING_FAULT_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] BINDING_INPUT_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] BINDING_OPERATION_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] BINDING_OUTPUT_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] FAULT_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_MESSAGE};
+ public static final String[] IMPORT_ATTR_NAMES =
+ new String[]{ATTR_NAMESPACE, ATTR_LOCATION};
+ public static final String[] INPUT_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_MESSAGE};
+ public static final String[] MESSAGE_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] OPERATION_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_PARAMETER_ORDER};
+ public static final String[] OUTPUT_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_MESSAGE};
+ public static final String[] PORT_ATTR_NAMES =
+ new String[]{ATTR_NAME, ATTR_BINDING};
+ public static final String[] PORT_TYPE_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] SERVICE_ATTR_NAMES =
+ new String[]{ATTR_NAME};
+ public static final String[] TYPES_ATTR_NAMES =
+ new String[]{};
+
+ // Qualified attribute names.
+ public static final QName Q_ATTR_REQUIRED =
+ new QName(NS_URI_WSDL, ATTR_REQUIRED);
+
+ // XML Declaration string.
+ public static final String XML_DECL_DEFAULT = "UTF-8";
+ public static final String XML_DECL_START =
+ "";
+
+ // Feature names.
+ public static final String FEATURE_VERBOSE = "javax.wsdl.verbose";
+ public static final String FEATURE_IMPORT_DOCUMENTS =
+ "javax.wsdl.importDocuments";
+ public static final String FEATURE_PARSE_SCHEMA =
+ "com.ibm.wsdl.parseXMLSchemas";
+
+ // Other
+ public static final String NONE = ":none";
+}
diff --git a/src/main/java/com/ibm/wsdl/DefinitionImpl.java b/src/main/java/com/ibm/wsdl/DefinitionImpl.java
new file mode 100644
index 0000000..38be0fe
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/DefinitionImpl.java
@@ -0,0 +1,879 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.xml.namespace.*;
+
+/**
+ * This class represents a WSDL definition.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class DefinitionImpl extends AbstractWSDLElement implements Definition
+{
+ protected String documentBaseURI = null;
+ protected QName name = null;
+ protected String targetNamespace = null;
+ protected Map namespaces = new HashMap();
+ protected Map imports = new HashMap();
+ protected Types types = null;
+ protected Map messages = new HashMap();
+ protected Map bindings = new HashMap();
+ protected Map portTypes = new HashMap();
+ protected Map services = new HashMap();
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.DEFINITION_ATTR_NAMES);
+ protected ExtensionRegistry extReg = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the document base URI of this definition. Can be used to
+ * represent the origin of the Definition, and can be exploited
+ * when resolving relative URIs (e.g. in <import>s).
+ *
+ * @param documentBaseURI the document base URI of this definition
+ */
+ public void setDocumentBaseURI(String documentBaseURI)
+ {
+ this.documentBaseURI = documentBaseURI;
+ }
+
+ /**
+ * Get the document base URI of this definition.
+ *
+ * @return the document base URI
+ */
+ public String getDocumentBaseURI()
+ {
+ return documentBaseURI;
+ }
+
+ /**
+ * Set the name of this definition.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this definition.
+ *
+ * @return the definition name
+ */
+ public QName getQName()
+ {
+ return name;
+ }
+
+ /**
+ * Set the target namespace in which WSDL elements are defined.
+ *
+ * @param targetNamespace the target namespace
+ */
+ public void setTargetNamespace(String targetNamespace)
+ {
+ this.targetNamespace = targetNamespace;
+ }
+
+ /**
+ * Get the target namespace in which the WSDL elements
+ * are defined.
+ *
+ * @return the target namespace
+ */
+ public String getTargetNamespace()
+ {
+ return targetNamespace;
+ }
+
+ /**
+ * This is a way to add a namespace association to a definition.
+ * It is similar to adding a namespace prefix declaration to the
+ * top of a <wsdl:definition> element. This has nothing to do
+ * with the <wsdl:import> element; there are separate methods for
+ * dealing with information described by <wsdl:import> elements.
+ *
+ * @param prefix the prefix to use for this namespace (when
+ * rendering this information as XML). Use null or an empty string
+ * to describe the default namespace (i.e. xmlns="...").
+ * @param namespaceURI the namespace URI to associate the prefix
+ * with. If you use null, the namespace association will be removed.
+ */
+ public void addNamespace(String prefix, String namespaceURI)
+ {
+ if (prefix == null)
+ {
+ prefix = "";
+ }
+
+ if (namespaceURI != null)
+ {
+ namespaces.put(prefix, namespaceURI);
+ }
+ else
+ {
+ namespaces.remove(prefix);
+ }
+ }
+
+ /**
+ * Get the namespace URI associated with this prefix. Or null if
+ * there is no namespace URI associated with this prefix. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ * @see #getPrefix(String)
+ */
+ public String getNamespace(String prefix)
+ {
+ if (prefix == null)
+ {
+ prefix = "";
+ }
+
+ return (String)namespaces.get(prefix);
+ }
+
+ /**
+ * Remove the namespace URI associated with this prefix.
+ *
+ * @param prefix the prefix of the namespace to be removed.
+ * @return the namespace URI which was removed
+ */
+ public String removeNamespace(String prefix)
+ {
+ if (prefix == null)
+ {
+ prefix = "";
+ }
+
+ return (String)namespaces.remove(prefix);
+ }
+
+ /**
+ * Get a prefix associated with this namespace URI. Or null if
+ * there are no prefixes associated with this namespace URI. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ * @see #getNamespace(String)
+ */
+ public String getPrefix(String namespaceURI)
+ {
+ if (namespaceURI == null)
+ {
+ return null;
+ }
+
+ Iterator entryIterator = namespaces.entrySet().iterator();
+
+ while (entryIterator.hasNext())
+ {
+ Map.Entry entry = (Map.Entry)entryIterator.next();
+ String prefix = (String)entry.getKey();
+ String assocNamespaceURI = (String)entry.getValue();
+
+ if (namespaceURI.equals(assocNamespaceURI))
+ {
+ return prefix;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Get all namespace associations in this definition. The keys are
+ * the prefixes, and the namespace URIs are the values. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ */
+ public Map getNamespaces()
+ {
+ return namespaces;
+ }
+
+ /**
+ * Set the types section.
+ */
+ public void setTypes(Types types)
+ {
+ this.types = types;
+ }
+
+ /**
+ * Get the types section.
+ *
+ * @return the types section
+ */
+ public Types getTypes()
+ {
+ return types;
+ }
+
+ /**
+ * Add an import to this WSDL description.
+ *
+ * @param importDef the import to be added
+ */
+ public void addImport(Import importDef)
+ {
+ String namespaceURI = importDef.getNamespaceURI();
+ List importList = (List)imports.get(namespaceURI);
+
+ if (importList == null)
+ {
+ importList = new Vector();
+
+ imports.put(namespaceURI, importList);
+ }
+
+ importList.add(importDef);
+ }
+
+ /**
+ * Remove an import from this WSDL description.
+ *
+ * @param importDef the import to be removed
+ */
+ public Import removeImport(Import importDef)
+ {
+ String namespaceURI = importDef.getNamespaceURI();
+ List importList = (List)imports.get(namespaceURI);
+
+ Import removed = null;
+ if (importList != null && importList.remove(importDef))
+ {
+ removed = importDef;
+ }
+ return removed;
+ }
+
+ /**
+ * Get the list of imports for the specified namespaceURI.
+ *
+ * @param namespaceURI the namespaceURI associated with the
+ * desired imports.
+ * @return a list of the corresponding imports, or null if
+ * there weren't any matching imports
+ */
+ public List getImports(String namespaceURI)
+ {
+ return (List)imports.get(namespaceURI);
+ }
+
+ /**
+ * Get a map of lists containing all the imports defined here.
+ * The map's keys are the namespaceURIs, and the map's values
+ * are lists. There is one list for each namespaceURI for which
+ * imports have been defined.
+ */
+ public Map getImports()
+ {
+ return imports;
+ }
+
+ /**
+ * Add a message to this WSDL description.
+ *
+ * @param message the message to be added
+ */
+ public void addMessage(Message message)
+ {
+ messages.put(message.getQName(), message);
+ }
+
+ /**
+ * Get the specified message. Also checks imported documents.
+ *
+ * @param name the name of the desired message.
+ * @return the corresponding message, or null if there wasn't
+ * any matching message
+ */
+ public Message getMessage(QName name)
+ {
+ Message message = (Message)messages.get(name);
+
+ if (message == null && name != null)
+ {
+ message = (Message)getFromImports(Constants.ELEM_MESSAGE, name);
+ }
+
+ return message;
+ }
+
+ /**
+ * Remove the specified message from this definition.
+ *
+ * @param name the name of the message to remove
+ * @return the message previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Message removeMessage(QName name)
+ {
+ return (Message) messages.remove(name);
+ }
+
+ /**
+ * Get all the messages defined here.
+ */
+ public Map getMessages()
+ {
+ return messages;
+ }
+
+ /**
+ * Add a binding to this WSDL description.
+ *
+ * @param binding the binding to be added
+ */
+ public void addBinding(Binding binding)
+ {
+ bindings.put(binding.getQName(), binding);
+ }
+
+ /**
+ * Get the specified binding. Also checks imported documents.
+ *
+ * @param name the name of the desired binding.
+ * @return the corresponding binding, or null if there wasn't
+ * any matching binding
+ */
+ public Binding getBinding(QName name)
+ {
+ Binding binding = (Binding)bindings.get(name);
+
+ if (binding == null && name != null)
+ {
+ binding = (Binding)getFromImports(Constants.ELEM_BINDING, name);
+ }
+
+ return binding;
+ }
+
+ /**
+ * Remove the specified binding from this definition.
+ *
+ * @param name the name of the binding to remove
+ * @return the binding previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Binding removeBinding(QName name)
+ {
+ return (Binding) bindings.remove(name);
+ }
+
+ /**
+ * Get all the bindings defined in this Definition.
+ */
+ public Map getBindings()
+ {
+ return bindings;
+ }
+
+ /**
+ * Add a portType to this WSDL description.
+ *
+ * @param portType the portType to be added
+ */
+ public void addPortType(PortType portType)
+ {
+ portTypes.put(portType.getQName(), portType);
+ }
+
+ /**
+ * Get the specified portType. Also checks imported documents.
+ *
+ * @param name the name of the desired portType.
+ * @return the corresponding portType, or null if there wasn't
+ * any matching portType
+ */
+ public PortType getPortType(QName name)
+ {
+ PortType portType = (PortType)portTypes.get(name);
+
+ if (portType == null && name != null)
+ {
+ portType = (PortType)getFromImports(Constants.ELEM_PORT_TYPE, name);
+ }
+
+ return portType;
+ }
+
+ /**
+ * Remove the specified portType from this definition.
+ *
+ * @param name the name of the portType to remove
+ * @return the portType previously associated with this qname, if there
+ * was one; may return null
+ */
+ public PortType removePortType(QName name)
+ {
+ return (PortType) portTypes.remove(name);
+ }
+
+ /**
+ * Get all the portTypes defined in this Definition.
+ */
+ public Map getPortTypes()
+ {
+ return portTypes;
+ }
+
+ /**
+ * Add a service to this WSDL description.
+ *
+ * @param service the service to be added
+ */
+ public void addService(Service service)
+ {
+ services.put(service.getQName(), service);
+ }
+
+ /**
+ * Get the specified service. Also checks imported documents.
+ *
+ * @param name the name of the desired service.
+ * @return the corresponding service, or null if there wasn't
+ * any matching service
+ */
+ public Service getService(QName name)
+ {
+ Service service = (Service)services.get(name);
+
+ if (service == null && name != null)
+ {
+ service = (Service)getFromImports(Constants.ELEM_SERVICE, name);
+ }
+
+ return service;
+ }
+
+ /**
+ * Remove the specified service from this definition.
+ *
+ * @param name the name of the service to remove
+ * @return the service previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Service removeService(QName name)
+ {
+ return (Service) services.remove(name);
+ }
+
+ /**
+ * Get all the services defined in this Definition.
+ */
+ public Map getServices()
+ {
+ return services;
+ }
+
+ /**
+ * Create a new binding.
+ *
+ * @return the newly created binding
+ */
+ public Binding createBinding()
+ {
+ return new BindingImpl();
+ }
+
+ /**
+ * Create a new binding fault.
+ *
+ * @return the newly created binding fault
+ */
+ public BindingFault createBindingFault()
+ {
+ return new BindingFaultImpl();
+ }
+
+ /**
+ * Create a new binding input.
+ *
+ * @return the newly created binding input
+ */
+ public BindingInput createBindingInput()
+ {
+ return new BindingInputImpl();
+ }
+
+ /**
+ * Create a new binding operation.
+ *
+ * @return the newly created binding operation
+ */
+ public BindingOperation createBindingOperation()
+ {
+ return new BindingOperationImpl();
+ }
+
+ /**
+ * Create a new binding output.
+ *
+ * @return the newly created binding output
+ */
+ public BindingOutput createBindingOutput()
+ {
+ return new BindingOutputImpl();
+ }
+
+ /**
+ * Create a new fault.
+ *
+ * @return the newly created fault
+ */
+ public Fault createFault()
+ {
+ return new FaultImpl();
+ }
+
+ /**
+ * Create a new import.
+ *
+ * @return the newly created import
+ */
+ public Import createImport()
+ {
+ return new ImportImpl();
+ }
+
+ /**
+ * Create a new input.
+ *
+ * @return the newly created input
+ */
+ public Input createInput()
+ {
+ return new InputImpl();
+ }
+
+ /**
+ * Create a new message.
+ *
+ * @return the newly created message
+ */
+ public Message createMessage()
+ {
+ return new MessageImpl();
+ }
+
+ /**
+ * Create a new operation.
+ *
+ * @return the newly created operation
+ */
+ public Operation createOperation()
+ {
+ return new OperationImpl();
+ }
+
+ /**
+ * Create a new output.
+ *
+ * @return the newly created output
+ */
+ public Output createOutput()
+ {
+ return new OutputImpl();
+ }
+
+ /**
+ * Create a new part.
+ *
+ * @return the newly created part
+ */
+ public Part createPart()
+ {
+ return new PartImpl();
+ }
+
+ /**
+ * Create a new port.
+ *
+ * @return the newly created port
+ */
+ public Port createPort()
+ {
+ return new PortImpl();
+ }
+
+ /**
+ * Create a new port type.
+ *
+ * @return the newly created port type
+ */
+ public PortType createPortType()
+ {
+ return new PortTypeImpl();
+ }
+
+ /**
+ * Create a new service.
+ *
+ * @return the newly created service
+ */
+ public Service createService()
+ {
+ return new ServiceImpl();
+ }
+
+ /**
+ * Create a new types section.
+ *
+ * @return the newly created types section
+ */
+ public Types createTypes()
+ {
+ return new TypesImpl();
+ }
+
+ /**
+ * Set the ExtensionRegistry for this Definition.
+ */
+ public void setExtensionRegistry(ExtensionRegistry extReg)
+ {
+ this.extReg = extReg;
+ }
+
+ /**
+ * Get a reference to the ExtensionRegistry for this Definition.
+ */
+ public ExtensionRegistry getExtensionRegistry()
+ {
+ return extReg;
+ }
+
+ private Object getFromImports(String typeOfDefinition, QName name)
+ {
+ Object ret = null;
+ List importList = getImports(name.getNamespaceURI());
+
+ if (importList != null)
+ {
+ Iterator importIterator = importList.iterator();
+
+ while (importIterator.hasNext())
+ {
+ Import importDef = (Import)importIterator.next();
+
+ if (importDef != null)
+ {
+ Definition importedDef = importDef.getDefinition();
+
+ if (importedDef != null)
+ {
+ /*
+ These object comparisons will work fine because
+ this private method is only called from within
+ this class, using only the pre-defined constants
+ from the Constants class as the typeOfDefinition
+ argument.
+ */
+ if (typeOfDefinition == Constants.ELEM_SERVICE)
+ {
+ ret = importedDef.getService(name);
+ }
+ else if (typeOfDefinition == Constants.ELEM_MESSAGE)
+ {
+ ret = importedDef.getMessage(name);
+ }
+ else if (typeOfDefinition == Constants.ELEM_BINDING)
+ {
+ ret = importedDef.getBinding(name);
+ }
+ else if (typeOfDefinition == Constants.ELEM_PORT_TYPE)
+ {
+ ret = importedDef.getPortType(name);
+ }
+
+ if (ret != null)
+ {
+ return ret;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Definition: name=" + name +
+ " targetNamespace=" + targetNamespace);
+
+ if (imports != null)
+ {
+ Iterator importIterator = imports.values().iterator();
+
+ while (importIterator.hasNext())
+ {
+ strBuf.append("\n" + importIterator.next());
+ }
+ }
+
+ if (types != null)
+ {
+ strBuf.append("\n" + types);
+ }
+
+ if (messages != null)
+ {
+ Iterator msgsIterator = messages.values().iterator();
+
+ while (msgsIterator.hasNext())
+ {
+ strBuf.append("\n" + msgsIterator.next());
+ }
+ }
+
+ if (portTypes != null)
+ {
+ Iterator portTypeIterator = portTypes.values().iterator();
+
+ while (portTypeIterator.hasNext())
+ {
+ strBuf.append("\n" + portTypeIterator.next());
+ }
+ }
+
+ if (bindings != null)
+ {
+ Iterator bindingIterator = bindings.values().iterator();
+
+ while (bindingIterator.hasNext())
+ {
+ strBuf.append("\n" + bindingIterator.next());
+ }
+ }
+
+ if (services != null)
+ {
+ Iterator serviceIterator = services.values().iterator();
+
+ while (serviceIterator.hasNext())
+ {
+ strBuf.append("\n" + serviceIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ /**
+ * Get all the bindings defined in this Definition and
+ * those in any imported Definitions in the WSDL tree.
+ */
+ public Map getAllBindings()
+ {
+ Map allBindings = new HashMap(getBindings());
+ Map importMap = getImports();
+ Iterator mapItr = importMap.values().iterator();
+ while(mapItr.hasNext())
+ {
+ Vector importDefs = (Vector) mapItr.next();
+ Iterator vecItr = importDefs.iterator();
+ while(vecItr.hasNext())
+ {
+ Import importDef = (Import) vecItr.next();
+ Definition importedDef = importDef.getDefinition();
+ //importedDef may be null (e.g. if the javax.wsdl.importDocuments feature is disabled).
+ if(importedDef != null)
+ {
+ allBindings.putAll(importedDef.getAllBindings());
+ }
+ }
+ }
+ return allBindings;
+ }
+
+ /**
+ * Get all the portTypes defined in this Definition and
+ * those in any imported Definitions in the WSDL tree.
+ */
+ public Map getAllPortTypes()
+ {
+ Map allPortTypes = new HashMap(getPortTypes());
+ Map importMap = getImports();
+ Iterator mapItr = importMap.values().iterator();
+ while(mapItr.hasNext())
+ {
+ Vector importDefs = (Vector) mapItr.next();
+ Iterator vecItr = importDefs.iterator();
+ while(vecItr.hasNext())
+ {
+ Import importDef = (Import) vecItr.next();
+ Definition importedDef = importDef.getDefinition();
+ //importedDef may be null (e.g. if the javax.wsdl.importDocuments feature is disabled).
+ if(importedDef != null)
+ {
+ allPortTypes.putAll(importedDef.getAllPortTypes());
+ }
+ }
+ }
+ return allPortTypes;
+ }
+
+ /**
+ * Get all the services defined in this Definition and
+ * those in any imported Definitions in the WSDL tree.
+ */
+ public Map getAllServices()
+ {
+ Map allServices = new HashMap(getServices());
+ Map importMap = getImports();
+ Iterator mapItr = importMap.values().iterator();
+ while(mapItr.hasNext())
+ {
+ Vector importDefs = (Vector) mapItr.next();
+ Iterator vecItr = importDefs.iterator();
+ while(vecItr.hasNext())
+ {
+ Import importDef = (Import) vecItr.next();
+ Definition importedDef = importDef.getDefinition();
+ //importedDef may be null (e.g. if the javax.wsdl.importDocuments feature is disabled).
+ if(importedDef != null)
+ {
+ allServices.putAll(importedDef.getAllServices());
+ }
+ }
+ }
+ return allServices;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/FaultImpl.java b/src/main/java/com/ibm/wsdl/FaultImpl.java
new file mode 100644
index 0000000..4fb3d13
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/FaultImpl.java
@@ -0,0 +1,86 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+
+/**
+ * This class represents a fault message, and contains the name
+ * of the fault and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public class FaultImpl extends AbstractWSDLElement implements Fault
+{
+ protected String name = null;
+ protected Message message = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.FAULT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this fault message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this fault message.
+ *
+ * @return the fault message name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setMessage(Message message)
+ {
+ this.message = message;
+ }
+
+ public Message getMessage()
+ {
+ return message;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Fault: name=" + name);
+
+ if (message != null)
+ {
+ strBuf.append("\n" + message);
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/ImportImpl.java b/src/main/java/com/ibm/wsdl/ImportImpl.java
new file mode 100644
index 0000000..656c3c8
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/ImportImpl.java
@@ -0,0 +1,118 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+
+/**
+ * This class represents an import, and may contain a reference
+ * to the imported definition.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class ImportImpl extends AbstractWSDLElement implements Import
+{
+ protected String namespaceURI = null;
+ protected String locationURI = null;
+ /*
+ This would need to be made into a generic reference to handle other
+ types of referenced documents.
+ */
+ protected Definition definition = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.IMPORT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ public void setNamespaceURI(String namespaceURI)
+ {
+ this.namespaceURI = namespaceURI;
+ }
+
+ public String getNamespaceURI()
+ {
+ return namespaceURI;
+ }
+
+ public void setLocationURI(String locationURI)
+ {
+ this.locationURI = locationURI;
+ }
+
+ public String getLocationURI()
+ {
+ return locationURI;
+ }
+
+ /**
+ * This property can be used to hang a referenced Definition,
+ * and the top-level Definition (i.e. the one with the <import>)
+ * will use this Definition when resolving referenced WSDL parts.
+ * This would need to be made into a generic reference to handle
+ * other types of referenced documents.
+ */
+ public void setDefinition(Definition definition)
+ {
+ this.definition = definition;
+ }
+
+ /**
+ * This property can be used to hang a referenced Definition,
+ * and the top-level Definition (i.e. the one with the <import>)
+ * will use this Definition when resolving referenced WSDL parts.
+ * This would need to be made into a generic reference to handle
+ * other types of referenced documents.
+ */
+ public Definition getDefinition()
+ {
+ return definition;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Import:");
+
+ if (namespaceURI != null)
+ {
+ strBuf.append("\nnamespaceURI=" + namespaceURI);
+ }
+
+ if (locationURI != null)
+ {
+ strBuf.append("\nlocationURI=" + locationURI);
+ }
+
+ if (definition != null)
+ {
+ //only printing out the defintion URI and TNS to avoid infinite loop
+ //if there are circular imports
+ strBuf.append("\ndefinition=" + definition.getDocumentBaseURI());
+ strBuf.append("\ndefinition namespaceURI=" + definition.getTargetNamespace());
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/InputImpl.java b/src/main/java/com/ibm/wsdl/InputImpl.java
new file mode 100644
index 0000000..a7f7780
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/InputImpl.java
@@ -0,0 +1,86 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+
+/**
+ * This class represents an input message, and contains the name
+ * of the input and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public class InputImpl extends AbstractWSDLElement implements Input
+{
+ protected String name = null;
+ protected Message message = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.INPUT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this input message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this input message.
+ *
+ * @return the input message name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setMessage(Message message)
+ {
+ this.message = message;
+ }
+
+ public Message getMessage()
+ {
+ return message;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Input: name=" + name);
+
+ if (message != null)
+ {
+ strBuf.append("\n" + message);
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/MessageImpl.java b/src/main/java/com/ibm/wsdl/MessageImpl.java
new file mode 100644
index 0000000..cf7bab8
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/MessageImpl.java
@@ -0,0 +1,174 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+import javax.xml.namespace.*;
+
+/**
+ * This class describes a message used for communication with an operation.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class MessageImpl extends AbstractWSDLElement implements Message
+{
+ protected Map parts = new HashMap();
+ protected List additionOrderOfParts = new Vector();
+ protected QName name = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.MESSAGE_ATTR_NAMES);
+ protected boolean isUndefined = true;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this message.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this message.
+ *
+ * @return the message name
+ */
+ public QName getQName()
+ {
+ return name;
+ }
+
+ /**
+ * Add a part to this message.
+ *
+ * @param part the part to be added
+ */
+ public void addPart(Part part)
+ {
+ String partName = part.getName();
+
+ parts.put(partName, part);
+ additionOrderOfParts.add(partName);
+ }
+
+ /**
+ * Get the specified part.
+ *
+ * @param name the name of the desired part.
+ * @return the corresponding part, or null if there wasn't
+ * any matching part
+ */
+ public Part getPart(String name)
+ {
+ return (Part)parts.get(name);
+ }
+
+ /**
+ * Remove the specified part.
+ *
+ * @param name the name of the part to be removed.
+ * @return the part which was removed
+ */
+ public Part removePart(String name)
+ {
+ return (Part)parts.remove(name);
+ }
+
+ /**
+ * Get all the parts defined here.
+ */
+ public Map getParts()
+ {
+ return parts;
+ }
+
+ /**
+ * Get an ordered list of parts as specified by the partOrder
+ * argument.
+ *
+ * @param partOrder a list of strings, with each string referring
+ * to a part by its name. If this argument is null, the parts are
+ * returned in the order in which they were added to the message.
+ * @return the list of parts
+ */
+ public List getOrderedParts(List partOrder)
+ {
+ List orderedParts = new Vector();
+
+ if (partOrder == null)
+ {
+ partOrder = additionOrderOfParts;
+ }
+
+ Iterator partNameIterator = partOrder.iterator();
+
+ while (partNameIterator.hasNext())
+ {
+ String partName = (String)partNameIterator.next();
+ Part part = getPart(partName);
+
+ if (part != null)
+ {
+ orderedParts.add(part);
+ }
+ }
+
+ return orderedParts;
+ }
+
+ public void setUndefined(boolean isUndefined)
+ {
+ this.isUndefined = isUndefined;
+ }
+
+ public boolean isUndefined()
+ {
+ return isUndefined;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Message: name=" + name);
+
+ if (parts != null)
+ {
+ Iterator partsIterator = parts.values().iterator();
+
+ while (partsIterator.hasNext())
+ {
+ strBuf.append("\n" + partsIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/OperationImpl.java b/src/main/java/com/ibm/wsdl/OperationImpl.java
new file mode 100644
index 0000000..e456149
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/OperationImpl.java
@@ -0,0 +1,249 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents a WSDL operation.
+ * It includes information on input, output and fault
+ * messages associated with usage of the operation.
+ *
+ * @author Paul Fremantle (pzf@us.ibm.com)
+ * @author Nirmal Mukhi (nmukhi@us.ibm.com)
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class OperationImpl extends AbstractWSDLElement implements Operation
+{
+ protected String name = null;
+ protected Input input = null;
+ protected Output output = null;
+ protected Map faults = new HashMap();
+ protected OperationType style = null;
+ protected List parameterOrder = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.OPERATION_ATTR_NAMES);
+ protected boolean isUndefined = true;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this operation.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this operation.
+ *
+ * @return the operation name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Set the input message specification for this operation.
+ *
+ * @param input the new input message
+ */
+ public void setInput(Input input)
+ {
+ this.input = input;
+ }
+
+ /**
+ * Get the input message specification for this operation.
+ *
+ * @return the input message
+ */
+ public Input getInput()
+ {
+ return input;
+ }
+
+ /**
+ * Set the output message specification for this operation.
+ *
+ * @param output the new output message
+ */
+ public void setOutput(Output output)
+ {
+ this.output = output;
+ }
+
+ /**
+ * Get the output message specification for this operation.
+ *
+ * @return the output message specification for the operation
+ */
+ public Output getOutput()
+ {
+ return output;
+ }
+
+ /**
+ * Add a fault message that must be associated with this
+ * operation.
+ *
+ * @param fault the new fault message
+ */
+ public void addFault(Fault fault)
+ {
+ faults.put(fault.getName(), fault);
+ }
+
+ /**
+ * Get the specified fault message.
+ *
+ * @param name the name of the desired fault message.
+ * @return the corresponding fault message, or null if there wasn't
+ * any matching message
+ */
+ public Fault getFault(String name)
+ {
+ return (Fault)faults.get(name);
+ }
+
+ /**
+ * Remove the specified fault message.
+ *
+ * @param name the name of the fault message to be removed
+ * @return the fault message which was removed.
+ */
+ public Fault removeFault(String name)
+ {
+ return (Fault)faults.remove(name);
+ }
+
+ /**
+ * Get all the fault messages associated with this operation.
+ *
+ * @return names of fault messages
+ */
+ public Map getFaults()
+ {
+ return faults;
+ }
+
+ /**
+ * Set the style for this operation (request-response,
+ * one way, solicit-response or notification).
+ *
+ * @param style the new operation style
+ */
+ public void setStyle(OperationType style)
+ {
+ this.style = style;
+ }
+
+ /**
+ * Get the operation type.
+ *
+ * @return the operation type
+ */
+ public OperationType getStyle()
+ {
+ return style;
+ }
+
+ /**
+ * Set the parameter ordering for a request-response,
+ * or solicit-response operation.
+ *
+ * @param parameterOrder a list of named parameters
+ * containing the part names to reflect the desired
+ * order of parameters for RPC-style operations
+ */
+ public void setParameterOrdering(List parameterOrder)
+ {
+ this.parameterOrder = parameterOrder;
+ }
+
+ /**
+ * Get the parameter ordering for this operation.
+ *
+ * @return the parameter ordering, a list consisting
+ * of message part names
+ */
+ public List getParameterOrdering()
+ {
+ return parameterOrder;
+ }
+
+ public void setUndefined(boolean isUndefined)
+ {
+ this.isUndefined = isUndefined;
+ }
+
+ public boolean isUndefined()
+ {
+ return isUndefined;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Operation: name=" + name);
+
+ if (parameterOrder != null)
+ {
+ strBuf.append("\nparameterOrder=" + parameterOrder);
+ }
+
+ if (style != null)
+ {
+ strBuf.append("\nstyle=" + style);
+ }
+
+ if (input != null)
+ {
+ strBuf.append("\n" + input);
+ }
+
+ if (output != null)
+ {
+ strBuf.append("\n" + output);
+ }
+
+ if (faults != null)
+ {
+ Iterator faultIterator = faults.values().iterator();
+
+ while (faultIterator.hasNext())
+ {
+ strBuf.append("\n" + faultIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/OutputImpl.java b/src/main/java/com/ibm/wsdl/OutputImpl.java
new file mode 100644
index 0000000..b84e9cb
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/OutputImpl.java
@@ -0,0 +1,86 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+
+/**
+ * This class represents an output message, and contains the name
+ * of the output and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public class OutputImpl extends AbstractWSDLElement implements Output
+{
+ protected String name = null;
+ protected Message message = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.OUTPUT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this output message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this output message.
+ *
+ * @return the output message name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setMessage(Message message)
+ {
+ this.message = message;
+ }
+
+ public Message getMessage()
+ {
+ return message;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Output: name=" + name);
+
+ if (message != null)
+ {
+ strBuf.append("\n" + message);
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/PartImpl.java b/src/main/java/com/ibm/wsdl/PartImpl.java
new file mode 100644
index 0000000..96559a5
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/PartImpl.java
@@ -0,0 +1,105 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+import javax.xml.namespace.*;
+
+/**
+ * This class represents a message part and contains the part's
+ * name, elementName, typeName, and any extensibility attributes.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class PartImpl extends AbstractWSDLElement implements Part
+{
+ protected String name = null;
+ protected QName elementName = null;
+ protected QName typeName = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.PART_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this part.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this part.
+ *
+ * @return the part name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setElementName(QName elementName)
+ {
+ this.elementName = elementName;
+ }
+
+ public QName getElementName()
+ {
+ return elementName;
+ }
+
+ public void setTypeName(QName typeName)
+ {
+ this.typeName = typeName;
+ }
+
+ public QName getTypeName()
+ {
+ return typeName;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Part: name=" + name);
+
+ if (elementName != null)
+ {
+ strBuf.append("\nelementName=" + elementName);
+ }
+
+ if (typeName != null)
+ {
+ strBuf.append("\ntypeName=" + typeName);
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/PortImpl.java b/src/main/java/com/ibm/wsdl/PortImpl.java
new file mode 100644
index 0000000..1d1ddb5
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/PortImpl.java
@@ -0,0 +1,99 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents a port, an endpoint for the
+ * functionality described by a particular port type.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class PortImpl extends AbstractWSDLElement implements Port
+{
+ protected String name = null;
+ protected Binding binding = null;
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.PORT_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this port.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this port.
+ *
+ * @return the port name
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Set the binding this port should refer to.
+ *
+ * @param binding the desired binding
+ */
+ public void setBinding(Binding binding)
+ {
+ this.binding = binding;
+ }
+
+ /**
+ * Get the binding this port refers to.
+ *
+ * @return the binding associated with this port
+ */
+ public Binding getBinding()
+ {
+ return binding;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Port: name=" + name);
+
+ if (binding != null)
+ {
+ strBuf.append("\n" + binding);
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/PortTypeImpl.java b/src/main/java/com/ibm/wsdl/PortTypeImpl.java
new file mode 100644
index 0000000..ed238a3
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/PortTypeImpl.java
@@ -0,0 +1,309 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+import javax.wsdl.*;
+import javax.xml.namespace.*;
+
+/**
+ * This class represents a port type. It contains information about
+ * operations associated with this port type.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class PortTypeImpl extends AbstractWSDLElement implements PortType
+{
+ protected QName name = null;
+ protected List operations = new Vector();
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.PORT_TYPE_ATTR_NAMES);
+ protected boolean isUndefined = true;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this port type.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this port type.
+ *
+ * @return the port type name
+ */
+ public QName getQName()
+ {
+ return name;
+ }
+
+ /**
+ * Add an operation to this port type.
+ *
+ * @param operation the operation to be added
+ */
+ public void addOperation(Operation operation)
+ {
+ operations.add(operation);
+ }
+
+ /**
+ * Get the specified operation. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ *
+ * The search criteria will be the operation name parameter and any
+ * non-null input or output message name parameters.
+ * To exclude the input or output message name from the search criteria,
+ * specify a null value for the input or output message name parameter.
+ * To search for operations with unnamed input or output messages
+ * (i.e. <input> or <output> elements with the 'name' attribute omitted),
+ * specify the string ":none
" for the input or output message name parameter.
+ *
+ * Note: the use of a string value ":none
" rather than null to search for
+ * unnamed input or output messages is necessary to retain backward compatibility
+ * with earlier versions of the JWSDL API, which defined a null value to
+ * mean 'ignore this parameter'.
+ * The colon in ":none
" is to avoid name clashes with input or output
+ * message names, which must be of type NCName (i.e. they cannot contain colons).
+ *
+ * @param name the name of the desired operation.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the corresponding operation, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ */
+ public Operation getOperation(String name,
+ String inputName,
+ String outputName)
+ {
+ boolean found = false;
+ Operation ret = null;
+ Iterator opIterator = operations.iterator();
+
+ while (opIterator.hasNext())
+ {
+ Operation op = (Operation)opIterator.next();
+ String opName = op.getName();
+
+ if (name != null && opName != null)
+ {
+ if (!name.equals(opName))
+ {
+ op = null;
+ }
+ }
+ else if (name != null || opName != null)
+ {
+ op = null;
+ }
+
+ if (op != null && inputName != null)
+ {
+ OperationType opStyle = op.getStyle();
+ String defaultInputName = opName;
+
+ if (opStyle == OperationType.REQUEST_RESPONSE)
+ {
+ defaultInputName = opName + "Request";
+ }
+ else if (opStyle == OperationType.SOLICIT_RESPONSE)
+ {
+ defaultInputName = opName + "Solicit";
+ }
+
+ boolean specifiedDefault = inputName.equals(defaultInputName);
+
+ Input input = op.getInput();
+
+ if (input != null)
+ {
+ String opInputName = input.getName();
+
+ if (opInputName == null)
+ {
+ if (!specifiedDefault && !inputName.equals(Constants.NONE))
+ {
+ op = null;
+ }
+ }
+ else if (!opInputName.equals(inputName))
+ {
+ op = null;
+ }
+ }
+ else
+ {
+ op = null;
+ }
+ }
+
+ if (op != null && outputName != null)
+ {
+ OperationType opStyle = op.getStyle();
+ String defaultOutputName = opName;
+
+ if (opStyle == OperationType.REQUEST_RESPONSE
+ || opStyle == OperationType.SOLICIT_RESPONSE)
+ {
+ defaultOutputName = opName + "Response";
+ }
+
+ boolean specifiedDefault = outputName.equals(defaultOutputName);
+
+ Output output = op.getOutput();
+
+ if (output != null)
+ {
+ String opOutputName = output.getName();
+
+ if (opOutputName == null)
+ {
+ if (!specifiedDefault && !outputName.equals(Constants.NONE))
+ {
+ op = null;
+ }
+ }
+ else if (!opOutputName.equals(outputName))
+ {
+ op = null;
+ }
+ }
+ else
+ {
+ op = null;
+ }
+ }
+
+ if (op != null)
+ {
+ if (found)
+ {
+ throw new IllegalArgumentException("Duplicate operation with " +
+ "name=" + name +
+ (inputName != null
+ ? ", inputName=" + inputName
+ : "") +
+ (outputName != null
+ ? ", outputName=" + outputName
+ : "") +
+ ", found in portType '" +
+ getQName() + "'.");
+ }
+ else
+ {
+ found = true;
+ ret = op;
+ }
+ }
+ } //end while loop
+
+ return ret;
+ }
+
+ /**
+ * Get all the operations defined here.
+ */
+ public List getOperations()
+ {
+ return operations;
+ }
+
+ /**
+ * Remove the specified operation. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ *
+ * Usage of the input and output message name parameters is as
+ * described for the
+ * The supported features are:
+ *
+ *
+ * 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.");
+ }
+
+ if (name.equals(Constants.FEATURE_VERBOSE))
+ {
+ verbose = value;
+ }
+ else if (name.equals(Constants.FEATURE_IMPORT_DOCUMENTS))
+ {
+ importDocuments = value;
+ }
+ else if (name.equals(Constants.FEATURE_PARSE_SCHEMA))
+ {
+ parseSchema = value;
+ }
+ 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.");
+ }
+
+ if (name.equals(Constants.FEATURE_VERBOSE))
+ {
+ return verbose;
+ }
+ else if (name.equals(Constants.FEATURE_IMPORT_DOCUMENTS))
+ {
+ return importDocuments;
+ }
+ else
+ {
+ throw new IllegalArgumentException("Feature name '" + name +
+ "' not recognized.");
+ }
+ }
+
+ /**
+ * Set the extension registry to be used when reading
+ * WSDL documents into a WSDL definition. If an
+ * extension registry is set, that is the extension
+ * registry that will be set as the extensionRegistry
+ * property of the definitions resulting from invoking
+ * readWSDL(...). Default is null.
+ *
+ * @param extReg the extension registry to use for new
+ * definitions
+ */
+ public void setExtensionRegistry(ExtensionRegistry extReg)
+ {
+ this.extReg = extReg;
+ }
+
+ /**
+ * Get the extension registry, if one was set. Default is
+ * null.
+ */
+ public ExtensionRegistry getExtensionRegistry()
+ {
+ return extReg;
+ }
+
+ /**
+ * Get the WSDLFactory object cached in the reader, or use lazy
+ * instantiation if it is not cached yet.
+ */
+ protected WSDLFactory getWSDLFactory() throws WSDLException
+ {
+ if (factory == null)
+ {
+ factory = (factoryImplName != null)
+ ? WSDLFactory.newInstance(factoryImplName)
+ : WSDLFactory.newInstance();
+ }
+ return factory;
+ }
+
+ /**
+ * Set a different factory implementation to use for
+ * creating definitions when reading WSDL documents.
+ * As some WSDLReader implementations may only be
+ * capable of creating definitions using the same
+ * factory implementation from which the reader was
+ * obtained, this method is optional. Default is null.
+ *
+ * @param factoryImplName the fully-qualified class name of the
+ * class which provides a concrete implementation of the abstract
+ * class WSDLFactory.
+ * @throws UnsupportedOperationException if this method
+ * is invoked on an implementation which does not
+ * support it.
+ */
+ public void setFactoryImplName(String factoryImplName)
+ throws UnsupportedOperationException
+ {
+ //check to see if we really need to change the factory name and clear the cache
+ if((this.factoryImplName == null && factoryImplName != null) ||
+ (this.factoryImplName != null && !this.factoryImplName.equals(factoryImplName)))
+ {
+ //the factory object is cached in the reader so set it
+ //to null if the factory impl name is reset.
+ this.factory = null;
+
+ this.factoryImplName = factoryImplName;
+ //if(verbose) System.out.println("WSDLFactory Impl Name set to : "+factoryImplName);
+ }
+ }
+
+ /**
+ * Get the factoryImplName, if one was set. Default is null.
+ */
+ public String getFactoryImplName()
+ {
+ return factoryImplName;
+ }
+
+ protected Definition parseDefinitions(String documentBaseURI,
+ Element defEl,
+ Map importedDefs)
+ throws WSDLException
+ {
+ checkElementName(defEl, Constants.Q_ELEM_DEFINITIONS);
+
+ WSDLFactory factory = getWSDLFactory();
+ Definition def = factory.newDefinition();
+
+ if (extReg != null)
+ {
+ def.setExtensionRegistry(extReg);
+ }
+
+ String name = DOMUtils.getAttribute(defEl, Constants.ATTR_NAME);
+ String targetNamespace = DOMUtils.getAttribute(defEl,
+ Constants.ATTR_TARGET_NAMESPACE);
+ NamedNodeMap attrs = defEl.getAttributes();
+
+ if (importedDefs == null)
+ {
+ importedDefs = new Hashtable();
+ }
+
+ if (documentBaseURI != null)
+ {
+ def.setDocumentBaseURI(documentBaseURI);
+ importedDefs.put(documentBaseURI, def);
+ }
+
+ if (name != null)
+ {
+ def.setQName(new QName(targetNamespace, name));
+ }
+
+ if (targetNamespace != null)
+ {
+ def.setTargetNamespace(targetNamespace);
+ }
+
+ int size = attrs.getLength();
+
+ for (int i = 0; i < size; i++)
+ {
+ Attr attr = (Attr)attrs.item(i);
+ String namespaceURI = attr.getNamespaceURI();
+ String localPart = attr.getLocalName();
+ String value = attr.getValue();
+
+ if (namespaceURI != null && namespaceURI.equals(Constants.NS_URI_XMLNS))
+ {
+ if (localPart != null && !localPart.equals(Constants.ATTR_XMLNS))
+ {
+ def.addNamespace(localPart, value);
+ }
+ else
+ {
+ def.addNamespace(null, value);
+ }
+ }
+ }
+
+ Element tempEl = DOMUtils.getFirstChildElement(defEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_IMPORT, tempEl))
+ {
+ def.addImport(parseImport(tempEl, def, importedDefs));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ def.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_TYPES, tempEl))
+ {
+ def.setTypes(parseTypes(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_MESSAGE, tempEl))
+ {
+ def.addMessage(parseMessage(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_PORT_TYPE, tempEl))
+ {
+ def.addPortType(parsePortType(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_BINDING, tempEl))
+ {
+ def.addBinding(parseBinding(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_SERVICE, tempEl))
+ {
+ def.addService(parseService(tempEl, def));
+ }
+ else
+ {
+ def.addExtensibilityElement(
+ parseExtensibilityElement(Definition.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(defEl, Definition.class, def, def);
+
+ return def;
+ }
+
+ protected Import parseImport(Element importEl,
+ Definition def,
+ Map importedDefs)
+ throws WSDLException
+ {
+ Import importDef = def.createImport();
+
+ try
+ {
+ String namespaceURI = DOMUtils.getAttribute(importEl,
+ Constants.ATTR_NAMESPACE);
+ String locationURI = DOMUtils.getAttribute(importEl,
+ Constants.ATTR_LOCATION);
+ String contextURI = null;
+
+ if (namespaceURI != null)
+ {
+ importDef.setNamespaceURI(namespaceURI);
+ }
+
+ if (locationURI != null)
+ {
+ importDef.setLocationURI(locationURI);
+
+ if (importDocuments)
+ {
+ try
+ {
+ contextURI = def.getDocumentBaseURI();
+ Definition importedDef = null;
+ InputStream inputStream = null;
+ InputSource inputSource = null;
+ URL url = null;
+
+ if (loc != null)
+ {
+ inputSource = loc.getImportInputSource(contextURI, locationURI);
+
+ /*
+ We now have available the latest import URI. This might
+ differ from the locationURI so check the importedDefs for it
+ since it is this that we pass as the documentBaseURI later.
+ */
+ String liu = loc.getLatestImportURI();
+
+ importedDef = (Definition)importedDefs.get(liu);
+
+ inputSource.setSystemId(liu);
+ }
+ else
+ {
+ URL contextURL = (contextURI != null)
+ ? StringUtils.getURL(null, contextURI)
+ : null;
+
+ url = StringUtils.getURL(contextURL, locationURI);
+ importedDef = (Definition)importedDefs.get(url.toString());
+
+ if (importedDef == null)
+ {
+ inputStream = StringUtils.getContentAsInputStream(url);
+
+ if (inputStream != null)
+ {
+ inputSource = new InputSource(inputStream);
+ inputSource.setSystemId(url.toString());
+ }
+ }
+ }
+
+ if (importedDef == null)
+ {
+ if (inputSource == null)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to locate imported document " +
+ "at '" + locationURI + "'" +
+ (contextURI == null
+ ? "."
+ : ", relative to '" + contextURI +
+ "'."));
+ }
+
+ Document doc = getDocument(inputSource, inputSource.getSystemId());
+
+ if (inputStream != null)
+ {
+ inputStream.close();
+ }
+
+ Element documentElement = doc.getDocumentElement();
+
+ /*
+ Check if it's a wsdl document.
+ If it's not, don't retrieve and process it.
+ This should later be extended to allow other types of
+ documents to be retrieved and processed, such as schema
+ documents (".xsd"), etc...
+ */
+ if (QNameUtils.matches(Constants.Q_ELEM_DEFINITIONS,
+ documentElement))
+ {
+ if (verbose)
+ {
+ System.out.println("Retrieving document at '" + locationURI +
+ "'" +
+ (contextURI == null
+ ? "."
+ : ", relative to '" + contextURI + "'."));
+ }
+
+ String urlString =
+ (loc != null)
+ ? loc.getLatestImportURI()
+ : (url != null)
+ ? url.toString()
+ : locationURI;
+
+ importedDef = readWSDL(urlString,
+ documentElement,
+ importedDefs);
+ }
+ else
+ {
+ QName docElementQName = QNameUtils.newQName(documentElement);
+
+ if (SchemaConstants.XSD_QNAME_LIST.contains(docElementQName))
+ {
+ if (verbose)
+ {
+ System.out.println("Retrieving schema wsdl:imported from '" + locationURI +
+ "'" +
+ (contextURI == null
+ ? "."
+ : ", relative to '" + contextURI + "'."));
+ }
+
+ WSDLFactory factory = getWSDLFactory();
+
+ importedDef = factory.newDefinition();
+
+ if (extReg != null)
+ {
+ importedDef.setExtensionRegistry(extReg);
+ }
+
+ String urlString =
+ (loc != null)
+ ? loc.getLatestImportURI()
+ : (url != null)
+ ? url.toString()
+ : locationURI;
+
+ importedDef.setDocumentBaseURI(urlString);
+
+ Types types = importedDef.createTypes();
+ types.addExtensibilityElement(
+ parseSchema(Types.class, documentElement, importedDef));
+ importedDef.setTypes(types);
+ }
+ }
+ }
+
+ if (importedDef != null)
+ {
+ importDef.setDefinition(importedDef);
+ }
+ }
+ catch (WSDLException e)
+ {
+ throw e;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to resolve imported document at '" +
+ locationURI +
+ (contextURI == null
+ ? "'." : "', relative to '" + contextURI + "'")
+ , e);
+ }
+ } //end importDocs
+ } //end locationURI
+
+ }
+ catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(importEl));
+ }
+ else
+ {
+ //If definitions are being parsed recursively for nested imports
+ //the exception location must be built up recursively too so
+ //prepend this element's xpath to exception location.
+ String loc = XPathUtils.getXPathExprFromNode(importEl) + e.getLocation();
+ e.setLocation(loc);
+ }
+
+ throw e;
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = importEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(importEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ importDef.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ importDef.addExtensibilityElement(
+ parseExtensibilityElement(Import.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(importEl, Import.class, importDef, def);
+
+ return importDef;
+
+ }
+
+ protected Types parseTypes(Element typesEl, Definition def)
+ throws WSDLException
+ {
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = typesEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Types types = def.createTypes();
+ Element tempEl = DOMUtils.getFirstChildElement(typesEl);
+ QName tempElType;
+
+ while (tempEl != null)
+ {
+ tempElType = QNameUtils.newQName(tempEl);
+
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ types.setDocumentationElement(tempEl);
+ }
+ else if ((SchemaConstants.XSD_QNAME_LIST).contains(tempElType))
+ {
+ if (parseSchema)
+ {
+ //the element qname indicates it is a schema.
+ types.addExtensibilityElement(
+ parseSchema(Types.class, tempEl, def));
+ }
+ else
+ {
+ types.addExtensibilityElement(parseExtensibilityElementAsDefaultExtensiblityElement(Types.class, tempEl, def));
+ }
+ }
+ else
+ {
+ types.addExtensibilityElement(
+ parseExtensibilityElement(Types.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(typesEl, Types.class, types, def);
+
+ return types;
+ }
+
+ protected ExtensibilityElement parseSchema( Class parentType,
+ Element el,
+ Definition def)
+ throws WSDLException
+ {
+ QName elementType = null;
+ ExtensionRegistry extReg = null;
+
+ try
+ {
+ extReg = def.getExtensionRegistry();
+
+ if (extReg == null)
+ {
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "No ExtensionRegistry set for this " +
+ "Definition, so unable to deserialize " +
+ "a '" + elementType + "' element in the " +
+ "context of a '" + parentType.getName() +
+ "'.");
+ }
+
+ return parseSchema(parentType, el, def, extReg);
+ }
+ catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(el));
+ }
+
+ throw e;
+ }
+ }
+
+
+ protected ExtensibilityElement parseSchema( Class parentType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ /*
+ * This method returns ExtensibilityElement rather than Schema because we
+ * do not insist that a suitable XSD schema deserializer is registered.
+ * PopulatedExtensionRegistry registers SchemaDeserializer by default, but
+ * if the user chooses not to register a suitable deserializer then the
+ * UnknownDeserializer will be used, returning an UnknownExtensibilityElement.
+ */
+
+ Schema schema = null;
+ SchemaReference schemaRef = null;
+ try
+ {
+
+ QName elementType = QNameUtils.newQName(el);
+
+ ExtensionDeserializer exDS =
+ extReg.queryDeserializer(parentType, elementType);
+
+ //Now unmarshall the DOM element.
+ ExtensibilityElement ee =
+ exDS.unmarshall(parentType, elementType, el, def, extReg);
+
+ if (ee instanceof Schema)
+ {
+ schema = (Schema) ee;
+ }
+ else
+ {
+ //Unknown extensibility element, so don't do any more schema parsing on it.
+ return ee;
+ }
+
+
+ //Keep track of parsed schemas to avoid duplicating Schema objects
+ //through duplicate or circular references (eg: A imports B imports A).
+ if (schema.getDocumentBaseURI() != null)
+ {
+ this.allSchemas.put(schema.getDocumentBaseURI(), schema);
+ }
+
+ //At this point, any SchemaReference objects held by the schema will not
+ //yet point to their referenced schemas, so we must now retrieve these
+ //schemas and set the schema references.
+
+ //First, combine the schema references for imports, includes and redefines
+ //into a single list
+
+ ArrayList allSchemaRefs = new ArrayList();
+
+ Collection ic = schema.getImports().values();
+ Iterator importsIterator = ic.iterator();
+ while(importsIterator.hasNext())
+ {
+ allSchemaRefs.addAll( (Collection) importsIterator.next() );
+ }
+
+ allSchemaRefs.addAll(schema.getIncludes());
+ allSchemaRefs.addAll(schema.getRedefines());
+
+ //Then, retrieve the schema referred to by each schema reference. If the
+ //schema has been read in previously, use the existing schema object.
+ //Otherwise unmarshall the DOM element into a new schema object.
+
+ ListIterator schemaRefIterator = allSchemaRefs.listIterator();
+
+ while(schemaRefIterator.hasNext())
+ {
+ try
+ {
+ schemaRef = (SchemaReference) schemaRefIterator.next();
+
+ if (schemaRef.getSchemaLocationURI() == null)
+ {
+ //cannot get the referenced schema, so ignore this schema reference
+ continue;
+ }
+
+ if (verbose)
+ {
+ System.out.println("Retrieving schema at '" +
+ schemaRef.getSchemaLocationURI() +
+ (schema.getDocumentBaseURI() == null
+ ? "'."
+ : "', relative to '" +
+ schema.getDocumentBaseURI() + "'."));
+ }
+
+
+ InputStream inputStream = null;
+ InputSource inputSource = null;
+
+ //This is the child schema referred to by the schemaReference
+ Schema referencedSchema = null;
+
+ //This is the child schema's location obtained from the WSDLLocator or the URL
+ String location = null;
+
+ if (loc != null)
+ {
+ //Try to get the referenced schema using the wsdl locator
+ inputSource = loc.getImportInputSource(
+ schema.getDocumentBaseURI(), schemaRef.getSchemaLocationURI());
+
+ if (inputSource == null)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to locate with a locator "
+ + "the schema referenced at '"
+ + schemaRef.getSchemaLocationURI()
+ + "' relative to document base '"
+ + schema.getDocumentBaseURI() + "'");
+ }
+ location = loc.getLatestImportURI();
+
+ //if a schema from this location has been read previously, use it.
+ referencedSchema = (Schema) this.allSchemas.get(location);
+ }
+ else
+ {
+ // We don't have a wsdl locator, so try to retrieve the schema by its URL
+ String contextURI = schema.getDocumentBaseURI();
+ URL contextURL = (contextURI != null) ? StringUtils.getURL(null, contextURI) : null;
+ URL url = StringUtils.getURL(contextURL, schemaRef.getSchemaLocationURI());
+ location = url.toExternalForm();
+
+ //if a schema from this location has been retrieved previously, use it.
+ referencedSchema = (Schema) this.allSchemas.get(location);
+
+ if (referencedSchema == null)
+ {
+ // We haven't read this schema in before so do it now
+ inputStream = StringUtils.getContentAsInputStream(url);
+
+ if (inputStream != null)
+ {
+ inputSource = new InputSource(inputStream);
+ }
+
+ if (inputSource == null)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to locate with a url "
+ + "the document referenced at '"
+ + schemaRef.getSchemaLocationURI()
+ + "'"
+ + (contextURI == null ? "." : ", relative to '"
+ + contextURI + "'."));
+ }
+ }
+
+ } //end if loc
+
+ // If we have not previously read the schema, get its DOM element now.
+ if (referencedSchema == null)
+ {
+ inputSource.setSystemId(location);
+ Document doc = getDocument(inputSource, location);
+
+ if (inputStream != null)
+ {
+ inputStream.close();
+ }
+
+ Element documentElement = doc.getDocumentElement();
+
+ // If it's a schema doc process it, otherwise the schema reference remains null
+
+ QName docElementQName = QNameUtils.newQName(documentElement);
+
+ if (SchemaConstants.XSD_QNAME_LIST.contains(docElementQName))
+ {
+ //We now need to call parseSchema recursively to parse the referenced
+ //schema. The document base URI of the referenced schema will be set to
+ //the document base URI of the current schema plus the schemaLocation in
+ //the schemaRef. We cannot explicitly pass in a new document base URI
+ //to the schema deserializer, so instead we will create a dummy
+ //Definition and set its documentBaseURI to the new document base URI.
+ //We can leave the other definition fields empty because we know
+ //that the SchemaDeserializer.unmarshall method uses the definition
+ //parameter only to get its documentBaseURI. If the unmarshall method
+ //implementation changes (ie: its use of definition changes) we may need
+ //to rethink this approach.
+
+ WSDLFactory factory = getWSDLFactory();
+ Definition dummyDef = factory.newDefinition();
+
+ dummyDef.setDocumentBaseURI(location);
+
+ //By this point, we know we have a SchemaDeserializer registered
+ //so we can safely cast the ExtensibilityElement to a Schema.
+ referencedSchema = (Schema) parseSchema( parentType,
+ documentElement,
+ dummyDef,
+ extReg);
+ }
+
+ } //end if referencedSchema
+
+ schemaRef.setReferencedSchema(referencedSchema);
+ }
+ catch (WSDLException e)
+ {
+ throw e;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "An error occurred trying to resolve schema referenced at '"
+ + schemaRef.getSchemaLocationURI()
+ + "'"
+ + (schema.getDocumentBaseURI() == null ? "." : ", relative to '"
+ + schema.getDocumentBaseURI() + "'."),
+ e);
+ }
+
+ } //end while loop
+
+ return schema;
+
+ }
+ catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(el));
+ }
+ else
+ {
+ //If this method has been called recursively for nested schemas
+ //the exception location must be built up recursively too so
+ //prepend this element's xpath to exception location.
+ String loc = XPathUtils.getXPathExprFromNode(el) + e.getLocation();
+ e.setLocation(loc);
+ }
+
+ throw e;
+ }
+
+ }
+
+
+ protected Binding parseBinding(Element bindingEl, Definition def)
+ throws WSDLException
+ {
+ Binding binding = null;
+
+ List remainingAttrs = DOMUtils.getAttributes(bindingEl);
+ String name = DOMUtils.getAttribute(bindingEl, Constants.ATTR_NAME, remainingAttrs);
+ QName portTypeName = getQualifiedAttributeValue(bindingEl,
+ Constants.ATTR_TYPE,
+ Constants.ELEM_BINDING,
+ def,
+ remainingAttrs);
+
+ PortType portType = null;
+
+ if (name != null)
+ {
+ QName bindingName = new QName(def.getTargetNamespace(), name);
+
+ binding = def.getBinding(bindingName);
+
+ if (binding == null)
+ {
+ binding = def.createBinding();
+ binding.setQName(bindingName);
+ }
+ }
+ else
+ {
+ binding = def.createBinding();
+ }
+
+ // Whether it was retrieved or created, the definition has been found.
+ binding.setUndefined(false);
+
+ if (portTypeName != null)
+ {
+ portType = def.getPortType(portTypeName);
+
+ if (portType == null)
+ {
+ portType = def.createPortType();
+ portType.setQName(portTypeName);
+ def.addPortType(portType);
+ }
+
+ binding.setPortType(portType);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = bindingEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(bindingEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ binding.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_OPERATION, tempEl))
+ {
+ binding.addBindingOperation(parseBindingOperation(tempEl,
+ portType,
+ def));
+ }
+ else
+ {
+ binding.addExtensibilityElement(parseExtensibilityElement(
+ Binding.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(bindingEl, Binding.class, binding, def);
+
+ return binding;
+ }
+
+ protected BindingOperation parseBindingOperation(
+ Element bindingOperationEl,
+ PortType portType,
+ Definition def)
+ throws WSDLException
+ {
+ BindingOperation bindingOperation = def.createBindingOperation();
+
+ List remainingAttrs = DOMUtils.getAttributes(bindingOperationEl);
+ String name = DOMUtils.getAttribute(bindingOperationEl,
+ Constants.ATTR_NAME,
+ remainingAttrs);
+
+ if (name != null)
+ {
+ bindingOperation.setName(name);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = bindingOperationEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(bindingOperationEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ bindingOperation.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_INPUT, tempEl))
+ {
+ bindingOperation.setBindingInput(parseBindingInput(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_OUTPUT, tempEl))
+ {
+ bindingOperation.setBindingOutput(parseBindingOutput(tempEl, def));
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_FAULT, tempEl))
+ {
+ bindingOperation.addBindingFault(parseBindingFault(tempEl, def));
+ }
+ else
+ {
+ bindingOperation.addExtensibilityElement(
+ parseExtensibilityElement(BindingOperation.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ if (portType != null)
+ {
+ BindingInput bindingInput = bindingOperation.getBindingInput();
+ BindingOutput bindingOutput = bindingOperation.getBindingOutput();
+ String inputName = (bindingInput != null
+ ? (bindingInput.getName() != null ? bindingInput.getName() : Constants.NONE)
+ : null);
+ String outputName = (bindingOutput != null
+ ? (bindingOutput.getName() != null ? bindingOutput.getName() : Constants.NONE)
+ : null);
+ Operation op = portType.getOperation(name, inputName, outputName);
+
+ /*
+ * If the bindingOp input or output message names are null we will search first
+ * for a porttypeOp with corresponding unnamed input or output messages (using
+ * Constants.NONE for inputName or outputName, as above).
+ * However, input and output message names need not be used at all if operation
+ * overloading is not used, so if no match was found we will try again ignoring
+ * these unnamed messages from the search criteria (i.e. using null instead of
+ * Constants.NONE for inputName or outputName).
+ */
+
+ if(op == null)
+ {
+ if(Constants.NONE.equals(inputName) && Constants.NONE.equals(outputName))
+ {
+ //There was no porttype op with unnamed input and output messages,
+ //so ignore input and output name and search on the op name only.
+ op = portType.getOperation(name, null, null);
+ }
+ else if(Constants.NONE.equals(inputName))
+ {
+ //There was no porttype op with an unnamed input message,
+ //so ignore input name and search on the op name and output name only.
+ op = portType.getOperation(name, null, outputName);
+ }
+ else if(Constants.NONE.equals(outputName))
+ {
+ //There was no porttype op with an unnamed output message,
+ //so ignore output name and search on the op name and input name only.
+ op = portType.getOperation(name, inputName, null);
+ }
+ }
+
+ if (op == null)
+ {
+ Input input = def.createInput();
+ Output output = def.createOutput();
+
+ op = def.createOperation();
+ op.setName(name);
+ input.setName(inputName);
+ output.setName(outputName);
+ op.setInput(input);
+ op.setOutput(output);
+ portType.addOperation(op);
+ }
+
+ bindingOperation.setOperation(op);
+ }
+
+ parseExtensibilityAttributes(bindingOperationEl, BindingOperation.class, bindingOperation, def);
+
+ return bindingOperation;
+ }
+
+ protected BindingInput parseBindingInput(Element bindingInputEl,
+ Definition def)
+ throws WSDLException
+ {
+ BindingInput bindingInput = def.createBindingInput();
+
+ List remainingAttrs = DOMUtils.getAttributes(bindingInputEl);
+ String name = DOMUtils.getAttribute(bindingInputEl,
+ Constants.ATTR_NAME,
+ remainingAttrs);
+
+ if (name != null)
+ {
+ bindingInput.setName(name);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = bindingInputEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(bindingInputEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ bindingInput.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ bindingInput.addExtensibilityElement(
+ parseExtensibilityElement(BindingInput.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(bindingInputEl, BindingInput.class, bindingInput, def);
+
+ return bindingInput;
+ }
+
+ protected BindingOutput parseBindingOutput(Element bindingOutputEl,
+ Definition def)
+ throws WSDLException
+ {
+ BindingOutput bindingOutput = def.createBindingOutput();
+
+ List remainingAttrs = DOMUtils.getAttributes(bindingOutputEl);
+ String name = DOMUtils.getAttribute(bindingOutputEl,
+ Constants.ATTR_NAME,
+ remainingAttrs);
+
+ if (name != null)
+ {
+ bindingOutput.setName(name);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = bindingOutputEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(bindingOutputEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ bindingOutput.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ bindingOutput.addExtensibilityElement(
+ parseExtensibilityElement(BindingOutput.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(bindingOutputEl, BindingOutput.class, bindingOutput, def);
+
+ return bindingOutput;
+ }
+
+ protected BindingFault parseBindingFault(Element bindingFaultEl,
+ Definition def)
+ throws WSDLException
+ {
+ BindingFault bindingFault = def.createBindingFault();
+
+ List remainingAttrs = DOMUtils.getAttributes(bindingFaultEl);
+ String name = DOMUtils.getAttribute(bindingFaultEl,
+ Constants.ATTR_NAME,
+ remainingAttrs);
+
+ if (name != null)
+ {
+ bindingFault.setName(name);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = bindingFaultEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(bindingFaultEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ bindingFault.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ bindingFault.addExtensibilityElement(
+ parseExtensibilityElement(BindingFault.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(bindingFaultEl, BindingFault.class, bindingFault, def);
+
+ return bindingFault;
+ }
+
+ protected Message parseMessage(Element msgEl, Definition def)
+ throws WSDLException
+ {
+ Message msg = null;
+
+ List remainingAttrs = DOMUtils.getAttributes(msgEl);
+ String name = DOMUtils.getAttribute(msgEl, Constants.ATTR_NAME, remainingAttrs);
+
+ if (name != null)
+ {
+ QName messageName = new QName(def.getTargetNamespace(), name);
+
+ msg = def.getMessage(messageName);
+
+ if (msg == null)
+ {
+ msg = def.createMessage();
+ msg.setQName(messageName);
+ }
+ }
+ else
+ {
+ msg = def.createMessage();
+ }
+
+ // Whether it was retrieved or created, the definition has been found.
+ msg.setUndefined(false);
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = msgEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(msgEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ msg.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_PART, tempEl))
+ {
+ msg.addPart(parsePart(tempEl, def));
+ }
+ else
+ {
+ msg.addExtensibilityElement(
+ parseExtensibilityElement(Message.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(msgEl, Message.class, msg, def);
+
+ return msg;
+ }
+
+ protected Part parsePart(Element partEl, Definition def)
+ throws WSDLException
+ {
+ Part part = def.createPart();
+ String name = DOMUtils.getAttribute(partEl, Constants.ATTR_NAME);
+ QName elementName = getQualifiedAttributeValue(partEl,
+ Constants.ATTR_ELEMENT,
+ Constants.ELEM_MESSAGE,
+ def);
+ QName typeName = getQualifiedAttributeValue(partEl,
+ Constants.ATTR_TYPE,
+ Constants.ELEM_MESSAGE,
+ def);
+
+ if (name != null)
+ {
+ part.setName(name);
+ }
+
+ if (elementName != null)
+ {
+ part.setElementName(elementName);
+ }
+
+ if (typeName != null)
+ {
+ part.setTypeName(typeName);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = partEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(partEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ part.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ part.addExtensibilityElement(
+ parseExtensibilityElement(Part.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(partEl, Part.class, part, def);
+
+ return part;
+ }
+
+ protected void parseExtensibilityAttributes(Element el,
+ Class parentType,
+ AttributeExtensible attrExt,
+ Definition def)
+ throws WSDLException
+ {
+ if (attrExt == null) return;
+
+ List nativeAttributeNames = attrExt.getNativeAttributeNames();
+ NamedNodeMap nodeMap = el.getAttributes();
+ int length = nodeMap.getLength();
+
+ for (int i = 0; i < length; i++)
+ {
+ Attr attribute = (Attr)nodeMap.item(i);
+ String localName = attribute.getLocalName();
+ String namespaceURI = attribute.getNamespaceURI();
+ String prefix = attribute.getPrefix();
+ QName qname = new QName(namespaceURI, localName);
+
+ if (namespaceURI != null && !namespaceURI.equals(Constants.NS_URI_WSDL))
+ {
+ if (!namespaceURI.equals(Constants.NS_URI_XMLNS))
+ {
+ DOMUtils.registerUniquePrefix(prefix, namespaceURI, def);
+
+ String strValue = attribute.getValue();
+ int attrType = AttributeExtensible.NO_DECLARED_TYPE;
+ ExtensionRegistry extReg = def.getExtensionRegistry();
+
+ if (extReg != null)
+ {
+ attrType = extReg.queryExtensionAttributeType(parentType, qname);
+ }
+
+ Object val = parseExtensibilityAttribute(el, attrType, strValue, def);
+
+ attrExt.setExtensionAttribute(qname, val);
+ }
+ }
+ else if (!nativeAttributeNames.contains(localName))
+ {
+ WSDLException wsdlExc = new WSDLException(WSDLException.INVALID_WSDL,
+ "Encountered illegal " +
+ "extension attribute '" +
+ qname + "'. Extension " +
+ "attributes must be in " +
+ "a namespace other than " +
+ "WSDL's.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(el));
+
+ throw wsdlExc;
+ }
+ }
+ }
+
+ protected Object parseExtensibilityAttribute(Element el,
+ int attrType,
+ String attrValue,
+ Definition def)
+ throws WSDLException
+ {
+ if (attrType == AttributeExtensible.QNAME_TYPE)
+ {
+ return DOMUtils.getQName(attrValue, el, def);
+ }
+ else if (attrType == AttributeExtensible.LIST_OF_STRINGS_TYPE)
+ {
+ return StringUtils.parseNMTokens(attrValue);
+ }
+ else if (attrType == AttributeExtensible.LIST_OF_QNAMES_TYPE)
+ {
+ List oldList = StringUtils.parseNMTokens(attrValue);
+ int size = oldList.size();
+ List newList = new Vector(size);
+
+ for (int i = 0; i < size; i++)
+ {
+ String str = (String)oldList.get(i);
+ QName qValue = DOMUtils.getQName(str, el, def);
+
+ newList.add(qValue);
+ }
+
+ return newList;
+ }
+ else if (attrType == AttributeExtensible.STRING_TYPE)
+ {
+ return attrValue;
+ }
+ else
+ {
+ QName qValue = null;
+
+ try
+ {
+ qValue = DOMUtils.getQName(attrValue, el, def);
+ }
+ catch (WSDLException e)
+ {
+ qValue = new QName(attrValue);
+ }
+
+ return qValue;
+ }
+ }
+
+ protected PortType parsePortType(Element portTypeEl, Definition def)
+ throws WSDLException
+ {
+ PortType portType = null;
+ String name = DOMUtils.getAttribute(portTypeEl, Constants.ATTR_NAME);
+
+ if (name != null)
+ {
+ QName portTypeName = new QName(def.getTargetNamespace(), name);
+
+ portType = def.getPortType(portTypeName);
+
+ if (portType == null)
+ {
+ portType = def.createPortType();
+ portType.setQName(portTypeName);
+ }
+ }
+ else
+ {
+ portType = def.createPortType();
+ }
+
+ // Whether it was retrieved or created, the definition has been found.
+ portType.setUndefined(false);
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = portTypeEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(portTypeEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ portType.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_OPERATION, tempEl))
+ {
+ Operation op = parseOperation(tempEl, portType, def);
+
+ if (op != null)
+ {
+ portType.addOperation(op);
+ }
+ }
+ else
+ {
+ portType.addExtensibilityElement(
+ parseExtensibilityElement(PortType.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(portTypeEl, PortType.class, portType, def);
+
+ return portType;
+ }
+
+ protected Operation parseOperation(Element opEl,
+ PortType portType,
+ Definition def)
+ throws WSDLException
+ {
+ Operation op = null;
+
+ List remainingAttrs = DOMUtils.getAttributes(opEl);
+ String name = DOMUtils.getAttribute(opEl, Constants.ATTR_NAME, remainingAttrs);
+ String parameterOrderStr = DOMUtils.getAttribute(opEl,
+ Constants.ATTR_PARAMETER_ORDER,
+ remainingAttrs);
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = opEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(opEl);
+ List messageOrder = new Vector();
+ Element docEl = null;
+ Input input = null;
+ Output output = null;
+ List faults = new Vector();
+ List extElements = new Vector();
+ boolean retrieved = true;
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ docEl = tempEl;
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_INPUT, tempEl))
+ {
+ input = parseInput(tempEl, def);
+ messageOrder.add(Constants.ELEM_INPUT);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_OUTPUT, tempEl))
+ {
+ output = parseOutput(tempEl, def);
+ messageOrder.add(Constants.ELEM_OUTPUT);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_FAULT, tempEl))
+ {
+ faults.add(parseFault(tempEl, def));
+ }
+ else
+ {
+ extElements.add(
+ parseExtensibilityElement(Operation.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ if (name != null)
+ {
+ String inputName = (input != null
+ ? (input.getName() != null ? input.getName() : Constants.NONE)
+ : null);
+ String outputName = (output != null
+ ? (output.getName() != null ? output.getName() : Constants.NONE)
+ : null);
+
+ op = portType.getOperation(name, inputName, outputName);
+
+ if (op != null && !op.isUndefined())
+ {
+ op = null;
+ }
+
+ if (op != null)
+ {
+ if (inputName == null)
+ {
+ Input tempIn = op.getInput();
+
+ if (tempIn != null)
+ {
+ if (tempIn.getName() != null)
+ {
+ op = null;
+ }
+ }
+ }
+ }
+
+ if (op != null)
+ {
+ if (outputName == null)
+ {
+ Output tempOut = op.getOutput();
+
+ if (tempOut != null)
+ {
+ if (tempOut.getName() != null)
+ {
+ op = null;
+ }
+ }
+ }
+ }
+
+ if (op == null)
+ {
+ op = def.createOperation();
+ op.setName(name);
+ retrieved = false;
+ }
+ }
+ else
+ {
+ op = def.createOperation();
+ retrieved = false;
+ }
+
+ // Whether it was retrieved or created, the definition has been found.
+ op.setUndefined(false);
+
+ if (parameterOrderStr != null)
+ {
+ op.setParameterOrdering(StringUtils.parseNMTokens(parameterOrderStr));
+ }
+
+ if (docEl != null)
+ {
+ op.setDocumentationElement(docEl);
+ }
+
+ if (input != null)
+ {
+ op.setInput(input);
+ }
+
+ if (output != null)
+ {
+ op.setOutput(output);
+ }
+
+ if (faults.size() > 0)
+ {
+ Iterator faultIterator = faults.iterator();
+
+ while (faultIterator.hasNext())
+ {
+ op.addFault((Fault)faultIterator.next());
+ }
+ }
+
+ if (extElements.size() > 0)
+ {
+ Iterator eeIterator = extElements.iterator();
+
+ while (eeIterator.hasNext())
+ {
+ op.addExtensibilityElement(
+ (ExtensibilityElement) eeIterator.next() );
+ }
+ }
+
+ OperationType style = null;
+
+ if (messageOrder.equals(STYLE_ONE_WAY))
+ {
+ style = OperationType.ONE_WAY;
+ }
+ else if (messageOrder.equals(STYLE_REQUEST_RESPONSE))
+ {
+ style = OperationType.REQUEST_RESPONSE;
+ }
+ else if (messageOrder.equals(STYLE_SOLICIT_RESPONSE))
+ {
+ style = OperationType.SOLICIT_RESPONSE;
+ }
+ else if (messageOrder.equals(STYLE_NOTIFICATION))
+ {
+ style = OperationType.NOTIFICATION;
+ }
+
+ if (style != null)
+ {
+ op.setStyle(style);
+ }
+
+ parseExtensibilityAttributes(opEl, Operation.class, op, def);
+
+ if (retrieved)
+ {
+ op = null;
+ }
+
+ return op;
+ }
+
+ protected Service parseService(Element serviceEl, Definition def)
+ throws WSDLException
+ {
+ Service service = def.createService();
+
+ List remainingAttrs = DOMUtils.getAttributes(serviceEl);
+ String name = DOMUtils.getAttribute(serviceEl, Constants.ATTR_NAME, remainingAttrs);
+
+ if (name != null)
+ {
+ service.setQName(new QName(def.getTargetNamespace(), name));
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = serviceEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(serviceEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ service.setDocumentationElement(tempEl);
+ }
+ else if (QNameUtils.matches(Constants.Q_ELEM_PORT, tempEl))
+ {
+ service.addPort(parsePort(tempEl, def));
+ }
+ else
+ {
+ service.addExtensibilityElement(
+ parseExtensibilityElement(Service.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(serviceEl, Service.class, service, def);
+
+ return service;
+ }
+
+ protected Port parsePort(Element portEl, Definition def)
+ throws WSDLException
+ {
+ Port port = def.createPort();
+
+ List remainingAttrs = DOMUtils.getAttributes(portEl);
+ String name = DOMUtils.getAttribute(portEl, Constants.ATTR_NAME, remainingAttrs);
+ QName bindingStr = getQualifiedAttributeValue(portEl,
+ Constants.ATTR_BINDING,
+ Constants.ELEM_PORT,
+ def,
+ remainingAttrs);
+
+ if (name != null)
+ {
+ port.setName(name);
+ }
+
+ if (bindingStr != null)
+ {
+ Binding binding = def.getBinding(bindingStr);
+
+ if (binding == null)
+ {
+ binding = def.createBinding();
+ binding.setQName(bindingStr);
+ def.addBinding(binding);
+ }
+
+ port.setBinding(binding);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = portEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(portEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ port.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ port.addExtensibilityElement(parseExtensibilityElement(Port.class,
+ tempEl,
+ def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(portEl, Port.class, port, def);
+
+ return port;
+ }
+
+ protected ExtensibilityElement parseExtensibilityElement(
+ Class parentType,
+ Element el,
+ Definition def)
+ throws WSDLException
+ {
+ QName elementType = QNameUtils.newQName(el);
+
+ String namespaceURI = el.getNamespaceURI();
+
+ try
+ {
+ if (namespaceURI == null || namespaceURI.equals(Constants.NS_URI_WSDL))
+ {
+ throw new WSDLException(WSDLException.INVALID_WSDL,
+ "Encountered illegal extension element '" +
+ elementType +
+ "' in the context of a '" +
+ parentType.getName() +
+ "'. Extension elements must be in " +
+ "a namespace other than WSDL's.");
+ }
+
+ ExtensionRegistry extReg = def.getExtensionRegistry();
+
+ if (extReg == null)
+ {
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "No ExtensionRegistry set for this " +
+ "Definition, so unable to deserialize " +
+ "a '" + elementType + "' element in the " +
+ "context of a '" + parentType.getName() +
+ "'.");
+ }
+
+ ExtensionDeserializer extDS = extReg.queryDeserializer(parentType,
+ elementType);
+ NamedNodeMap attrs = el.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ return extDS.unmarshall(parentType, elementType, el, def, extReg);
+ }
+ catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(el));
+ }
+
+ throw e;
+ }
+ }
+
+ /**
+ * Parse the element using the ExtensionRegistry default deserializer instead using the one
+ * registered. The default deserializer will create an UnknownExtensibilityElement from the element.
+ * @param parentType
+ * @param el
+ * @param def
+ * @return An instance of the default ExtensibilityElement as registered with the ExtensionRegistry
+ * @throws WSDLException
+ */
+ protected ExtensibilityElement parseExtensibilityElementAsDefaultExtensiblityElement(
+ Class parentType, Element el, Definition def) throws WSDLException
+ {
+ QName elementType = QNameUtils.newQName(el);
+
+ String namespaceURI = el.getNamespaceURI();
+
+ try
+ {
+ if (namespaceURI == null || namespaceURI.equals(Constants.NS_URI_WSDL))
+ {
+ throw new WSDLException(WSDLException.INVALID_WSDL,
+ "Encountered illegal extension element '" + elementType
+ + "' in the context of a '" + parentType.getName()
+ + "'. Extension elements must be in "
+ + "a namespace other than WSDL's.");
+ }
+
+ ExtensionRegistry extReg = def.getExtensionRegistry();
+
+ if (extReg == null)
+ {
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "No ExtensionRegistry set for this "
+ + "Definition, so unable to deserialize " + "a '" + elementType
+ + "' element in the " + "context of a '" + parentType.getName()
+ + "'.");
+ }
+
+ ExtensionDeserializer extDS = extReg.getDefaultDeserializer();
+
+ NamedNodeMap attrs = el.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ return extDS.unmarshall(parentType, elementType, el, def, extReg);
+ } catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(el));
+ }
+
+ throw e;
+ }
+ }
+
+ protected Input parseInput(Element inputEl, Definition def)
+ throws WSDLException
+ {
+ Input input = def.createInput();
+ String name = DOMUtils.getAttribute(inputEl, Constants.ATTR_NAME);
+ QName messageName = getQualifiedAttributeValue(inputEl,
+ Constants.ATTR_MESSAGE,
+ Constants.ELEM_INPUT,
+ def);
+
+ if (name != null)
+ {
+ input.setName(name);
+ }
+
+ if (messageName != null)
+ {
+ Message message = def.getMessage(messageName);
+
+ if (message == null)
+ {
+ message = def.createMessage();
+ message.setQName(messageName);
+ def.addMessage(message);
+ }
+
+ input.setMessage(message);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = inputEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(inputEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ input.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ input.addExtensibilityElement(
+ parseExtensibilityElement(Input.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(inputEl, Input.class, input, def);
+
+ return input;
+ }
+
+ protected Output parseOutput(Element outputEl, Definition def)
+ throws WSDLException
+ {
+ Output output = def.createOutput();
+ String name = DOMUtils.getAttribute(outputEl, Constants.ATTR_NAME);
+ QName messageName = getQualifiedAttributeValue(outputEl,
+ Constants.ATTR_MESSAGE,
+ Constants.ELEM_OUTPUT,
+ def);
+
+ if (name != null)
+ {
+ output.setName(name);
+ }
+
+ if (messageName != null)
+ {
+ Message message = def.getMessage(messageName);
+
+ if (message == null)
+ {
+ message = def.createMessage();
+ message.setQName(messageName);
+ def.addMessage(message);
+ }
+
+ output.setMessage(message);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = outputEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(outputEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ output.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ output.addExtensibilityElement(
+ parseExtensibilityElement(Output.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(outputEl, Output.class, output, def);
+
+ return output;
+ }
+
+ protected Fault parseFault(Element faultEl, Definition def)
+ throws WSDLException
+ {
+ Fault fault = def.createFault();
+ String name = DOMUtils.getAttribute(faultEl, Constants.ATTR_NAME);
+ QName messageName = getQualifiedAttributeValue(faultEl,
+ Constants.ATTR_MESSAGE,
+ Constants.ELEM_FAULT,
+ def);
+
+ if (name != null)
+ {
+ fault.setName(name);
+ }
+
+ if (messageName != null)
+ {
+ Message message = def.getMessage(messageName);
+
+ if (message == null)
+ {
+ message = def.createMessage();
+ message.setQName(messageName);
+ def.addMessage(message);
+ }
+
+ fault.setMessage(message);
+ }
+
+ //register any NS decls with the Definition
+ NamedNodeMap attrs = faultEl.getAttributes();
+ registerNSDeclarations(attrs, def);
+
+ Element tempEl = DOMUtils.getFirstChildElement(faultEl);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(Constants.Q_ELEM_DOCUMENTATION, tempEl))
+ {
+ fault.setDocumentationElement(tempEl);
+ }
+ else
+ {
+ fault.addExtensibilityElement(
+ parseExtensibilityElement(Fault.class, tempEl, def));
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ parseExtensibilityAttributes(faultEl, Fault.class, fault, def);
+
+ return fault;
+ }
+
+ /**
+ * This method should be used for elements that support extension
+ * attributes because it does not track unexpected remaining attributes.
+ */
+ private static QName getQualifiedAttributeValue(Element el,
+ String attrName,
+ String elDesc,
+ Definition def)
+ throws WSDLException
+ {
+ try
+ {
+ return DOMUtils.getQualifiedAttributeValue(el,
+ attrName,
+ elDesc,
+ false,
+ def);
+ }
+ catch (WSDLException e)
+ {
+ if (e.getFaultCode().equals(WSDLException.NO_PREFIX_SPECIFIED))
+ {
+ String attrValue = DOMUtils.getAttribute(el, attrName);
+
+ return new QName(attrValue);
+ }
+ else
+ {
+ throw e;
+ }
+ }
+ }
+
+ /**
+ * This method should be used for elements that do not support extension
+ * attributes because it tracks unexpected remaining attributes.
+ */
+ private static QName getQualifiedAttributeValue(Element el,
+ String attrName,
+ String elDesc,
+ Definition def,
+ List remainingAttrs)
+ throws WSDLException
+ {
+ try
+ {
+ return DOMUtils.getQualifiedAttributeValue(el,
+ attrName,
+ elDesc,
+ false,
+ def,
+ remainingAttrs);
+ }
+ catch (WSDLException e)
+ {
+ if (e.getFaultCode().equals(WSDLException.NO_PREFIX_SPECIFIED))
+ {
+ String attrValue = DOMUtils.getAttribute(el, attrName, remainingAttrs);
+
+ return new QName(attrValue);
+ }
+ else
+ {
+ throw e;
+ }
+ }
+ }
+
+ private static void checkElementName(Element el, QName qname)
+ throws WSDLException
+ {
+ if (!QNameUtils.matches(qname, el))
+ {
+ WSDLException wsdlExc = new WSDLException(WSDLException.INVALID_WSDL,
+ "Expected element '" +
+ qname + "'.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(el));
+
+ throw wsdlExc;
+ }
+ }
+
+ 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);
+ }
+ }
+
+ private static void registerNSDeclarations(NamedNodeMap attrs, Definition def)
+ {
+ int size = attrs.getLength();
+
+ for (int i = 0; i < size; i++)
+ {
+ Attr attr = (Attr)attrs.item(i);
+ String namespaceURI = attr.getNamespaceURI();
+ String localPart = attr.getLocalName();
+ String value = attr.getValue();
+
+ if (namespaceURI != null && namespaceURI.equals(Constants.NS_URI_XMLNS))
+ {
+ if (localPart != null && !localPart.equals(Constants.ATTR_XMLNS))
+ {
+ DOMUtils.registerUniquePrefix(localPart, value, def);
+ }
+ else
+ {
+ DOMUtils.registerUniquePrefix(null, value, def);
+ }
+ }
+ }
+ }
+
+ /**
+ * Read the WSDL document accessible via the specified
+ * URI into a WSDL definition.
+ *
+ * @param wsdlURI a URI (can be a filename or URL) pointing to a
+ * WSDL XML definition.
+ * @return the definition.
+ */
+ public Definition readWSDL(String wsdlURI) throws WSDLException
+ {
+ return readWSDL(null, wsdlURI);
+ }
+
+ /**
+ * Read the WSDL document accessible via the specified
+ * URI into a WSDL definition.
+ *
+ * @param contextURI the context in which to resolve the
+ * wsdlURI, if the wsdlURI is relative. Can be null, in which
+ * case it will be ignored.
+ * @param wsdlURI a URI (can be a filename or URL) pointing to a
+ * WSDL XML definition.
+ * @return the definition.
+ */
+ public Definition readWSDL(String contextURI, String wsdlURI)
+ throws WSDLException
+ {
+ try
+ {
+ if (verbose)
+ {
+ System.out.println("Retrieving document at '" + wsdlURI + "'" +
+ (contextURI == null
+ ? "."
+ : ", relative to '" + contextURI + "'."));
+ }
+
+ URL contextURL = (contextURI != null)
+ ? StringUtils.getURL(null, contextURI)
+ : null;
+ URL url = StringUtils.getURL(contextURL, wsdlURI);
+ InputStream inputStream = StringUtils.getContentAsInputStream(url);
+ InputSource inputSource = new InputSource(inputStream);
+ inputSource.setSystemId(url.toString());
+ Document doc = getDocument(inputSource, url.toString());
+
+ inputStream.close();
+
+ Definition def = readWSDL(url.toString(), doc);
+
+ return def;
+ }
+ catch (WSDLException e)
+ {
+ throw e;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to resolve imported document at '" +
+ wsdlURI +
+ (contextURI == null
+ ? "'."
+ : "', relative to '" + contextURI + "'.")
+ , e);
+ }
+ }
+
+ /**
+ * Read the specified <wsdl:definitions> element into a WSDL
+ * definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the element. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param definitionsElement the <wsdl:definitions> element
+ * @return the definition described by the element.
+ */
+ public Definition readWSDL(String documentBaseURI,
+ Element definitionsElement)
+ throws WSDLException
+ {
+ return readWSDL(documentBaseURI, definitionsElement, null);
+ }
+
+ /**
+ * Read the specified <wsdl:definitions> element into a WSDL
+ * definition. The WSDLLocator is used to provide the document
+ * base URIs. The InputSource of the WSDLLocator is ignored, instead
+ * the WSDL is parsed from the given Element.
+ *
+ * @param locator A WSDLLocator object used to provide
+ * the document base URI of the WSDL definition described by the
+ * element.
+ * @param definitionsElement the <wsdl:definitions> element
+ * @return the definition described by the element.
+ */
+ public Definition readWSDL(WSDLLocator locator,
+ Element definitionsElement)
+ throws WSDLException
+ {
+ try
+ {
+ this.loc = locator;
+ return readWSDL(locator.getBaseURI(), definitionsElement, null);
+ }
+ finally
+ {
+ locator.close();
+ this.loc = null;
+ }
+ }
+
+ protected Definition readWSDL(String documentBaseURI,
+ Element definitionsElement,
+ Map importedDefs)
+ throws WSDLException
+ {
+ return parseDefinitions(documentBaseURI, definitionsElement, importedDefs);
+ }
+
+ /**
+ * Read the specified WSDL document into a WSDL definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the document. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param wsdlDocument the WSDL document, an XML
+ * document obeying the WSDL schema.
+ * @return the definition described in the document.
+ */
+ public Definition readWSDL(String documentBaseURI, Document wsdlDocument)
+ throws WSDLException
+ {
+ return readWSDL(documentBaseURI, wsdlDocument.getDocumentElement());
+ }
+
+ /**
+ * Read a WSDL document into a WSDL definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the document. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param inputSource an InputSource pointing to the
+ * WSDL document, an XML document obeying the WSDL schema.
+ * @return the definition described in the document pointed to
+ * by the InputSource.
+ */
+ public Definition readWSDL(String documentBaseURI, InputSource inputSource)
+ throws WSDLException
+ {
+ String location = (inputSource.getSystemId() != null ?
+ inputSource.getSystemId() : "- WSDL Document -");
+
+ return readWSDL(documentBaseURI,
+ getDocument(inputSource, location));
+ }
+
+ /**
+ * Read a WSDL document into a WSDL definition.
+ *
+ * @param locator A WSDLLocator object used to provide InputSources
+ * pointing to the wsdl file.
+ * @return the definition described in the document
+ */
+ public Definition readWSDL(WSDLLocator locator) throws WSDLException
+ {
+ InputSource is = locator.getBaseInputSource();
+ String base = locator.getBaseURI();
+
+ if (is == null)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Unable to locate document at '" + base + "'.");
+ }
+ is.setSystemId(base);
+
+ this.loc = locator;
+
+ if (verbose)
+ {
+ System.out.println("Retrieving document at '" + base + "'.");
+ }
+
+ try
+ {
+ return readWSDL(base, is);
+ }
+ finally
+ {
+ this.loc.close();
+ this.loc = null;
+ }
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/xml/WSDLWriterImpl.java b/src/main/java/com/ibm/wsdl/xml/WSDLWriterImpl.java
new file mode 100644
index 0000000..9a4b6f2
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/xml/WSDLWriterImpl.java
@@ -0,0 +1,1137 @@
+/*
+ * (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("" + tagName + '>');
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+
+ 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(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ 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.
+ *
+ *
+ *
+ * The search criteria will be the operation name parameter and any
+ * non-null input or output message name parameters.
+ * To exclude the input or output message name from the search criteria,
+ * specify a null value for the input or output message name parameter.
+ * To search for operations with unnamed input or output messages
+ * (i.e. <input> or <output> elements with the 'name' attribute omitted),
+ * specify the string "
+ * Note: the use of a string value "
+ * Usage of the input and output message name parameters is as
+ * described for the
+ * The search criteria will be the operation name parameter and any
+ * non-null input or output message name parameters.
+ * To exclude the input or output message name from the search criteria,
+ * specify a null value for the input or output message name parameter.
+ * To search for operations with unnamed input or output messages
+ * (i.e. <input> or <output> elements with the 'name' attribute omitted),
+ * specify the string "
+ * Note: the use of a string value "
+ * Usage of the input and output message name parameters is as
+ * described for the
+ * The steps in order are:
+ *
+ * Once an instance of a WSDLFactory is obtained, invoke
+ * newDefinition(), newWSDLReader(), or newWSDLWriter(), to create
+ * the desired instances.
+ */
+ public static WSDLFactory newInstance() throws WSDLException
+ {
+ String factoryImplName = findFactoryImplName();
+
+ return newInstance(factoryImplName);
+ }
+
+ /**
+ * Get a new instance of a WSDLFactory. This method
+ * returns an instance of the class factoryImplName.
+ * Once an instance of a WSDLFactory is obtained, invoke
+ * newDefinition(), newWSDLReader(), or newWSDLWriter(), to create
+ * the desired instances.
+ *
+ * @param factoryImplName the fully-qualified class name of the
+ * class which provides a concrete implementation of the abstract
+ * class WSDLFactory.
+ */
+ public static WSDLFactory newInstance(String factoryImplName)
+ throws WSDLException
+ {
+ if (factoryImplName != null)
+ {
+ try
+ {
+ Class cl = Class.forName(factoryImplName);
+
+ return (WSDLFactory)cl.newInstance();
+ }
+ catch (Exception e)
+ {
+ /*
+ Catches:
+ ClassNotFoundException
+ InstantiationException
+ IllegalAccessException
+ */
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "Problem instantiating factory " +
+ "implementation.",
+ e);
+ }
+ }
+ else
+ {
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "Unable to find name of factory " +
+ "implementation.");
+ }
+ }
+
+ /**
+ * Get a new instance of a WSDLFactory. This method
+ * returns an instance of the class factoryImplName, using
+ * the specified ClassLoader.
+ * Once an instance of a WSDLFactory is obtained, invoke
+ * newDefinition(), newWSDLReader(), or newWSDLWriter(), to create
+ * the desired instances.
+ *
+ * @param factoryImplName the fully-qualified class name of the
+ * class which provides a concrete implementation of the abstract
+ * class WSDLFactory.
+ * @param classLoader the ClassLoader to use to load the WSDLFactory
+ * implementation.
+ */
+ public static WSDLFactory newInstance(String factoryImplName,
+ ClassLoader classLoader)
+ throws WSDLException
+ {
+ if (factoryImplName != null)
+ {
+ try
+ {
+ Class cl = classLoader.loadClass(factoryImplName);
+
+ return (WSDLFactory)cl.newInstance();
+ }
+ catch (Exception e)
+ {
+ /*
+ Catches:
+ ClassNotFoundException
+ InstantiationException
+ IllegalAccessException
+ */
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "Problem instantiating factory " +
+ "implementation.",
+ e);
+ }
+ }
+ else
+ {
+ throw new WSDLException(WSDLException.CONFIGURATION_ERROR,
+ "Unable to find name of factory " +
+ "implementation.");
+ }
+ }
+
+ /**
+ * Create a new instance of a Definition.
+ */
+ public abstract Definition newDefinition();
+
+ /**
+ * Create a new instance of a WSDLReader.
+ */
+ public abstract WSDLReader newWSDLReader();
+
+ /**
+ * Create a new instance of a WSDLWriter.
+ */
+ public abstract WSDLWriter newWSDLWriter();
+
+ /**
+ * Create a new instance of an ExtensionRegistry with pre-registered
+ * serializers/deserializers for the SOAP, HTTP and MIME
+ * extensions. Java extensionTypes are also mapped for all
+ * the SOAP, HTTP and MIME extensions.
+ */
+ public abstract ExtensionRegistry newPopulatedExtensionRegistry();
+
+ private static String findFactoryImplName()
+ {
+ String factoryImplName = null;
+
+ // First, check the META-INF/services property file.
+ final String metaInfServicesPropFileName = getMetaInfFullPropertyFileName();
+
+ if (metaInfServicesPropFileName != null)
+ {
+ try
+ {
+ InputStream is = (InputStream) AccessController.doPrivileged(
+ new PrivilegedAction() {
+ public Object run() {
+ return WSDLFactory.class.getResourceAsStream(metaInfServicesPropFileName);
+ }
+ });
+
+ if(is != null)
+ {
+ InputStreamReader isr = new InputStreamReader(is);
+ BufferedReader br = new BufferedReader(isr);
+
+ factoryImplName = br.readLine();
+
+ br.close();
+ isr.close();
+ is.close();
+ }
+
+ if (factoryImplName != null)
+ {
+ return factoryImplName;
+ }
+ }
+ catch (IOException e)
+ {
+ }
+ }
+
+ // Second, check the system property.
+ try
+ {
+ factoryImplName = System.getProperty(PROPERTY_NAME);
+
+ if (factoryImplName != null)
+ {
+ return factoryImplName;
+ }
+ }
+ catch (SecurityException e)
+ {
+ }
+
+ // Third, check the properties file.
+ String propFileName = getFullPropertyFileName();
+
+ if (propFileName != null)
+ {
+ try
+ {
+ Properties properties = new Properties();
+ File propFile = new File(propFileName);
+ FileInputStream fis = new FileInputStream(propFile);
+
+ properties.load(fis);
+ fis.close();
+
+ factoryImplName = properties.getProperty(PROPERTY_NAME);
+
+ if (factoryImplName != null)
+ {
+ return factoryImplName;
+ }
+ }
+ catch (IOException e)
+ {
+ }
+ }
+
+ // Fourth, return the default.
+ return DEFAULT_FACTORY_IMPL_NAME;
+ }
+
+ private static String getFullPropertyFileName()
+ {
+ if (fullPropertyFileName == null)
+ {
+ try
+ {
+ String javaHome = System.getProperty("java.home");
+
+ fullPropertyFileName = javaHome + File.separator + "lib" +
+ File.separator + PROPERTY_FILE_NAME;
+ }
+ catch (SecurityException e)
+ {
+ }
+ }
+
+ return fullPropertyFileName;
+ }
+
+ private static String getMetaInfFullPropertyFileName()
+ {
+ if (metaInfServicesFullPropertyFileName == null)
+ {
+ String metaInfServices = "/META-INF/services/";
+ metaInfServicesFullPropertyFileName = metaInfServices + META_INF_SERVICES_PROPERTY_FILE_NAME;
+ }
+
+ return metaInfServicesFullPropertyFileName;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/xml/WSDLLocator.java b/src/main/java/javax/wsdl/xml/WSDLLocator.java
new file mode 100644
index 0000000..7cda0bd
--- /dev/null
+++ b/src/main/java/javax/wsdl/xml/WSDLLocator.java
@@ -0,0 +1,62 @@
+/*
+ * (c) Copyright IBM Corp 2002, 2006
+ */
+
+package javax.wsdl.xml;
+
+import org.xml.sax.*;
+
+/**
+ * This interface can act as an additional layer of indirection between
+ * a WSDLReader and the actual location of WSDL documents. One
+ * use could be to retrieve WSDL documents from JAR files, while still
+ * retaining the ability to resolve imported documents using relative
+ * URIs.
+ *
+ * @author Owen Burroughs (owenb@uk.ibm.com)
+ *
+ * @see WSDLReader#readWSDL(WSDLLocator)
+ */
+public interface WSDLLocator
+{
+ /**
+ * Returns an InputSource "pointed at" the base document.
+ *
+ * @return the InputSource object or null if the base document could
+ * not be found
+ */
+ public InputSource getBaseInputSource();
+
+ /**
+ * Returns an InputSource "pointed at" an imported wsdl document.
+ *
+ * @param parentLocation a URI specifying the location of the
+ * document doing the importing. This can be null if the import location
+ * is not relative to the parent location.
+ * @param importLocation a URI specifying the location of the
+ * document to import. This might be relative to the parent document's
+ * location.
+ * @return the InputSource object or null if the import cannot be found.
+ */
+ public InputSource getImportInputSource(String parentLocation,
+ String importLocation);
+
+ /**
+ * Returns a URI representing the location of the base document.
+ */
+ public String getBaseURI();
+
+ /**
+ * Returns a URI representing the location of the last import document
+ * to be resolved. This is used in resolving nested imports where an
+ * import location is relative to the parent document.
+ */
+ public String getLatestImportURI();
+
+ /**
+ * Releases all associated system resources such as the InputStreams
+ * associated with the Base and Import InputSources.
+ */
+ public void close();
+}
+
diff --git a/src/main/java/javax/wsdl/xml/WSDLReader.java b/src/main/java/javax/wsdl/xml/WSDLReader.java
new file mode 100644
index 0000000..79f3655
--- /dev/null
+++ b/src/main/java/javax/wsdl/xml/WSDLReader.java
@@ -0,0 +1,204 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl.xml;
+
+import org.w3c.dom.*;
+import org.xml.sax.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+
+/**
+ * This interface describes a collection of methods
+ * that enable conversion of a WSDL document (in XML,
+ * following the WSDL schema described in the WSDL
+ * specification) into a WSDL model.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface WSDLReader
+{
+ /**
+ * Sets the specified feature to the specified value.
+ *
+ * The minimum features that must be supported are:
+ *
+ *
+ * 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;
+
+ /**
+ * Gets the value of the specified feature.
+ *
+ * @param name the name of the feature to get the value of.
+ * @return the value of feature
+ * @throws IllegalArgumentException if the feature name is not recognized.
+ * @see #setFeature(String, boolean)
+ */
+ public boolean getFeature(String name) throws IllegalArgumentException;
+
+ /**
+ * Set the extension registry to be used when reading
+ * WSDL documents into a WSDL definition. If an
+ * extension registry is set, that is the extension
+ * registry that will be set as the extensionRegistry
+ * property of the definitions resulting from invoking
+ * readWSDL(...). Default is null.
+ *
+ * @param extReg the extension registry to use for new
+ * definitions
+ */
+ public void setExtensionRegistry(ExtensionRegistry extReg);
+
+ /**
+ * Get the extension registry, if one was set. Default is
+ * null.
+ */
+ public ExtensionRegistry getExtensionRegistry();
+
+ /**
+ * Set a different factory implementation to use for
+ * creating definitions when reading WSDL documents.
+ * As some WSDLReader implementations may only be
+ * capable of creating definitions using the same
+ * factory implementation from which the reader was
+ * obtained, this method is optional. Default is null.
+ *
+ * @param factoryImplName the fully-qualified class name of the
+ * class which provides a concrete implementation of the abstract
+ * class WSDLFactory.
+ * @throws UnsupportedOperationException if this method
+ * is invoked on an implementation which does not
+ * support it.
+ */
+ public void setFactoryImplName(String factoryImplName)
+ throws UnsupportedOperationException;
+
+ /**
+ * Get the factoryImplName, if one was set. Default is null.
+ */
+ public String getFactoryImplName();
+
+ /**
+ * Read the WSDL document accessible via the specified
+ * URI into a WSDL definition.
+ *
+ * @param wsdlURI a URI (can be a filename or URL) pointing to a
+ * WSDL XML definition.
+ * @return the definition.
+ */
+ public Definition readWSDL(String wsdlURI) throws WSDLException;
+
+ /**
+ * Read the WSDL document accessible via the specified
+ * URI into a WSDL definition.
+ *
+ * @param contextURI the context in which to resolve the
+ * wsdlURI, if the wsdlURI is relative. Can be null, in which
+ * case it will be ignored.
+ * @param wsdlURI a URI (can be a filename or URL) pointing to a
+ * WSDL XML definition.
+ * @return the definition.
+ */
+ public Definition readWSDL(String contextURI, String wsdlURI)
+ throws WSDLException;
+
+ /**
+ * Read the specified <wsdl:definitions> element into a WSDL
+ * definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the element. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param definitionsElement the <wsdl:definitions> element
+ * @return the definition described by the element.
+ */
+ public Definition readWSDL(String documentBaseURI,
+ Element definitionsElement)
+ throws WSDLException;
+
+ /**
+ * Read the specified <wsdl:definitions> element into a WSDL
+ * definition. The WSDLLocator is used to provide the document
+ * base URIs. The InputSource of the WSDLLocator is ignored, instead
+ * the WSDL is parsed from the given Element.
+ *
+ * @param locator A WSDLLocator object used to provide
+ * the document base URI of the WSDL definition described by the
+ * element.
+ * @param definitionsElement the <wsdl:definitions> element
+ * @return the definition described by the element.
+ */
+ public Definition readWSDL(WSDLLocator locator,
+ Element definitionsElement)
+ throws WSDLException;
+
+ /**
+ * Read the specified WSDL document into a WSDL definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the document. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param wsdlDocument the WSDL document, an XML
+ * document obeying the WSDL schema.
+ * @return the definition described in the document.
+ */
+ public Definition readWSDL(String documentBaseURI, Document wsdlDocument)
+ throws WSDLException;
+
+ /**
+ * Read a WSDL document into a WSDL definition.
+ *
+ * @param documentBaseURI the document base URI of the WSDL definition
+ * described by the document. Will be set as the documentBaseURI
+ * of the returned Definition. Can be null, in which case it
+ * will be ignored.
+ * @param inputSource an InputSource pointing to the
+ * WSDL document, an XML document obeying the WSDL schema.
+ * @return the definition described in the document pointed to
+ * by the InputSource.
+ */
+ public Definition readWSDL(String documentBaseURI, InputSource inputSource)
+ throws WSDLException;
+
+ /**
+ * Read a WSDL document into a WSDL definition.
+ *
+ * @param locator A WSDLLocator object used to provide InputSources
+ * pointing to the wsdl file.
+ * @return the definition described in the document
+ */
+ public Definition readWSDL(WSDLLocator locator) throws WSDLException;
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/xml/WSDLWriter.java b/src/main/java/javax/wsdl/xml/WSDLWriter.java
new file mode 100644
index 0000000..02be45e
--- /dev/null
+++ b/src/main/java/javax/wsdl/xml/WSDLWriter.java
@@ -0,0 +1,71 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package javax.wsdl.xml;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+
+/**
+ * This interface 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
+ */
+public interface 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;
+
+ /**
+ * 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;
+
+ /**
+ * Return a document generated from the specified WSDL model.
+ */
+ public Document getDocument(Definition wsdlDef) throws WSDLException;
+
+ /**
+ * 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;
+
+ /**
+ * 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;
+}
\ No newline at end of file
diff --git a/src/main/java/javax/xml/namespace/QName.java b/src/main/java/javax/xml/namespace/QName.java
new file mode 100644
index 0000000..7ce9f58
--- /dev/null
+++ b/src/main/java/javax/xml/namespace/QName.java
@@ -0,0 +1,251 @@
+/*
+ * (c) Copyright IBM Corp 2002, 2006
+ */
+
+package javax.xml.namespace;
+
+import java.io.*;
+
+/**
+ *
+ * The value of a QName contains a namespaceURI and a localPart.
+ * The localPart provides the local part of the qualified name. The
+ * namespaceURI is a URI reference identifying the namespace.
+ *
+ * Note: Some of this impl code was taken from Axis.
+ *
+ * @author axis-dev
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class QName implements Serializable
+{
+ // Comment/shared empty string.
+ private static final String emptyString = "";
+
+ // Field namespaceURI.
+ private String namespaceURI;
+
+ // Field localPart.
+ private String localPart;
+
+ // Field prefix.
+ private String prefix;
+
+ private static final long serialVersionUID = -9120448754896609940L;
+
+ /**
+ * Constructor for the QName.
+ *
+ * @param localPart Local part of the QName
+ */
+ public QName(String localPart)
+ {
+ this.namespaceURI = emptyString;
+ this.localPart = (localPart == null)
+ ? emptyString
+ : localPart.intern();
+ this.prefix = emptyString;
+ }
+
+ /**
+ * Constructor for the QName.
+ *
+ * @param namespaceURI Namespace URI for the QName
+ * @param localPart Local part of the QName.
+ */
+ public QName(String namespaceURI, String localPart)
+ {
+ this.namespaceURI = (namespaceURI == null)
+ ? emptyString
+ : namespaceURI.intern();
+ this.localPart = (localPart == null)
+ ? emptyString
+ : localPart.intern();
+ this.prefix = emptyString;
+ }
+
+ /**
+ * Constructor for the QName.
+ *
+ * @param namespaceURI Namespace URI for the QName
+ * @param localPart Local part of the QName.
+ * @param prefix the xmlns-declared prefix for this namespaceURI
+ */
+ public QName(String namespaceURI, String localPart, String prefix)
+ {
+ this.namespaceURI = (namespaceURI == null)
+ ? emptyString
+ : namespaceURI.intern();
+ this.localPart = (localPart == null)
+ ? emptyString
+ : localPart.intern();
+ this.prefix = (prefix == null)
+ ? emptyString
+ : prefix.intern();
+ }
+
+ /**
+ * Gets the Namespace URI for this QName
+ *
+ * @return Namespace URI
+ */
+ public String getNamespaceURI()
+ {
+ return namespaceURI;
+ }
+
+ /**
+ * Gets the Local part for this QName
+ *
+ * @return Local part
+ */
+ public String getLocalPart()
+ {
+ return localPart;
+ }
+
+ /**
+ * Gets the prefix for this QName
+ *
+ * @return prefix of this QName
+ */
+ public String getPrefix()
+ {
+ return prefix;
+ }
+
+ /**
+ * Returns a string representation of this QName
+ *
+ * @return a string representation of the QName
+ */
+ public String toString()
+ {
+ return ((namespaceURI == emptyString)
+ ? localPart
+ : '{' + namespaceURI + '}' + localPart);
+ }
+
+ /**
+ * Tests this QName for equality with another object.
+ *
+ * If the given object is not a QName or is null then this method
+ * returns false.
+ *
+ * For two QNames to be considered equal requires that both
+ * localPart and namespaceURI must be equal. This method uses
+ *
+ * This method satisfies the general contract of the
+ * The string must be in the form returned by the QName.toString()
+ * method, i.e. "{namespaceURI}localPart", with the "{namespaceURI}"
+ * part being optional.
+ *
+ * This method doesn't do a full validation of the resulting QName.
+ * In particular, it doesn't check that the resulting namespace URI
+ * is a legal URI (per RFC 2396 and RFC 2732), nor that the resulting
+ * local part is a legal NCName per the XML Namespaces specification.
+ *
+ * @param s the string to be parsed
+ * @throws IllegalArgumentException If the specified String
+ * cannot be parsed as a QName
+ * @return QName corresponding to the given String
+ */
+ public static QName valueOf(String s)
+ {
+ if ((s == null) || s.equals(""))
+ {
+ throw new IllegalArgumentException("Invalid QName literal.");
+ }
+
+ if (s.charAt(0) == '{')
+ {
+ int i = s.indexOf('}');
+
+ if (i == -1)
+ {
+ throw new IllegalArgumentException("Invalid QName literal.");
+ }
+
+ if (i == s.length() - 1)
+ {
+ throw new IllegalArgumentException("Invalid QName literal.");
+ }
+ else
+ {
+ return new QName(s.substring(1, i), s.substring(i + 1));
+ }
+ }
+ else
+ {
+ return new QName(s);
+ }
+ }
+
+ /**
+ * Returns a hash code value for this QName object. The hash code
+ * is based on both the localPart and namespaceURI parts of the
+ * QName. This method satisfies the general contract of the
+ * getOperation
method.
+ *
+ * @param name the name of the desired operation.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the operation which was removed, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ *
+ * @see #getOperation(String, String, String)
+ */
+ public Operation removeOperation(String name,
+ String inputName,
+ String outputName)
+ {
+ Operation op = getOperation(name,inputName,outputName);
+ if(operations.remove(op))
+ {
+ return op;
+ }
+ else return null;
+ }
+
+ public void setUndefined(boolean isUndefined)
+ {
+ this.isUndefined = isUndefined;
+ }
+
+ public boolean isUndefined()
+ {
+ return isUndefined;
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("PortType: name=" + name);
+
+ if (operations != null)
+ {
+ Iterator opIterator = operations.iterator();
+
+ while (opIterator.hasNext())
+ {
+ strBuf.append("\n" + opIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/ServiceImpl.java b/src/main/java/com/ibm/wsdl/ServiceImpl.java
new file mode 100644
index 0000000..04e323e
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/ServiceImpl.java
@@ -0,0 +1,126 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+import javax.xml.namespace.*;
+
+/**
+ * This class represents a service, which groups related
+ * ports to provide some functionality.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public class ServiceImpl extends AbstractWSDLElement implements Service
+{
+ protected QName name = null;
+ protected Map ports = new HashMap();
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.SERVICE_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the name of this service.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Get the name of this service.
+ *
+ * @return the service name
+ */
+ public QName getQName()
+ {
+ return name;
+ }
+
+ /**
+ * Add a port to this service.
+ *
+ * @param port the port to be added
+ */
+ public void addPort(Port port)
+ {
+ ports.put(port.getName(), port);
+ }
+
+ /**
+ * Get the specified port.
+ *
+ * @param name the name of the desired port.
+ * @return the corresponding port, or null if there wasn't
+ * any matching port
+ */
+ public Port getPort(String name)
+ {
+ return (Port)ports.get(name);
+ }
+
+ /**
+ * Remove the specified port.
+ *
+ * @param name the name of the port to be removed.
+ * @return the port which was removed
+ */
+ public Port removePort(String name)
+ {
+ return (Port)ports.remove(name);
+ }
+
+ /**
+ * Get all the ports defined here.
+ */
+ public Map getPorts()
+ {
+ return ports;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Service: name=" + name);
+
+ if (ports != null)
+ {
+ Iterator portIterator = ports.values().iterator();
+
+ while (portIterator.hasNext())
+ {
+ strBuf.append("\n" + portIterator.next());
+ }
+ }
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/TypesImpl.java b/src/main/java/com/ibm/wsdl/TypesImpl.java
new file mode 100644
index 0000000..e4ee509
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/TypesImpl.java
@@ -0,0 +1,49 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl;
+
+import java.util.*;
+
+import javax.wsdl.*;
+
+/**
+ * This class represents the <types> section of a WSDL document.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class TypesImpl extends AbstractWSDLElement implements Types
+{
+ protected List nativeAttributeNames =
+ Arrays.asList(Constants.TYPES_ATTR_NAMES);
+
+ public static final long serialVersionUID = 1;
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("Types:");
+
+ String superString = super.toString();
+ if(!superString.equals(""))
+ {
+ strBuf.append("\n");
+ strBuf.append(superString);
+ }
+
+ return strBuf.toString();
+ }
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames()
+ {
+ return nativeAttributeNames;
+ }
+}
diff --git a/src/main/java/com/ibm/wsdl/extensions/PopulatedExtensionRegistry.java b/src/main/java/com/ibm/wsdl/extensions/PopulatedExtensionRegistry.java
new file mode 100644
index 0000000..6effdf2
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/PopulatedExtensionRegistry.java
@@ -0,0 +1,438 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl.extensions;
+
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.soap.*;
+import javax.wsdl.extensions.soap12.*;
+import javax.wsdl.extensions.mime.*;
+import com.ibm.wsdl.extensions.soap.*;
+import com.ibm.wsdl.extensions.soap12.*;
+import com.ibm.wsdl.extensions.http.*;
+import com.ibm.wsdl.extensions.mime.*;
+import com.ibm.wsdl.extensions.schema.*;
+
+/**
+ * This class extends ExtensionRegistry and pre-registers
+ * serializers/deserializers for the SOAP, HTTP and MIME
+ * extensions. Java extensionTypes are also mapped for all
+ * the SOAP, HTTP and MIME extensions.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class PopulatedExtensionRegistry extends ExtensionRegistry
+{
+ public static final long serialVersionUID = 1;
+
+ public PopulatedExtensionRegistry()
+ {
+ SOAPAddressSerializer soapAddressSer = new SOAPAddressSerializer();
+
+ registerSerializer(Port.class,
+ SOAPConstants.Q_ELEM_SOAP_ADDRESS,
+ soapAddressSer);
+ registerDeserializer(Port.class,
+ SOAPConstants.Q_ELEM_SOAP_ADDRESS,
+ soapAddressSer);
+ mapExtensionTypes(Port.class,
+ SOAPConstants.Q_ELEM_SOAP_ADDRESS,
+ SOAPAddressImpl.class);
+
+ SOAPBindingSerializer soapBindingSer = new SOAPBindingSerializer();
+
+ registerSerializer(Binding.class,
+ SOAPConstants.Q_ELEM_SOAP_BINDING,
+ soapBindingSer);
+ registerDeserializer(Binding.class,
+ SOAPConstants.Q_ELEM_SOAP_BINDING,
+ soapBindingSer);
+ mapExtensionTypes(Binding.class,
+ SOAPConstants.Q_ELEM_SOAP_BINDING,
+ SOAPBindingImpl.class);
+
+ SOAPHeaderSerializer soapHeaderSer = new SOAPHeaderSerializer();
+
+ registerSerializer(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ registerDeserializer(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ mapExtensionTypes(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ SOAPHeaderImpl.class);
+ registerSerializer(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ registerDeserializer(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ mapExtensionTypes(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ SOAPHeaderImpl.class);
+ mapExtensionTypes(SOAPHeader.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER_FAULT,
+ SOAPHeaderFaultImpl.class);
+ registerSerializer(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ registerDeserializer(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ soapHeaderSer);
+ mapExtensionTypes(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_HEADER,
+ SOAPHeaderImpl.class);
+
+ SOAPBodySerializer soapBodySer = new SOAPBodySerializer();
+
+ registerSerializer(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ registerDeserializer(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ mapExtensionTypes(BindingInput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ SOAPBodyImpl.class);
+ registerSerializer(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ registerDeserializer(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ mapExtensionTypes(BindingOutput.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ SOAPBodyImpl.class);
+ registerSerializer(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ registerDeserializer(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ soapBodySer);
+ mapExtensionTypes(MIMEPart.class,
+ SOAPConstants.Q_ELEM_SOAP_BODY,
+ SOAPBodyImpl.class);
+
+ SOAPFaultSerializer soapFaultSer = new SOAPFaultSerializer();
+
+ registerSerializer(BindingFault.class,
+ SOAPConstants.Q_ELEM_SOAP_FAULT,
+ soapFaultSer);
+ registerDeserializer(BindingFault.class,
+ SOAPConstants.Q_ELEM_SOAP_FAULT,
+ soapFaultSer);
+ mapExtensionTypes(BindingFault.class,
+ SOAPConstants.Q_ELEM_SOAP_FAULT,
+ SOAPFaultImpl.class);
+
+ SOAPOperationSerializer soapOperationSer = new SOAPOperationSerializer();
+
+ registerSerializer(BindingOperation.class,
+ SOAPConstants.Q_ELEM_SOAP_OPERATION,
+ soapOperationSer);
+ registerDeserializer(BindingOperation.class,
+ SOAPConstants.Q_ELEM_SOAP_OPERATION,
+ soapOperationSer);
+ mapExtensionTypes(BindingOperation.class,
+ SOAPConstants.Q_ELEM_SOAP_OPERATION,
+ SOAPOperationImpl.class);
+
+
+ SOAP12AddressSerializer soap12AddressSer = new SOAP12AddressSerializer();
+
+ registerSerializer(Port.class,
+ SOAP12Constants.Q_ELEM_SOAP_ADDRESS,
+ soap12AddressSer);
+ registerDeserializer(Port.class,
+ SOAP12Constants.Q_ELEM_SOAP_ADDRESS,
+ soap12AddressSer);
+ mapExtensionTypes(Port.class,
+ SOAP12Constants.Q_ELEM_SOAP_ADDRESS,
+ SOAP12AddressImpl.class);
+
+ SOAP12BindingSerializer soap12BindingSer = new SOAP12BindingSerializer();
+
+ registerSerializer(Binding.class,
+ SOAP12Constants.Q_ELEM_SOAP_BINDING,
+ soap12BindingSer);
+ registerDeserializer(Binding.class,
+ SOAP12Constants.Q_ELEM_SOAP_BINDING,
+ soap12BindingSer);
+ mapExtensionTypes(Binding.class,
+ SOAP12Constants.Q_ELEM_SOAP_BINDING,
+ SOAP12BindingImpl.class);
+
+ SOAP12HeaderSerializer soap12HeaderSer = new SOAP12HeaderSerializer();
+
+ registerSerializer(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ registerDeserializer(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ mapExtensionTypes(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ SOAP12HeaderImpl.class);
+ registerSerializer(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ registerDeserializer(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ mapExtensionTypes(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ SOAP12HeaderImpl.class);
+ mapExtensionTypes(SOAP12Header.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER_FAULT,
+ SOAP12HeaderFaultImpl.class);
+ registerSerializer(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ registerDeserializer(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ soap12HeaderSer);
+ mapExtensionTypes(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_HEADER,
+ SOAP12HeaderImpl.class);
+
+ SOAP12BodySerializer soap12BodySer = new SOAP12BodySerializer();
+
+ registerSerializer(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ registerDeserializer(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ mapExtensionTypes(BindingInput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ SOAP12BodyImpl.class);
+ registerSerializer(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ registerDeserializer(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ mapExtensionTypes(BindingOutput.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ SOAP12BodyImpl.class);
+ registerSerializer(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ registerDeserializer(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ soap12BodySer);
+ mapExtensionTypes(MIMEPart.class,
+ SOAP12Constants.Q_ELEM_SOAP_BODY,
+ SOAP12BodyImpl.class);
+
+ SOAP12FaultSerializer soap12FaultSer = new SOAP12FaultSerializer();
+
+ registerSerializer(BindingFault.class,
+ SOAP12Constants.Q_ELEM_SOAP_FAULT,
+ soap12FaultSer);
+ registerDeserializer(BindingFault.class,
+ SOAP12Constants.Q_ELEM_SOAP_FAULT,
+ soap12FaultSer);
+ mapExtensionTypes(BindingFault.class,
+ SOAP12Constants.Q_ELEM_SOAP_FAULT,
+ SOAP12FaultImpl.class);
+
+ SOAP12OperationSerializer soap12OperationSer = new SOAP12OperationSerializer();
+
+ registerSerializer(BindingOperation.class,
+ SOAP12Constants.Q_ELEM_SOAP_OPERATION,
+ soap12OperationSer);
+ registerDeserializer(BindingOperation.class,
+ SOAP12Constants.Q_ELEM_SOAP_OPERATION,
+ soap12OperationSer);
+ mapExtensionTypes(BindingOperation.class,
+ SOAP12Constants.Q_ELEM_SOAP_OPERATION,
+ SOAP12OperationImpl.class);
+
+ HTTPAddressSerializer httpAddressSer = new HTTPAddressSerializer();
+
+ registerSerializer(Port.class,
+ HTTPConstants.Q_ELEM_HTTP_ADDRESS,
+ httpAddressSer);
+ registerDeserializer(Port.class,
+ HTTPConstants.Q_ELEM_HTTP_ADDRESS,
+ httpAddressSer);
+ mapExtensionTypes(Port.class,
+ HTTPConstants.Q_ELEM_HTTP_ADDRESS,
+ HTTPAddressImpl.class);
+
+ HTTPOperationSerializer httpOperationSer = new HTTPOperationSerializer();
+
+ registerSerializer(BindingOperation.class,
+ HTTPConstants.Q_ELEM_HTTP_OPERATION,
+ httpOperationSer);
+ registerDeserializer(BindingOperation.class,
+ HTTPConstants.Q_ELEM_HTTP_OPERATION,
+ httpOperationSer);
+ mapExtensionTypes(BindingOperation.class,
+ HTTPConstants.Q_ELEM_HTTP_OPERATION,
+ HTTPOperationImpl.class);
+
+ HTTPBindingSerializer httpBindingSer = new HTTPBindingSerializer();
+
+ registerSerializer(Binding.class,
+ HTTPConstants.Q_ELEM_HTTP_BINDING,
+ httpBindingSer);
+ registerDeserializer(Binding.class,
+ HTTPConstants.Q_ELEM_HTTP_BINDING,
+ httpBindingSer);
+ mapExtensionTypes(Binding.class,
+ HTTPConstants.Q_ELEM_HTTP_BINDING,
+ HTTPBindingImpl.class);
+
+ HTTPUrlEncodedSerializer httpUrlEncodedSer =
+ new HTTPUrlEncodedSerializer();
+
+ registerSerializer(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_ENCODED,
+ httpUrlEncodedSer);
+ registerDeserializer(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_ENCODED,
+ httpUrlEncodedSer);
+ mapExtensionTypes(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_ENCODED,
+ HTTPUrlEncodedImpl.class);
+
+ HTTPUrlReplacementSerializer httpUrlReplacementSer =
+ new HTTPUrlReplacementSerializer();
+
+ registerSerializer(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_REPLACEMENT,
+ httpUrlReplacementSer);
+ registerDeserializer(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_REPLACEMENT,
+ httpUrlReplacementSer);
+ mapExtensionTypes(BindingInput.class,
+ HTTPConstants.Q_ELEM_HTTP_URL_REPLACEMENT,
+ HTTPUrlReplacementImpl.class);
+
+ MIMEContentSerializer mimeContentSer = new MIMEContentSerializer();
+
+ registerSerializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ registerDeserializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ mapExtensionTypes(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ MIMEContentImpl.class);
+ registerSerializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ registerDeserializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ mapExtensionTypes(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ MIMEContentImpl.class);
+ registerSerializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ registerDeserializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ mimeContentSer);
+ mapExtensionTypes(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_CONTENT,
+ MIMEContentImpl.class);
+
+ MIMEMultipartRelatedSerializer mimeMultipartRelatedSer =
+ new MIMEMultipartRelatedSerializer();
+
+ registerSerializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ registerDeserializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ mapExtensionTypes(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ MIMEMultipartRelatedImpl.class);
+ registerSerializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ registerDeserializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ mapExtensionTypes(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ MIMEMultipartRelatedImpl.class);
+ registerSerializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ registerDeserializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ mimeMultipartRelatedSer);
+ mapExtensionTypes(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED,
+ MIMEMultipartRelatedImpl.class);
+ mapExtensionTypes(MIMEMultipartRelated.class,
+ MIMEConstants.Q_ELEM_MIME_PART,
+ MIMEPartImpl.class);
+
+ MIMEMimeXmlSerializer mimeMimeXmlSer = new MIMEMimeXmlSerializer();
+
+ registerSerializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ registerDeserializer(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ mapExtensionTypes(BindingInput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ MIMEMimeXmlImpl.class);
+ registerSerializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ registerDeserializer(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ mapExtensionTypes(BindingOutput.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ MIMEMimeXmlImpl.class);
+ registerSerializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ registerDeserializer(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ mimeMimeXmlSer);
+ mapExtensionTypes(MIMEPart.class,
+ MIMEConstants.Q_ELEM_MIME_MIME_XML,
+ MIMEMimeXmlImpl.class);
+
+ // [tellef - 2019-02-22]: The following code has been removed
+ // to prevent WSDL4j from fetching external files using HTTP.
+ //
+ //Register the schema parser
+ /*
+ mapExtensionTypes(Types.class, SchemaConstants.Q_ELEM_XSD_1999,
+ SchemaImpl.class);
+ registerDeserializer(Types.class, SchemaConstants.Q_ELEM_XSD_1999,
+ new SchemaDeserializer());
+ registerSerializer(Types.class, SchemaConstants.Q_ELEM_XSD_1999,
+ new SchemaSerializer());
+
+ mapExtensionTypes(Types.class, SchemaConstants.Q_ELEM_XSD_2000,
+ SchemaImpl.class);
+ registerDeserializer(Types.class, SchemaConstants.Q_ELEM_XSD_2000,
+ new SchemaDeserializer());
+ registerSerializer(Types.class, SchemaConstants.Q_ELEM_XSD_2000,
+ new SchemaSerializer());
+
+ mapExtensionTypes(Types.class, SchemaConstants.Q_ELEM_XSD_2001,
+ SchemaImpl.class);
+ registerDeserializer(Types.class, SchemaConstants.Q_ELEM_XSD_2001,
+ new SchemaDeserializer());
+ registerSerializer(Types.class, SchemaConstants.Q_ELEM_XSD_2001,
+ new SchemaSerializer());
+ */
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressImpl.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressImpl.java
new file mode 100644
index 0000000..e47e8ff
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressImpl.java
@@ -0,0 +1,92 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPAddressImpl implements HTTPAddress
+{
+ protected QName elementType = HTTPConstants.Q_ELEM_HTTP_ADDRESS;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected String locationURI = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Set the location URI for this HTTP address.
+ *
+ * @param locationURI the desired location URI
+ */
+ public void setLocationURI(String locationURI)
+ {
+ this.locationURI = locationURI;
+ }
+
+ /**
+ * Get the location URI for this HTTP address.
+ */
+ public String getLocationURI()
+ {
+ return locationURI;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("HTTPAddress (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (locationURI != null)
+ {
+ strBuf.append("\nlocationURI=" + locationURI);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressSerializer.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressSerializer.java
new file mode 100644
index 0000000..7f09ce0
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPAddressSerializer.java
@@ -0,0 +1,88 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPAddressSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPAddress httpAddress = (HTTPAddress)extension;
+
+ if (httpAddress != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(HTTPConstants.NS_URI_HTTP,
+ "address",
+ def);
+
+ pw.print(" <" + tagName);
+
+ DOMUtils.printAttribute(Constants.ATTR_LOCATION,
+ httpAddress.getLocationURI(),
+ pw);
+
+ Boolean required = httpAddress.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPAddress httpAddress = (HTTPAddress)extReg.createExtension(parentType,
+ elementType);
+ String locationURI = DOMUtils.getAttribute(el, Constants.ATTR_LOCATION);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (locationURI != null)
+ {
+ httpAddress.setLocationURI(locationURI);
+ }
+
+ if (requiredStr != null)
+ {
+ httpAddress.setRequired(new Boolean(requiredStr));
+ }
+
+ return httpAddress;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingImpl.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingImpl.java
new file mode 100644
index 0000000..1f62da9
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingImpl.java
@@ -0,0 +1,92 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPBindingImpl implements HTTPBinding
+{
+ protected QName elementType = HTTPConstants.Q_ELEM_HTTP_BINDING;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected String verb = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Set the verb for this HTTP binding.
+ *
+ * @param verb the desired verb
+ */
+ public void setVerb(String verb)
+ {
+ this.verb = verb;
+ }
+
+ /**
+ * Get the verb for this HTTP binding.
+ */
+ public String getVerb()
+ {
+ return verb;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("HTTPBinding (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (verb != null)
+ {
+ strBuf.append("\nverb=" + verb);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingSerializer.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingSerializer.java
new file mode 100644
index 0000000..76e0528
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPBindingSerializer.java
@@ -0,0 +1,88 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPBindingSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPBinding httpBinding = (HTTPBinding)extension;
+
+ if (httpBinding != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(HTTPConstants.NS_URI_HTTP,
+ "binding",
+ def);
+
+ pw.print(" <" + tagName);
+
+ DOMUtils.printAttribute(HTTPConstants.ATTR_VERB,
+ httpBinding.getVerb(),
+ pw);
+
+ Boolean required = httpBinding.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPBinding httpBinding = (HTTPBinding)extReg.createExtension(parentType,
+ elementType);
+ String verb = DOMUtils.getAttribute(el, HTTPConstants.ATTR_VERB);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (verb != null)
+ {
+ httpBinding.setVerb(verb);
+ }
+
+ if (requiredStr != null)
+ {
+ httpBinding.setRequired(new Boolean(requiredStr));
+ }
+
+ return httpBinding;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPConstants.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPConstants.java
new file mode 100644
index 0000000..45128b0
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPConstants.java
@@ -0,0 +1,38 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPConstants
+{
+ // Namespace URIs.
+ public static final String NS_URI_HTTP =
+ "http://schemas.xmlsoap.org/wsdl/http/";
+
+ // Element names.
+ public static final String ELEM_ADDRESS = "address";
+ public static final String ELEM_URL_ENCODED = "urlEncoded";
+ public static final String ELEM_URL_REPLACEMENT = "urlReplacement";
+
+ // Qualified element names.
+ public static final QName Q_ELEM_HTTP_BINDING =
+ new QName(NS_URI_HTTP, Constants.ELEM_BINDING);
+ public static final QName Q_ELEM_HTTP_OPERATION =
+ new QName(NS_URI_HTTP, Constants.ELEM_OPERATION);
+ public static final QName Q_ELEM_HTTP_ADDRESS =
+ new QName(NS_URI_HTTP, ELEM_ADDRESS);
+ public static final QName Q_ELEM_HTTP_URL_ENCODED =
+ new QName(NS_URI_HTTP, ELEM_URL_ENCODED);
+ public static final QName Q_ELEM_HTTP_URL_REPLACEMENT =
+ new QName(NS_URI_HTTP, ELEM_URL_REPLACEMENT);
+
+ // Attribute names.
+ public static final String ATTR_VERB = "verb";
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationImpl.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationImpl.java
new file mode 100644
index 0000000..3b3e806
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationImpl.java
@@ -0,0 +1,92 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPOperationImpl implements HTTPOperation
+{
+ protected QName elementType = HTTPConstants.Q_ELEM_HTTP_OPERATION;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected String locationURI = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Set the location URI for this HTTP operation.
+ *
+ * @param locationURI the desired location URI
+ */
+ public void setLocationURI(String locationURI)
+ {
+ this.locationURI = locationURI;
+ }
+
+ /**
+ * Get the location URI for this HTTP operation.
+ */
+ public String getLocationURI()
+ {
+ return locationURI;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("HTTPOperation (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (locationURI != null)
+ {
+ strBuf.append("\nlocationURI=" + locationURI);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationSerializer.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationSerializer.java
new file mode 100644
index 0000000..da0f7ae
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPOperationSerializer.java
@@ -0,0 +1,88 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPOperationSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPOperation httpOperation = (HTTPOperation)extension;
+
+ if (httpOperation != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(HTTPConstants.NS_URI_HTTP,
+ "operation",
+ def);
+
+ pw.print(" <" + tagName);
+
+ DOMUtils.printAttribute(Constants.ATTR_LOCATION,
+ httpOperation.getLocationURI(),
+ pw);
+
+ Boolean required = httpOperation.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPOperation httpOperation =
+ (HTTPOperation)extReg.createExtension(parentType, elementType);
+ String locationURI = DOMUtils.getAttribute(el, Constants.ATTR_LOCATION);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (locationURI != null)
+ {
+ httpOperation.setLocationURI(locationURI);
+ }
+
+ if (requiredStr != null)
+ {
+ httpOperation.setRequired(new Boolean(requiredStr));
+ }
+
+ return httpOperation;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedImpl.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedImpl.java
new file mode 100644
index 0000000..4fdb39f
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedImpl.java
@@ -0,0 +1,68 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPUrlEncodedImpl implements HTTPUrlEncoded
+{
+ protected QName elementType = HTTPConstants.Q_ELEM_HTTP_URL_ENCODED;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("HTTPUrlEncoded (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedSerializer.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedSerializer.java
new file mode 100644
index 0000000..9566ab8
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlEncodedSerializer.java
@@ -0,0 +1,78 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPUrlEncodedSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPUrlEncoded httpUrlEncoded = (HTTPUrlEncoded)extension;
+
+ if (httpUrlEncoded != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(HTTPConstants.NS_URI_HTTP,
+ "urlEncoded",
+ def);
+
+ pw.print(" <" + tagName);
+
+ Boolean required = httpUrlEncoded.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPUrlEncoded httpUrlEncoded =
+ (HTTPUrlEncoded)extReg.createExtension(parentType, elementType);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (requiredStr != null)
+ {
+ httpUrlEncoded.setRequired(new Boolean(requiredStr));
+ }
+
+ return httpUrlEncoded;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementImpl.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementImpl.java
new file mode 100644
index 0000000..3e48c25
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementImpl.java
@@ -0,0 +1,68 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPUrlReplacementImpl implements HTTPUrlReplacement
+{
+ protected QName elementType = HTTPConstants.Q_ELEM_HTTP_URL_REPLACEMENT;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("HTTPUrlReplacement (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementSerializer.java b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementSerializer.java
new file mode 100644
index 0000000..094e4b3
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/http/HTTPUrlReplacementSerializer.java
@@ -0,0 +1,78 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.http;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.http.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class HTTPUrlReplacementSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPUrlReplacement httpUrlReplacement = (HTTPUrlReplacement)extension;
+
+ if (httpUrlReplacement != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(HTTPConstants.NS_URI_HTTP,
+ "urlReplacement",
+ def);
+
+ pw.print(" <" + tagName);
+
+ Boolean required = httpUrlReplacement.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ HTTPUrlReplacement httpUrlReplacement =
+ (HTTPUrlReplacement)extReg.createExtension(parentType, elementType);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (requiredStr != null)
+ {
+ httpUrlReplacement.setRequired(new Boolean(requiredStr));
+ }
+
+ return httpUrlReplacement;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEConstants.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEConstants.java
new file mode 100644
index 0000000..0f63fdd
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEConstants.java
@@ -0,0 +1,36 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEConstants
+{
+ // Namespace URIs.
+ public static final String NS_URI_MIME =
+ "http://schemas.xmlsoap.org/wsdl/mime/";
+
+ // Element names.
+ public static final String ELEM_CONTENT = "content";
+ public static final String ELEM_MULTIPART_RELATED = "multipartRelated";
+ public static final String ELEM_MIME_XML = "mimeXml";
+
+ // Qualified element names.
+ public static final QName Q_ELEM_MIME_CONTENT =
+ new QName(NS_URI_MIME, ELEM_CONTENT);
+ public static final QName Q_ELEM_MIME_MULTIPART_RELATED =
+ new QName(NS_URI_MIME, ELEM_MULTIPART_RELATED);
+ public static final QName Q_ELEM_MIME_PART =
+ new QName(NS_URI_MIME, Constants.ELEM_PART);
+ public static final QName Q_ELEM_MIME_MIME_XML =
+ new QName(NS_URI_MIME, ELEM_MIME_XML);
+
+ // Attribute names.
+ public static final String ATTR_PART = "part";
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentImpl.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentImpl.java
new file mode 100644
index 0000000..ebeb226
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentImpl.java
@@ -0,0 +1,116 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEContentImpl implements MIMEContent
+{
+ protected QName elementType = MIMEConstants.Q_ELEM_MIME_CONTENT;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected String part = null;
+ protected String type = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Set the part for this MIME content.
+ *
+ * @param part the desired part
+ */
+ public void setPart(String part)
+ {
+ this.part = part;
+ }
+
+ /**
+ * Get the part for this MIME content.
+ */
+ public String getPart()
+ {
+ return part;
+ }
+
+ /**
+ * Set the type for this MIME content.
+ *
+ * @param type the desired type
+ */
+ public void setType(String type)
+ {
+ this.type = type;
+ }
+
+ /**
+ * Get the type for this MIME content.
+ */
+ public String getType()
+ {
+ return type;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("MIMEContent (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (part != null)
+ {
+ strBuf.append("\npart=" + part);
+ }
+
+ if (type != null)
+ {
+ strBuf.append("\ntype=" + type);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentSerializer.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentSerializer.java
new file mode 100644
index 0000000..2bf9501
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEContentSerializer.java
@@ -0,0 +1,103 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEContentSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEContent mimeContent = (MIMEContent)extension;
+
+ if (mimeContent != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(MIMEConstants.NS_URI_MIME,
+ "content",
+ def);
+
+ if (parentType != null
+ && MIMEPart.class.isAssignableFrom(parentType))
+ {
+ pw.print(" ");
+ }
+
+ pw.print(" <" + tagName);
+
+ DOMUtils.printAttribute(MIMEConstants.ATTR_PART,
+ mimeContent.getPart(),
+ pw);
+ DOMUtils.printAttribute(Constants.ATTR_TYPE,
+ mimeContent.getType(),
+ pw);
+
+ Boolean required = mimeContent.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEContent mimeContent = (MIMEContent)extReg.createExtension(parentType,
+ elementType);
+ String part = DOMUtils.getAttribute(el, MIMEConstants.ATTR_PART);
+ String type = DOMUtils.getAttribute(el, Constants.ATTR_TYPE);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (part != null)
+ {
+ mimeContent.setPart(part);
+ }
+
+ if (type != null)
+ {
+ mimeContent.setType(type);
+ }
+
+ if (requiredStr != null)
+ {
+ mimeContent.setRequired(new Boolean(requiredStr));
+ }
+
+ return mimeContent;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlImpl.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlImpl.java
new file mode 100644
index 0000000..d688be2
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlImpl.java
@@ -0,0 +1,92 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEMimeXmlImpl implements MIMEMimeXml
+{
+ protected QName elementType = MIMEConstants.Q_ELEM_MIME_MIME_XML;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected String part = null;
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Set the part for this MIME mimeXml.
+ *
+ * @param part the desired part
+ */
+ public void setPart(String part)
+ {
+ this.part = part;
+ }
+
+ /**
+ * Get the part for this MIME mimeXml.
+ */
+ public String getPart()
+ {
+ return part;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("MIMEMimeXml (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (part != null)
+ {
+ strBuf.append("\npart=" + part);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlSerializer.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlSerializer.java
new file mode 100644
index 0000000..21a322f
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMimeXmlSerializer.java
@@ -0,0 +1,94 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import java.io.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEMimeXmlSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEMimeXml mimeMimeXml = (MIMEMimeXml)extension;
+
+ if (mimeMimeXml != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(MIMEConstants.NS_URI_MIME,
+ "mimeXml",
+ def);
+
+ if (parentType != null
+ && MIMEPart.class.isAssignableFrom(parentType))
+ {
+ pw.print(" ");
+ }
+
+ pw.print(" <" + tagName);
+
+ DOMUtils.printAttribute(MIMEConstants.ATTR_PART,
+ mimeMimeXml.getPart(),
+ pw);
+
+ Boolean required = mimeMimeXml.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println("/>");
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEMimeXml mimeMimeXml = (MIMEMimeXml)extReg.createExtension(parentType,
+ elementType);
+ String part = DOMUtils.getAttribute(el, MIMEConstants.ATTR_PART);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (part != null)
+ {
+ mimeMimeXml.setPart(part);
+ }
+
+ if (requiredStr != null)
+ {
+ mimeMimeXml.setRequired(new Boolean(requiredStr));
+ }
+
+ return mimeMimeXml;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedImpl.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedImpl.java
new file mode 100644
index 0000000..e436895
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedImpl.java
@@ -0,0 +1,112 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import java.util.*;
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEMultipartRelatedImpl implements MIMEMultipartRelated
+{
+ protected QName elementType = MIMEConstants.Q_ELEM_MIME_MULTIPART_RELATED;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected List mimeParts = new Vector();
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Add a MIME part to this MIME multipart related.
+ *
+ * @param mimePart the MIME part to be added
+ */
+ public void addMIMEPart(MIMEPart mimePart)
+ {
+ mimeParts.add(mimePart);
+ }
+
+ /**
+ * Remove a MIME part from this MIME multipart related.
+ *
+ * @param mimePart the MIME part to be removed.
+ * @return the MIME part which was removed.
+ */
+ public MIMEPart removeMIMEPart(MIMEPart mimePart)
+ {
+ if(mimeParts.remove(mimePart))
+ return mimePart;
+ else
+ return null;
+ }
+
+ /**
+ * Get all the MIME parts defined here.
+ */
+ public List getMIMEParts()
+ {
+ return mimeParts;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("MIMEMultipartRelated (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (mimeParts != null)
+ {
+ Iterator mimePartIterator = mimeParts.iterator();
+
+ while (mimePartIterator.hasNext())
+ {
+ strBuf.append("\n" + mimePartIterator.next());
+ }
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedSerializer.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedSerializer.java
new file mode 100644
index 0000000..69fc29a
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEMultipartRelatedSerializer.java
@@ -0,0 +1,228 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import java.io.*;
+import java.util.*;
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+import com.ibm.wsdl.*;
+import com.ibm.wsdl.util.xml.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEMultipartRelatedSerializer implements ExtensionSerializer,
+ ExtensionDeserializer,
+ Serializable
+{
+ public static final long serialVersionUID = 1;
+
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement extension,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEMultipartRelated mimeMultipartRelated =
+ (MIMEMultipartRelated)extension;
+
+ if (mimeMultipartRelated != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(MIMEConstants.NS_URI_MIME,
+ "multipartRelated",
+ def);
+
+ if (parentType != null
+ && MIMEPart.class.isAssignableFrom(parentType))
+ {
+ pw.print(" ");
+ }
+
+ pw.print(" <" + tagName);
+
+ Boolean required = mimeMultipartRelated.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println('>');
+
+ printMIMEParts(mimeMultipartRelated.getMIMEParts(), pw, def, extReg);
+
+ if (parentType != null
+ && MIMEPart.class.isAssignableFrom(parentType))
+ {
+ pw.print(" ");
+ }
+
+ pw.println(" " + tagName + '>');
+ }
+ }
+
+ private void printMIMEParts(List mimeParts,
+ PrintWriter pw,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ if (mimeParts != null)
+ {
+ String tagName =
+ DOMUtils.getQualifiedValue(MIMEConstants.NS_URI_MIME,
+ "part",
+ def);
+ Iterator mimePartIterator = mimeParts.iterator();
+
+ while (mimePartIterator.hasNext())
+ {
+ MIMEPart mimePart = (MIMEPart)mimePartIterator.next();
+
+ if (mimePart != null)
+ {
+ pw.print(" <" + tagName);
+
+ Boolean required = mimePart.getRequired();
+
+ if (required != null)
+ {
+ DOMUtils.printQualifiedAttribute(Constants.Q_ATTR_REQUIRED,
+ required.toString(),
+ def,
+ pw);
+ }
+
+ pw.println('>');
+
+ List extensibilityElements = mimePart.getExtensibilityElements();
+
+ if (extensibilityElements != null)
+ {
+ Iterator extensibilityElementIterator =
+ extensibilityElements.iterator();
+
+ while (extensibilityElementIterator.hasNext())
+ {
+ ExtensibilityElement ext =
+ (ExtensibilityElement)extensibilityElementIterator.next();
+ QName elementType = ext.getElementType();
+ ExtensionSerializer extSer =
+ extReg.querySerializer(MIMEPart.class, elementType);
+
+ extSer.marshall(MIMEPart.class,
+ elementType,
+ ext,
+ pw,
+ def,
+ extReg);
+ }
+ }
+
+ pw.println(" " + tagName + '>');
+ }
+ }
+ }
+ }
+
+ public ExtensibilityElement unmarshall(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEMultipartRelated mimeMultipartRelated =
+ (MIMEMultipartRelated)extReg.createExtension(parentType, elementType);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+ Element tempEl = DOMUtils.getFirstChildElement(el);
+
+ while (tempEl != null)
+ {
+ if (QNameUtils.matches(MIMEConstants.Q_ELEM_MIME_PART, tempEl))
+ {
+ mimeMultipartRelated.addMIMEPart(
+ parseMIMEPart(MIMEMultipartRelated.class,
+ MIMEConstants.Q_ELEM_MIME_PART,
+ tempEl,
+ def,
+ extReg));
+ }
+ else
+ {
+ DOMUtils.throwWSDLException(tempEl);
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ if (requiredStr != null)
+ {
+ mimeMultipartRelated.setRequired(new Boolean(requiredStr));
+ }
+
+ return mimeMultipartRelated;
+ }
+
+ private MIMEPart parseMIMEPart(Class parentType,
+ QName elementType,
+ Element el,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException
+ {
+ MIMEPart mimePart = (MIMEPart)extReg.createExtension(parentType,
+ elementType);
+ String requiredStr = DOMUtils.getAttributeNS(el,
+ Constants.NS_URI_WSDL,
+ Constants.ATTR_REQUIRED);
+
+ if (requiredStr != null)
+ {
+ mimePart.setRequired(new Boolean(requiredStr));
+ }
+
+ Element tempEl = DOMUtils.getFirstChildElement(el);
+
+ while (tempEl != null)
+ {
+ try
+ {
+ QName tempElType = QNameUtils.newQName(tempEl);
+ ExtensionDeserializer extDS = extReg.queryDeserializer(MIMEPart.class,
+ tempElType);
+ ExtensibilityElement ext =
+ extDS.unmarshall(MIMEPart.class, tempElType, tempEl, def, extReg);
+
+ mimePart.addExtensibilityElement(ext);
+ }
+ catch (WSDLException e)
+ {
+ if (e.getLocation() == null)
+ {
+ e.setLocation(XPathUtils.getXPathExprFromNode(tempEl));
+ }
+
+ throw e;
+ }
+
+ tempEl = DOMUtils.getNextSiblingElement(tempEl);
+ }
+
+ return mimePart;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/mime/MIMEPartImpl.java b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEPartImpl.java
new file mode 100644
index 0000000..f5c846f
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/mime/MIMEPartImpl.java
@@ -0,0 +1,114 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl.extensions.mime;
+
+import java.util.*;
+import javax.wsdl.extensions.*;
+import javax.wsdl.extensions.mime.*;
+import javax.xml.namespace.*;
+
+/**
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public class MIMEPartImpl implements MIMEPart
+{
+ protected QName elementType = MIMEConstants.Q_ELEM_MIME_PART;
+ // Uses the wrapper type so we can tell if it was set or not.
+ protected Boolean required = null;
+ protected List extElements = new Vector();
+
+ public static final long serialVersionUID = 1;
+
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType)
+ {
+ this.elementType = elementType;
+ }
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType()
+ {
+ return elementType;
+ }
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required)
+ {
+ this.required = required;
+ }
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired()
+ {
+ return required;
+ }
+
+ /**
+ * Add an extensibility element. This is where the MIME
+ * elements go.
+ *
+ * @param extElement the extensibility element to be added
+ */
+ public void addExtensibilityElement(ExtensibilityElement extElement)
+ {
+ extElements.add(extElement);
+ }
+
+ /**
+ * Remove an extensibility element.
+ *
+ * @param extElement the extensibility element to be removed
+ * @return the extensibility element which was removed
+ */
+ public ExtensibilityElement removeExtensibilityElement(ExtensibilityElement extElement)
+ {
+ if(extElements.remove(extElement))
+ return extElement;
+ else
+ return null;
+ }
+
+ /**
+ * Get all the extensibility elements defined here.
+ */
+ public List getExtensibilityElements()
+ {
+ return extElements;
+ }
+
+ public String toString()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("MIMEPart (" + elementType + "):");
+ strBuf.append("\nrequired=" + required);
+
+ if (extElements != null)
+ {
+ Iterator extIterator = extElements.iterator();
+
+ while (extIterator.hasNext())
+ {
+ strBuf.append("\n" + extIterator.next());
+ }
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/extensions/schema/SchemaConstants.java b/src/main/java/com/ibm/wsdl/extensions/schema/SchemaConstants.java
new file mode 100644
index 0000000..74fd222
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/extensions/schema/SchemaConstants.java
@@ -0,0 +1,78 @@
+/*
+ * (c) Copyright IBM Corp 2004, 2005
+ */
+
+package com.ibm.wsdl.extensions.schema;
+
+import java.util.Arrays;
+import java.util.List;
+import javax.xml.namespace.QName;
+import com.ibm.wsdl.Constants;
+
+/**
+ * Constants used for handling XML Schemas
+ *
+ * @author John Kaputin <schema>
elements into
+ * Schema instances.
+ *
+ * @see SchemaImpl
+ * @see SchemaSerializer
+ *
+ * @author Jeremy Hughes <schema>
element.
+ *
+ * @see SchemaSerializer
+ * @see SchemaDeserializer
+ *
+ * @author Jeremy Hughes DOM Level 2
APIs.
+ * The main difference between this class and DOMWriter is that this class
+ * generates and prints out namespace declarations.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ * @author Joseph Kesselman
+ */
+public class DOM2Writer
+{
+ /**
+ * The namespaceURI represented by the prefix xmlns
.
+ */
+ private static String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/";
+
+ /**
+ * The namespaceURI represented by the prefix xml
.
+ */
+ private static String NS_URI_XML = "http://www.w3.org/XML/1998/namespace";
+
+ private static Map xmlEncodingMap = new HashMap();
+
+ static
+ {
+ xmlEncodingMap.put(null, Constants.XML_DECL_DEFAULT);
+ xmlEncodingMap.put(System.getProperty("file.encoding"),
+ Constants.XML_DECL_DEFAULT);
+ xmlEncodingMap.put("UTF8", "UTF-8");
+ xmlEncodingMap.put("UTF-16", "UTF-16");
+ xmlEncodingMap.put("UnicodeBig", "UTF-16");
+ xmlEncodingMap.put("UnicodeLittle", "UTF-16");
+ xmlEncodingMap.put("ASCII", "US-ASCII");
+ xmlEncodingMap.put("ISO8859_1", "ISO-8859-1");
+ xmlEncodingMap.put("ISO8859_2", "ISO-8859-2");
+ xmlEncodingMap.put("ISO8859_3", "ISO-8859-3");
+ xmlEncodingMap.put("ISO8859_4", "ISO-8859-4");
+ xmlEncodingMap.put("ISO8859_5", "ISO-8859-5");
+ xmlEncodingMap.put("ISO8859_6", "ISO-8859-6");
+ xmlEncodingMap.put("ISO8859_7", "ISO-8859-7");
+ xmlEncodingMap.put("ISO8859_8", "ISO-8859-8");
+ xmlEncodingMap.put("ISO8859_9", "ISO-8859-9");
+ xmlEncodingMap.put("ISO8859_13", "ISO-8859-13");
+ xmlEncodingMap.put("ISO8859_15_FDIS", "ISO-8859-15");
+ xmlEncodingMap.put("GBK", "GBK");
+ xmlEncodingMap.put("Big5", "Big5");
+ }
+
+ /**
+ * Return a string containing this node serialized as XML.
+ */
+ public static String nodeToString(Node node)
+ {
+ return nodeToString(node, new HashMap());
+ }
+
+ /**
+ * Return a string containing this node serialized as XML.
+ * The specified Map associates prefixes with namespace URLs.
+ */
+ public static String nodeToString(Node node, Map namespaces)
+ {
+ StringWriter sw = new StringWriter();
+
+ serializeAsXML(node, namespaces, sw);
+
+ return sw.toString();
+ }
+
+
+ /**
+ * Print an XML declaration before serializing the element.
+ */
+ public static void serializeElementAsDocument(Element el, Writer writer)
+ {
+ serializeElementAsDocument(el, new HashMap(), writer);
+ }
+
+ /**
+ * Print an XML declaration before serializing the element.
+ * The specified Map associates prefixes with namespace URLs.
+ */
+ public static void serializeElementAsDocument(Element el, Map namespaces, Writer writer)
+ {
+ PrintWriter pw = new PrintWriter(writer);
+ String javaEncoding = (writer instanceof OutputStreamWriter)
+ ? ((OutputStreamWriter) writer).getEncoding()
+ : null;
+
+ String xmlEncoding = java2XMLEncoding(javaEncoding);
+
+ if (xmlEncoding != null)
+ {
+ pw.println(Constants.XML_DECL_START +
+ xmlEncoding +
+ Constants.XML_DECL_END);
+ }
+ else
+ {
+ pw.println("");
+ }
+
+ serializeAsXML(el, namespaces, writer);
+ }
+
+ /**
+ * Serialize this node into the writer as XML.
+ */
+ public static void serializeAsXML(Node node, Writer writer)
+ {
+ serializeAsXML(node, new HashMap(), writer);
+ }
+
+ /**
+ * Serialize this node into the writer as XML.
+ * The specified Map associates prefixes with namespace URLs.
+ */
+ public static void serializeAsXML(Node node, Map namespaces, Writer writer)
+ {
+ ObjectRegistry namespaceStack = new ObjectRegistry(namespaces);
+
+ namespaceStack.register("xml", NS_URI_XML);
+
+ PrintWriter pw = new PrintWriter(writer);
+ String javaEncoding = (writer instanceof OutputStreamWriter)
+ ? ((OutputStreamWriter) writer).getEncoding()
+ : null;
+
+ print(node, namespaceStack, pw, java2XMLEncoding(javaEncoding));
+ }
+
+ private static void print(Node node, ObjectRegistry namespaceStack,
+ PrintWriter out, String xmlEncoding)
+ {
+ if (node == null)
+ {
+ return;
+ }
+
+ boolean hasChildren = false;
+ int type = node.getNodeType();
+
+ switch (type)
+ {
+ case Node.DOCUMENT_NODE :
+ {
+ if (xmlEncoding != null)
+ {
+ out.println(Constants.XML_DECL_START +
+ xmlEncoding +
+ Constants.XML_DECL_END);
+ }
+ else
+ {
+ out.println("");
+ }
+
+ Node child = node.getFirstChild();
+ while (child != null)
+ {
+ print(child,namespaceStack, out, xmlEncoding);
+ child = child.getNextSibling();
+ }
+ break;
+ }
+
+ case Node.ELEMENT_NODE :
+ {
+ namespaceStack = new ObjectRegistry(namespaceStack);
+
+ out.print('<' + node.getNodeName());
+
+ String elPrefix = node.getPrefix();
+ String elNamespaceURI = node.getNamespaceURI();
+
+ if (elPrefix != null && elNamespaceURI != null)
+ {
+ boolean prefixIsDeclared = false;
+
+ try
+ {
+ String namespaceURI = (String)namespaceStack.lookup(elPrefix);
+
+ if (elNamespaceURI.equals(namespaceURI))
+ {
+ prefixIsDeclared = true;
+ }
+ }
+ catch (IllegalArgumentException e)
+ {
+ // ignore this and carry on
+ }
+
+ if (!prefixIsDeclared)
+ {
+ printNamespaceDecl(node, namespaceStack, out);
+ }
+ }
+
+ NamedNodeMap attrs = node.getAttributes();
+ int len = (attrs != null) ? attrs.getLength() : 0;
+
+ for (int i = 0; i < len; i++)
+ {
+ Attr attr = (Attr)attrs.item(i);
+
+ out.print(' ' + attr.getNodeName() +"=\"" +
+ normalize(attr.getValue()) + '\"');
+
+ String attrPrefix = attr.getPrefix();
+ String attrNamespaceURI = attr.getNamespaceURI();
+
+ if (attrPrefix != null && attrNamespaceURI != null)
+ {
+ boolean prefixIsDeclared = false;
+
+ try
+ {
+ String namespaceURI = (String)namespaceStack.lookup(attrPrefix);
+
+ if (attrNamespaceURI.equals(namespaceURI))
+ {
+ prefixIsDeclared = true;
+ }
+ }
+ catch (IllegalArgumentException e)
+ {
+ // ignore this and carry on
+ }
+
+ if (!prefixIsDeclared)
+ {
+ printNamespaceDecl(attr, namespaceStack, out);
+ }
+ }
+ }
+
+ Node child = node.getFirstChild();
+ if (child != null)
+ {
+ hasChildren = true;
+ out.print('>');
+
+ while (child != null)
+ {
+ print(child, namespaceStack, out, xmlEncoding);
+ child = child.getNextSibling();
+ }
+ }
+ else
+ {
+ hasChildren = false;
+ out.print("/>");
+ }
+ break;
+ }
+
+ case Node.ENTITY_REFERENCE_NODE :
+ {
+ out.print('&');
+ out.print(node.getNodeName());
+ out.print(';');
+ break;
+ }
+
+ case Node.CDATA_SECTION_NODE :
+ {
+ out.print("");
+ break;
+ }
+
+ case Node.TEXT_NODE :
+ {
+ out.print(normalize(node.getNodeValue()));
+ break;
+ }
+
+ case Node.COMMENT_NODE :
+ {
+ out.print("");
+ break;
+ }
+
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ {
+ out.print("");
+ out.print(node.getNodeName());
+
+ String data = node.getNodeValue();
+
+ if (data != null && data.length() > 0)
+ {
+ out.print(' ');
+ out.print(data);
+ }
+
+ out.println("?>");
+ break;
+ }
+ }
+
+ if (type == Node.ELEMENT_NODE && hasChildren == true)
+ {
+ out.print("");
+ out.print(node.getNodeName());
+ out.print('>');
+ hasChildren = false;
+ }
+ }
+
+ public static String java2XMLEncoding(String javaEnc)
+ {
+ return (String)xmlEncodingMap.get(javaEnc);
+ }
+
+
+ private static void printNamespaceDecl(Node node,
+ ObjectRegistry namespaceStack,
+ PrintWriter out)
+ {
+ switch (node.getNodeType())
+ {
+ case Node.ATTRIBUTE_NODE :
+ {
+ printNamespaceDecl(((Attr)node).getOwnerElement(), node,
+ namespaceStack, out);
+ break;
+ }
+
+ case Node.ELEMENT_NODE :
+ {
+ printNamespaceDecl((Element)node, node, namespaceStack, out);
+ break;
+ }
+ }
+ }
+
+ private static void printNamespaceDecl(Element owner, Node node,
+ ObjectRegistry namespaceStack,
+ PrintWriter out)
+ {
+ String namespaceURI = node.getNamespaceURI();
+ String prefix = node.getPrefix();
+
+ if (!(namespaceURI.equals(NS_URI_XMLNS) && prefix.equals("xmlns")))
+ {
+ if (DOMUtils.getAttributeNS(owner, NS_URI_XMLNS, prefix) == null)
+ {
+ out.print(" xmlns:" + prefix + "=\"" + namespaceURI + '\"');
+ }
+ }
+ else
+ {
+ prefix = node.getLocalName();
+ namespaceURI = node.getNodeValue();
+ }
+
+ namespaceStack.register(prefix, namespaceURI);
+ }
+
+ private static String normalize(String s)
+ {
+ StringBuffer str = new StringBuffer();
+ int len = (s != null) ? s.length() : 0;
+
+ for (int i = 0; i < len; i++)
+ {
+ char ch = s.charAt(i);
+
+ switch (ch)
+ {
+ case '<' :
+ {
+ str.append("<");
+ break;
+ }
+ case '>' :
+ {
+ str.append(">");
+ break;
+ }
+ case '&' :
+ {
+ str.append("&");
+ break;
+ }
+ case '"' :
+ {
+ str.append(""");
+ break;
+ }
+ case '\n' :
+ {
+ if (i > 0)
+ {
+ char lastChar = str.charAt(str.length() - 1);
+
+ if (lastChar != '\r')
+ {
+ str.append(StringUtils.lineSeparator);
+ }
+ else
+ {
+ str.append('\n');
+ }
+ }
+ else
+ {
+ str.append(StringUtils.lineSeparator);
+ }
+ break;
+ }
+ default :
+ {
+ str.append(ch);
+ }
+ }
+ }
+
+ return (str.toString());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/util/xml/DOMUtils.java b/src/main/java/com/ibm/wsdl/util/xml/DOMUtils.java
new file mode 100644
index 0000000..6985679
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/util/xml/DOMUtils.java
@@ -0,0 +1,605 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl.util.xml;
+
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+public class DOMUtils {
+ /**
+ * The namespaceURI represented by the prefix xmlns
.
+ */
+ private static String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/";
+
+ private static final String ATTR_XMLNS = "xmlns";
+
+ /**
+ * Returns a list of attributes of an element. Returns an
+ * empty list if the element has no attributes. Does not
+ * include namespace declarations.
+ *
+ * @param el Element whose attributes are returned
+ * @return the List of Attr
+ */
+ static public List getAttributes (Element el) {
+ String nodename, prefix = null;
+ List attrs = new Vector();
+ NamedNodeMap attrMap = el.getAttributes();
+ for(int i = 0; i < attrMap.getLength(); i++)
+ {
+ nodename = attrMap.item(i).getNodeName();
+ prefix = attrMap.item(i).getPrefix();
+
+ if (ATTR_XMLNS.equals(nodename) || ATTR_XMLNS.equals(prefix))
+ {
+ //ignore namespace declarations
+ continue;
+ }
+ else
+ {
+ attrs.add(attrMap.item(i));
+ }
+ }
+
+ return attrs;
+ }
+
+ /**
+ * Returns the value of an attribute of an element. Returns null
+ * if the attribute is not found (whereas Element.getAttribute
+ * returns "" if an attrib is not found). This method should be
+ * used for elements that support extension attributes because it
+ * does not track unexpected attributes.
+ *
+ * @param el Element whose attrib is looked for
+ * @param attrName name of attribute to look for
+ * @return the attribute value
+ */
+ static public String getAttribute (Element el, String attrName) {
+ String sRet = null;
+ Attr attr = el.getAttributeNode(attrName);
+
+ if (attr != null) {
+ sRet = attr.getValue();
+ }
+ return sRet;
+ }
+
+ /**
+ * Returns the value of an attribute of an element. Returns null
+ * if the attribute is not found (whereas Element.getAttribute
+ * returns "" if an attrib is not found). This method should be
+ * used for elements that do not support extension attributes
+ * because it tracks the element's remaining attributes so that
+ * eventually any unexpected attributes can be identified.
+ *
+ * @param el Element whose attrib is looked for
+ * @param attrName name of attribute to look for
+ * @param remainingAttrs List of remaining attributes
+ * @return the attribute value
+ */
+ static public String getAttribute (Element el, String attrName, List remainingAttrs) {
+ String sRet = null;
+ Attr attr = el.getAttributeNode(attrName);
+
+ if (attr != null) {
+ sRet = attr.getValue();
+ remainingAttrs.remove(attr);
+ }
+ return sRet;
+ }
+
+ /**
+ * Returns the value of an attribute of an element. Returns null
+ * if the attribute is not found (whereas Element.getAttributeNS
+ * returns "" if an attrib is not found).
+ *
+ * @param el Element whose attrib is looked for
+ * @param namespaceURI namespace URI of attribute to look for
+ * @param localPart local part of attribute to look for
+ * @return the attribute value
+ */
+ static public String getAttributeNS (Element el,
+ String namespaceURI,
+ String localPart) {
+ String sRet = null;
+ Attr attr = el.getAttributeNodeNS (namespaceURI, localPart);
+
+ if (attr != null) {
+ sRet = attr.getValue ();
+ }
+
+ return sRet;
+ }
+
+ /**
+ * Concat all the text and cdata node children of this elem and return
+ * the resulting text.
+ *
+ * @param parentEl the element whose cdata/text node values are to
+ * be combined.
+ * @return the concatanated string.
+ */
+ static public String getChildCharacterData (Element parentEl) {
+ if (parentEl == null) {
+ return null;
+ }
+ Node tempNode = parentEl.getFirstChild();
+ StringBuffer strBuf = new StringBuffer();
+ CharacterData charData;
+
+ while (tempNode != null) {
+ switch (tempNode.getNodeType()) {
+ case Node.TEXT_NODE :
+ case Node.CDATA_SECTION_NODE : charData = (CharacterData)tempNode;
+ strBuf.append(charData.getData());
+ break;
+ }
+ tempNode = tempNode.getNextSibling();
+ }
+ return strBuf.toString();
+ }
+
+ /**
+ * Return the first child element of the given element. Null if no
+ * children are found.
+ *
+ * @param elem Element whose child is to be returned
+ * @return the first child element.
+ */
+ public static Element getFirstChildElement (Element elem) {
+ for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {
+ if (n.getNodeType () == Node.ELEMENT_NODE) {
+ return (Element) n;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the next sibling element of the given element. Null if no
+ * more sibling elements are found.
+ *
+ * @param elem Element whose sibling element is to be returned
+ * @return the next sibling element.
+ */
+ public static Element getNextSiblingElement (Element elem) {
+ for (Node n = elem.getNextSibling (); n != null; n = n.getNextSibling ()) {
+ if (n.getNodeType () == Node.ELEMENT_NODE) {
+ return (Element) n;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the first child element of the given element which has the
+ * given attribute with the given value.
+ *
+ * @param elem the element whose children are to be searched
+ * @param attrName the attrib that must be present
+ * @param attrValue the desired value of the attribute
+ *
+ * @return the first matching child element.
+ */
+ public static Element findChildElementWithAttribute (Element elem,
+ String attrName,
+ String attrValue) {
+ for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {
+ if (n.getNodeType () == Node.ELEMENT_NODE) {
+ if (attrValue.equals (DOMUtils.getAttribute ((Element) n, attrName))) {
+ return (Element) n;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Count number of children of a certain type of the given element.
+ *
+ * @param elem the element whose kids are to be counted
+ *
+ * @return the number of matching kids.
+ */
+ public static int countKids (Element elem, short nodeType) {
+ int nkids = 0;
+ for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {
+ if (n.getNodeType () == nodeType) {
+ nkids++;
+ }
+ }
+ return nkids;
+ }
+
+ /**
+ * Given a prefix and a node, return the namespace URI that the prefix
+ * has been associated with. This method is useful in resolving the
+ * namespace URI of attribute values which are being interpreted as
+ * QNames. If prefix is null, this method will return the default
+ * namespace.
+ *
+ * @param context the starting node (looks up recursively from here)
+ * @param prefix the prefix to find an xmlns:prefix=uri for
+ *
+ * @return the namespace URI or null if not found
+ */
+ public static String getNamespaceURIFromPrefix (Node context,
+ String prefix) {
+ short nodeType = context.getNodeType ();
+ Node tempNode = null;
+
+ switch (nodeType)
+ {
+ case Node.ATTRIBUTE_NODE :
+ {
+ tempNode = ((Attr) context).getOwnerElement ();
+ break;
+ }
+ case Node.ELEMENT_NODE :
+ {
+ tempNode = context;
+ break;
+ }
+ default :
+ {
+ tempNode = context.getParentNode ();
+ break;
+ }
+ }
+
+ while (tempNode != null && tempNode.getNodeType () == Node.ELEMENT_NODE)
+ {
+ Element tempEl = (Element) tempNode;
+ String namespaceURI = (prefix == null)
+ ? getAttribute (tempEl, "xmlns")
+ : getAttributeNS (tempEl, NS_URI_XMLNS, prefix);
+
+ if (namespaceURI != null)
+ {
+ return namespaceURI;
+ }
+ else
+ {
+ tempNode = tempEl.getParentNode ();
+ }
+ }
+
+ return null;
+ }
+
+ public static QName getQName(String prefixedValue,
+ Element contextEl,
+ Definition def)
+ throws WSDLException
+ {
+ int index = prefixedValue.indexOf(':');
+ String prefix = (index != -1)
+ ? prefixedValue.substring(0, index)
+ : null;
+ String localPart = prefixedValue.substring(index + 1);
+ String namespaceURI = getNamespaceURIFromPrefix(contextEl, prefix);
+
+ if (namespaceURI != null)
+ {
+ registerUniquePrefix(prefix, namespaceURI, def);
+
+ return new QName(namespaceURI, localPart);
+ }
+ else
+ {
+ String faultCode = (prefix == null)
+ ? WSDLException.NO_PREFIX_SPECIFIED
+ : WSDLException.UNBOUND_PREFIX;
+
+ WSDLException wsdlExc = new WSDLException(faultCode,
+ "Unable to determine " +
+ "namespace of '" +
+ prefixedValue + "'.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(contextEl));
+
+ throw wsdlExc;
+ }
+ }
+
+ public static void registerUniquePrefix(String prefix,
+ String namespaceURI,
+ Definition def)
+ {
+ String tempNSUri = def.getNamespace(prefix);
+
+ //Check if the prefix and namespace are already registered.
+ if (tempNSUri != null && tempNSUri.equals(namespaceURI))
+ {
+ return;
+ }
+
+ /* Check if the namespace is already registered with some other prefix,
+ * in which case do not register it again with this prefix. The existing
+ * prefix/namespace association will suffice (i.e. semantically equivalent).
+ */
+ Collection nSpaces = def.getNamespaces().values();
+ if(nSpaces.contains(namespaceURI))
+ {
+ return;
+ }
+
+ while (tempNSUri != null && !tempNSUri.equals(namespaceURI))
+ {
+ prefix = (prefix != null ? prefix + "_" : "_");
+ tempNSUri = def.getNamespace(prefix);
+ }
+
+ def.addNamespace(prefix, namespaceURI);
+ }
+
+ /**
+ * This method should be used for elements that support extension attributes
+ * because it does not track the remaining attributes to test for unexpected
+ * attributes.
+ */
+ public static QName getQualifiedAttributeValue(Element el,
+ String attrName,
+ String elDesc,
+ boolean isRequired,
+ Definition def)
+ throws WSDLException
+ {
+ String attrValue = DOMUtils.getAttribute(el, attrName);
+
+ if (attrValue != null)
+ {
+ return getQName(attrValue, el, def);
+ }
+ else if (isRequired)
+ {
+ WSDLException wsdlExc = new WSDLException(WSDLException.INVALID_WSDL,
+ "The '" + attrName +
+ "' attribute must be " +
+ "specified for every " +
+ elDesc + " element.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(el));
+
+ throw wsdlExc;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * This method should be used for elements that do not support extension attributes
+ * because it tracks the remaining attributes so that eventually any
+ * unexpected attributes can be identified.
+ */
+ public static QName getQualifiedAttributeValue(Element el,
+ String attrName,
+ String elDesc,
+ boolean isRequired,
+ Definition def,
+ List remainingAttrs)
+ throws WSDLException
+ {
+ String attrValue = null;
+
+ attrValue = DOMUtils.getAttribute(el, attrName, remainingAttrs);
+
+ if (attrValue != null)
+ {
+ return getQName(attrValue, el, def);
+ }
+ else if (isRequired)
+ {
+ WSDLException wsdlExc = new WSDLException(WSDLException.INVALID_WSDL,
+ "The '" + attrName +
+ "' attribute must be " +
+ "specified for every " +
+ elDesc + " element.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(el));
+
+ throw wsdlExc;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public static void throwWSDLException(Element location) throws WSDLException
+ {
+ String elName = QNameUtils.newQName(location).toString();
+
+ WSDLException wsdlExc = new WSDLException(WSDLException.INVALID_WSDL,
+ "Encountered unexpected element '" +
+ elName + "'.");
+
+ wsdlExc.setLocation(XPathUtils.getXPathExprFromNode(location));
+
+ throw wsdlExc;
+ }
+
+ public static void printAttribute(String name,
+ String value,
+ PrintWriter pw)
+ {
+ if (value != null)
+ {
+ pw.print(' ' + name + "=\"" + cleanString(value) + '\"');
+ }
+ }
+
+ /**
+ * Prints attributes with qualified names.
+ */
+ public static void printQualifiedAttribute(QName name,
+ String value,
+ Definition def,
+ PrintWriter pw)
+ throws WSDLException
+ {
+ if (name != null)
+ {
+ printAttribute(getQualifiedValue(name.getNamespaceURI(),
+ name.getLocalPart(),
+ def),
+ value,
+ pw);
+ }
+ }
+
+ public static void printQualifiedAttribute(QName name,
+ QName value,
+ Definition def,
+ PrintWriter pw)
+ throws WSDLException
+ {
+ if (value != null)
+ {
+ printAttribute(getQualifiedValue(name.getNamespaceURI(),
+ name.getLocalPart(),
+ def),
+ getQualifiedValue(value.getNamespaceURI(),
+ value.getLocalPart(),
+ def),
+ pw);
+ }
+ }
+
+ public static void printQualifiedAttribute(String name,
+ QName value,
+ Definition def,
+ PrintWriter pw)
+ throws WSDLException
+ {
+ if (value != null)
+ {
+ printAttribute(name,
+ getQualifiedValue(value.getNamespaceURI(),
+ value.getLocalPart(),
+ def),
+ pw);
+ }
+ }
+
+ public static String getQualifiedValue(String namespaceURI,
+ String localPart,
+ Definition def)
+ throws WSDLException
+ {
+ String prefix = null;
+
+ if (namespaceURI != null && !namespaceURI.equals(""))
+ {
+ prefix = getPrefix(namespaceURI, def);
+ }
+
+ return ((prefix != null && !prefix.equals(""))
+ ? prefix + ":"
+ : "") + localPart;
+ }
+
+ public static String getPrefix(String namespaceURI,
+ Definition def)
+ throws WSDLException
+ {
+ String prefix = def.getPrefix(namespaceURI);
+
+ if (prefix == null)
+ {
+ throw new WSDLException(WSDLException.OTHER_ERROR,
+ "Can't find prefix for '" + namespaceURI +
+ "'. Namespace prefixes must be set on the" +
+ " Definition object using the " +
+ "addNamespace(...) method.");
+ }
+
+ return prefix;
+ }
+
+ public static String cleanString(String orig)
+ {
+ if (orig == null)
+ {
+ return "";
+ }
+
+ StringBuffer strBuf = new StringBuffer();
+ char[] chars = orig.toCharArray();
+ boolean inCDATA = false;
+
+ for (int i = 0; i < chars.length; i++)
+ {
+ if (!inCDATA)
+ {
+ switch (chars[i])
+ {
+ case '&' : strBuf.append("&");
+ break;
+ case '\"' : strBuf.append(""");
+ break;
+ case '\'' : strBuf.append("'");
+ break;
+ case '<' :
+ {
+ if (chars.length >= i + 9)
+ {
+ String tempStr = new String(chars, i, 9);
+
+ if (tempStr.equals("' : strBuf.append(">");
+ break;
+ default : strBuf.append(chars[i]);
+ break;
+ }
+ }
+ else
+ {
+ strBuf.append(chars[i]);
+
+ if (chars[i] == '>'
+ && chars[i - 1] == ']'
+ && chars[i - 2] == ']')
+ {
+ inCDATA = false;
+ }
+ }
+ }
+
+ return strBuf.toString();
+ }
+}
+
diff --git a/src/main/java/com/ibm/wsdl/util/xml/QNameUtils.java b/src/main/java/com/ibm/wsdl/util/xml/QNameUtils.java
new file mode 100644
index 0000000..6e61d46
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/util/xml/QNameUtils.java
@@ -0,0 +1,28 @@
+/*
+ * (c) Copyright IBM Corp 2002, 2005
+ */
+
+package com.ibm.wsdl.util.xml;
+
+import javax.xml.namespace.*;
+import org.w3c.dom.*;
+
+public class QNameUtils
+{
+ public static boolean matches(QName qname, Node node)
+ {
+ return (node != null && qname.equals(newQName(node)));
+ }
+
+ public static QName newQName(Node node)
+ {
+ if (node != null)
+ {
+ return new QName(node.getNamespaceURI(), node.getLocalName());
+ }
+ else
+ {
+ return new QName(null, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/util/xml/XPathUtils.java b/src/main/java/com/ibm/wsdl/util/xml/XPathUtils.java
new file mode 100644
index 0000000..fff807f
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/util/xml/XPathUtils.java
@@ -0,0 +1,197 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package com.ibm.wsdl.util.xml;
+
+import java.util.Vector;
+import org.w3c.dom.*;
+
+/**
+ * A XPathUtils
...
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
+ */
+public class XPathUtils
+{
+ private static Node getPreviousTypedNode(Node node, short nodeType)
+ {
+ node = node.getPreviousSibling();
+
+ while (node != null && node.getNodeType() != nodeType)
+ {
+ node = node.getPreviousSibling();
+ }
+
+ return node;
+ }
+
+ private static Node getNextTypedNode(Node node, short nodeType)
+ {
+ node = node.getNextSibling();
+
+ while (node != null && node.getNodeType() != nodeType)
+ {
+ node = node.getNextSibling();
+ }
+
+ return node;
+ }
+
+ private static String getValue(Node node, short nodeType)
+ {
+ switch (nodeType)
+ {
+ case Node.ELEMENT_NODE :
+ return ((Element)node).getTagName();
+
+ case Node.TEXT_NODE :
+ return ((Text)node).getData();
+
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ return ((ProcessingInstruction)node).getData();
+
+ default :
+ return "";
+ }
+ }
+
+ private static short getNodeType(Node node)
+ {
+ return (node != null ? node.getNodeType() : -1);
+ }
+
+ private static String getXPathFromVector(Vector path)
+ {
+ StringBuffer strBuf = new StringBuffer();
+ int length = path.size();
+
+ for (int i = 0; i < length; i++)
+ {
+ Node tempNode = (Node)path.elementAt(i);
+ short nodeType = getNodeType(tempNode);
+ String targetValue = getValue(tempNode, nodeType);
+ int position = 1;
+
+ tempNode = getPreviousTypedNode(tempNode, nodeType);
+
+ while (tempNode != null)
+ {
+ if (nodeType == Node.ELEMENT_NODE)
+ {
+ if (getValue(tempNode, nodeType).equals(targetValue))
+ {
+ position++;
+ }
+ }
+ else
+ {
+ position++;
+ }
+
+ tempNode = getPreviousTypedNode(tempNode, nodeType);
+ }
+
+ boolean hasMatchingSiblings = (position > 1);
+
+ if (!hasMatchingSiblings)
+ {
+ tempNode = (Node)path.elementAt(i);
+ tempNode = getNextTypedNode(tempNode, nodeType);
+
+ while (!hasMatchingSiblings && tempNode != null)
+ {
+ if (nodeType == Node.ELEMENT_NODE)
+ {
+ if (getValue(tempNode, nodeType).equals(targetValue))
+ {
+ hasMatchingSiblings = true;
+ }
+ else
+ {
+ tempNode = getNextTypedNode(tempNode, nodeType);
+ }
+ }
+ else
+ {
+ hasMatchingSiblings = true;
+ }
+ }
+ }
+
+ String step;
+
+ switch (nodeType)
+ {
+ case Node.TEXT_NODE :
+ step = "text()";
+ break;
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ step = "processing-instruction()";
+ break;
+ default :
+ step = targetValue;
+ break;
+ }
+
+ if (step != null && step.length() > 0)
+ {
+ strBuf.append('/' + step);
+ }
+
+ if (hasMatchingSiblings)
+ {
+ strBuf.append("[" + position + "]");
+ }
+ }
+
+ return strBuf.toString();
+ }
+
+ private static Vector getVectorPathFromNode(Node node)
+ {
+ Vector path = new Vector();
+
+ while (node != null)
+ {
+ path.insertElementAt(node, 0);
+ node = node.getParentNode();
+ }
+
+ return path;
+ }
+
+ /**
+ * Generates an XPath expression that will return only the given node as its
+ * result. This method only works for element, text, document and PI nodes.
+ *
+ * @param node the node to generate an XPath expression for. This node must
+ * be an element node, a text node, a document node, or a processing
+ * instruction node.
+ * @return an XPath expression that will return only the given node as its
+ * result.
+ * @exception IllegalArgumentException if the given node is not an element,
+ * text, document or PI node.
+ */
+ public static String getXPathExprFromNode(Node node)
+ throws IllegalArgumentException
+ {
+ short nodeType = getNodeType(node);
+
+ switch (nodeType)
+ {
+ case Node.ELEMENT_NODE :
+ case Node.TEXT_NODE :
+ case Node.PROCESSING_INSTRUCTION_NODE :
+ return getXPathFromVector(getVectorPathFromNode(node));
+
+ case Node.DOCUMENT_NODE :
+ return "/";
+
+ default :
+ throw new IllegalArgumentException("Only works for element, text, " +
+ "document, and PI nodes.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ibm/wsdl/xml/WSDLReaderImpl.java b/src/main/java/com/ibm/wsdl/xml/WSDLReaderImpl.java
new file mode 100644
index 0000000..ecf40e5
--- /dev/null
+++ b/src/main/java/com/ibm/wsdl/xml/WSDLReaderImpl.java
@@ -0,0 +1,2430 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package com.ibm.wsdl.xml;
+
+import java.io.*;
+import java.net.*;
+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.*;
+
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.extensions.schema.SchemaReference;
+import com.ibm.wsdl.extensions.schema.SchemaConstants;
+
+
+/**
+ * This class describes a collection of methods
+ * that enable conversion of a WSDL document (in XML,
+ * following the WSDL schema described in the WSDL
+ * specification) into a WSDL model.
+ *
+ * @author Matthew J. Duftler
+ * @author Nirmal Mukhi
+ */
+public class WSDLReaderImpl implements WSDLReader
+{
+ // Used for determining the style of operations.
+ private static final List STYLE_ONE_WAY =
+ Arrays.asList(new String[]{Constants.ELEM_INPUT});
+ private static final List STYLE_REQUEST_RESPONSE =
+ Arrays.asList(new String[]{Constants.ELEM_INPUT, Constants.ELEM_OUTPUT});
+ private static final List STYLE_SOLICIT_RESPONSE =
+ Arrays.asList(new String[]{Constants.ELEM_OUTPUT, Constants.ELEM_INPUT});
+ private static final List STYLE_NOTIFICATION =
+ Arrays.asList(new String[]{Constants.ELEM_OUTPUT});
+
+ protected boolean verbose = true;
+ protected boolean importDocuments = true;
+ protected boolean parseSchema = true;
+ protected ExtensionRegistry extReg = null;
+ protected String factoryImplName = null;
+ protected WSDLLocator loc = null;
+ protected WSDLFactory factory = null;
+
+ //Contains all schemas used by this wsdl, either in-line or nested
+ //via wsdl imports or schema imports, includes or redefines
+ protected Map allSchemas = new Hashtable();
+
+
+ /**
+ * Sets the specified feature to the specified value.
+ *
+ *
+ *
+ *
+ * Name
+ * Description
+ * Default Value
+ *
+ *
+ *
+ * If set to true, status messages will be displayed.
+ *
+ *
+ *
+ *
+ * If set to true, imported WSDL documents will be
+ * retrieved and processed.
+ *
+ *
+ *
+ *
+ * If set to true, the schema documents inlined and import directly
+ * or indrectly will be retrieved as javax.wsdl.extensions.schema.Schema
+ * objects and referred to in the Definition. This is the default (only)
+ * behaviour from JWSDL 1.2. Which is why the default for this feature is true.
+ * However, prior to JWSDL 1.2 the only behaviour was not to parse the schema
+ * files. Setting this feature to false will prevent the schemas being parsed.
+ *
+ *
+ *
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.");
+ }
+ }
+}
diff --git a/src/main/java/javax/wsdl/Binding.java b/src/main/java/javax/wsdl/Binding.java
new file mode 100644
index 0000000..d3a6811
--- /dev/null
+++ b/src/main/java/javax/wsdl/Binding.java
@@ -0,0 +1,127 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+import javax.xml.namespace.*;
+
+/**
+ * This interface represents a port type binding and describes the
+ * protocol required for using operations in a port type.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Binding extends WSDLElement
+{
+ /**
+ * Set the name of this binding.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name);
+
+ /**
+ * Get the name of this binding.
+ *
+ * @return the binding name
+ */
+ public QName getQName();
+
+ /**
+ * Set the port type this is a binding for.
+ *
+ * @param portType the port type associated with this binding
+ */
+ public void setPortType(PortType portType);
+
+ /**
+ * Get the port type this is a binding for.
+ *
+ * @return the associated port type
+ */
+ public PortType getPortType();
+
+ /**
+ * Add an operation binding to binding.
+ *
+ * @param bindingOperation the operation binding to be added
+ */
+ public void addBindingOperation(BindingOperation bindingOperation);
+
+ /**
+ * Get the specified operation binding. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ * :none
" for the input or output message name parameter.
+ * :none
" rather than null to search for
+ * unnamed input or output messages is necessary to retain backward compatibility
+ * with earlier versions of the JWSDL API, which defined a null value to
+ * mean 'ignore this parameter'.
+ * The colon in ":none
" is to avoid name clashes with input or output
+ * message names, which must be of type NCName (i.e. they cannot contain colons).
+ *
+ * @param name the name of the desired operation binding.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the corresponding operation binding, or null if there wasn't
+ * any matching operation binding
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ */
+ public BindingOperation getBindingOperation(String name,
+ String inputName,
+ String outputName);
+
+ /**
+ * Get all the operation bindings defined here.
+ */
+ public List getBindingOperations();
+
+ /**
+ * Remove the specified operation binding. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ * getBindingOperation
method.
+ *
+ * @param name the name of the operation binding to be removed.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the binding operation which was removed, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ *
+ * @see #getBindingOperation(String, String, String)
+ */
+ public BindingOperation removeBindingOperation(String name,
+ String inputName,
+ String outputName);
+
+ public void setUndefined(boolean isUndefined);
+
+ public boolean isUndefined();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/BindingFault.java b/src/main/java/javax/wsdl/BindingFault.java
new file mode 100644
index 0000000..58c0640
--- /dev/null
+++ b/src/main/java/javax/wsdl/BindingFault.java
@@ -0,0 +1,31 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents a fault binding. That is, it contains
+ * the information that would be specified in a fault element
+ * contained within an operation element contained within a
+ * binding element.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface BindingFault extends WSDLElement
+{
+ /**
+ * Set the name of this fault binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this fault binding.
+ *
+ * @return the fault binding name
+ */
+ public String getName();
+
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/BindingInput.java b/src/main/java/javax/wsdl/BindingInput.java
new file mode 100644
index 0000000..5d1d947
--- /dev/null
+++ b/src/main/java/javax/wsdl/BindingInput.java
@@ -0,0 +1,31 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents an input binding. That is, it contains
+ * the information that would be specified in an input element
+ * contained within an operation element contained within a
+ * binding element.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface BindingInput extends WSDLElement
+{
+ /**
+ * Set the name of this input binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this input binding.
+ *
+ * @return the input binding name
+ */
+ public String getName();
+
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/BindingOperation.java b/src/main/java/javax/wsdl/BindingOperation.java
new file mode 100644
index 0000000..5231ecc
--- /dev/null
+++ b/src/main/java/javax/wsdl/BindingOperation.java
@@ -0,0 +1,106 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+
+/**
+ * This interface represents a WSDL operation binding.
+ * That is, it holds the information that would be
+ * specified in the operation element contained within
+ * a binding element.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface BindingOperation extends WSDLElement
+{
+ /**
+ * Set the name of this operation binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this operation binding.
+ *
+ * @return the operation binding name
+ */
+ public String getName();
+
+ /**
+ * Set the operation that this operation binding binds.
+ *
+ * @param operation the operation this operation binding binds
+ */
+ public void setOperation(Operation operation);
+
+ /**
+ * Get the operation that this operation binding binds.
+ *
+ * @return the operation that this operation binding binds
+ */
+ public Operation getOperation();
+
+ /**
+ * Set the input binding for this operation binding.
+ *
+ * @param bindingInput the new input binding
+ */
+ public void setBindingInput(BindingInput bindingInput);
+
+ /**
+ * Get the input binding for this operation binding.
+ *
+ * @return the input binding
+ */
+ public BindingInput getBindingInput();
+
+ /**
+ * Set the output binding for this operation binding.
+ *
+ * @param bindingOutput the new output binding
+ */
+ public void setBindingOutput(BindingOutput bindingOutput);
+
+ /**
+ * Get the output binding for this operation binding.
+ *
+ * @return the output binding for the operation binding
+ */
+ public BindingOutput getBindingOutput();
+
+ /**
+ * Add a fault binding.
+ *
+ * @param bindingFault the new fault binding
+ */
+ public void addBindingFault(BindingFault bindingFault);
+
+ /**
+ * Remove a fault binding.
+ *
+ * @param name the name of the fault binding to be removed
+ * @return the BindingFault which was removed
+ */
+ public BindingFault removeBindingFault(String name);
+
+ /**
+ * Get the specified fault binding.
+ *
+ * @param name the name of the desired fault binding.
+ * @return the corresponding fault binding, or null if there wasn't
+ * any matching fault binding
+ */
+ public BindingFault getBindingFault(String name);
+
+ /**
+ * Get all the fault bindings associated with this operation binding.
+ *
+ * @return names of fault bindings
+ */
+ public Map getBindingFaults();
+
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/BindingOutput.java b/src/main/java/javax/wsdl/BindingOutput.java
new file mode 100644
index 0000000..4f987b9
--- /dev/null
+++ b/src/main/java/javax/wsdl/BindingOutput.java
@@ -0,0 +1,31 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents an output binding. That is, it contains
+ * the information that would be specified in an output element
+ * contained within an operation element contained within a
+ * binding element.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface BindingOutput extends WSDLElement
+{
+ /**
+ * Set the name of this output binding.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this output binding.
+ *
+ * @return the output binding name
+ */
+ public String getName();
+
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Definition.java b/src/main/java/javax/wsdl/Definition.java
new file mode 100644
index 0000000..4ae9814
--- /dev/null
+++ b/src/main/java/javax/wsdl/Definition.java
@@ -0,0 +1,421 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+import javax.wsdl.extensions.*;
+import javax.xml.namespace.*;
+
+/**
+ * This interface represents a WSDL definition.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Definition extends WSDLElement
+{
+ /**
+ * Set the document base URI of this definition. Can be used to
+ * represent the origin of the Definition, and can be exploited
+ * when resolving relative URIs (e.g. in <import>s).
+ *
+ * @param documentBaseURI the document base URI of this definition
+ */
+ public void setDocumentBaseURI(String documentBaseURI);
+
+ /**
+ * Get the document base URI of this definition.
+ *
+ * @return the document base URI
+ */
+ public String getDocumentBaseURI();
+
+ /**
+ * Set the name of this definition.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name);
+
+ /**
+ * Get the name of this definition.
+ *
+ * @return the definition name
+ */
+ public QName getQName();
+
+ /**
+ * Set the target namespace in which WSDL elements are defined.
+ *
+ * @param targetNamespace the target namespace
+ */
+ public void setTargetNamespace(String targetNamespace);
+
+ /**
+ * Get the target namespace in which the WSDL elements
+ * are defined.
+ *
+ * @return the target namespace
+ */
+ public String getTargetNamespace();
+
+ /**
+ * This is a way to add a namespace association to a definition.
+ * It is similar to adding a namespace prefix declaration to the
+ * top of a <wsdl:definition> element. This has nothing to do
+ * with the <wsdl:import> element; there are separate methods for
+ * dealing with information described by <wsdl:import> elements.
+ *
+ * @param prefix the prefix to use for this namespace (when
+ * rendering this information as XML). Use null or an empty string
+ * to describe the default namespace (i.e. xmlns="...").
+ * @param namespaceURI the namespace URI to associate the prefix
+ * with. If you use null, the namespace association will be removed.
+ */
+ public void addNamespace(String prefix, String namespaceURI);
+
+ /**
+ * Get the namespace URI associated with this prefix. Or null if
+ * there is no namespace URI associated with this prefix. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ * @see #getPrefix(String)
+ */
+ public String getNamespace(String prefix);
+
+ /**
+ * Remove the namespace URI associated with this prefix.
+ *
+ * @param prefix the prefix of the namespace to be removed.
+ * @return the namespace URI which was removed.
+ */
+ public String removeNamespace(String prefix);
+
+ /**
+ * Get a prefix associated with this namespace URI. Or null if
+ * there are no prefixes associated with this namespace URI. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ * @see #getNamespace(String)
+ */
+ public String getPrefix(String namespaceURI);
+
+ /**
+ * Get all namespace associations in this definition. The keys are
+ * the prefixes, and the namespace URIs are the values. This is
+ * unrelated to the <wsdl:import> element.
+ *
+ * @see #addNamespace(String, String)
+ */
+ public Map getNamespaces();
+
+ /**
+ * Set the types section.
+ */
+ public void setTypes(Types types);
+
+ /**
+ * Get the types section.
+ *
+ * @return the types section
+ */
+ public Types getTypes();
+
+ /**
+ * Add an import to this WSDL description.
+ *
+ * @param importDef the import to be added
+ */
+ public void addImport(Import importDef);
+
+ /**
+ * Remove an import from this WSDL description.
+ *
+ * @param importDef the import to be removed
+ * @return the removed Import
+ */
+ public Import removeImport(Import importDef);
+
+ /**
+ * Get the list of imports for the specified namespaceURI.
+ *
+ * @param namespaceURI the namespaceURI associated with the
+ * desired imports.
+ * @return a list of the corresponding imports, or null if
+ * there weren't any matching imports
+ */
+ public List getImports(String namespaceURI);
+
+ /**
+ * Get a map of lists containing all the imports defined here.
+ * The map's keys are the namespaceURIs, and the map's values
+ * are lists. There is one list for each namespaceURI for which
+ * imports have been defined.
+ */
+ public Map getImports();
+
+ /**
+ * Add a message to this WSDL description.
+ *
+ * @param message the message to be added
+ */
+ public void addMessage(Message message);
+
+ /**
+ * Get the specified message. Also checks imported documents.
+ *
+ * @param name the name of the desired message.
+ * @return the corresponding message, or null if there wasn't
+ * any matching message
+ */
+ public Message getMessage(QName name);
+
+ /**
+ * Remove the specified message from this definition.
+ *
+ * @param name the name of the message to remove
+ * @return the message previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Message removeMessage(QName name);
+
+ /**
+ * Get all the messages defined here.
+ */
+ public Map getMessages();
+
+ /**
+ * Add a binding to this WSDL description.
+ *
+ * @param binding the binding to be added
+ */
+ public void addBinding(Binding binding);
+
+ /**
+ * Get the specified binding. Also checks imported documents.
+ *
+ * @param name the name of the desired binding.
+ * @return the corresponding binding, or null if there wasn't
+ * any matching binding
+ */
+ public Binding getBinding(QName name);
+
+ /**
+ * Remove the specified binding from this definition.
+ *
+ * @param name the name of the binding to remove
+ * @return the binding previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Binding removeBinding(QName name);
+
+ /**
+ * Get all the bindings defined in this Definition.
+ */
+ public Map getBindings();
+
+ /**
+ * Get all the bindings defined in this Definition and
+ * those in any imported Definitions down the WSDL tree.
+ */
+ public Map getAllBindings();
+
+ /**
+ * Add a portType to this WSDL description.
+ *
+ * @param portType the portType to be added
+ */
+ public void addPortType(PortType portType);
+
+ /**
+ * Get the specified portType. Also checks imported documents.
+ *
+ * @param name the name of the desired portType.
+ * @return the corresponding portType, or null if there wasn't
+ * any matching portType
+ */
+ public PortType getPortType(QName name);
+
+ /**
+ * Remove the specified portType from this definition.
+ *
+ * @param name the name of the portType to remove
+ * @return the portType previously associated with this qname, if there
+ * was one; may return null
+ */
+ public PortType removePortType(QName name);
+
+ /**
+ * Get all the portTypes defined in this Definition.
+ */
+ public Map getPortTypes();
+
+ /**
+ * Get all the portTypes defined in this Definition and
+ * those in any imported Definitions down the WSDL tree.
+ */
+ public Map getAllPortTypes();
+
+ /**
+ * Add a service to this WSDL description.
+ *
+ * @param service the service to be added
+ */
+ public void addService(Service service);
+
+ /**
+ * Get the specified service. Also checks imported documents.
+ *
+ * @param name the name of the desired service.
+ * @return the corresponding service, or null if there wasn't
+ * any matching service
+ */
+ public Service getService(QName name);
+
+ /**
+ * Remove the specified service from this definition.
+ *
+ * @param name the name of the service to remove
+ * @return the service previously associated with this qname, if there
+ * was one; may return null
+ */
+ public Service removeService(QName name);
+
+ /**
+ * Get all the services defined in this Definition.
+ */
+ public Map getServices();
+
+ /**
+ * Get all the services defined in this Definition and
+ * those in any imported Definitions down the WSDL tree.
+ */
+ public Map getAllServices();
+
+ /**
+ * Create a new binding.
+ *
+ * @return the newly created binding
+ */
+ public Binding createBinding();
+
+ /**
+ * Create a new binding fault.
+ *
+ * @return the newly created binding fault
+ */
+ public BindingFault createBindingFault();
+
+ /**
+ * Create a new binding input.
+ *
+ * @return the newly created binding input
+ */
+ public BindingInput createBindingInput();
+
+ /**
+ * Create a new binding operation.
+ *
+ * @return the newly created binding operation
+ */
+ public BindingOperation createBindingOperation();
+
+ /**
+ * Create a new binding output.
+ *
+ * @return the newly created binding output
+ */
+ public BindingOutput createBindingOutput();
+
+ /**
+ * Create a new fault.
+ *
+ * @return the newly created fault
+ */
+ public Fault createFault();
+
+ /**
+ * Create a new import.
+ *
+ * @return the newly created import
+ */
+ public Import createImport();
+
+ /**
+ * Create a new input.
+ *
+ * @return the newly created input
+ */
+ public Input createInput();
+
+ /**
+ * Create a new message.
+ *
+ * @return the newly created message
+ */
+ public Message createMessage();
+
+ /**
+ * Create a new operation.
+ *
+ * @return the newly created operation
+ */
+ public Operation createOperation();
+
+ /**
+ * Create a new output.
+ *
+ * @return the newly created output
+ */
+ public Output createOutput();
+
+ /**
+ * Create a new part.
+ *
+ * @return the newly created part
+ */
+ public Part createPart();
+
+ /**
+ * Create a new port.
+ *
+ * @return the newly created port
+ */
+ public Port createPort();
+
+ /**
+ * Create a new port type.
+ *
+ * @return the newly created port type
+ */
+ public PortType createPortType();
+
+ /**
+ * Create a new service.
+ *
+ * @return the newly created service
+ */
+ public Service createService();
+
+ /**
+ * Create a new types section.
+ *
+ * @return the newly created types section
+ */
+ public Types createTypes();
+
+ /**
+ * Get a reference to the ExtensionRegistry for this Definition.
+ */
+ public ExtensionRegistry getExtensionRegistry();
+
+ /**
+ * Set the ExtensionRegistry for this Definition.
+ */
+ public void setExtensionRegistry(ExtensionRegistry extReg);
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Fault.java b/src/main/java/javax/wsdl/Fault.java
new file mode 100644
index 0000000..c13d746
--- /dev/null
+++ b/src/main/java/javax/wsdl/Fault.java
@@ -0,0 +1,32 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents a fault message, and contains the name
+ * of the fault and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface Fault extends WSDLElement
+{
+ /**
+ * Set the name of this fault message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this fault message.
+ *
+ * @return the fault message name
+ */
+ public String getName();
+
+ public void setMessage(Message message);
+
+ public Message getMessage();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Import.java b/src/main/java/javax/wsdl/Import.java
new file mode 100644
index 0000000..c29a0c6
--- /dev/null
+++ b/src/main/java/javax/wsdl/Import.java
@@ -0,0 +1,56 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents an import, and may contain a reference
+ * to the imported definition.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface Import extends WSDLElement
+{
+ /**
+ * Set the namespace URI of this import.
+ *
+ * @param namespaceURI the desired namespace URI
+ */
+ public void setNamespaceURI(String namespaceURI);
+
+ /**
+ * Get the namespace URI of this import.
+ */
+ public String getNamespaceURI();
+
+ /**
+ * Set the location URI of this import.
+ *
+ * @param locationURI the desired location URI
+ */
+ public void setLocationURI(String locationURI);
+
+ /**
+ * Get the location URI of this import.
+ */
+ public String getLocationURI();
+
+ /**
+ * This property can be used to hang a referenced Definition,
+ * and the top-level Definition (i.e. the one with the <import>)
+ * will use this Definition when resolving referenced WSDL parts.
+ * This would need to be made into a generic reference to handle
+ * other types of referenced documents.
+ */
+ public void setDefinition(Definition definition);
+
+ /**
+ * This property can be used to hang a referenced Definition,
+ * and the top-level Definition (i.e. the one with the <import>)
+ * will use this Definition when resolving referenced WSDL parts.
+ * This would need to be made into a generic reference to handle
+ * other types of referenced documents.
+ */
+ public Definition getDefinition();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Input.java b/src/main/java/javax/wsdl/Input.java
new file mode 100644
index 0000000..24aa564
--- /dev/null
+++ b/src/main/java/javax/wsdl/Input.java
@@ -0,0 +1,32 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents an input message, and contains the name
+ * of the input and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface Input extends WSDLElement
+{
+ /**
+ * Set the name of this input message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this input message.
+ *
+ * @return the input message name
+ */
+ public String getName();
+
+ public void setMessage(Message message);
+
+ public Message getMessage();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Message.java b/src/main/java/javax/wsdl/Message.java
new file mode 100644
index 0000000..f640e61
--- /dev/null
+++ b/src/main/java/javax/wsdl/Message.java
@@ -0,0 +1,76 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+import javax.xml.namespace.QName;
+
+/**
+ * This interface describes a message used for communication with an operation.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Message extends WSDLElement
+{
+ /**
+ * Set the name of this message.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name);
+
+ /**
+ * Get the name of this message.
+ *
+ * @return the message name
+ */
+ public QName getQName();
+
+ /**
+ * Add a part to this message.
+ *
+ * @param part the part to be added
+ */
+ public void addPart(Part part);
+
+ /**
+ * Get the specified part.
+ *
+ * @param name the name of the desired part.
+ * @return the corresponding part, or null if there wasn't
+ * any matching part
+ */
+ public Part getPart(String name);
+
+ /**
+ * Remove the specified part.
+ *
+ * @param name the name of the part to be removed.
+ * @return the part which was removed
+ */
+ public Part removePart(String name);
+
+ /**
+ * Get all the parts defined here.
+ */
+ public Map getParts();
+
+ /**
+ * Get an ordered list of parts as specified by the partOrder
+ * argument.
+ *
+ * @param partOrder a list of strings, with each string referring
+ * to a part by its name. If this argument is null, the parts are
+ * returned in the order in which they were added to the message.
+ * @return the list of parts
+ */
+ public List getOrderedParts(List partOrder);
+
+ public void setUndefined(boolean isUndefined);
+
+ public boolean isUndefined();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Operation.java b/src/main/java/javax/wsdl/Operation.java
new file mode 100644
index 0000000..fbfc56f
--- /dev/null
+++ b/src/main/java/javax/wsdl/Operation.java
@@ -0,0 +1,130 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+
+/**
+ * This interface represents a WSDL operation.
+ * It includes information on input, output and fault
+ * messages associated with usage of the operation.
+ *
+ * @author Paul Fremantle (pzf@us.ibm.com)
+ * @author Nirmal Mukhi (nmukhi@us.ibm.com)
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface Operation extends WSDLElement
+{
+ /**
+ * Set the name of this operation.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this operation.
+ *
+ * @return the operation name
+ */
+ public String getName();
+
+ /**
+ * Set the input message specification for this operation.
+ *
+ * @param input the new input message
+ */
+ public void setInput(Input input);
+
+ /**
+ * Get the input message specification for this operation.
+ *
+ * @return the input message
+ */
+ public Input getInput();
+
+ /**
+ * Set the output message specification for this operation.
+ *
+ * @param output the new output message
+ */
+ public void setOutput(Output output);
+
+ /**
+ * Get the output message specification for this operation.
+ *
+ * @return the output message specification for the operation
+ */
+ public Output getOutput();
+
+ /**
+ * Add a fault message that must be associated with this
+ * operation.
+ *
+ * @param fault the new fault message
+ */
+ public void addFault(Fault fault);
+
+ /**
+ * Get the specified fault message.
+ *
+ * @param name the name of the desired fault message.
+ * @return the corresponding fault message, or null if there wasn't
+ * any matching message
+ */
+ public Fault getFault(String name);
+
+ /**
+ * Remove the specified fault message.
+ *
+ * @param name the name of the fault message to be removed.
+ * @return the fault message which was removed
+ */
+ public Fault removeFault(String name);
+
+ /**
+ * Get all the fault messages associated with this operation.
+ *
+ * @return names of fault messages
+ */
+ public Map getFaults();
+
+ /**
+ * Set the style for this operation (request-response,
+ * one way, solicit-response or notification).
+ *
+ * @param style the new operation style
+ */
+ public void setStyle(OperationType style);
+
+ /**
+ * Get the operation type.
+ *
+ * @return the operation type
+ */
+ public OperationType getStyle();
+
+ /**
+ * Set the parameter ordering for a request-response,
+ * or solicit-response operation.
+ *
+ * @param parameterOrder a list of named parameters
+ * containing the part names to reflect the desired
+ * order of parameters for RPC-style operations
+ */
+ public void setParameterOrdering(List parameterOrder);
+
+ /**
+ * Get the parameter ordering for this operation.
+ *
+ * @return the parameter ordering, a list consisting
+ * of message part names
+ */
+ public List getParameterOrdering();
+
+ public void setUndefined(boolean isUndefined);
+
+ public boolean isUndefined();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/OperationType.java b/src/main/java/javax/wsdl/OperationType.java
new file mode 100644
index 0000000..f03130e
--- /dev/null
+++ b/src/main/java/javax/wsdl/OperationType.java
@@ -0,0 +1,79 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package javax.wsdl;
+
+import java.io.ObjectStreamException;
+
+/**
+ * This class represents an operation type which can
+ * be one of request-response, solicit response, one way or
+ * notification. This represents a safe way to prevent usage
+ * of invalid values since the only objects of this class available
+ * are the public static instances declared within the class.
+ * Need to figure out if this should be made into an interface.
+ */
+public class OperationType implements java.io.Serializable
+{
+ private final String id;
+ private final int intId;
+
+ private static int counter = 0;
+
+ public static final long serialVersionUID = 1;
+
+ public static OperationType ONE_WAY =
+ new OperationType("ONE_WAY");
+ public static OperationType REQUEST_RESPONSE =
+ new OperationType("REQUEST_RESPONSE");
+ public static OperationType SOLICIT_RESPONSE =
+ new OperationType("SOLICIT_RESPONSE");
+ public static OperationType NOTIFICATION =
+ new OperationType("NOTIFICATION");
+ //If new values of op type are ever added (highly unlikely)
+ //they must be added here, after the existing values. Otherwise
+ //readResolve will return the wrong instances at deserialization.
+
+ private static final OperationType[] INSTANCES =
+ {ONE_WAY, REQUEST_RESPONSE, SOLICIT_RESPONSE, NOTIFICATION};
+
+ private OperationType(String id)
+ {
+ this.id = id;
+ this.intId = counter++;
+ }
+
+ private String getId()
+ {
+ return id;
+ }
+
+ /* The following equals method is not used within wsdl4j but
+ * it is historically part of the jsr110 jwsdl API, so it
+ * will not likely be removed. Although it overloads the
+ * Object.equals method (i.e. it has a different arg) it does
+ * not override it, so Object.equals will still be used by
+ * the readResolve method at deserialization.
+ */
+ public boolean equals(OperationType operationType)
+ {
+ return operationType != null && id.equals(operationType.getId());
+ }
+
+ public String toString()
+ {
+ return id + "," + intId;
+ }
+
+ /* The readResolve method has been added because this class
+ * implements a typesafe enumeration and it is serializable.
+ * This method will ensure that at deserialization the orginal
+ * instances of the enumeration are used, so that Object.equals
+ * and the '==' operator behave as expected.
+ */
+ private Object readResolve() throws ObjectStreamException {
+ return INSTANCES[intId];
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Output.java b/src/main/java/javax/wsdl/Output.java
new file mode 100644
index 0000000..7e67e13
--- /dev/null
+++ b/src/main/java/javax/wsdl/Output.java
@@ -0,0 +1,32 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents an output message, and contains the name
+ * of the output and the message itself.
+ *
+ * @author Matthew J. Duftler
+ */
+public interface Output extends WSDLElement
+{
+ /**
+ * Set the name of this output message.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this output message.
+ *
+ * @return the output message name
+ */
+ public String getName();
+
+ public void setMessage(Message message);
+
+ public Message getMessage();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Part.java b/src/main/java/javax/wsdl/Part.java
new file mode 100644
index 0000000..dcd81ee
--- /dev/null
+++ b/src/main/java/javax/wsdl/Part.java
@@ -0,0 +1,40 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import javax.xml.namespace.*;
+
+/**
+ * This interface represents a message part and contains the part's
+ * name, elementName, typeName, and any extensibility attributes.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Part extends WSDLElement
+{
+ /**
+ * Set the name of this part.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this part.
+ *
+ * @return the part name
+ */
+ public String getName();
+
+ public void setElementName(QName elementName);
+
+ public QName getElementName();
+
+ public void setTypeName(QName typeName);
+
+ public QName getTypeName();
+}
diff --git a/src/main/java/javax/wsdl/Port.java b/src/main/java/javax/wsdl/Port.java
new file mode 100644
index 0000000..2f0bacf
--- /dev/null
+++ b/src/main/java/javax/wsdl/Port.java
@@ -0,0 +1,44 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents a port, an endpoint for the
+ * functionality described by a particular port type.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Port extends WSDLElement
+{
+ /**
+ * Set the name of this port.
+ *
+ * @param name the desired name
+ */
+ public void setName(String name);
+
+ /**
+ * Get the name of this port.
+ *
+ * @return the port name
+ */
+ public String getName();
+
+ /**
+ * Set the binding this port should refer to.
+ *
+ * @param binding the desired binding
+ */
+ public void setBinding(Binding binding);
+
+ /**
+ * Get the binding this port refers to.
+ *
+ * @return the binding associated with this port
+ */
+ public Binding getBinding();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/PortType.java b/src/main/java/javax/wsdl/PortType.java
new file mode 100644
index 0000000..1332051
--- /dev/null
+++ b/src/main/java/javax/wsdl/PortType.java
@@ -0,0 +1,113 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+import javax.xml.namespace.*;
+
+/**
+ * This interface represents a port type. It contains information about
+ * operations associated with this port type.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface PortType extends WSDLElement
+{
+ /**
+ * Set the name of this port type.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name);
+
+ /**
+ * Get the name of this port type.
+ *
+ * @return the port type name
+ */
+ public QName getQName();
+
+ /**
+ * Add an operation to this port type.
+ *
+ * @param operation the operation to be added
+ */
+ public void addOperation(Operation operation);
+
+ /**
+ * Get the specified operation. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ * :none
" for the input or output message name parameter.
+ * :none
" rather than null to search for
+ * unnamed input or output messages is necessary to retain backward compatibility
+ * with earlier versions of the JWSDL API, which defined a null value to
+ * mean 'ignore this parameter'.
+ * The colon in ":none
" is to avoid name clashes with input or output
+ * message names, which must be of type NCName (i.e. they cannot contain colons).
+ *
+ * @param name the name of the desired operation.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the corresponding operation, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ */
+ public Operation getOperation(String name,
+ String inputName,
+ String outputName);
+
+ /**
+ * Get all the operations defined here.
+ */
+ public List getOperations();
+
+ /**
+ * Remove the specified operation. Note that operation names can
+ * be overloaded within a PortType. In case of overloading, the
+ * names of the input and output messages can be used to further
+ * refine the search.
+ * getOperation
method.
+ *
+ * @param name the name of the desired operation.
+ * @param inputName the name of the input message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an input
+ * message without a name.
+ * @param outputName the name of the output message; if this is null
+ * it will be ignored, if this is ":none
" it means search for an output
+ * message without a name.
+ * @return the operation which was removed, or null if there wasn't
+ * any matching operation
+ *
+ * @throws IllegalArgumentException if duplicate operations are found.
+ *
+ * @see #getOperation(String, String, String)
+ */
+ public Operation removeOperation(String name,
+ String inputName,
+ String outputName);
+
+ public void setUndefined(boolean isUndefined);
+
+ public boolean isUndefined();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Service.java b/src/main/java/javax/wsdl/Service.java
new file mode 100644
index 0000000..78d6249
--- /dev/null
+++ b/src/main/java/javax/wsdl/Service.java
@@ -0,0 +1,62 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+import java.util.*;
+import javax.xml.namespace.*;
+
+/**
+ * This interface represents a service, which groups related
+ * ports to provide some functionality.
+ *
+ * @author Paul Fremantle
+ * @author Nirmal Mukhi
+ * @author Matthew J. Duftler
+ */
+public interface Service extends WSDLElement
+{
+ /**
+ * Set the name of this service.
+ *
+ * @param name the desired name
+ */
+ public void setQName(QName name);
+
+ /**
+ * Get the name of this service.
+ *
+ * @return the service name
+ */
+ public QName getQName();
+
+ /**
+ * Add a port to this service.
+ *
+ * @param port the port to be added
+ */
+ public void addPort(Port port);
+
+ /**
+ * Get the specified port.
+ *
+ * @param name the name of the desired port.
+ * @return the corresponding port, or null if there wasn't
+ * any matching port
+ */
+ public Port getPort(String name);
+
+ /**
+ * Remove the specified port.
+ *
+ * @param name the name of the port to be removed.
+ * @return the port which was removed.
+ */
+ public Port removePort(String name);
+
+ /**
+ * Get all the ports defined here.
+ */
+ public Map getPorts();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/Types.java b/src/main/java/javax/wsdl/Types.java
new file mode 100644
index 0000000..89ae962
--- /dev/null
+++ b/src/main/java/javax/wsdl/Types.java
@@ -0,0 +1,14 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+/**
+ * This interface represents the <types> section of a WSDL document.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface Types extends WSDLElement
+{
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/WSDLElement.java b/src/main/java/javax/wsdl/WSDLElement.java
new file mode 100644
index 0000000..96048f9
--- /dev/null
+++ b/src/main/java/javax/wsdl/WSDLElement.java
@@ -0,0 +1,32 @@
+/*
+ * (c) Copyright IBM Corp 2006
+ */
+
+package javax.wsdl;
+
+import javax.wsdl.extensions.AttributeExtensible;
+import javax.wsdl.extensions.ElementExtensible;
+
+import org.w3c.dom.Element;
+
+/**
+ * This interface represents all WSDL Elements
+ */
+public interface WSDLElement extends java.io.Serializable,
+ AttributeExtensible,
+ ElementExtensible
+{
+ /**
+ * Set the documentation element for this document.
+ *
+ * @param docEl the documentation element
+ */
+ public void setDocumentationElement(Element docEl);
+
+ /**
+ * Get the documentation element.
+ *
+ * @return the documentation element
+ */
+ public Element getDocumentationElement();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/WSDLException.java b/src/main/java/javax/wsdl/WSDLException.java
new file mode 100644
index 0000000..2dd2d35
--- /dev/null
+++ b/src/main/java/javax/wsdl/WSDLException.java
@@ -0,0 +1,123 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2006
+ */
+
+package javax.wsdl;
+
+public class WSDLException extends Exception
+{
+ public static final long serialVersionUID = 1;
+
+ public static final String INVALID_WSDL = "INVALID_WSDL";
+ public static final String PARSER_ERROR = "PARSER_ERROR";
+ public static final String OTHER_ERROR = "OTHER_ERROR";
+ public static final String CONFIGURATION_ERROR = "CONFIGURATION_ERROR";
+ public static final String UNBOUND_PREFIX = "UNBOUND_PREFIX";
+ public static final String NO_PREFIX_SPECIFIED = "NO_PREFIX_SPECIFIED";
+
+ private String faultCode = null;
+ private Throwable targetThrowable = null;
+ private String location = null;
+
+ public WSDLException(String faultCode, String msg, Throwable t)
+ {
+ super(msg, t);
+ setFaultCode(faultCode);
+ }
+
+ public WSDLException(String faultCode, String msg)
+ {
+ this(faultCode, msg, null);
+ }
+
+ public void setFaultCode(String faultCode)
+ {
+ this.faultCode = faultCode;
+ }
+
+ public String getFaultCode()
+ {
+ return faultCode;
+ }
+
+ public void setTargetException(Throwable targetThrowable)
+ {
+ this.targetThrowable = targetThrowable;
+ }
+
+ public Throwable getTargetException()
+ {
+ if(targetThrowable == null) return getCause();
+ else return targetThrowable;
+ }
+
+ /**
+ * Set the location using an XPath expression. Used for error messages.
+ *
+ * @param location an XPath expression describing the location where
+ * the exception occurred.
+ */
+ public void setLocation(String location)
+ {
+ this.location = location;
+ }
+
+ /**
+ * Get the location, if one was set. Should be an XPath expression which
+ * is used for error messages.
+ */
+ public String getLocation()
+ {
+ return location;
+ }
+
+ public String getMessage()
+ {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("WSDLException");
+
+ if (location != null)
+ {
+ try
+ {
+ strBuf.append(" (at " + location + ")");
+ }
+ catch (IllegalArgumentException e)
+ {
+ }
+ }
+
+ if (faultCode != null)
+ {
+ strBuf.append(": faultCode=" + faultCode);
+ }
+
+ String thisMsg = super.getMessage();
+ String targetMsg = null;
+ String targetName = null;
+ if(getTargetException() != null)
+ {
+ targetMsg = getTargetException().getMessage();
+ targetName = getTargetException().getClass().getName();
+ }
+
+ if (thisMsg != null
+ && (targetMsg == null || !thisMsg.equals(targetMsg)))
+ {
+ strBuf.append(": " + thisMsg);
+ }
+
+ if (targetName != null)
+ {
+ strBuf.append(": " + targetName);
+ }
+
+ if (targetMsg != null)
+ {
+ strBuf.append(": " + targetMsg);
+ }
+
+ return strBuf.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/extensions/AttributeExtensible.java b/src/main/java/javax/wsdl/extensions/AttributeExtensible.java
new file mode 100644
index 0000000..db040e5
--- /dev/null
+++ b/src/main/java/javax/wsdl/extensions/AttributeExtensible.java
@@ -0,0 +1,78 @@
+/*
+ * (c) Copyright IBM Corp 2004, 2005
+ */
+
+package javax.wsdl.extensions;
+
+import java.util.*;
+import javax.xml.namespace.*;
+
+/**
+ * Classes that implement this interface can contain extensibility
+ * attributes.
+ *
+ * @author Matthew J. Duftler
+ * @author Paul Fremantle
+ */
+public interface AttributeExtensible
+{
+ public static final int NO_DECLARED_TYPE = -1;
+ public static final int STRING_TYPE = 0;
+ public static final int QNAME_TYPE = 1;
+ public static final int LIST_OF_STRINGS_TYPE = 2;
+ public static final int LIST_OF_QNAMES_TYPE = 3;
+
+ /**
+ * Set an extension attribute on this element. Pass in a null value to remove
+ * an extension attribute.
+ *
+ * @param name the extension attribute name
+ * @param value the extension attribute value. Can be a String, a QName, a
+ * List of Strings, or a List of QNames.
+ *
+ * @see #getExtensionAttribute
+ * @see #getExtensionAttributes
+ * @see ExtensionRegistry#registerExtensionAttributeType
+ * @see ExtensionRegistry#queryExtensionAttributeType
+ */
+ public void setExtensionAttribute(QName name, Object value);
+
+ /**
+ * Retrieve an extension attribute from this element. If the extension
+ * attribute is not defined, null is returned.
+ *
+ * @param name the extension attribute name
+ *
+ * @return the value of the extension attribute, or null if
+ * it is not defined. Can be a String, a QName, a List of Strings, or a List
+ * of QNames.
+ *
+ * @see #setExtensionAttribute
+ * @see #getExtensionAttributes
+ * @see ExtensionRegistry#registerExtensionAttributeType
+ * @see ExtensionRegistry#queryExtensionAttributeType
+ */
+ public Object getExtensionAttribute(QName name);
+
+ /**
+ * Get the map containing all the extension attributes defined
+ * on this element. The keys are the qnames of the attributes.
+ *
+ * @return a map containing all the extension attributes defined
+ * on this element
+ *
+ * @see #setExtensionAttribute
+ * @see #getExtensionAttribute
+ * @see ExtensionRegistry#registerExtensionAttributeType
+ * @see ExtensionRegistry#queryExtensionAttributeType
+ */
+ public Map getExtensionAttributes();
+
+ /**
+ * Get the list of local attribute names defined for this element in
+ * the WSDL specification.
+ *
+ * @return a List of Strings, one for each local attribute name
+ */
+ public List getNativeAttributeNames();
+}
diff --git a/src/main/java/javax/wsdl/extensions/ElementExtensible.java b/src/main/java/javax/wsdl/extensions/ElementExtensible.java
new file mode 100644
index 0000000..4e505b9
--- /dev/null
+++ b/src/main/java/javax/wsdl/extensions/ElementExtensible.java
@@ -0,0 +1,39 @@
+/*
+ * (c) Copyright IBM Corp 2004, 2006
+ */
+
+package javax.wsdl.extensions;
+
+import java.util.*;
+import javax.wsdl.extensions.ExtensibilityElement;
+
+/**
+ * Classes that implement this interface can contain extensibility
+ * elements.
+ *
+ * @author John Kaputin
+ */
+public interface ElementExtensible {
+
+ /**
+ * Add an extensibility element.
+ *
+ * @param extElement the extensibility element to be added
+ */
+ public void addExtensibilityElement(ExtensibilityElement extElement);
+
+ /**
+ * Remove an extensibility element.
+ *
+ * @param extElement the extensibility element to be removed
+ * @return the extensibility element which was removed
+ */
+ public ExtensibilityElement removeExtensibilityElement(ExtensibilityElement extElement);
+
+ /**
+ * Get all the extensibility elements defined here.
+ */
+ public List getExtensibilityElements();
+
+
+}
diff --git a/src/main/java/javax/wsdl/extensions/ExtensibilityElement.java b/src/main/java/javax/wsdl/extensions/ExtensibilityElement.java
new file mode 100644
index 0000000..1878e46
--- /dev/null
+++ b/src/main/java/javax/wsdl/extensions/ExtensibilityElement.java
@@ -0,0 +1,42 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package javax.wsdl.extensions;
+
+import javax.xml.namespace.*;
+
+/**
+ * This interface should be implemented by classes intending to represent
+ * extensions.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface ExtensibilityElement
+{
+ /**
+ * Set the type of this extensibility element.
+ *
+ * @param elementType the type
+ */
+ public void setElementType(QName elementType);
+
+ /**
+ * Get the type of this extensibility element.
+ *
+ * @return the extensibility element's type
+ */
+ public QName getElementType();
+
+ /**
+ * Set whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public void setRequired(Boolean required);
+
+ /**
+ * Get whether or not the semantics of this extension
+ * are required. Relates to the wsdl:required attribute.
+ */
+ public Boolean getRequired();
+}
\ No newline at end of file
diff --git a/src/main/java/javax/wsdl/extensions/ExtensionDeserializer.java b/src/main/java/javax/wsdl/extensions/ExtensionDeserializer.java
new file mode 100644
index 0000000..88060dc
--- /dev/null
+++ b/src/main/java/javax/wsdl/extensions/ExtensionDeserializer.java
@@ -0,0 +1,43 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005
+ */
+
+package javax.wsdl.extensions;
+
+import org.w3c.dom.*;
+import javax.wsdl.*;
+import javax.xml.namespace.*;
+
+/**
+ * This interface should be implemented by classes which deserialize
+ * org.w3c.dom.Elements into extension-specific instances of
+ * ExtensibilityElement.
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ */
+public interface ExtensionDeserializer
+{
+ /**
+ * This method deserializes elements into instances of classes
+ * which implement the ExtensibilityElement interface. The
+ * return value should be explicitly cast to the more-specific
+ * implementing type.
+ *
+ * @param parentType a class object indicating where in the WSDL
+ * document this extensibility element was encountered. For
+ * example, javax.wsdl.Binding.class would be used to indicate
+ * this element was encountered as an immediate child of
+ * a
+ *
+ *
+ *
+ *
+ *
+ * Name
+ * Description
+ * Default Value
+ *
+ *
+ *
+ * If set to true, status messages will be displayed.
+ *
+ *
+ *
+ *
+ * If set to true, imported WSDL documents will be
+ * retrieved and processed.
+ *
+ * QName
class represents the value of a qualified name
+ * as specified in XML
+ * Schema Part2: Datatypes specification.
+ * String.equals
to check equality of localPart
+ * and namespaceURI. Any class that extends QName is required
+ * to satisfy this equality contract.
+ * Object.equals
method.
+ *
+ * @param obj the reference object with which to compare
+ *
+ * @return true
if the given object is identical to this
+ * QName: false
otherwise.
+ */
+ public final boolean equals(Object obj)
+ {
+ if (obj == this)
+ {
+ return true;
+ }
+
+ if (!(obj instanceof QName))
+ {
+ return false;
+ }
+
+ if ((namespaceURI == ((QName)obj).namespaceURI)
+ && (localPart == ((QName)obj).localPart))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns a QName holding the value of the specified String.
+ * Object.hashCode
method.
+ *
+ * @return a hash code value for this Qname object
+ */
+ public final int hashCode()
+ {
+ return namespaceURI.hashCode() ^ localPart.hashCode();
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException,
+ ClassNotFoundException
+ {
+ in.defaultReadObject();
+
+ namespaceURI = namespaceURI.intern();
+ localPart = localPart.intern();
+ if(prefix == null)
+ {
+ //The serialized object did not have a 'prefix'.
+ //i.e. it was serialized from an old version of QName.
+ prefix = emptyString;
+ }
+ else
+ {
+ prefix = prefix.intern();
+ }
+ }
+}
\ No newline at end of file