001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.mq;
023:
024: import java.io.PrintStream;
025: import java.io.PrintWriter;
026:
027: import javax.transaction.xa.XAException;
028:
029: import org.jboss.util.NestedException;
030: import org.jboss.util.NestedThrowable;
031:
032: /**
033: * An XAException with a nested throwable
034: *
035: * @author <a href="mailto:adrian@jboss.org">Adrian Brock</a>
036: * @version <tt>$Revision: 57198 $</tt>
037: */
038: public class SpyXAException extends XAException implements
039: NestedThrowable {
040: /** The serialVersionUID */
041: static final long serialVersionUID = 7814140228056884098L;
042:
043: /** The nested throwable */
044: protected Throwable nested;
045:
046: /**
047: * Converts a throwable to an XAException if it is not already
048: *
049: * @param message any message to add to a constructed XAException
050: * @param t the throwable
051: * @return XAException never (always throws)
052: * @throws XAException always
053: */
054: public static XAException rethrowAsXAException(String message,
055: Throwable t) throws XAException {
056: throw getAsXAException(message, t);
057: }
058:
059: /**
060: * Converts a throwable to an XAException if it is not already
061: *
062: * @param message any message to add to a constructed XAException
063: * @param t the throwable
064: * @return an XAException
065: */
066: public static XAException getAsXAException(String message,
067: Throwable t) {
068: if (t instanceof XAException)
069: return (XAException) t;
070: else {
071: SpyXAException e = new SpyXAException(message, t);
072: e.errorCode = XAException.XAER_RMERR;
073: return e;
074: }
075: }
076:
077: /**
078: * Construct a <tt>SpyXAException</tt>
079: */
080: public SpyXAException() {
081: super ();
082: this .nested = null;
083: }
084:
085: /**
086: * Construct a <tt>SpyXAException</tt> with the specified detail message.
087: *
088: * @param msg Detail message.
089: */
090: public SpyXAException(final String msg) {
091: super (msg);
092: this .nested = null;
093: }
094:
095: /**
096: * Construct a <tt>SpyXAException</tt> with the specified detail message
097: * and error code.
098: *
099: * @param code Error code.
100: */
101: public SpyXAException(final int code) {
102: super (code);
103: this .nested = null;
104: }
105:
106: /**
107: * Construct a <tt>SpyXAException</tt>
108: *
109: * @param throwable the nested throwable.
110: */
111: public SpyXAException(Throwable t) {
112: super ();
113: this .nested = t;
114: }
115:
116: /**
117: * Construct a <tt>SpyXAException</tt> with the specified detail message.
118: *
119: * @param msg Detail message.
120: * @param throwable the nested throwable.
121: */
122: public SpyXAException(final String msg, Throwable t) {
123: super (msg);
124: this .nested = t;
125: }
126:
127: /**
128: * Construct a <tt>SpyXAException</tt> with the specified detail message
129: * and error code.
130: *
131: * @param code Error code.
132: * @param throwable the nested throwable.
133: */
134: public SpyXAException(final int code, Throwable t) {
135: super (code);
136: this .nested = t;
137: }
138:
139: public Throwable getNested() {
140: return nested;
141: }
142:
143: public Throwable getCause() {
144: return nested;
145: }
146:
147: public void setLinkedException(final Exception e) {
148: this .nested = e;
149: }
150:
151: public Exception getLinkedException() {
152: //
153: // jason: this is bad, but whatever... the jms folks should have had more
154: // insight
155: //
156: if (nested == null)
157: return this ;
158: if (nested instanceof Exception) {
159: return (Exception) nested;
160: }
161: return new NestedException(nested);
162: }
163:
164: public String getMessage() {
165: return NestedThrowable.Util.getMessage(super .getMessage(),
166: nested);
167: }
168:
169: public void printStackTrace(final PrintStream stream) {
170: if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
171: super .printStackTrace(stream);
172: }
173: NestedThrowable.Util.print(nested, stream);
174: }
175:
176: public void printStackTrace(final PrintWriter writer) {
177: if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
178: super .printStackTrace(writer);
179: }
180: NestedThrowable.Util.print(nested, writer);
181: }
182:
183: public void printStackTrace() {
184: printStackTrace(System.err);
185: }
186: }
|