You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by Ying Zhao <yz...@interwoven.com> on 2001/06/19 19:46:10 UTC

[PATCH]:Factory method and unmarshall method(non-default SOAP type)


-----Original Message-----
From: Ying Zhao [mailto:yzhao@ponyexpress.interwoven.com]
Sent: Tuesday, June 19, 2001 10:43 AM
To: yzhao@interwoven.com
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 apache@apache.org.
- *
- * 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>&lt;SOAP-ENV:Body&gt;</code> element.
- *
- * @author Matthew J. Duftler (duftler@us.ibm.com)
- * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
- */
-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 apache@apache.org.

+ *

+ * 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>&lt;SOAP-ENV:Body&gt;</code> element.

+ *

+ * @author Matthew J. Duftler (duftler@us.ibm.com)

+ * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)

+ */

+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