From 42706c2c0dd267eef48fa11c2ad1300778dc5574 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:02:09 -0500 Subject: [PATCH 01/10] AbstractLogService: tweak javadoc --- src/main/java/org/scijava/log/AbstractLogService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 96dc08240..1b23c6396 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -38,7 +38,7 @@ import org.scijava.service.AbstractService; /** - * Base implementation of an abstract {@link LogService}. + * Base class for {@link LogService} implementations. * * @author Johannes Schindelin */ From 466c5a64e7980267251513b59da5262e0979a7da Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:03:11 -0500 Subject: [PATCH 02/10] AbstractLogService: format code style --- .../org/scijava/log/AbstractLogService.java | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 1b23c6396..8115a5806 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 @@ -38,29 +38,31 @@ import org.scijava.service.AbstractService; /** - * Base class for {@link LogService} implementations. - * + * 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); @@ -87,7 +89,8 @@ 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))); } @@ -109,97 +112,97 @@ protected void log(final int level, final Object msg) { log((prefix == null ? "" : prefix + " ") + msg); } - protected String getPrefix(int level) { + protected 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 null; + case ERROR: + return "[ERROR]"; + case WARN: + return "[WARNING]"; + case INFO: + return "[INFO]"; + case DEBUG: + return "[DEBUG]"; + case TRACE: + return "[TRACE]"; + default: + return null; } } // -- LogService methods -- @Override - public void debug(Object msg) { + public void debug(final Object msg) { log(DEBUG, msg, null); } @Override - public void debug(Throwable t) { + public void debug(final Throwable t) { log(DEBUG, null, t); } @Override - public void debug(Object msg, Throwable t) { + public void debug(final Object msg, final Throwable t) { log(DEBUG, msg, t); } @Override - public void error(Object msg) { + public void error(final Object msg) { log(ERROR, msg, null); } @Override - public void error(Throwable t) { + public void error(final Throwable t) { log(ERROR, null, t); } @Override - public void error(Object msg, Throwable t) { + public void error(final Object msg, final Throwable t) { log(ERROR, msg, t); } @Override - public void info(Object msg) { + public void info(final Object msg) { log(INFO, msg, null); } @Override - public void info(Throwable t) { + public void info(final Throwable t) { log(INFO, null, t); } @Override - public void info(Object msg, Throwable t) { + public void info(final Object msg, final Throwable t) { log(INFO, msg, t); } @Override - public void trace(Object msg) { + public void trace(final Object msg) { log(TRACE, msg, null); } @Override - public void trace(Throwable t) { + public void trace(final Throwable t) { log(TRACE, null, t); } @Override - public void trace(Object msg, Throwable t) { + public void trace(final Object msg, final Throwable t) { log(TRACE, msg, t); } @Override - public void warn(Object msg) { + public void warn(final Object msg) { log(WARN, msg, null); } @Override - public void warn(Throwable t) { + public void warn(final Throwable t) { log(WARN, null, t); } @Override - public void warn(Object msg, Throwable t) { + public void warn(final Object msg, final Throwable t) { log(WARN, msg, t); } @@ -248,7 +251,7 @@ public void setLevel(final int level) { currentLevel = level; } - //@Override +// @Override public void setLevel(final String classOrPackageName, final int level) { classAndPackageLevels.put(classOrPackageName, level); } @@ -289,7 +292,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); } From 49285cf41f80a7beff2df5c660f782b37797fae9 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:03:42 -0500 Subject: [PATCH 03/10] LogService: add setLevel method to public API Specifically, the setLevel(String classOrPackageName, int level) method was public in AbstractLogService, but not part of the LogService API. --- src/main/java/org/scijava/log/AbstractLogService.java | 2 +- src/main/java/org/scijava/log/LogService.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 8115a5806..8a2241370 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -251,7 +251,7 @@ public void setLevel(final int level) { currentLevel = level; } -// @Override + @Override public void setLevel(final String classOrPackageName, final int level) { classAndPackageLevels.put(classOrPackageName, level); } 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); + } From 2255c6957191214cda667c1ba8485d5d7d697948 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:29:34 -0500 Subject: [PATCH 04/10] Organize imports --- src/main/java/org/scijava/script/History.java | 1 + src/test/java/org/scijava/command/CommandServiceTest.java | 2 -- src/test/java/org/scijava/display/DisplayTest.java | 3 --- src/test/java/org/scijava/menu/ShadowMenuTest.java | 2 -- src/test/java/org/scijava/options/OptionsTest.java | 2 -- src/test/java/org/scijava/prefs/PrefServiceTest.java | 1 - src/test/java/org/scijava/test/TestUtilsTest.java | 1 - src/test/java/org/scijava/util/ColorRGBTest.java | 2 -- src/test/java/org/scijava/util/UnitUtilsTest.java | 1 - 9 files changed, 1 insertion(+), 14 deletions(-) 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/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/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/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}. From 6d27af00dca659e0229ca3e7071452033c76d8b5 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:31:47 -0500 Subject: [PATCH 05/10] Rename StderrLogService to DefaultLogService This is a backwards incompatible change. --- pom.xml | 2 +- .../org/scijava/log/DefaultLogService.java | 67 +++++++++++++++++++ .../scijava/script/AbstractScriptEngine.java | 4 +- .../org/scijava/service/ServiceHelper.java | 4 +- .../java/org/scijava/ContextCreationTest.java | 2 +- .../java/org/scijava/log/LogServiceTest.java | 2 +- .../org/scijava/service/ServiceIndexTest.java | 4 +- 7 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/scijava/log/DefaultLogService.java 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/DefaultLogService.java b/src/main/java/org/scijava/log/DefaultLogService.java new file mode 100644 index 000000000..37d91e455 --- /dev/null +++ b/src/main/java/org/scijava/log/DefaultLogService.java @@ -0,0 +1,67 @@ +/* + * #%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; + +/** + * Implementation of {@link LogService} using the standard error stream. + * + * @author Johannes Schindelin + * @author Curtis Rueden + */ +@Plugin(type = Service.class, priority = Priority.LOW_PRIORITY) +public class DefaultLogService extends AbstractLogService { + + /** + * Prints a message to stderr. + * + * @param message the message + */ + @Override + protected void log(final String message) { + System.err.println(message); + } + + /** + * Prints an exception to stderr. + * + * @param t the exception + */ + @Override + protected void log(final Throwable t) { + t.printStackTrace(); + } + +} 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/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/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/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()); } /** From 2ee2db9de040dac1162434c9468c245bb67ebc17 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:34:50 -0500 Subject: [PATCH 06/10] AbstractLogService: make getPrefix private --- .../org/scijava/log/AbstractLogService.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 8a2241370..473f1d8e9 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -112,23 +112,6 @@ protected void log(final int level, final Object msg) { log((prefix == null ? "" : prefix + " ") + msg); } - protected 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 null; - } - } - // -- LogService methods -- @Override @@ -258,6 +241,23 @@ public void setLevel(final String classOrPackageName, final int 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 null; + } + } + /** Extracts the log level value from a string. */ private int level(final String logProp) { if (logProp == null) return -1; From 1f19243cf1756a9e6049dba3a6e32995a4e3a1a5 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:37:11 -0500 Subject: [PATCH 07/10] AbstractLogService: refactor level check logic We do the level check in the level-specific methods now, in preparation for the protected log(int level, Object msg, Throwable t) method to become the central override point of concrete implementations. That way, specific implementations will not need to worry about filtering based on level in the typical case. --- .../org/scijava/log/AbstractLogService.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 473f1d8e9..d89e0f785 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -99,8 +99,6 @@ public AbstractLogService() { // -- 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); } @@ -116,77 +114,77 @@ protected void log(final int level, final Object msg) { @Override public void debug(final Object msg) { - log(DEBUG, msg, null); + if (isDebug()) log(DEBUG, msg, null); } @Override public void debug(final Throwable t) { - log(DEBUG, null, t); + if (isDebug()) log(DEBUG, null, t); } @Override public void debug(final Object msg, final Throwable t) { - log(DEBUG, msg, t); + if (isDebug()) log(DEBUG, msg, t); } @Override public void error(final Object msg) { - log(ERROR, msg, null); + if (isError()) log(ERROR, msg, null); } @Override public void error(final Throwable t) { - log(ERROR, null, t); + if (isError()) log(ERROR, null, t); } @Override public void error(final Object msg, final Throwable t) { - log(ERROR, msg, t); + if (isError()) log(ERROR, msg, t); } @Override public void info(final Object msg) { - log(INFO, msg, null); + if (isInfo()) log(INFO, msg, null); } @Override public void info(final Throwable t) { - log(INFO, null, t); + if (isInfo()) log(INFO, null, t); } @Override public void info(final Object msg, final Throwable t) { - log(INFO, msg, t); + if (isInfo()) log(INFO, msg, t); } @Override public void trace(final Object msg) { - log(TRACE, msg, null); + if (isTrace()) log(TRACE, msg, null); } @Override public void trace(final Throwable t) { - log(TRACE, null, t); + if (isTrace()) log(TRACE, null, t); } @Override public void trace(final Object msg, final Throwable t) { - log(TRACE, msg, t); + if (isTrace()) log(TRACE, msg, t); } @Override public void warn(final Object msg) { - log(WARN, msg, null); + if (isWarn()) log(WARN, msg, null); } @Override public void warn(final Throwable t) { - log(WARN, null, t); + if (isWarn()) log(WARN, null, t); } @Override public void warn(final Object msg, final Throwable t) { - log(WARN, msg, t); + if (isWarn()) log(WARN, msg, t); } @Override From ecacd10ee0ffaef754a2f45159eb7768b90b9b4e Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:38:30 -0500 Subject: [PATCH 08/10] AbstractLogService: fix section header See: http://imagej.net/Coding_style#Ordering_of_code_blocks --- src/main/java/org/scijava/log/AbstractLogService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index d89e0f785..bdaad9bba 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -96,7 +96,7 @@ public AbstractLogService() { } - // -- helper methods -- + // -- Internal methods -- protected void log(final int level, final Object msg, final Throwable t) { if (msg != null || t == null) { From 8877f4decf1a1ec84a8447e301f8dfaba5371783 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:50:48 -0500 Subject: [PATCH 09/10] AbstractLogService: simplify prefix logic --- .../java/org/scijava/log/AbstractLogService.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index bdaad9bba..29114c60f 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -106,8 +106,7 @@ protected void log(final int level, final Object msg, final Throwable t) { } protected void log(final int level, final Object msg) { - final String prefix = getPrefix(level); - log((prefix == null ? "" : prefix + " ") + msg); + log(getPrefix(level) + msg); } // -- LogService methods -- @@ -242,17 +241,17 @@ public void setLevel(final String classOrPackageName, final int level) { private String getPrefix(final int level) { switch (level) { case ERROR: - return "[ERROR]"; + return "[ERROR] "; case WARN: - return "[WARNING]"; + return "[WARNING] "; case INFO: - return "[INFO]"; + return "[INFO] "; case DEBUG: - return "[DEBUG]"; + return "[DEBUG] "; case TRACE: - return "[TRACE]"; + return "[TRACE] "; default: - return null; + return ""; } } From d419af4a50bc1ac75b835536a0d0a7b6e9eca0b0 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Mon, 16 Mar 2015 14:51:36 -0500 Subject: [PATCH 10/10] Improve DefaultLogService to use stdout and stderr When logging critical messages (WARN and ERROR levels), use stderr. When logging non-critical messages (e.g., INFO level), use stdout. This change will be very useful for differentiating between different log levels in a simpler way; in particular, ImageJ can send both stdout and stderr to a Console window, coloring stderr messages in red and setting the Console to visible when they occur, but not displaying the Console by default when only stdout messages occur (because many ImageJ plugins spam stdout with lots of debugging output). --- .../org/scijava/log/AbstractLogService.java | 48 +++++++++---------- .../org/scijava/log/DefaultLogService.java | 29 ++++------- 2 files changed, 34 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/scijava/log/AbstractLogService.java b/src/main/java/org/scijava/log/AbstractLogService.java index 29114c60f..5009639e7 100644 --- a/src/main/java/org/scijava/log/AbstractLogService.java +++ b/src/main/java/org/scijava/log/AbstractLogService.java @@ -31,6 +31,7 @@ package org.scijava.log; +import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -51,22 +52,6 @@ public abstract class AbstractLogService extends AbstractService implements 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() { @@ -98,15 +83,30 @@ public AbstractLogService() { // -- Internal methods -- - protected void log(final int level, final Object msg, final Throwable t) { - if (msg != null || t == null) { - log(level, msg); - } - if (t != null) log(t); - } + /** + * 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 void log(final int level, final Object msg) { - log(getPrefix(level) + msg); + /** + * 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 -- diff --git a/src/main/java/org/scijava/log/DefaultLogService.java b/src/main/java/org/scijava/log/DefaultLogService.java index 37d91e455..4c85e6c62 100644 --- a/src/main/java/org/scijava/log/DefaultLogService.java +++ b/src/main/java/org/scijava/log/DefaultLogService.java @@ -36,32 +36,23 @@ import org.scijava.service.Service; /** - * Implementation of {@link LogService} using the standard error stream. + * 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 Johannes Schindelin * @author Curtis Rueden */ @Plugin(type = Service.class, priority = Priority.LOW_PRIORITY) public class DefaultLogService extends AbstractLogService { - /** - * Prints a message to stderr. - * - * @param message the message - */ @Override - protected void log(final String message) { - System.err.println(message); - } - - /** - * Prints an exception to stderr. - * - * @param t the exception - */ - @Override - protected void log(final Throwable t) { - t.printStackTrace(); + protected void log(final int level, final Object msg, final Throwable t) { + log(level > WARN ? System.out : System.err, level, msg, t); } }