/*
 * Created on Apr 2, 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.fujitsu.nextgrid.byteio.faults;

import java.util.Calendar;

import org.apache.axis2.util.StreamWrapper;
import org.apache.ws.commons.om.OMAbstractFactory;
import org.apache.ws.commons.om.OMElement;
import org.apache.ws.commons.om.impl.OMNodeEx;
import org.apache.ws.commons.om.impl.builder.StAXOMBuilder;
import org.apache.xmlbeans.XmlObject;
import org.oasis_open.docs.wsrf.bf_2.BaseFaultType;
import org.oasis_open.docs.wsrf.bf_2.BaseFaultType.Description;


public abstract class WSRFBaseFaultException 
extends SOAPFaultException {

    /** ------------------------------------------------------------------------------------------- STATIC VARIABLES **/

    private static String reason = "WSRF Fault - see details";
    
    /** --------------------------------------------------------------------------------------------- STATIC METHODS **/
    
    private Calendar                timestamp = null;   // MANDATORY
    private String                  description = null; // optional
    // TODO support WSRF BaseFault::Originator
    // TODO support WSRF BaseFault::ErrorCode
    // TODO support WSRF BaseFault::FaultCause
    
    /** ----------------------------------------------------------------------------------------- INSTANCE VARIABLES **/
    
    /** ----------------------------------------------------------------------------------------------- CONSTRUCTORS **/

    public WSRFBaseFaultException() {
    }

    public WSRFBaseFaultException( FaultCode faultCode, String faultActorURI ) {
        this( faultCode, faultActorURI, null );
    }
    
    public WSRFBaseFaultException( FaultCode faultCode, String faultActorURI, String description ) {
        super( faultCode, reason, faultActorURI );
        timestamp = Calendar.getInstance();
        this.description = description;
    }

    /** --------------------------------------------------------------------------------------------- PUBLIC METHODS **/

    public void setDescription( String descr ) {
        description = descr;
    }
    
    public String getDescription() {
        return description;
    }
    
    /** ------------------------------------------------------------------------------------------ PROTECTED METHODS **/

    protected void populateFromException( BaseFaultType fault ) {
        fault.setTimestamp( timestamp );
        addDescriptionToFault( fault );
        // TODO support WSRF BaseFault::Originator
        // TODO support WSRF BaseFault::ErrorCode
        // TODO support WSRF BaseFault::FaultCause
    }
    
    protected OMElement toOM( XmlObject param ) {
        StAXOMBuilder builder = new StAXOMBuilder( OMAbstractFactory.getOMFactory(),
                                                   new StreamWrapper( param.newXMLStreamReader() ) ) ;
        OMElement documentElement = builder.getDocumentElement();
        ((OMNodeEx)documentElement).setParent(null);
        return documentElement;
    }

    protected void populateFromXML( BaseFaultType baseFault ) {
        timestamp = baseFault.getTimestamp();
        getDescriptionFromFault( baseFault );
    }
    
    /** -------------------------------------------------------------------------------------------- PRIVATE METHODS **/
    
    private void addDescriptionToFault( BaseFaultType fault ) {
        if ( description == null ) {
            return;
        }
        Description descr = fault.addNewDescription();
        descr.setStringValue( description );
    }
    
    private void getDescriptionFromFault( BaseFaultType fault ) {
        Description[] descrArr = fault.getDescriptionArray();
        if ( descrArr != null && descrArr.length>0 ) {
            description = descrArr[0].getStringValue();
        }
    }

}


//
// Copyright (c) Fujitsu Ltd 2000 - 2006
//
// Use and distribution is subject a License.
// A copy was supplied with the distribution (see documentation or the jar file).
//
// This product includes software developed by Fujitsu Limited (http://www.fujitsu.com).
