1 /* 2 * Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 5 * associated documentation files (the "Software"), to deal in the Software without restriction, including 6 * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the 8 * following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in all copies or substantial 11 * portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 14 * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 15 * EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 16 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 17 * USE OR OTHER DEALINGS IN THE SOFTWARE. 18 */ 19 20 package org.ksoap2; 21 22 import java.io.IOException; 23 24 import org.ksoap2.kdom.Node; 25 import org.xmlpull.v1.XmlPullParser; 26 import org.xmlpull.v1.XmlPullParserException; 27 import org.xmlpull.v1.XmlSerializer; 28 29 /** 30 * Exception class encapsulating SOAP Faults 31 */ 32 33 public class SoapFault extends IOException { 34 35 private static final long serialVersionUID = 1011001L; 36 /** The SOAP fault code */ 37 public String faultcode; 38 /** The SOAP fault code */ 39 public String faultstring; 40 /** The SOAP fault code */ 41 public String faultactor; 42 /** A KDom Node holding the details of the fault */ 43 public Node detail; 44 /** an integer that holds current soap version */ 45 public int version; 46 47 public SoapFault() { 48 super(); 49 this.version = SoapEnvelope.VER11; 50 } 51 52 public SoapFault(int version) { 53 super(); 54 this.version = version; 55 } 56 57 /** Fills the fault details from the given XML stream */ 58 public void parse(XmlPullParser parser) throws IOException, XmlPullParserException { 59 parser.require(XmlPullParser.START_TAG, SoapEnvelope.ENV, "Fault"); 60 while (parser.nextTag() == XmlPullParser.START_TAG) { 61 String name = parser.getName(); 62 if (name.equals("detail")) { 63 detail = new Node(); 64 detail.parse(parser); 65 // Handle case '...<detail/></soap:Fault>' 66 if (parser.getNamespace().equals(SoapEnvelope.ENV) 67 && parser.getName().equals("Fault")) { 68 break; 69 } 70 continue; 71 } else if (name.equals("faultcode")) { 72 faultcode = parser.nextText(); 73 } else if (name.equals("faultstring")) { 74 faultstring = parser.nextText(); 75 } else if (name.equals("faultactor")) { 76 faultactor = parser.nextText(); 77 } else { 78 throw new RuntimeException("unexpected tag:" + name); 79 } 80 parser.require(XmlPullParser.END_TAG, null, name); 81 } 82 parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV, "Fault"); 83 parser.nextTag(); 84 } 85 86 /** Writes the fault to the given XML stream */ 87 public void write(XmlSerializer xw) throws IOException { 88 xw.startTag(SoapEnvelope.ENV, "Fault"); 89 xw.startTag(null, "faultcode"); 90 xw.text("" + faultcode); 91 xw.endTag(null, "faultcode"); 92 xw.startTag(null, "faultstring"); 93 xw.text("" + faultstring); 94 xw.endTag(null, "faultstring"); 95 xw.startTag(null, "detail"); 96 if (detail != null) { 97 detail.write(xw); 98 } 99 xw.endTag(null, "detail"); 100 xw.endTag(SoapEnvelope.ENV, "Fault"); 101 } 102 103 /** 104 * @see java.lang.Throwable#getMessage() 105 */ 106 public String getMessage() { 107 return faultstring; 108 } 109 110 /** Returns a simple string representation of the fault */ 111 public String toString() { 112 return "SoapFault - faultcode: '" + faultcode + "' faultstring: '" 113 + faultstring + "' faultactor: '" + faultactor + "' detail: " + 114 detail; 115 } 116 } 117