();
- // -- 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}.