/* Copyright (C) 2009 Egon Willighagen <egonw@users.sf.net> * * Contact: cdk-devel@lists.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.openscience.cdk.tools; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; /** * Factory used to instantiate a {@link ILoggingTool}. To get an instance, run: * <pre> * public class SomeClass { * private static ILoggingTool logger; * * static { * logger = LoggingToolFactory.createLoggingTool(SomeClass.class); * } * } * </pre> * * @cdk.module core */ @TestClass("org.openscience.cdk.tools.LoggingToolFactoryTest") public class LoggingToolFactory { /** Default logging tool. Currently, the log4j based one. */ public final static String DEFAULT_LOGGING_TOOL_CLASS = "org.openscience.cdk.tools.LoggingTool"; /** Back-up logging tool. Currently, a tool that outputs to System.out. */ public final static String STDOUT_LOGGING_TOOL_CLASS = "org.openscience.cdk.tools.SystemOutLoggingTool"; private static Class<? extends ILoggingTool> userSetILoggerTool; /** * Sets the {@link ILoggingTool} implementation to be used. * * @param loggingTool The new {@link ILoggingTool}. * @see #getLoggingToolClass() */ @TestMethod("testSetGetLoggingToolClass,testCustomLogger") public static void setLoggingToolClass( Class<? extends ILoggingTool> loggingTool) { LoggingToolFactory.userSetILoggerTool = loggingTool; } /** * Gets the currently used {@link ILoggingTool} implementation. * * @return The currently used {@link ILoggingTool}. * @see #setLoggingToolClass(Class) */ @TestMethod("testSetGetLoggingToolClass") public static Class<? extends ILoggingTool> getLoggingToolClass() { return LoggingToolFactory.userSetILoggerTool; } /** * Dynamically create a {@link ILoggingTool} for the given * <code>sourceClass</code>. * * @param sourceClass Class for which the {@link ILoggingTool} should be * constructed. * @return An {@link ILoggingTool} implementation. */ @TestMethod("testCreateLoggingTool") public static ILoggingTool createLoggingTool(Class<?> sourceClass) { ILoggingTool tool = null; // first attempt the user set ILoggingTool if (userSetILoggerTool != null) { tool = instantiateWithCreateMethod( sourceClass, userSetILoggerTool ); } if (tool == null) { tool = initializeLoggingTool( sourceClass, DEFAULT_LOGGING_TOOL_CLASS ); } if (tool == null) { tool = initializeLoggingTool( sourceClass, STDOUT_LOGGING_TOOL_CLASS ); } return tool; } private static ILoggingTool initializeLoggingTool( Class<?> sourceClass, String className) { try { Class<?> possibleLoggingToolClass = sourceClass.getClassLoader() .loadClass(className); if (ILoggingTool.class.isAssignableFrom(possibleLoggingToolClass)) { return instantiateWithCreateMethod(sourceClass, possibleLoggingToolClass); } } catch (ClassNotFoundException e) { } catch (SecurityException e) { } catch (IllegalArgumentException e) { } return null; } private static ILoggingTool instantiateWithCreateMethod( Class<?> sourceClass, Class<?> loggingToolClass) { Method createMethod; try { createMethod = loggingToolClass.getMethod( "create", Class.class ); Object createdLoggingTool = createMethod.invoke( null, sourceClass ); if (createdLoggingTool instanceof ILoggingTool) { return (ILoggingTool)createdLoggingTool; } else { System.out.println("Expected ILoggingTool, but found a:" + createdLoggingTool.getClass().getName()); } } catch (SecurityException e) { } catch (NoSuchMethodException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } return null; } }