/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.cxf.ws.rm;

import javax.xml.namespace.QName;

import org.w3c.dom.Element;

import org.apache.cxf.ws.rm.v200702.Identifier;
import org.apache.cxf.ws.rm.v200702.SequenceAcknowledgement;

/**
 * Holder for SequenceFault information.
 */
public class SequenceFault extends Exception {
    
    private static final long serialVersionUID = 1144842362378723203L;
    private boolean sender;
    private QName faultCode;
    private Object detail;
    private Element extraDetail;

    public SequenceFault(String message) {
        super(message);
    }
    
    public boolean isSender() {
        return sender;
    }
    
    public void setSender(boolean s) {
        sender = s;
    }
    
    public String getReason() {
        return getMessage();
    }
    
    public QName getFaultCode() {
        return faultCode;
    }

    public void setFaultCode(QName faultCode) {
        this.faultCode = faultCode;
    }

    /**
     * Set detail content as arbitrary element.
     * 
     * @param d (<code>null</code> if none)
     */
    public void setDetail(Element d) {
        detail = d;
    }

    /**
     * Set detail content as Identifier.
     * 
     * @param d (<code>null</code> if none)
     */
    public void setDetail(Identifier d) {
        detail = d;
    }

    /**
     * Set detail content as SequenceAcknowledgement.
     * 
     * @param d (<code>null</code> if none)
     */
    public void setDetail(SequenceAcknowledgement d) {
        detail = d;
    }
    
    /**
     * Get Fault detail object, which may be an {@link Element}, an {@link Identifier}, or a
     * {@link SequenceAcknowledgement}.
     * 
     * @return detail object (<code>null</code> if none)
     */
    public Object getDetail() {
        return detail;
    }

    /**
     * Get extra element appended to main fault detail.
     * 
     * @return element (<code>null</code> if none)
     */
    public Element getExtraDetail() {
        return extraDetail;
    }

    /**
     * Set extra element appended to main fault detail.
     * 
     * @param ex (<code>null</code> if none)
     */
    public void setExtraDetail(Element ex) {
        extraDetail = ex;
    }
}
