/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.clientapi.agent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.rhq.core.util.exception.WrappedRemotingException;
/**
* This generic exception thrown by the plugin container is part of its client API; thus this exception is available to
* both the plugin container as well as its remote clients.
*
* <p>Make sure that when constructing these exceptions, that any {@link #getCause() cause} is also available to remote
* clients as well! If you are unsure, wrap the cause in a {@link org.rhq.core.util.exception.WrappedRemotingException}
* before passing it to this class' constructor.</p>
*
* @author John Mazzitelli
*/
public class PluginContainerException extends Exception {
private static final long serialVersionUID = 1L;
private static Throwable wrapIfNecessary(Throwable e){
if (e.getClass().equals(WrappedRemotingException.class)) return e;
// we assume everyone has java.* exception definitions available
// see if the exception and all its causes are all java.* exceptions
Throwable check_for_java = e;
boolean all_java_exceptions = true; // if false, e or one of its causes is not a java.* exception
while (check_for_java != null) {
if (!check_for_java.getClass().getName().startsWith("java.")) {
all_java_exceptions = false;
break; // don't bother continuing, we found a non-java.* exception
}
if (check_for_java.getCause() == check_for_java) {
check_for_java = null; // reached the end of the causes chain
} else {
check_for_java = check_for_java.getCause();
}
}
// if the exception and all its causes are java.*, then just return e as-is
if (!all_java_exceptions) {
return new WrappedRemotingException(e);
}
return e;
}
/**
* Because this exception is part of the plugin container's client API and thus is to be available on remote clients
* as well, make sure the <code>cause</code> throwable you pass to this constructor is also available to remote
* clients. If it is not or you are unsure, wrap the cause in a
* {@link org.rhq.core.util.exception.WrappedRemotingException} before passing it in to this constructor.
*
* @see Throwable#Throwable(Throwable)
*/
public PluginContainerException(Throwable cause) {
super(wrapIfNecessary(cause));
}
/**
* Because this exception is part of the plugin container's client API and thus is to be available on remote clients
* as well, make sure the <code>cause</code> throwable you pass to this constructor is also available to remote
* clients. If it is not or you are unsure, wrap the cause in a
* {@link org.rhq.core.util.exception.WrappedRemotingException} before passing it in to this constructor.
*
* @see Throwable#Throwable(String, Throwable)
*/
public PluginContainerException(String message, Throwable cause) {
super(message, wrapIfNecessary(cause));
}
/**
* @see Throwable#Throwable()
*/
public PluginContainerException() {
}
/**
* @see Throwable#Throwable(String)
*/
public PluginContainerException(String message) {
super(message);
}
}