soapenvelope.java

来自「it is a tools for developing J2ME applic」· Java 代码 · 共 325 行

JAVA
325
字号
/* Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The  above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE. */


package org.ksoap2;

import java.io.*;

import org.xmlpull.v1.*;
import org.kxml2.kdom.*;

/** 
 * A SOAP envelope, holding head and body objects. While this 
 * basic envelope supports literal encoding as content format 
 * via KDom, The SoapSerializationEnvelope provides support
 * for the SOAP Serialization format specification and 
 * simple object serialization. */

public class SoapEnvelope {

    /** SOAP Version 1.0 constant */

    public static final int VER10 = 100;

    /** SOAP Version 1.1 constant */

    public static final int VER11 = 110;

    /** SOAP Version 1.2 constant */

    public static final int VER12 = 120;

    public static final String ENV2001 =
        "http://www.w3.org/2001/12/soap-envelope";

    public static final String ENC2001 =
        "http://www.w3.org/2001/12/soap-encoding";

    /** Namespace constant: http://schemas.xmlsoap.org/soap/envelope/ */

    public static final String ENV =
        "http://schemas.xmlsoap.org/soap/envelope/";

    /** Namespace constant: http://schemas.xmlsoap.org/soap/encoding/ */

    public static final String ENC =
        "http://schemas.xmlsoap.org/soap/encoding/";

    /** Namespace constant: http://www.w3.org/2001/XMLSchema */

    public static final String XSD = "http://www.w3.org/2001/XMLSchema";

    /** Namespace constant: http://www.w3.org/2001/XMLSchema */

    public static final String XSI =
        "http://www.w3.org/2001/XMLSchema-instance";

    /** Namespace constant: http://www.w3.org/1999/XMLSchema */

    public static final String XSD1999 = "http://www.w3.org/1999/XMLSchema";

    /** Namespace constant: http://www.w3.org/1999/XMLSchema */

    public static final String XSI1999 =
        "http://www.w3.org/1999/XMLSchema-instance";

    
    /** 
     * Returns true for the string values "1" and "true", ignoring 
     * upper/lower case and whitespace, false otherwise. */ 

    public static boolean stringToBoolean(String s) {

        if (s == null)
            return false;

        s = s.trim().toLowerCase();
        return (s.equals("1") || s.equals("true"));
    }

    /**
     * The body object received with this envelope. Will be an
     * KDom Node for literal encoding. For SOAP Serialization,
     * please refer to SoapSerializationEnvelope. */

    public Object bodyIn;

    /** 
     * The body object to be sent with this envelope. Must be a KDom Node
     * modelling the remote call including all parameters
     * for literal encoding. For SOAP Serialization, please 
     * refer to SoapSerializationEnvelope  */

    public Object bodyOut;


    /** 
     * Incoming header elements */
    
    public Element [] headerIn;

    /** 
     * Outgoing header elements */

    public Element [] headerOut;
    public String encodingStyle;


    /** 
     * The SOAP version, set by the constructor */

    public int version;    

    /** Envelope namespace, set by the constructor */

    public String env;

    /** Encoding namespace, set by the constructor */

    public String enc;

    /** Xml Schema instance namespace, set by the constructor */
    
    public String xsi;   

    /** Xml Schema data namespace, set by the constructor */

    public String xsd;


    /** 
     * Initializes a SOAP Envelope. The version parameter must
     * be set to one of VER10, VER11 or VER12 */ 

    public SoapEnvelope (int version) {
                this.version = version;
        //  prefixMap = SoapEnvelope.prefixMap[version];

        if (version == SoapEnvelope.VER10) {
            xsi = SoapEnvelope.XSI1999;
            xsd = SoapEnvelope.XSD1999;
        }
        else {
            xsi = SoapEnvelope.XSI;
            xsd = SoapEnvelope.XSD;
        }

        if (version < SoapEnvelope.VER12) {
            enc = SoapEnvelope.ENC;
            env = SoapEnvelope.ENV;
        }
        else {
            enc = SoapEnvelope.ENC2001;
            env = SoapEnvelope.ENV2001;
        }

    }


