/* * $Id$ * * Copyright (c) 2008 by Joel Uckelman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.tools; import java.lang.reflect.InvocationTargetException; /** * @author Joel Uckelman * @since 3.1.0 */ public class ReflectionUtils { private ReflectionUtils() {} public static void handleImportClassFailure(Throwable t, String className) { handle( t, className, // thrown by Class.forName() ClassNotFoundException.class, ExceptionInInitializerError.class, LinkageError.class, // thrown by Class.getConstructor() NoSuchMethodException.class, SecurityException.class, // thrown by Constructor.newInstance() IllegalAccessException.class, IllegalArgumentException.class, InstantiationException.class, InvocationTargetException.class ); } /** * Handle a {@link Throwable} generated by * <code>Class.getConstructor().newInstance()</code>. * * @param t the <code>Throwable</code> */ public static void handleNewInstanceFailure(Throwable t, Class<?> c) { handle( t, c.getName(), IllegalAccessException.class, IllegalArgumentException.class, InstantiationException.class, InvocationTargetException.class, NoSuchMethodException.class, SecurityException.class, ExceptionInInitializerError.class ); } private static void handle(Throwable t, String className, Class<?>... args) { // find and rethrow causes which are not bugs ThrowableUtils.throwRecent(OutOfMemoryError.class, t); // always a bug if the class was from the VASSAL.* hiearchy if (className.startsWith("VASSAL.")) { ErrorDialog.bug(t); return; } // these errors are expected from custom classes for (Class<?> cl : args) { if (cl.isInstance(t)) { ErrorDialog.showDetailsDisableable( t, ThrowableUtils.getStackTrace(t), className, "Error.custom_class_error", className ); return; } } // otherwise something weird happened if (t instanceof Error) { // some unusual problem occurred throw (Error) t; } else if (t instanceof RuntimeException) { // some unusual problem occurred throw (RuntimeException) t; } else { // this should never happen throw new IllegalStateException(t); } } }