/*
 * Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
 * 
 * Copyright (c) 2011, Petter Uvesten, Everichon AB, Sweden
 * 
 * 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.IOException;

import org.ksoap2.kdom.Node;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

/**
 * Exception class encapsulating SOAP 1.2 Faults
 * 
 * see http://www.w3.org/TR/soap12-part1/#soapfault for explanation of fields
 *
 * @author Petter Uvesten
 */

public class SoapFault12 extends SoapFault {
    private static final long serialVersionUID = 1012001L;

    /** Top-level nodes */
    public Node Code;
    public Node Reason;
    public Node Node;
    public Node Role;
    public Node Detail;

    public SoapFault12() {
        super();
        this.version = SoapEnvelope.VER12;
    }

    public SoapFault12(int version) {
        super();
        this.version = version;
    }

    /** Fills the fault details from the given XML stream */
    public void parse(XmlPullParser parser) throws IOException, XmlPullParserException
    {
        parseSelf(parser);
        // done parsing, populate some of the legacy public members
        this.faultcode = Code.getElement(SoapEnvelope.ENV2003, "Value").getText(0);
        this.faultstring = Reason.getElement(SoapEnvelope.ENV2003, "Text").getText(0);
        this.detail = this.Detail;
        this.faultactor = null;
    }

    private void parseSelf(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, SoapEnvelope.ENV2003, "Fault");

        while (parser.nextTag() == XmlPullParser.START_TAG) {
            String name = parser.getName();
            parser.nextTag();
            if (name.equals("Code")) {
                this.Code = new Node();
                this.Code.parse(parser);
            } else if (name.equals("Reason")) {
                this.Reason = new Node();
                this.Reason.parse(parser);
            } else if (name.equals("Node")) {
                this.Node = new Node();
                this.Node.parse(parser);
            } else if (name.equals("Role")) {
                this.Role = new Node();
                this.Role.parse(parser);
            } else if (name.equals("Detail")) {
                this.Detail = new Node();
                this.Detail.parse(parser);
            } else {
                throw new RuntimeException("unexpected tag:" + name);
            }

            parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, name);
        }
        parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, "Fault");
        parser.nextTag();

    }

    /** Writes the fault to the given XML stream */
    public void write(XmlSerializer xw) throws IOException
    {
        xw.startTag(SoapEnvelope.ENV2003, "Fault");
        //this.Code.write(xw);

        xw.startTag(SoapEnvelope.ENV2003, "Code");
        this.Code.write(xw);
        xw.endTag(SoapEnvelope.ENV2003, "Code");
        xw.startTag(SoapEnvelope.ENV2003, "Reason");
        this.Reason.write(xw);
        xw.endTag(SoapEnvelope.ENV2003, "Reason");

        if (this.Node != null) {
            xw.startTag(SoapEnvelope.ENV2003, "Node");
            this.Node.write(xw);
            xw.endTag(SoapEnvelope.ENV2003, "Node");
        }
        if (this.Role != null) {
            xw.startTag(SoapEnvelope.ENV2003, "Role");
            this.Role.write(xw);
            xw.endTag(SoapEnvelope.ENV2003, "Role");
        }

        if (this.Detail != null) {
            xw.startTag(SoapEnvelope.ENV2003, "Detail");
            this.Detail.write(xw);
            xw.endTag(SoapEnvelope.ENV2003, "Detail");
        }
        xw.endTag(SoapEnvelope.ENV2003, "Fault");
    }

    /**
     * @see java.lang.Throwable#getMessage()
     */
    public String getMessage() {
        return Reason.getElement(SoapEnvelope.ENV2003, "Text").getText(0);
    }

    /** Returns a string representation of the fault */
    public String toString() {
        String reason = Reason.getElement(SoapEnvelope.ENV2003, "Text").getText(0);
        String code = Code.getElement(SoapEnvelope.ENV2003, "Value").getText(0);
        return "Code: " + code + ", Reason: " + reason;
    }
}
