/* * #%L * Common package for I/O and related utilities * %% * Copyright (C) 2005 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * #L% */ package loci.common; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; /** * A utility class with convenience methods for debugging. * * @author Curtis Rueden ctrueden at wisc.edu */ public final class DebugTools { // -- Constructor -- private DebugTools() { } // -- DebugTools methods -- /** Extracts the given exception's corresponding stack trace to a string. */ public static String getStackTrace(Throwable t) { try { ByteArrayOutputStream out = new ByteArrayOutputStream(); t.printStackTrace(new PrintStream(out, false, Constants.ENCODING)); return new String(out.toByteArray(), Constants.ENCODING); } catch (IOException e) { } return null; } /** * Attempts to enable SLF4J logging via logback or log4j * without an external configuration file. * * @param level A string indicating the desired level * (i.e.: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN). * @return true iff logging was successfully enabled */ public static synchronized boolean enableLogging(String level) { final String[][] toolClasses = new String[][] { new String[] {"loci.common.", "LogbackTools"}, new String[] {"loci.common.", "Log4jTools"} }; for (String[] toolClass : toolClasses) { try { Class<?> k = Class.forName(toolClass[0] + toolClass[1]); Method m = k.getMethod("enableLogging", String.class); m.invoke(null, level); return true; } catch (Throwable t) { // no-op. Ignore error and try the next class. } } return false; } /** * Enable SLF4J logging using logback, in the context of ImageJ. * This allows logging events to be echoed to the ImageJ status bar, * regardless of how the logging configuration file was set up. * * @param debug true if debug-level output should be shown * @return whether or not ImageJ log enabling was successful */ public static synchronized boolean enableIJLogging(boolean debug) { ReflectedUniverse r = new ReflectedUniverse(); try { r.exec("import loci.common.LogbackTools"); r.exec("import loci.plugins.util.IJStatusEchoer"); r.exec("appender = new IJStatusEchoer()"); r.setVar("debug", debug); r.exec("LogbackTools.enableIJLogging(debug, appender)"); } catch (ReflectException exc) { return false; } return true; } /** * This method uses reflection to scan the values of the given class's * static fields, returning the first matching field's name. */ public static String getFieldName(Class<?> c, int value) { Field[] fields = c.getDeclaredFields(); for (int i=0; i<fields.length; i++) { if (!Modifier.isStatic(fields[i].getModifiers())) continue; fields[i].setAccessible(true); try { if (fields[i].getInt(null) == value) return fields[i].getName(); } catch (IllegalAccessException exc) { } catch (IllegalArgumentException exc) { } } return "" + value; } }