Skip to content

Commit 138b57b

Browse files
committed
Use Context as dependency injection point
Rather than LogFormatter and LoggingPanel and ConsolePanel having constructors that take services explicitly, they now just take a Context, and inject the services from there. This is a more resilient API in the face of changing service dependencies, and prevents the ability to inject services from different contexts. The LogFormatter now receives its Context and prefKey at construction, rather than having a setPrefService method.
1 parent ca26e90 commit 138b57b

File tree

6 files changed

+44
-27
lines changed

6 files changed

+44
-27
lines changed

src/main/java/org/scijava/ui/swing/console/ConsolePanel.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@
4747

4848
import net.miginfocom.swing.MigLayout;
4949

50+
import org.scijava.Context;
5051
import org.scijava.console.OutputEvent;
5152
import org.scijava.console.OutputListener;
5253
import org.scijava.log.IgnoreAsCallingClass;
54+
import org.scijava.plugin.Parameter;
5355
import org.scijava.thread.ThreadService;
5456
import org.scijava.ui.swing.StaticSwingUtils;
5557

@@ -73,10 +75,11 @@ public class ConsolePanel extends JPanel implements OutputListener
7375
private Style stdoutGlobal;
7476
private Style stderrGlobal;
7577

76-
private final ThreadService threadService;
78+
@Parameter
79+
private ThreadService threadService;
7780

