-----Original Message----- From: Ying Zhao [mailto:[EMAIL PROTECTED]] Sent: Tuesday, June 19, 2001 10:43 AM To: [EMAIL PROTECTED] Subject: [PATCH]:Factory method and unmarshall method(non-default SOAPtype) Hello, This patch file also follows the previous patch files. It mainly adds a factory method for producing the AttributeHandler part of a SOAP Body and an unmarshall method for unmarshalling a SOAP body part into a specific Body instance, used for non-default SOAP body type. Name : patch_Body.txt Author: Jerry Boetje Content: --------------------------------------------------------------------------- --- /net/bigbang/vol/vol1/homes/yzhao/xml-soap/java/src/org/apache/soap/Body.jav a Mon Jun 18 16:10:11 2001 +++ Body.java Mon Jun 18 15:23:30 2001 @@ -1,222 +1,225 @@ -/* - * 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; - -/** - * A <code>Body</code> object represents the contents and semantics - * of a <code><SOAP-ENV:Body></code> element. - * - * @author Matthew J. Duftler ([EMAIL PROTECTED]) - * @author Sanjiva Weerawarana ([EMAIL PROTECTED]) - */ -public class Body -{ - private Vector bodyEntries = null; - private AttributeHandler attrHandler = new AttributeHandler(); - - 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 setBodyEntries(Vector bodyEntries) - { - this.bodyEntries = bodyEntries; - } - - public Vector getBodyEntries() - { - return bodyEntries; - } - - public void marshall(String inScopeEncStyle, Writer sink, NSStack nsStack, - XMLJavaMappingRegistry xjmr, SOAPContext ctx) - throws IllegalArgumentException, IOException - { - attrHandler.populateNSStack(nsStack); - - String declEncStyle = getAttribute(new QName( - Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE)); - String actualEncStyle = declEncStyle != null - ? declEncStyle - : inScopeEncStyle; - - // 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); - - sink.write('<' + soapEnvNSPrefix + ':' + Constants.ELEM_BODY); - - // Serialize any body attributes. - attrHandler.marshall(sink, ctx); - - sink.write('>' + StringUtils.lineSeparator); - - // Serialize any body entries. - if (bodyEntries != null) - { - for (Enumeration e = bodyEntries.elements(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - if (obj instanceof Bean) - { - Bean bodyEntry = (Bean) obj; - - if (Serializer.class.isAssignableFrom(bodyEntry.type)) - { - ((Serializer)bodyEntry.value).marshall(actualEncStyle, - bodyEntry.type, - bodyEntry.value, - null, - sink, - nsStack, - xjmr, - ctx); - } - else - { - throw new IllegalArgumentException("Body entries must implement " + - "the Serializer interface."); - } - } - else if (obj instanceof Element) - { - Utils.marshallNode((Element)obj, sink); - } - else - { - throw new IllegalArgumentException("Unknown type of body entry: '" + - obj.getClass () + "'"); - } - sink.write(StringUtils.lineSeparator); - } - } - - sink.write("</" + soapEnvNSPrefix + ':' + Constants.ELEM_BODY + '>' + - StringUtils.lineSeparator); - - nsStack.popScope(); - } - - public static Body unmarshall(Node src, SOAPContext ctx) throws IllegalArgumentException - { - Element root = (Element)src; - Body body = new Body(); - Vector bodyEntries = new Vector(); - - // Deserialize any body attributes. - body.attrHandler = AttributeHandler.unmarshall(root, ctx); - - for (Element el = DOMUtils.getFirstChildElement(root); - el != null; - el = DOMUtils.getNextSiblingElement(el)) - { - bodyEntries.addElement(el); - } - - body.setBodyEntries(bodyEntries); - - return body; - } - - public String toString() - { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - - pw.print("[Attributes=" + attrHandler + "] " + - "[BodyEntries="); - - if (bodyEntries != null) - { - pw.println(); - - for (int i = 0; i < bodyEntries.size(); i++) - { - pw.println("[(" + i + ")=" + bodyEntries.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; + +/** + * A <code>Body</code> object represents the contents and semantics + * of a <code><SOAP-ENV:Body></code> element. + * + * @author Matthew J. Duftler ([EMAIL PROTECTED]) + * @author Sanjiva Weerawarana ([EMAIL PROTECTED]) + */ +public class Body { + private Vector bodyEntries = null; + private AttributeHandler attrHandler = new AttributeHandler(); + + 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 setBodyEntries(Vector bodyEntries) { + this.bodyEntries = bodyEntries; + } + + public Vector getBodyEntries() { + return bodyEntries; + } + + public void marshall(String inScopeEncStyle, Writer sink, NSStack nsStack, + XMLJavaMappingRegistry xjmr, SOAPContext ctx) + throws IllegalArgumentException, IOException { + attrHandler.populateNSStack(nsStack); + + String declEncStyle = getAttribute(new QName( + Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE)); + String actualEncStyle = declEncStyle != null ? declEncStyle : inScopeEncStyle; + + // 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); + + sink.write('<' + soapEnvNSPrefix + ':' + Constants.ELEM_BODY); + + // Serialize any body attributes. + attrHandler.marshall(sink, ctx); + + sink.write('>' + StringUtils.lineSeparator); + + // Serialize any body entries. + if (bodyEntries != null) { + for (Enumeration e = bodyEntries.elements(); e.hasMoreElements();) { + Object obj = e.nextElement(); + if (obj instanceof Bean) { + Bean bodyEntry = (Bean) obj; + + if (Serializer.class.isAssignableFrom(bodyEntry.type)) { + ((Serializer)bodyEntry.value).marshall(actualEncStyle, + bodyEntry.type, + bodyEntry.value, + null, + sink, + nsStack, + xjmr, + ctx); + } + else { + throw new IllegalArgumentException("Body entries must implement " + + "the Serializer interface."); + } + } + else if (obj instanceof Element) { + Utils.marshallNode((Element)obj, sink); + } + else { + throw new IllegalArgumentException("Unknown type of body entry: '" + + obj.getClass() + "'"); + } + sink.write(StringUtils.lineSeparator); + } + } + + sink.write("</" + soapEnvNSPrefix + ':' + Constants.ELEM_BODY + '>' + + StringUtils.lineSeparator); + + nsStack.popScope(); + } + + /** + * Factory method for producing the AttributeHandler part of a SOAP Body. + * May be overridden by subclasses of Body that desire to have + * specialized types of AttributeHandler. + * @return Returns a new AttributeHandler. Used when providing + * non-default values for SOAP components. + */ + public AttributeHandler createAttributeHandler() { + return new AttributeHandler(); + } + + public static Body unmarshall(Node src, SOAPContext ctx) + throws IllegalArgumentException { + Body body = new Body(); + return body.doUnmarshall(src, ctx); + } + + /** Method for unmarshalling a SOAP body part into a specific Body + * instance. Used when the application requires a non-default SOAP + * Body type. + * @param src + * @param ctx + * @return Returns the Body instance. + */ + public Body doUnmarshall(Node src, SOAPContext ctx) { + Element root = (Element)src; + Vector bodyEntries = new Vector(); + + // Deserialize any body attributes. + //this.attrHandler = AttributeHandler.unmarshall(root, ctx); + AttributeHandler attrHandler = createAttributeHandler(); + attrHandler.doUnmarshall(root, ctx); + + for (Element el = DOMUtils.getFirstChildElement(root); + el != null; + el = DOMUtils.getNextSiblingElement(el)) { + bodyEntries.addElement(el); + } + + this.setBodyEntries(bodyEntries); + + return this; + } + + public String toString() { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + + pw.print("[Attributes=" + attrHandler + "] " + + "[BodyEntries="); + + if (bodyEntries != null) { + pw.println(); + + for (int i = 0; i < bodyEntries.size(); i++) { + pw.println("[(" + i + ")=" + bodyEntries.elementAt(i) + "]"); + } + } + + pw.print("]"); + + return sw.toString(); + } +} ---------------------------------------------------------------------------- Thanks, Ying