Hello, There are several factory methods added into the Envelope.java. Patch file name: patch_Envelope.txt. Author: Jerry Boetje Content: ------------------------------------------------------------------------ --- /net/bigbang/vol/vol1/homes/yzhao/xml-soap/java/src/org/apache/soap/Envelope .java Sun Jun 17 02:59:14 2001 +++ Envelope.java Mon Jun 18 15:23:30 2001 @@ -1,341 +1,394 @@ -/* - * The Apache Software License, Version 1.1 - * - * - * Copyright (c) 2000 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "SOAP" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact [EMAIL PROTECTED] - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation and was - * originally based on software copyright (c) 2000, International - * Business Machines, Inc., http://www.apache.org. For more - * information on the Apache Software Foundation, please see - * <http://www.apache.org/>. - */ - -package org.apache.soap; - -import java.io.*; -import java.util.*; -import org.w3c.dom.*; -import org.apache.soap.util.*; -import org.apache.soap.util.xml.*; -import org.apache.soap.encoding.*; -import org.apache.soap.rpc.SOAPContext; - -/** - * An <code>Envelope</code> object represents the contents and semantics - * of an <code><SOAP-ENV:Envelope></code> element. - * - * @author Matthew J. Duftler ([EMAIL PROTECTED]) - * @author Sanjiva Weerawarana ([EMAIL PROTECTED]) - */ -public class Envelope -{ - private Header header = null; - private Body body = null; - private Vector envelopeEntries = null; - private AttributeHandler attrHandler = new AttributeHandler(); - - public Envelope() - { - // Declare the "SOAP-ENV" namespace. - declareNamespace(Constants.NS_PRE_SOAP_ENV, - Constants.NS_URI_SOAP_ENV); - - // Declare the "xsi" namespace. - declareNamespace(Constants.NS_PRE_SCHEMA_XSI, - Constants.NS_URI_CURRENT_SCHEMA_XSI); - - // Declare the "xsd" namespace. - declareNamespace(Constants.NS_PRE_SCHEMA_XSD, - Constants.NS_URI_CURRENT_SCHEMA_XSD); - } - - public void setAttribute(QName attrQName, String value) - { - attrHandler.setAttribute(attrQName, value); - } - - public String getAttribute(QName attrQName) - { - return attrHandler.getAttribute(attrQName); - } - - public void removeAttribute(QName attrQName) - { - attrHandler.removeAttribute(attrQName); - } - - public void declareNamespace(String nsPrefix, String namespaceURI) - { - attrHandler.declareNamespace(nsPrefix, namespaceURI); - } - - public void setHeader(Header header) - { - this.header = header; - } - - public Header getHeader() - { - return header; - } - - public void setBody(Body body) - { - this.body = body; - } - - public Body getBody() - { - return body; - } - - public void setEnvelopeEntries(Vector envelopeEntries) - { - this.envelopeEntries = envelopeEntries; - } - - public Vector getEnvelopeEntries() - { - return envelopeEntries; - } - - /** - * Supported for backward compatibility. - * - * @see #marshall(java.io.Writer, org.apache.soap.util.xml.XMLJavaMappingRegistry, org.apache.soap.rpc.SOAPContext) - */ - public void marshall(Writer sink, XMLJavaMappingRegistry xjmr) - throws IllegalArgumentException, IOException { - marshall(sink, xjmr, new SOAPContext()); - } - - public void marshall(Writer sink, XMLJavaMappingRegistry xjmr, - SOAPContext ctx) - throws IllegalArgumentException, IOException - { - // Initialize the namespace stack. - NSStack nsStack = new NSStack(); - - attrHandler.populateNSStack(nsStack); - - Header header = getHeader(); - Body body = getBody(); - Vector envelopeEntries = getEnvelopeEntries(); - String declEncStyle = getAttribute(new QName( - Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE)); - - // Determine the prefix associated with the NS_URI_SOAP_ENV namespace URI. - String soapEnvNSPrefix = attrHandler.getUniquePrefixFromURI( - Constants.NS_URI_SOAP_ENV, Constants.NS_PRE_SOAP_ENV, nsStack); - - // Write XML declaration - sink.write(Constants.XML_DECL); - - sink.write('<' + soapEnvNSPrefix + ':' + Constants.ELEM_ENVELOPE); - - // Serialize any envelope attributes. - attrHandler.marshall(sink, ctx); - - sink.write('>' + StringUtils.lineSeparator); - - // If there is a header, serialize it. - if (header != null) - { - header.marshall(sink, nsStack, xjmr, ctx); - } - - // There must always be a <SOAP-ENV:Body>. - if (body != null) - { - body.marshall(declEncStyle, sink, nsStack, xjmr, ctx); - } - else - { - throw new IllegalArgumentException("An '" + Constants.Q_ELEM_ENVELOPE + - "' must contain a: '" + - Constants.Q_ELEM_BODY + "'."); - } - - // Serialize any envelope entries (in addition to <SOAP-ENV:Body>). - if (envelopeEntries != null) - { - for (Enumeration e = envelopeEntries.elements(); e.hasMoreElements();) - { - Element envelopeEntryEl = (Element)e.nextElement(); - - Utils.marshallNode(envelopeEntryEl, sink); - - sink.write(StringUtils.lineSeparator); - } - } - - sink.write("</" + soapEnvNSPrefix + ':' + Constants.ELEM_ENVELOPE + - '>' + StringUtils.lineSeparator); - } - - /** - * Supported for backward compatibility. - * - * @see #unmarshall(org.w3c.dom.Node, org.apache.soap.rpc.SOAPContext) - */ - public static Envelope unmarshall(Node src) - throws IllegalArgumentException { - return unmarshall(src, new SOAPContext()); - } - - public static Envelope unmarshall(Node src, SOAPContext ctx) - throws IllegalArgumentException - { - Element root = (Element)src; - Envelope env = new Envelope(); - - if (Constants.Q_ELEM_ENVELOPE.matches(root)) - { - // Deserialize any envelope attributes. - env.attrHandler = AttributeHandler.unmarshall(root, ctx); - - // Examine the subelements of the envelope. - Element headerEl = null; - Element bodyEl = null; - Element tempEl = DOMUtils.getFirstChildElement(root); - - if (Constants.Q_ELEM_HEADER.matches(tempEl)) - { - headerEl = tempEl; - tempEl = DOMUtils.getNextSiblingElement(tempEl); - } - - if (Constants.Q_ELEM_BODY.matches(tempEl)) - { - bodyEl = tempEl; - tempEl = DOMUtils.getNextSiblingElement(tempEl); - } - - // Deserialize any header entries. - if (headerEl != null) - { - Header header = Header.unmarshall(headerEl, ctx); - - env.setHeader(header); - } - - // Deserialize any body entries. - if (bodyEl != null) - { - Body body = Body.unmarshall(bodyEl, ctx); - - env.setBody(body); - } - else - { - throw new IllegalArgumentException("An '" + Constants.Q_ELEM_ENVELOPE + - "' element must contain a: '" + - Constants.Q_ELEM_BODY + - "' element."); - } - - // Deserialize any envelope entries (in addition to <SOAP-ENV:Body>). - if (tempEl != null) - { - Vector envelopeEntries = new Vector(); - - while (tempEl != null) - { - envelopeEntries.addElement(tempEl); - tempEl = DOMUtils.getNextSiblingElement(tempEl); - } - - env.setEnvelopeEntries(envelopeEntries); - } - } - else - { - String localName = root.getLocalName(); - - if (localName != null && localName.equals(Constants.ELEM_ENVELOPE)) - { - throw new IllegalArgumentException(Constants.ERR_MSG_VERSION_MISMATCH); - } - else - { - throw new IllegalArgumentException("Root element of a SOAP message " + - "must be: '" + - Constants.Q_ELEM_ENVELOPE + "'."); - } - } - - return env; - } - - public String toString() - { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - - pw.print("[Attributes=" + attrHandler + "] " + - "[Header=" + header + "] " + - "[Body=" + body + "] " + - "[EnvelopeEntries="); - - if (envelopeEntries != null) - { - pw.println(); - - for (int i = 0; i < envelopeEntries.size(); i++) - { - pw.println("[(" + i + ")=" + - DOM2Writer.nodeToString((Element)envelopeEntries.elementAt(i)) + - "]"); - } - } - - pw.print("]"); - - return sw.toString(); - } -} +/* + * The Apache Software License, Version 1.1 + * + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "SOAP" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact [EMAIL PROTECTED] + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation and was + * originally based on software copyright (c) 2000, International + * Business Machines, Inc., http://www.apache.org. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +package org.apache.soap; + +import java.io.*; +import java.util.*; +import org.w3c.dom.*; +import org.apache.soap.util.*; +import org.apache.soap.util.xml.*; +import org.apache.soap.encoding.*; +import org.apache.soap.rpc.SOAPContext; + +/** + * An <code>Envelope</code> object represents the contents and semantics + * of an <code><SOAP-ENV:Envelope></code> element. + * + * @author Matthew J. Duftler ([EMAIL PROTECTED]) + * @author Sanjiva Weerawarana ([EMAIL PROTECTED]) + */ +public class Envelope +{ + private Header header = null; + private Body body = null; + private Vector envelopeEntries = null; + private AttributeHandler attrHandler = new AttributeHandler(); + + public Envelope() + { + // Declare the "SOAP-ENV" namespace. + declareNamespace(Constants.NS_PRE_SOAP_ENV, + Constants.NS_URI_SOAP_ENV); + + // Declare the "xsi" namespace. + declareNamespace(Constants.NS_PRE_SCHEMA_XSI, + Constants.NS_URI_CURRENT_SCHEMA_XSI); + + // Declare the "xsd" namespace. + declareNamespace(Constants.NS_PRE_SCHEMA_XSD, + Constants.NS_URI_CURRENT_SCHEMA_XSD); + } + + public void setAttribute(QName attrQName, String value) + { + attrHandler.setAttribute(attrQName, value); + } + + public String getAttribute(QName attrQName) + { + return attrHandler.getAttribute(attrQName); + } + + public void removeAttribute(QName attrQName) + { + attrHandler.removeAttribute(attrQName); + } + + public void declareNamespace(String nsPrefix, String namespaceURI) + { + attrHandler.declareNamespace(nsPrefix, namespaceURI); + } + + public void setHeader(Header header) + { + this.header = header; + } + + public Header getHeader() + { + return header; + } + + public void setBody(Body body) + { + this.body = body; + } + + public Body getBody() + { + return body; + } + + public void setEnvelopeEntries(Vector envelopeEntries) + { + this.envelopeEntries = envelopeEntries; + } + + public Vector getEnvelopeEntries() + { + return envelopeEntries; + } + + /** + * Supported for backward compatibility. + * + * @see #marshall(java.io.Writer, org.apache.soap.util.xml.XMLJavaMappingRegistry, org.apache.soap.rpc.SOAPContext) + */ + public void marshall(Writer sink, XMLJavaMappingRegistry xjmr) + throws IllegalArgumentException, IOException { + marshall(sink, xjmr, new SOAPContext()); + } + + public void marshall(Writer sink, XMLJavaMappingRegistry xjmr, + SOAPContext ctx) + throws IllegalArgumentException, IOException + { + // Initialize the namespace stack. + NSStack nsStack = new NSStack(); + + attrHandler.populateNSStack(nsStack); + + Header header = getHeader(); + Body body = getBody(); + Vector envelopeEntries = getEnvelopeEntries(); + String declEncStyle = getAttribute(new QName( + Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE)); + + // Determine the prefix associated with the NS_URI_SOAP_ENV namespace URI. + String soapEnvNSPrefix = attrHandler.getUniquePrefixFromURI( + Constants.NS_URI_SOAP_ENV, Constants.NS_PRE_SOAP_ENV, nsStack); + + // Write XML declaration + sink.write(Constants.XML_DECL); + + sink.write('<' + soapEnvNSPrefix + ':' + Constants.ELEM_ENVELOPE); + + // Serialize any envelope attributes. + attrHandler.marshall(sink, ctx); + + sink.write('>' + StringUtils.lineSeparator); + + // If there is a header, serialize it. + if (header != null) + { + header.marshall(sink, nsStack, xjmr, ctx); + } + + // There must always be a <SOAP-ENV:Body>. + if (body != null) + { + body.marshall(declEncStyle, sink, nsStack, xjmr, ctx); + } + else + { + throw new IllegalArgumentException("An '" + Constants.Q_ELEM_ENVELOPE + + "' must contain a: '" + + Constants.Q_ELEM_BODY + "'."); + } + + // Serialize any envelope entries (in addition to <SOAP-ENV:Body>). + if (envelopeEntries != null) + { + for (Enumeration e = envelopeEntries.elements(); e.hasMoreElements();) + { + Element envelopeEntryEl = (Element)e.nextElement(); + + Utils.marshallNode(envelopeEntryEl, sink); + + sink.write(StringUtils.lineSeparator); + } + } + + sink.write("</" + soapEnvNSPrefix + ':' + Constants.ELEM_ENVELOPE + + '>' + StringUtils.lineSeparator); + } + + /** + * Factory method for producing the AttributeHandler part of a SOAP envekope. + * May be overridden by subclasses of Envelope that desire to have + * specialized types of AttributeHandler. + * @return Returns a new instance of an AttributeHandler or a + * specialized subclass of AttributeHander. The default + * returns an instance of AttributeHandler. + */ + public AttributeHandler createAttributeHandler() { + return new AttributeHandler(); + } + + /** + * Factory method for producing the Body part of a SOAP envelope. + * May be overridden by subclasses of Envelope that desire to have + * specialized types of Body. + * @return Returns an instance of Body or a specialized subclass + * of Body. The default returns an instance of Body. + */ + public Body createBody() { + return new Body(); + } + + /** + * Factory method for producing the Header part of a SOAP envelope. + * May be overridden by subclasses of Envelope that desire to have + * specialized types of Header. + * @return Returns an instance of Header or a specialized subclass of + * Header. The default returns an instance of Header. + */ + public Header createHeader() { + return new Header(); + } + + /** + * Supported for backward compatibility. + * + * @see #unmarshall(org.w3c.dom.Node, org.apache.soap.rpc.SOAPContext) + */ + public static Envelope unmarshall(Node src) + throws IllegalArgumentException { + return unmarshall(src, new SOAPContext()); + } + + public static Envelope unmarshall(Node src, SOAPContext ctx) + throws IllegalArgumentException { + Envelope env = new Envelope(); + env.doUnmarshall(src, ctx); + return env; + } + + /** The method unmarshalls a SOAP Envelope part into a specific instance + * of Envelope. Most often used when the application requires a + * specialized version of a SOAP Envelope. + * @param src + * @param ctx + * @throws IllegalArgumentException + * @return Returns the instance of Envelope or specialized subclass of Envelope. + */ + public Envelope doUnmarshall(Node src, SOAPContext ctx) + throws IllegalArgumentException { + Element root = (Element)src; + + if (Constants.Q_ELEM_ENVELOPE.matches(root)) + { + // Deserialize any envelope attributes. + //env.attrHandler = AttributeHandler.unmarshall(root, ctx); + attrHandler = createAttributeHandler(); + attrHandler.doUnmarshall(root, ctx); + + // Examine the subelements of the envelope. + Element headerEl = null; + Element bodyEl = null; + Element tempEl = DOMUtils.getFirstChildElement(root); + + if (Constants.Q_ELEM_HEADER.matches(tempEl)) + { + headerEl = tempEl; + tempEl = DOMUtils.getNextSiblingElement(tempEl); + } + + if (Constants.Q_ELEM_BODY.matches(tempEl)) + { + bodyEl = tempEl; + tempEl = DOMUtils.getNextSiblingElement(tempEl); + } + + // Deserialize any header entries. + if (headerEl != null) + { + //Header header = Header.unmarshall(headerEl, ctx); + Header header = createHeader(); + header.doUnmarshall(headerEl, ctx); + + this.setHeader(header); + } + + // Deserialize any body entries. + if (bodyEl != null) + { + //Body body = Body.unmarshall(bodyEl, ctx); + Body body = createBody(); + body.doUnmarshall(bodyEl, ctx); + + this.setBody(body); + } + else + { + throw new IllegalArgumentException("An '" + Constants.Q_ELEM_ENVELOPE + + "' element must contain a: '" + + Constants.Q_ELEM_BODY + + "' element."); + } + + // Deserialize any envelope entries (in addition to <SOAP-ENV:Body>). + if (tempEl != null) + { + Vector envelopeEntries = new Vector(); + + while (tempEl != null) + { + envelopeEntries.addElement(tempEl); + tempEl = DOMUtils.getNextSiblingElement(tempEl); + } + + this.setEnvelopeEntries(envelopeEntries); + } + } + else + { + String localName = root.getLocalName(); + + if (localName != null && localName.equals(Constants.ELEM_ENVELOPE)) + { + throw new IllegalArgumentException(Constants.ERR_MSG_VERSION_MISMATCH); + } + else + { + throw new IllegalArgumentException("Root element of a SOAP message " + + "must be: '" + + Constants.Q_ELEM_ENVELOPE + "'."); + } + } + + return this; + } + + public String toString() + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + + pw.print("[Attributes=" + attrHandler + "] " + + "[Header=" + header + "] " + + "[Body=" + body + "] " + + "[EnvelopeEntries="); + + if (envelopeEntries != null) + { + pw.println(); + + for (int i = 0; i < envelopeEntries.size(); i++) + { + pw.println("[(" + i + ")=" + + DOM2Writer.nodeToString((Element)envelopeEntries.elementAt(i)) + + "]"); + } + } + + pw.print("]"); + + return sw.toString(); + } +} ------------------------------------------------------------------------ Thanks, Ying