/**
* Copyright 2007-2008 University Of Southern California
*
* 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 edu.isi.pegasus.planner.catalog;
import java.util.List;
import java.util.ArrayList;
/**
* Class to notify of failures. Exceptions are chained like the
* {@link java.sql.SQLException} interface.<p>
*
* Here is a fragment of code to chain exceptions for later throwing:<p>
*
* <pre>
* CatalogException rce = null;
* ... some loop code ... {
* ...
* if ( exception triggered ) {
* if ( rce == null ) rce = new CatalogException( reason );
* else rce.setNextException( new CatalogException(reason) );
* ...
* } ... loop end ...
* if ( rce != null ) throw rce;
* </pre>
*
* Here is a fragment of code to unchain exceptions in the client:<p>
*
* <pre>
* try {
* ... operation ...
* } catch ( CatalogException rce ) {
* for ( ; rce != null; rce = rce.getNextException ) {
* ... do something with the payload ...
* }
* }
* </pre>
*
* @author Karan Vahi
* @author Jens-S. Vöckler
*/
public class CatalogException
// method A: no need to change interface, obsfuscated use, though
extends java.lang.RuntimeException
// method B: needs API small change, but makes things clear.
// extends java.lang.Exception
{
/**
* chains the next exception into line.
*/
private CatalogException m_next_exception = null;
/*
* Constructs a <code>CatalogException</code> with no detail
* message.
*/
public CatalogException()
{
super();
m_next_exception = null;
}
/**
* Constructs a <code>CatalogException</code> with the
* specified detailed message.
*
* @param s is the detailled message.
*/
public CatalogException( String s )
{
super(s);
m_next_exception = null;
}
/**
* Constructs a <code>CatalogException</code> with the
* specified detailed message and a cause.
*
* @param s is the detailled message.
* @param cause is the cause (which is saved for later retrieval by the
* {@link java.lang.Throwable#getCause()} method). A <code>null</code>
* value is permitted, and indicates that the cause is nonexistent or
* unknown.
*/
public CatalogException( String s, Throwable cause )
{
super(s,cause);
m_next_exception = null;
}
/**
* Constructs a <code>CatalogException</code> with the
* specified just a cause.
*
* @param cause is the cause (which is saved for later retrieval by the
* {@link java.lang.Throwable#getCause()} method). A <code>null</code>
* value is permitted, and indicates that the cause is nonexistent or
* unknown.
*/
public CatalogException( Throwable cause )
{
super(cause);
m_next_exception = null;
}
/**
* Retrieves the exception chained to this
* <code>CatalogException</code> object.
*
* @return the next <code>CatalogException</code> object in the chain;
* <code>null</code> if there are none.
* @see #setNextException( CatalogException )
*/
public CatalogException getNextException()
{
return m_next_exception;
}
/**
* Adds an <code>CatalogException<code> object to the end of
* the chain.
*
* @param ex the new exception that will be added to the end of the
* <code>CatalogException</code> chain.
* @see #getNextException()
*/
public void setNextException( CatalogException ex )
{
if ( m_next_exception == null ) {
m_next_exception = ex;
} else {
CatalogException temp, rce = m_next_exception;
while ( (temp = rce.getNextException()) != null ) {
rce = temp;
}
rce.setNextException(ex);
}
}
}