1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/*
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * associated documentation files (the "Software"), to deal in the Software without restriction, including
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * following conditions:
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The above copyright notice and this permission notice shall be included in all copies or substantial
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * portions of the Software.
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * USE OR OTHER DEALINGS IN THE SOFTWARE.
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2;
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.IOException;
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.kdom.Node;
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.XmlPullParser;
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.XmlPullParserException;
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.xmlpull.v1.XmlSerializer;
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Exception class encapsulating SOAP Faults
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class SoapFault extends IOException {
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    private static final long serialVersionUID = 1011001L;
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** The SOAP fault code */
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String faultcode;
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** The SOAP fault code */
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String faultstring;
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** The SOAP fault code */
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String faultactor;
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** A KDom Node holding the details of the fault */
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Node detail;
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** an integer that holds current soap version */
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int version;
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public SoapFault() {
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super();
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.version = SoapEnvelope.VER11;
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public SoapFault(int version) {
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        super();
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.version = version;
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Fills the fault details from the given XML stream */
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void parse(XmlPullParser parser) throws IOException, XmlPullParserException {
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.require(XmlPullParser.START_TAG, SoapEnvelope.ENV, "Fault");
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        while (parser.nextTag() == XmlPullParser.START_TAG) {
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            String name = parser.getName();
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            if (name.equals("detail")) {
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                detail = new Node();
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                detail.parse(parser);
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                // Handle case '...<detail/></soap:Fault>'
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                if (parser.getNamespace().equals(SoapEnvelope.ENV)
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                        && parser.getName().equals("Fault")) {
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    break;
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                }
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                continue;
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else if (name.equals("faultcode")) {
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                faultcode = parser.nextText();
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else if (name.equals("faultstring")) {
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                faultstring = parser.nextText();
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else if (name.equals("faultactor")) {
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                faultactor = parser.nextText();
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            } else {
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                throw new RuntimeException("unexpected tag:" + name);
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            }
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            parser.require(XmlPullParser.END_TAG, null, name);
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV, "Fault");
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        parser.nextTag();
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Writes the fault to the given XML stream */
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void write(XmlSerializer xw) throws IOException {
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.startTag(SoapEnvelope.ENV, "Fault");
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.startTag(null, "faultcode");
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.text("" + faultcode);
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.endTag(null, "faultcode");
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.startTag(null, "faultstring");
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.text("" + faultstring);
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.endTag(null, "faultstring");
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.startTag(null, "detail");
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (detail != null) {
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            detail.write(xw);
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.endTag(null, "detail");
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        xw.endTag(SoapEnvelope.ENV, "Fault");
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @see java.lang.Throwable#getMessage()
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getMessage() {
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return faultstring;
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /** Returns a simple string representation of the fault */
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String toString() {
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return "SoapFault - faultcode: '" + faultcode + "' faultstring: '"
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                + faultstring + "' faultactor: '" + faultactor + "' detail: " +
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                detail;
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
117