/*=============================================================================*
* Copyright 2004 The Apache Software Foundation
*
* Licensed 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.ws.resource.faults.axis;
import org.apache.axis.AxisEngine;
import org.apache.axis.AxisFault;
import org.apache.axis.description.ElementDesc;
import org.apache.axis.description.TypeDesc;
import org.apache.axis.encoding.Deserializer;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.encoding.ser.BeanDeserializer;
import org.apache.axis.encoding.ser.BeanSerializer;
import org.apache.axis.message.MessageElement;
import org.apache.axis.message.addressing.EndpointReferenceType;
import org.apache.axis.types.URI;
import org.apache.ws.resource.faults.BaseFaultException;
import org.apache.ws.resource.faults.ErrorCode;
import org.apache.ws.resource.faults.v1_2.Faults1_2Constants;
import javax.xml.namespace.QName;
import javax.xml.soap.Detail;
import javax.xml.soap.SOAPElement;
import java.io.IOException;
import java.util.Calendar;
/**
* LOG-DONE
* WS-BaseFaults base fault type implemented as an {@link AxisFault}.
*
* @author Ian P. Springer (Hewlett-Packard Company)
*/
public class BaseFaultType
extends AxisFault
{
/**
* DOCUMENT_ME
*/
private static final QName DEFAULT_NAME =
new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "BaseFault",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA );
// Type metadata
/**
* DOCUMENT_ME
*/
private static final TypeDesc TYPE_DESC = new TypeDesc( BaseFaultType.class, true );
static
{
// TODO: I don't think the below line should need to be commented out if sendXsiTypes=false - possible bug in SerializationContext.startElement()
//TYPE_DESC.setXmlType( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "BaseFaultType", Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
ElementDesc elemField = new ElementDesc( );
elemField.setFieldName( "timestamp" );
elemField.setXmlName( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "Timestamp",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setXmlType( new QName( "http://www.w3.org/2001/XMLSchema", "dateTime", "xsd" ) );
TYPE_DESC.addFieldDesc( elemField );
elemField = new ElementDesc( );
elemField.setFieldName( "originator" );
elemField.setXmlName( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "Originator",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setXmlType( new QName( "http://schemas.xmlsoap.org/ws/2003/03/addressing", "EndpointReferenceType" ) );
elemField.setMinOccurs( 0 );
TYPE_DESC.addFieldDesc( elemField );
elemField = new ElementDesc( );
elemField.setFieldName( "errorCode" );
elemField.setXmlName( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "ErrorCode",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setXmlType( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, ">BaseFaultType>ErrorCode",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setMinOccurs( 0 );
TYPE_DESC.addFieldDesc( elemField );
elemField = new ElementDesc( );
elemField.setFieldName( "description" );
elemField.setXmlName( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "Description",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setXmlType( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, ">BaseFaultType>Description",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setMinOccurs( 0 );
TYPE_DESC.addFieldDesc( elemField );
elemField = new ElementDesc( );
elemField.setFieldName( "faultCause" );
elemField.setXmlName( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "FaultCause",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setXmlType( new QName( Faults1_2Constants.NSURI_BASEFAULTS_SCHEMA, "BaseFaultType",
Faults1_2Constants.NSPREFIX_BASEFAULTS_SCHEMA ) );
elemField.setMinOccurs( 0 );
TYPE_DESC.addFieldDesc( elemField );
}
private QName m_name;
private Calendar m_timestamp;
private EndpointReferenceType m_originator;
private _BaseFaultType_ErrorCode m_errorCode;
private _BaseFaultType_Description[] m_description;
private BaseFaultType[] m_faultCause;
/**
* Constructs a new BaseFaultType with the specified name, SOAP fault code, and SOAP fault message. Sets the
* timestamp field to the current time and the SOAP actor and detail fields to null.
*
* @param name XML element name to use when serializing this fault
* @param _faultCode the SOAP fault code
* @param _faultString the SOAP fault string
*/
public BaseFaultType( QName name,
QName _faultCode,
String _faultString )
{
super( _faultCode, _faultString, null, null );
m_name = ( name != null ) ? name : DEFAULT_NAME;
m_timestamp = Calendar.getInstance( );
}
/**
* Constructs a new BaseFaultType from the specified BaseFaultException.
*
* @param bfe a platform-neutral BaseFaultException
*/
public BaseFaultType( BaseFaultException bfe )
{
setFaultCode( bfe.getFaultCode( ) );
setFaultString( bfe.getFaultString( ) );
setFaultActor( bfe.getFaultActor( ) );
if ( bfe.getDetail( ) != null )
{
setFaultDetail( new Detail[]
{
bfe.getDetail( )
} );
}
m_name = bfe.getName( );
m_timestamp = bfe.getTimestamp( );
m_originator = bfe.getOriginator( );
ErrorCode errorCode = bfe.getErrorCode( );
if ( errorCode != null )
{
try
{
m_errorCode =
new _BaseFaultType_ErrorCode( toMessageElements( errorCode.getContent( ) ),
new URI( errorCode.getDialect( ).toString( ) ) );
}
catch ( URI.MalformedURIException murie )
{
throw new RuntimeException( murie );
}
}
String[] description = bfe.getDescription( );
if ( description != null )
{
m_description = new _BaseFaultType_Description[description.length];
for ( int i = 0; i < description.length; i++ )
{
m_description[i] = new _BaseFaultType_Description( description[i] );
}
}
BaseFaultException[] faultCause = bfe.getFaultCause( );
if ( faultCause != null )
{
m_faultCause = new BaseFaultType[faultCause.length];
for ( int i = 0; i < faultCause.length; i++ )
{
m_faultCause[i] = new BaseFaultType( faultCause[i] );
}
}
}
/**
* DOCUMENT_ME
*
* @param description DOCUMENT_ME
*/
public void setDescription( _BaseFaultType_Description[] description )
{
m_description = description;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public _BaseFaultType_Description[] getDescription( )
{
return m_description;
}
/**
* Gets deserializer for this fault.
*/
public static Deserializer getDeserializer( String mechType,
Class javaType,
QName xmlType )
{
return new BeanDeserializer( javaType, xmlType, TYPE_DESC );
}
/**
* DOCUMENT_ME
*
* @param errorCode DOCUMENT_ME
*/
public void setErrorCode( _BaseFaultType_ErrorCode errorCode )
{
m_errorCode = errorCode;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public _BaseFaultType_ErrorCode getErrorCode( )
{
return m_errorCode;
}
/**
* DOCUMENT_ME
*
* @param faultCause DOCUMENT_ME
*/
public void setFaultCause( BaseFaultType[] faultCause )
{
m_faultCause = faultCause;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public BaseFaultType[] getFaultCause( )
{
return m_faultCause;
}
/**
* DOCUMENT_ME
*
* @param originator DOCUMENT_ME
*/
public void setOriginator( EndpointReferenceType originator )
{
m_originator = originator;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public EndpointReferenceType getOriginator( )
{
return m_originator;
}
/**
* Gets serializer for this fault.
*/
public static Serializer getSerializer( String mechType,
Class javaType,
QName xmlType )
{
return new BeanSerializer( javaType, xmlType, TYPE_DESC );
}
/**
* DOCUMENT_ME
*
* @param timestamp DOCUMENT_ME
*/
public void setTimestamp( Calendar timestamp )
{
m_timestamp = timestamp;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public Calendar getTimestamp( )
{
return m_timestamp;
}
/**
* Returns type metadata object (called via reflection by {@link SerializationContext#serialize}).
*/
public static TypeDesc getTypeDesc( )
{
return TYPE_DESC;
}
/**
* DOCUMENT_ME
*
* @return DOCUMENT_ME
*/
public String toString( )
{
// TODO
return super.toString( );
}
/**
* Serializes the WS-RF fault detail to the specified serialization context - called by {@link
* org.apache.axis.message.SOAPFault#outputImpl}.
*
* @param detailElemName the <code>QName</code> of the WS-RF fault detail element to be written (ignored by this
* impl)
* @param serContext the <code>SerializationContext</code> to write the fault detail XML to
*
* @throws java.io.IOException if serialization of the WS-RF fault detail fails
*/
public void writeDetails( QName detailElemName,
SerializationContext serContext )
throws IOException
{
serContext.getMessageContext( ).setProperty( AxisEngine.PROP_SEND_XSI,
Boolean.FALSE.toString( ) );
serContext.setDoMultiRefs( false );
serContext.serialize( m_name, null, this, null, true, Boolean.FALSE );
}
/**
* @return
*/
protected QName getName( )
{
return m_name;
}
private MessageElement[] toMessageElements( SOAPElement[] soapElems )
{
MessageElement[] msgElems = new MessageElement[soapElems.length];
for ( int i = 0; i < soapElems.length; i++ )
{
msgElems[i] = (MessageElement) soapElems[i];
}
return msgElems;
}
}