package at.gv.egovernment.moa.id;
import java.io.PrintStream;
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.id.util.MOAIDMessageProvider;
import at.gv.egovernment.moa.util.Constants;
/**
* Base class of technical MOA exceptions.
*
* Technical exceptions are exceptions that originate from system failure (e.g.,
* a database connection fails, a component is not available, etc.)
*
* @author Patrick Peck, Ivancsics Paul
* @version $Id$
*/
public class MOAIDException extends Exception {
/** message ID */
private String messageId;
/** wrapped exception */
private Throwable wrapped;
/**
* Create a new MOAIDException
.
*
* @param messageId The identifier of the message associated with this
* exception.
* @param parameters Additional message parameters.
*/
public MOAIDException(String messageId, Object[] parameters) {
super(MOAIDMessageProvider.getInstance().getMessage(messageId, parameters));
this.messageId = messageId;
}
/**
* Create a new MOAIDException
.
*
* @param messageId The identifier of the message associated with this
* MOAIDException
.
* @param parameters Additional message parameters.
* @param wrapped The exception wrapped by this
* MOAIDException
.
*/
public MOAIDException(
String messageId,
Object[] parameters,
Throwable wrapped) {
super(MOAIDMessageProvider.getInstance().getMessage(messageId, parameters));
this.messageId = messageId;
this.wrapped = wrapped;
}
/**
* Print a stack trace of this exception to System.err
.
*
* @see java.lang.Throwable#printStackTrace()
*/
public void printStackTrace() {
printStackTrace(System.err);
}
/**
* Print a stack trace of this exception, including the wrapped exception.
*
* @param s The stream to write the stack trace to.
* @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
*/
public void printStackTrace(PrintStream s) {
if (getWrapped() == null)
super.printStackTrace(s);
else {
s.print("Root exception: ");
getWrapped().printStackTrace(s);
}
}
/**
* Print a stack trace of this exception, including the wrapped exception.
*
* @param s The stream to write the stacktrace to.
* @see java.lang.Throwable#printStackTrace(java.io.PrintWriter)
*/
public void printStackTrace(PrintWriter s) {
if (getWrapped() == null)
super.printStackTrace(s);
else {
s.print("Root exception: ");
getWrapped().printStackTrace(s);
}
}
/**
* @return message ID
*/
public String getMessageId() {
return messageId;
}
/**
* @return wrapped exception
*/
public Throwable getWrapped() {
return wrapped;
}
/**
* Convert this MOAIDException
to an ErrorResponse
* element from the MOA namespace.
*
* @return An ErrorResponse
element, containing the subelements
* ErrorCode
and Info
required by the MOA schema.
*/
public Element toErrorResponse() {
DocumentBuilder builder;
DOMImplementation impl;
Document doc;
Element errorResponse;
Element errorCode;
Element info;
// create a new document
try {
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
impl = builder.getDOMImplementation();
} catch (ParserConfigurationException e) {
return null;
}
// build the ErrorResponse element
doc = impl.createDocument(Constants.MOA_NS_URI, "ErrorResponse", null);
errorResponse = doc.getDocumentElement();
// add MOA namespace declaration
errorResponse.setAttributeNS(
Constants.XMLNS_NS_URI,
"xmlns",
Constants.MOA_NS_URI);
// build the child elements
errorCode = doc.createElementNS(Constants.MOA_NS_URI, "ErrorCode");
errorCode.appendChild(doc.createTextNode(messageId));
info = doc.createElementNS(Constants.MOA_NS_URI, "Info");
info.appendChild(doc.createTextNode(toString()));
errorResponse.appendChild(errorCode);
errorResponse.appendChild(info);
return errorResponse;
}
}