78-
public ConsolePanel(ThreadService threadService) {
79-
this.threadService = threadService;
81+
public ConsolePanel(final Context context) {
82+
context.inject(this);
8083
initGui();
8184
}
8285

src/main/java/org/scijava/ui/swing/console/ItemTextPane.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import java.awt.Font;
3434
import java.util.Collections;
3535
import java.util.Iterator;
36-
import java.util.Objects;
3736

3837
import javax.swing.JComponent;
3938
import javax.swing.JPopupMenu;
@@ -44,6 +43,8 @@
4443
import javax.swing.text.DefaultStyledDocument;
4544
import javax.swing.text.StyledDocument;
4645

46+
import org.scijava.Context;
47+
import org.scijava.plugin.Parameter;
4748
import org.scijava.thread.ThreadService;
4849
import org.scijava.ui.swing.StaticSwingUtils;
4950

@@ -66,8 +67,6 @@
6667
*/
6768
class ItemTextPane {
6869

69-
private final ThreadService threadService;
70-
7170
private DocumentCalculator initialCalculator = null;
7271

7372
private JTextPane textPane = new JTextPane();
@@ -79,10 +78,13 @@ class ItemTextPane {
7978
private DocumentCalculator calculator =
8079
new DocumentCalculator(Collections.<Item> emptyList().iterator());
8180

81+
@Parameter
82+
private ThreadService threadService;
83+
8284
// -- constructor --
8385

84-
ItemTextPane(ThreadService threadService) {
85-
this.threadService = Objects.requireNonNull(threadService);
86+
ItemTextPane(final Context context) {
87+
context.inject(this);
8688
textPane.setEditable(false);
8789
textPane.setFont(new Font("monospaced", Font.PLAIN, 12));
8890
}

src/main/java/org/scijava/ui/swing/console/LogFormatter.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@
3636
import java.util.EnumSet;
3737
import java.util.Map;
3838

39+
import org.scijava.Context;
3940
import org.scijava.log.LogLevel;
4041
import org.scijava.log.LogMessage;
42+
import org.scijava.plugin.Parameter;
4143
import org.scijava.prefs.PrefService;
4244

4345
/**
@@ -47,12 +49,13 @@
4749
*/
4850
public class LogFormatter {
4951

50-
private String prefKey = null;
52+
private final String prefKey;
5153

52-
private PrefService prefService = null;
54+
@Parameter(required = false)
55+
private PrefService prefService;
5356

54-
public void setPrefService(PrefService prefService, String prefKey) {
55-
this.prefService = (prefKey != null && !prefKey.isEmpty()) ? prefService : null;
57+
public LogFormatter(final Context context, final String prefKey) {
58+
context.inject(this);
5659
this.prefKey = prefKey;
5760
applySettings();
5861
}

src/main/java/org/scijava/ui/swing/console/LoggingPanel.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.scijava.log.LogService;
7272
import org.scijava.log.LogSource;
7373
import org.scijava.log.Logger;
74+
import org.scijava.plugin.Parameter;
7475
import org.scijava.prefs.PrefService;
7576
import org.scijava.thread.ThreadService;
7677

@@ -87,7 +88,6 @@
8788
@IgnoreAsCallingClass
8889
public class LoggingPanel extends JPanel implements LogListener
8990
{
90-
9191
private static final AttributeSet STYLE_ERROR = normal(new Color(200, 0, 0));
9292
private static final AttributeSet STYLE_WARN = normal(new Color(200, 140, 0));
9393
private static final AttributeSet STYLE_INFO = normal(Color.BLACK);
@@ -107,19 +107,26 @@ public class LoggingPanel extends JPanel implements LogListener
107107

108108
private final Set<LogSource> sources = Collections.newSetFromMap(
109109
new ConcurrentHashMap<>());
110-
private final LogFormatter logFormatter = new LogFormatter();
110+
private final LogFormatter logFormatter;
111111

112112
private LogRecorder recorder;
113113

114+
@Parameter
115+
private ThreadService threadService;
116+
117+
@Parameter
118+
private PrefService prefService;
119+
114120
// -- constructor --
115121

116-
public LoggingPanel(Context context) {
117-
this(context.getService(ThreadService.class), null, null);
122+
public LoggingPanel(final Context context) {
123+
this(context, null);
118124
}
119125

120-
public LoggingPanel(ThreadService threadService, PrefService prefService, String prefKey) {
121-
textArea = new ItemTextPane(threadService);
122-
logFormatter.setPrefService(prefService, prefKey);
126+
public LoggingPanel(final Context context, final String prefKey) {
127+
context.inject(this);
128+
textArea = new ItemTextPane(context);
129+
logFormatter = new LogFormatter(context, prefKey);
123130
initGui();
124131
setRecorder(new LogRecorder());
125132
}
@@ -130,7 +137,7 @@ public void setRecorder(LogRecorder recorder) {
130137
if (recorder != null) recorder.removeObserver(textArea::update);
131138
this.recorder = recorder;
132139
updateFilter();
133-
recorder.addObservers(textArea::update);
140+
if (recorder != null) recorder.addObservers(textArea::update);
134141
}
135142

136143
public void toggleSourcesPanel() {

src/main/java/org/scijava/ui/swing/console/SwingConsolePane.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/*
2+
*
23
* #%L
34
* SciJava UI components for Java Swing.
45
* %%
@@ -61,6 +62,9 @@ public class SwingConsolePane extends AbstractConsolePane<JPanel> {
6162

6263
public static final String LOG_FORMATTING_SETTINGS_KEY = "/log-formatting";
6364

65+
@Parameter
66+
private Context context;
67+
6468
@Parameter
6569
private ThreadService threadService;
6670

@@ -138,8 +142,8 @@ private ConsolePanel consolePanel() {
138142

139143
private synchronized void initLoggingPanel() {
140144
if (consolePanel != null) return;
141-
consolePanel = new ConsolePanel(threadService);
142-
loggingPanel = new LoggingPanel(threadService, prefService, LOG_FORMATTING_SETTINGS_KEY);
145+
consolePanel = new ConsolePanel(context);
146+
loggingPanel = new LoggingPanel(context, LOG_FORMATTING_SETTINGS_KEY);
143147
logService.addLogListener(loggingPanel);
144148
component = new JPanel(new MigLayout("", "[grow]", "[grow]"));
145149
JTabbedPane tabs = new JTabbedPane();

src/test/java/org/scijava/ui/swing/console/LogFormatterTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@ public class LogFormatterTest {
1616

1717
@Test
1818
public void testSettings() {
19-
PrefService prefService = new Context(PrefService.class).service(PrefService.class);
20-
LogFormatter formatter1 = new LogFormatter();
21-
formatter1.setPrefService(prefService, "/abc");
19+
Context context = new Context(PrefService.class);
20+
LogFormatter formatter1 = new LogFormatter(context, "abc");
2221
formatter1.setVisible(LogFormatter.Field.ATTACHMENT, true);
2322
formatter1.setVisible(LogFormatter.Field.LEVEL, false);
24-
LogFormatter formatter2 = new LogFormatter();
25-
formatter2.setPrefService(prefService, "/abc");
23+
LogFormatter formatter2 = new LogFormatter(context, "abc");
2624
assertTrue(formatter2.isVisible(LogFormatter.Field.ATTACHMENT));
2725
assertFalse(formatter2.isVisible(LogFormatter.Field.LEVEL));
2826
}

0 commit comments

Comments
 (0)