diff --git a/pom.xml b/pom.xml index 9868b80ee..35e36da1e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ scijava-common - 2.41.1-SNAPSHOT + 3.0.0-SNAPSHOT SciJava Common SciJava Common is a shared library for SciJava software. It provides a plugin framework, with an extensible mechanism for service discovery, backed by its own annotation processor, so that plugins can be loaded dynamically. It is used by both ImageJ and SCIFIO. diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 96dc08240..5009639e7 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -8,13 +8,13 @@ * %% * 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 @@ -31,6 +31,7 @@ package org.scijava.log; +import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -38,33 +39,19 @@ import org.scijava.service.AbstractService; /** - * Base implementation of an abstract {@link LogService}. - * + * Base class for {@link LogService} implementationst. + * * @author Johannes Schindelin */ -public abstract class AbstractLogService extends AbstractService implements LogService { +public abstract class AbstractLogService extends AbstractService implements + LogService +{ private int currentLevel = System.getenv("DEBUG") == null ? INFO : DEBUG; - private Map classAndPackageLevels = + private final Map classAndPackageLevels = new HashMap(); - // -- abstract methods -- - - /** - * Displays a message. - * - * @param msg the message to display. - */ - protected abstract void log(final String msg); - - /** - * Displays an exception. - * - * @param t the exception to display. - */ - protected abstract void log(final Throwable t); - // -- constructor -- public AbstractLogService() { @@ -87,120 +74,116 @@ public AbstractLogService() { if (!(propKey instanceof String)) continue; final String propName = (String) propKey; if (!propName.startsWith(logLevelPrefix)) continue; - final String classOrPackageName = propName.substring(logLevelPrefix.length()); + final String classOrPackageName = + propName.substring(logLevelPrefix.length()); setLevel(classOrPackageName, level(props.getProperty(propName))); } } - // -- helper methods -- - - protected void log(final int level, final Object msg, final Throwable t) { - if (level > getLevel()) return; - - if (msg != null || t == null) { - log(level, msg); - } - if (t != null) log(t); - } + // -- Internal methods -- - protected void log(final int level, final Object msg) { - final String prefix = getPrefix(level); - log((prefix == null ? "" : prefix + " ") + msg); - } + /** + * Displays a message and/or exception at the given logging level. + * + * @param level The logging level of the information. + * @param msg The message to display. + * @param t The exception to display. + */ + protected abstract void log(final int level, final Object msg, + final Throwable t); - protected String getPrefix(int level) { - switch (level) { - case ERROR: - return "[ERROR]"; - case WARN: - return "[WARNING]"; - case INFO: - return "[INFO]"; - case DEBUG: - return "[DEBUG]"; - case TRACE: - return "[TRACE]"; - default: - return null; - } + /** + * Displays a message and/or exception at the given logging level, using the + * specific output stream. + * + * @param stream The output stream to which the information should be sent. + * @param level The logging level of the information. + * @param msg The message to display. + * @param t The exception to display. + */ + protected void log(final PrintStream stream, final int level, + final Object msg, final Throwable t) + { + if (msg != null || t == null) stream.println(getPrefix(level) + msg); + if (t != null) t.printStackTrace(stream); } // -- LogService methods -- @Override - public void debug(Object msg) { - log(DEBUG, msg, null); + public void debug(final Object msg) { + if (isDebug()) log(DEBUG, msg, null); } @Override - public void debug(Throwable t) { - log(DEBUG, null, t); + public void debug(final Throwable t) { + if (isDebug()) log(DEBUG, null, t); } @Override - public void debug(Object msg, Throwable t) { - log(DEBUG, msg, t); + public void debug(final Object msg, final Throwable t) { + if (isDebug()) log(DEBUG, msg, t); } @Override - public void error(Object msg) { - log(ERROR, msg, null); + public void error(final Object msg) { + if (isError()) log(ERROR, msg, null); } @Override - public void error(Throwable t) { - log(ERROR, null, t); + public void error(final Throwable t) { + if (isError()) log(ERROR, null, t); } @Override - public void error(Object msg, Throwable t) { - log(ERROR, msg, t); + public void error(final Object msg, final Throwable t) { + if (isError()) log(ERROR, msg, t); } @Override - public void info(Object msg) { - log(INFO, msg, null); + public void info(final Object msg) { + if (isInfo()) log(INFO, msg, null); } @Override - public void info(Throwable t) { - log(INFO, null, t); + public void info(final Throwable t) { + if (isInfo()) log(INFO, null, t); } @Override - public void info(Object msg, Throwable t) { - log(INFO, msg, t); + public void info(final Object msg, final Throwable t) { + if (isInfo()) log(INFO, msg, t); } @Override - public void trace(Object msg) { - log(TRACE, msg, null); + public void trace(final Object msg) { + if (isTrace()) log(TRACE, msg, null); } @Override - public void trace(Throwable t) { - log(TRACE, null, t); + public void trace(final Throwable t) { + if (isTrace()) log(TRACE, null, t); } @Override - public void trace(Object msg, Throwable t) { - log(TRACE, msg, t); + public void trace(final Object msg, final Throwable t) { + if (isTrace()) log(TRACE, msg, t); } @Override - public void warn(Object msg) { - log(WARN, msg, null); + public void warn(final Object msg) { + if (isWarn()) log(WARN, msg, null); } @Override - public void warn(Throwable t) { - log(WARN, null, t); + public void warn(final Throwable t) { + if (isWarn()) log(WARN, null, t); } @Override - public void warn(Object msg, Throwable t) { - log(WARN, msg, t); + public void warn(final Object msg, final Throwable t) { + if (isWarn()) log(WARN, msg, t); } @Override @@ -248,13 +231,30 @@ public void setLevel(final int level) { currentLevel = level; } - //@Override + @Override public void setLevel(final String classOrPackageName, final int level) { classAndPackageLevels.put(classOrPackageName, level); } // -- Helper methods -- + private String getPrefix(final int level) { + switch (level) { + case ERROR: + return "[ERROR] "; + case WARN: + return "[WARNING] "; + case INFO: + return "[INFO] "; + case DEBUG: + return "[DEBUG] "; + case TRACE: + return "[TRACE] "; + default: + return ""; + } + } + /** Extracts the log level value from a string. */ private int level(final String logProp) { if (logProp == null) return -1; @@ -289,7 +289,7 @@ private String callingClass() { } private String parentPackage(final String classOrPackageName) { - int dot = classOrPackageName.lastIndexOf("."); + final int dot = classOrPackageName.lastIndexOf("."); if (dot < 0) return null; return classOrPackageName.substring(0, dot); } diff --git a/src/main/java/org/scijava/log/DefaultLogService.java b/src/main/java/org/scijava/log/DefaultLogService.java new file mode 100644 index 000000000..4c85e6c62 --- /dev/null +++ b/src/main/java/org/scijava/log/DefaultLogService.java @@ -0,0 +1,58 @@ +/* + * #%L + * SciJava Common shared library for SciJava software. + * %% + * Copyright (C) 2009 - 2015 Board of Regents of the University of + * Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck + * Institute of Molecular Cell Biology and Genetics. + * %% + * 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 org.scijava.log; + +import org.scijava.Priority; +import org.scijava.plugin.Plugin; +import org.scijava.service.Service; + +/** + * Default implementation of {@link LogService}. + *

+ * It uses the standard output and error streams, logging critical messages ( + * {@link LogService#WARN} and {@link LogService#ERROR} levels) to + * {@code stderr}, and non-critical messages ({@link LogService#INFO}, + * {@link LogService#DEBUG} and {@link LogService#TRACE} levels) to + * {@code stdout}. + *

+ * + * @author Curtis Rueden + */ +@Plugin(type = Service.class, priority = Priority.LOW_PRIORITY) +public class DefaultLogService extends AbstractLogService { + + @Override + protected void log(final int level, final Object msg, final Throwable t) { + log(level > WARN ? System.out : System.err, level, msg, t); + } + +} diff --git a/src/main/java/org/scijava/log/LogService.java b/src/main/java/org/scijava/log/LogService.java index 190077f0f..0ea0901f2 100644 --- a/src/main/java/org/scijava/log/LogService.java +++ b/src/main/java/org/scijava/log/LogService.java @@ -100,4 +100,6 @@ public interface LogService extends SciJavaService { void setLevel(int level); + void setLevel(String classOrPackageName, int level); + } diff --git a/src/main/java/org/scijava/script/AbstractScriptEngine.java b/src/main/java/org/scijava/script/AbstractScriptEngine.java index 1c40684cd..0603dfcb5 100644 --- a/src/main/java/org/scijava/script/AbstractScriptEngine.java +++ b/src/main/java/org/scijava/script/AbstractScriptEngine.java @@ -39,8 +39,8 @@ import javax.script.ScriptEngineFactory; import javax.script.ScriptException; +import org.scijava.log.DefaultLogService; import org.scijava.log.LogService; -import org.scijava.log.StderrLogService; /** * This class implements dummy versions for ScriptEngine's methods that are not @@ -70,7 +70,7 @@ public abstract class AbstractScriptEngine implements ScriptEngine { public synchronized LogService log() { if (log == null) { - log = new StderrLogService(); + log = new DefaultLogService(); } return log; } diff --git a/src/main/java/org/scijava/script/History.java b/src/main/java/org/scijava/script/History.java index 445bffd96..f860798bb 100644 --- a/src/main/java/org/scijava/script/History.java +++ b/src/main/java/org/scijava/script/History.java @@ -33,6 +33,7 @@ import org.scijava.prefs.PrefService; import org.scijava.util.LastRecentlyUsed; +import org.scijava.util.Prefs; /** * Container for a script language's interpreter history. diff --git a/src/main/java/org/scijava/service/ServiceHelper.java b/src/main/java/org/scijava/service/ServiceHelper.java index 025deaac7..55fc231dc 100644 --- a/src/main/java/org/scijava/service/ServiceHelper.java +++ b/src/main/java/org/scijava/service/ServiceHelper.java @@ -43,8 +43,8 @@ import org.scijava.Optional; import org.scijava.event.EventHandler; import org.scijava.event.EventService; +import org.scijava.log.DefaultLogService; import org.scijava.log.LogService; -import org.scijava.log.StderrLogService; import org.scijava.plugin.Parameter; import org.scijava.plugin.PluginInfo; import org.scijava.service.event.ServicesLoadedEvent; @@ -114,7 +114,7 @@ public ServiceHelper(final Context context, { setContext(context); log = context.getService(LogService.class); - if (log == null) log = new StderrLogService(); + if (log == null) log = new DefaultLogService(); classPoolMap = new HashMap, Double>(); classPoolList = new ArrayList>(); findServiceClasses(classPoolMap, classPoolList); diff --git a/src/test/java/org/scijava/ContextCreationTest.java b/src/test/java/org/scijava/ContextCreationTest.java index 04edd543c..1b53d880a 100644 --- a/src/test/java/org/scijava/ContextCreationTest.java +++ b/src/test/java/org/scijava/ContextCreationTest.java @@ -98,7 +98,7 @@ public void testFull() { org.scijava.ui.dnd.DefaultDragAndDropService.class, org.scijava.welcome.DefaultWelcomeService.class, org.scijava.widget.DefaultWidgetService.class, - org.scijava.log.StderrLogService.class, + org.scijava.log.DefaultLogService.class, org.scijava.platform.DefaultAppEventService.class }; final Context context = new Context(); diff --git a/src/test/java/org/scijava/command/CommandServiceTest.java b/src/test/java/org/scijava/command/CommandServiceTest.java index dd53d29d2..71d35ba14 100644 --- a/src/test/java/org/scijava/command/CommandServiceTest.java +++ b/src/test/java/org/scijava/command/CommandServiceTest.java @@ -35,8 +35,6 @@ import org.junit.Test; import org.scijava.Context; -import org.scijava.command.Command; -import org.scijava.command.CommandService; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; diff --git a/src/test/java/org/scijava/display/DisplayTest.java b/src/test/java/org/scijava/display/DisplayTest.java index 17e02d96a..6b0109ce6 100644 --- a/src/test/java/org/scijava/display/DisplayTest.java +++ b/src/test/java/org/scijava/display/DisplayTest.java @@ -38,9 +38,6 @@ import org.junit.Test; import org.scijava.Context; -import org.scijava.display.Display; -import org.scijava.display.DisplayService; -import org.scijava.display.TextDisplay; /** * Unit tests for core {@link Display} classes. diff --git a/src/test/java/org/scijava/log/LogServiceTest.java b/src/test/java/org/scijava/log/LogServiceTest.java index 8373b065c..8b3c7ebca 100644 --- a/src/test/java/org/scijava/log/LogServiceTest.java +++ b/src/test/java/org/scijava/log/LogServiceTest.java @@ -44,7 +44,7 @@ public class LogServiceTest { @Test public void testDefaultLevel() { - final LogService log = new StderrLogService(); + final LogService log = new DefaultLogService(); int level = log.getLevel(); assertTrue("default level (" + level + ") is at least INFO(" + WARN + ")", level >= WARN); } diff --git a/src/test/java/org/scijava/menu/ShadowMenuTest.java b/src/test/java/org/scijava/menu/ShadowMenuTest.java index 1d07c4b2c..ae4def0b9 100644 --- a/src/test/java/org/scijava/menu/ShadowMenuTest.java +++ b/src/test/java/org/scijava/menu/ShadowMenuTest.java @@ -43,8 +43,6 @@ import org.junit.Test; import org.scijava.Context; import org.scijava.MenuPath; -import org.scijava.menu.ShadowMenu; -import org.scijava.menu.ShadowMenuIterator; import org.scijava.module.DefaultMutableModuleInfo; import org.scijava.module.ModuleInfo; diff --git a/src/test/java/org/scijava/options/OptionsTest.java b/src/test/java/org/scijava/options/OptionsTest.java index 09519b591..4fad69481 100644 --- a/src/test/java/org/scijava/options/OptionsTest.java +++ b/src/test/java/org/scijava/options/OptionsTest.java @@ -39,8 +39,6 @@ import org.junit.Test; import org.scijava.Context; -import org.scijava.options.OptionsPlugin; -import org.scijava.options.OptionsService; import org.scijava.plugin.Parameter; import org.scijava.plugin.PluginInfo; import org.scijava.plugin.PluginService; diff --git a/src/test/java/org/scijava/prefs/PrefServiceTest.java b/src/test/java/org/scijava/prefs/PrefServiceTest.java index a0b1f5270..00488a836 100644 --- a/src/test/java/org/scijava/prefs/PrefServiceTest.java +++ b/src/test/java/org/scijava/prefs/PrefServiceTest.java @@ -45,7 +45,6 @@ import org.junit.Before; import org.junit.Test; import org.scijava.Context; -import org.scijava.prefs.PrefService; /** * Tests {@link PrefService}. diff --git a/src/test/java/org/scijava/service/ServiceIndexTest.java b/src/test/java/org/scijava/service/ServiceIndexTest.java index 9ba7ae354..bb4c4eb54 100644 --- a/src/test/java/org/scijava/service/ServiceIndexTest.java +++ b/src/test/java/org/scijava/service/ServiceIndexTest.java @@ -40,7 +40,7 @@ import org.junit.Test; import org.scijava.Context; import org.scijava.event.DefaultEventService; -import org.scijava.log.StderrLogService; +import org.scijava.log.DefaultLogService; import org.scijava.options.DefaultOptionsService; import org.scijava.options.OptionsService; import org.scijava.plugin.DefaultPluginService; @@ -63,7 +63,7 @@ public void testGetAll() { assertSame(DefaultEventService.class, all.get(0).getClass()); assertSame(DefaultPluginService.class, all.get(1).getClass()); assertSame(DefaultThreadService.class, all.get(2).getClass()); - assertSame(StderrLogService.class, all.get(3).getClass()); + assertSame(DefaultLogService.class, all.get(3).getClass()); } /** diff --git a/src/test/java/org/scijava/test/TestUtilsTest.java b/src/test/java/org/scijava/test/TestUtilsTest.java index 3bdcf2f45..be7f2a732 100644 --- a/src/test/java/org/scijava/test/TestUtilsTest.java +++ b/src/test/java/org/scijava/test/TestUtilsTest.java @@ -40,7 +40,6 @@ import java.util.Arrays; import org.junit.Test; -import org.scijava.test.TestUtils; /** * Tests the {@link TestUtils}. diff --git a/src/test/java/org/scijava/util/ColorRGBTest.java b/src/test/java/org/scijava/util/ColorRGBTest.java index 467663eec..1a4c3413b 100644 --- a/src/test/java/org/scijava/util/ColorRGBTest.java +++ b/src/test/java/org/scijava/util/ColorRGBTest.java @@ -37,8 +37,6 @@ import static org.junit.Assert.assertSame; import org.junit.Test; -import org.scijava.util.ColorRGB; -import org.scijava.util.Colors; /** * Tests {@link ColorRGB}. diff --git a/src/test/java/org/scijava/util/UnitUtilsTest.java b/src/test/java/org/scijava/util/UnitUtilsTest.java index cbf003d33..8fcaf7552 100644 --- a/src/test/java/org/scijava/util/UnitUtilsTest.java +++ b/src/test/java/org/scijava/util/UnitUtilsTest.java @@ -34,7 +34,6 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; -import org.scijava.util.UnitUtils; /** * Tests {@link UnitUtils}.