    /** Parses the SOAP envelope from the given parser */


    public void parse(XmlPullParser parser)
        throws IOException, XmlPullParserException {

        parser.nextTag();
        
   /*     System.out.println ("name-r: '"+parser.getName()+"'");
        System.out.println ("name-x: 'Envelope'");
        System.out.println ("namesp-r: '"+parser.getNamespace()+"'");
        System.out.println ("namesp-x: '"+env+"'"); */
        
        parser.require(XmlPullParser.START_TAG, env, "Envelope");
        encodingStyle = parser.getAttributeValue(env, "encodingStyle");

        parser.nextTag();

        if (parser.getEventType() == XmlPullParser.START_TAG
            && parser.getNamespace().equals(env)
            && parser.getName().equals("Header")) {

            parseHeader(parser);

            parser.require(XmlPullParser.END_TAG, env, "Header");
            parser.nextTag();
        }

        parser.require(XmlPullParser.START_TAG, env, "Body");
        encodingStyle = parser.getAttributeValue(env, "encodingStyle");

        parseBody (parser);

        parser.require(XmlPullParser.END_TAG, env, "Body");

        parser.nextTag();
        parser.require(XmlPullParser.END_TAG, env, "Envelope");
    }


    public void parseHeader(XmlPullParser parser)
        throws IOException, XmlPullParserException {

        // consume start header

        parser.nextTag();

        // look at all header entries

        Node headers = new Node ();
        headers.parse (parser);
    
        int count = 0;
        for (int i = 0; i < headers.getChildCount(); i++) {
            Element child = headers.getElement(i);
            if (child != null) count++;
        }
        
        headerIn = new Element [count];
        count = 0;
        for (int i = 0; i < headers.getChildCount(); i++) {
            Element child = headers.getElement(i);
            if (child != null) 
                headerIn [count++] = child;
        }
    }

    public void parseBody(XmlPullParser parser)
        throws IOException, XmlPullParserException {

        parser.nextTag();
        // insert fault generation code here

        if (parser.getEventType() == XmlPullParser.START_TAG
            && parser.getNamespace().equals(env)
            && parser.getName().equals("Fault")) {
            SoapFault fault = new SoapFault();
            fault.parse(parser);
            bodyIn = fault;
        }
        else {
            Node node = (bodyIn instanceof Node) ? (Node) bodyIn : new Node ();
            node.parse(parser);
            bodyIn = node;
        }
    }


    /** 
     * Writes the complete envelope including header and body 
     * elements to the given XML writer. */

    public void write(XmlSerializer writer) throws IOException {

        writer.setPrefix("i", xsi);  
        writer.setPrefix("d", xsd);  
        writer.setPrefix("c", enc);      
        writer.setPrefix("v", env);      
        writer.startTag(env, "Envelope");

        //  writer.attribute (Soap.ENV, "encodingStyle", encodingStyle); 
        
        writer.startTag(env, "Header");
        writeHeader(writer);
        writer.endTag(env, "Header");

        writer.startTag(env, "Body");
        writeBody(writer);
        writer.endTag(env, "Body");


        writer.endTag(env, "Envelope");
    }

    /** 
     * Writes the header elements contained in headerOut */

    public void writeHeader(XmlSerializer writer) throws IOException {
        if (headerOut != null) {
            for (int i = 0; i < headerOut.length; i++) {
                headerOut[i].write (writer);
            }   
        }
    }

    /** 
     * Writes the SOAP body stored in the object variable bodyIn,
     * Overwrite this method for customized writing of
     * the soap message body. */

    public void writeBody(XmlSerializer writer) throws IOException {

        /*   if (body instanceof XmlIO) {
               if (encodingStyle != null)
                   writer.attribute(classMap.env, "encodingStyle", encodingStyle);
        
               ((XmlIO) body).write(writer);
           }
           else { */

		if (encodingStyle != null) 
           writer.attribute(env, "encodingStyle", encodingStyle);
        
        ((Node) bodyOut).write(writer);
        //        }
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?