001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.activemq.util;
019
020 import org.activemq.util.JMSExceptionHelper;
021
022 import javax.jms.JMSException;
023
024 /**
025 * A helper class for ensuring that a number of tasks occur, whether they
026 * throw exceptions or not and saving the first exception so that we can
027 * throw it properly.
028 * This class is particularly useful for shutting things down, where we
029 * want to try close all resources, whether they fail or not.
030 *
031 * @version $Revision: 1.1.1.1 $
032 */
033 public class ExceptionTemplate {
034 private Throwable firstException;
035
036 public ExceptionTemplate() {
037 }
038
039 public void run(Callback task) {
040 try {
041 task.execute();
042 }
043 catch (Throwable t) {
044 if (firstException == null) {
045 firstException = t;
046 }
047 }
048 }
049
050 /**
051 * Returns the first exception thrown during the execution of this
052 * template or returns null if there has been no exception thrown yet.
053 *
054 * @return the first caught exception or null if none has occured yet
055 */
056 public Throwable getFirstException() {
057 return firstException;
058 }
059
060 /**
061 * Throws the first exception caught during the execution of this template
062 * as a JMS exception or do nothing if we have not caught and exception
063 *
064 * @throws JMSException
065 */
066 public void throwJMSException() throws JMSException {
067 if (firstException != null) {
068 if (firstException instanceof JMSException) {
069 throw (JMSException) firstException;
070 }
071 else if (firstException instanceof Exception) {
072 throw JMSExceptionHelper.newJMSException(firstException.getMessage(), (Exception) firstException);
073 }
074 else {
075 // lets wrap the Throwable in an Exception
076 throw JMSExceptionHelper.newJMSException(firstException.getMessage(), new Exception(firstException));
077 }
078 }
079 }
080 }