Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Context: add Logger injection
  • Loading branch information
maarzt committed Apr 27, 2018
commit cad0cfe8eaa3b4bfa7160b407c9fe1c9db162169
18 changes: 18 additions & 0 deletions src/main/java/org/scijava/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
import org.scijava.event.EventHandler;
import org.scijava.event.EventService;
import org.scijava.log.LogService;
import org.scijava.log.Logger;
import org.scijava.plugin.Parameter;
import org.scijava.plugin.Plugin;
import org.scijava.plugin.PluginIndex;
import org.scijava.service.Service;
import org.scijava.service.ServiceHelper;
Expand Down Expand Up @@ -495,6 +497,22 @@ else if (Context.class.isAssignableFrom(type) && type.isInstance(this)) {
// populate Context parameter
ClassUtils.setValue(f, o, this);
}
else if (Logger.class.isAssignableFrom(type)) {
final Logger existingLogger = (Logger) ClassUtils.getValue(f, o);
if (existingLogger == null) {
final LogService logService = getService(LogService.class);
if(logService != null) {
Parameter annotation = f.getAnnotation(Parameter.class);
String label = annotation.label();
String name = label == null || label.isEmpty() ? o.getClass().getSimpleName() : label;
final Logger logger = logService.subLogger(name);
ClassUtils.setValue(f, o, logger);
} else if(f.getAnnotation(Parameter.class).required()) {
throw new IllegalArgumentException(
createMissingServiceMessage(LogService.class));
}
}
}
else if (!type.isPrimitive()) {
// the parameter is some other object; if it is non-null, we recurse
final Object value = ClassUtils.getValue(f, o);
Expand Down
89 changes: 89 additions & 0 deletions src/test/java/org/scijava/log/LoggerInjectionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package org.scijava.log;

import org.junit.Test;
import org.scijava.Context;
import org.scijava.plugin.Parameter;

import java.util.Collections;

import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class LoggerInjectionTest {

private final Context context = new Context(LogService.class);

@Test
public void testInjection() {
// setup
LogService logService = context.service(LogService.class);
TestLogListener listener = new TestLogListener();
logService.addLogListener(listener);
// process
ObjectWithLogger object = new ObjectWithLogger();
context.inject(object);
object.logSomething();
// test
assertTrue(listener.hasLogged(m -> "Something".equals(m.text())));
}

@Test
public void testDefaultLoggerName() {
ObjectWithLogger object = new ObjectWithLogger();
context.inject(object);
assertEquals(ObjectWithLogger.class.getSimpleName(), object.getLogger().getName());
}

@Test
public void testCustomLoggerName() {
ObjectWithLabeledLogger object = new ObjectWithLabeledLogger();
context.inject(object);
assertEquals("xyz", object.getLogger().getName());
}

@Test(expected = IllegalArgumentException.class)
public void testMissingLogService() {
Context emptyContext = new Context(Collections.emptyList());
ObjectWithLogger object = new ObjectWithLogger();
emptyContext.inject(object);
}

@Test
public void testMissingLogServiceOptionalLogger() {
Context emptyContext = new Context(Collections.emptyList());
ObjectWithOptionalLogger object = new ObjectWithOptionalLogger();
emptyContext.inject(object);
assertNull(object.getLogger());
}

public static class ObjectWithLogger {

@Parameter Logger log;

public Logger getLogger() {
return log;
}

public void logSomething() { log.warn("Something"); }
}

public static class ObjectWithLabeledLogger {

@Parameter(label = "xyz") Logger log;

public Logger getLogger() {
return log;
}
}

public static class ObjectWithOptionalLogger {

@Parameter(required = false) Logger log;

public Logger getLogger() {
return log;
}
}
}