Skip to content

Commit 17079e1

Browse files
authored
Merge pull request #38 from maarzt/fix-logformatter-preferences
LogFormatter: fix the storage of preferences with arbitrary key value
2 parents 66e0b18 + af2e2d9 commit 17079e1

File tree

6 files changed

+72
-55
lines changed

6 files changed

+72
-55
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: 17 additions & 9 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
}
@@ -114,8 +117,9 @@ private void printWithBrackets(PrintWriter printer, String prefix) {
114117
// -- Helper methods --
115118

116119
public void applySettings() {
117-
if(prefService == null) return;
118-
Map<String, String> settings = prefService.getMap(prefKey);
120+
if (skipPersist()) return;
121+
final Map<String, String> settings = //
122+
prefService.getMap(LogFormatter.class, prefKey);
119123
for(Field field : Field.values()) {
120124
String defaultValue = Boolean.toString(isVisible(field));
121125
String value = settings.getOrDefault(field.toString(), defaultValue);
@@ -125,9 +129,13 @@ public void applySettings() {
125129
}
126130

127131
public void changeSetting(Field field, boolean visible) {
128-
if(prefService == null) return;
129-
Map<String, String> settings = prefService.getMap(prefKey);
132+
if (skipPersist()) return;
133+
Map<String, String> settings = prefService.getMap(LogFormatter.class, prefKey);
130134
settings.put(field.toString(), Boolean.toString(visible));
131-
prefService.putMap(prefKey, settings);
135+
prefService.put(LogFormatter.class, prefKey, settings);
136+
}
137+
138+
private boolean skipPersist() {
139+
return prefService == null || prefKey == null || prefKey.isEmpty();
132140
}
133141
}

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: 11 additions & 3 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
* %%
@@ -59,7 +60,14 @@
5960
*/
6061
public class SwingConsolePane extends AbstractConsolePane<JPanel> {
6162

62-
public static final String LOG_FORMATTING_SETTINGS_KEY = "/log-formatting";
63+
/**
64+
* Key to use when when persisting {@link LogFormatter} preferences with the
65+
* {@link PrefService}.
66+
*/
67+
private static final String LOG_FORMATTING_SETTINGS_KEY = "log-formatting";
68+
69+
@Parameter
70+
private Context context;
6371

6472
@Parameter
6573
private ThreadService threadService;
@@ -138,8 +146,8 @@ private ConsolePanel consolePanel() {
138146

139147
private synchronized void initLoggingPanel() {
140148
if (consolePanel != null) return;
141-
consolePanel = new ConsolePanel(threadService);
142-
loggingPanel = new LoggingPanel(threadService, prefService, LOG_FORMATTING_SETTINGS_KEY);
149+
consolePanel = new ConsolePanel(context);
150+
loggingPanel = new LoggingPanel(context, LOG_FORMATTING_SETTINGS_KEY);
143151
logService.addLogListener(loggingPanel);
144152
component = new JPanel(new MigLayout("", "[grow]", "[grow]"));
145153
JTabbedPane tabs = new JTabbedPane();
Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package org.scijava.ui.swing.console;
22

3-
import static org.junit.Assert.assertEquals;
43
import static org.junit.Assert.assertFalse;
54
import static org.junit.Assert.assertTrue;
65

7-
import java.util.Collections;
8-
import java.util.Map;
9-
106
import org.junit.Test;
117
import org.scijava.Context;
128
import org.scijava.prefs.PrefService;
@@ -18,34 +14,27 @@
1814
*/
1915
public class LogFormatterTest {
2016

21-
@Test
22-
public void testPrefService() {
23-
PrefService prefService = new Context(PrefService.class).service(PrefService.class);
24-
String expected = "Hello World";
25-
prefService.put("foo", expected);
26-
String actual = prefService.get("foo");
27-
assertEquals(expected, actual);
28-
}
29-
30-
@Test
31-
public void testPrefServiceMap() {
32-
PrefService prefService = new Context(PrefService.class).service(PrefService.class);
33-
Map<String, String> expected = Collections.singletonMap("Hello", "World");
34-
prefService.putMap("/foo", expected);
35-
Map<String, String> actual = prefService.getMap("/foo");
36-
assertEquals(expected, actual);
37-
}
38-
3917
@Test
4018
public void testSettings() {
41-
PrefService prefService = new Context(PrefService.class).service(PrefService.class);
42-
LogFormatter formatter1 = new LogFormatter();
43-
formatter1.setPrefService(prefService, "/abc");
19+
Context context = new Context(PrefService.class);
20+
final String usedKey = "LogFormatterTest-key";
21+
final String nonMatchingKey = "LogFormatterTest-nonmatching";
22+
context.service(PrefService.class).remove(LogFormatter.class, usedKey);
23+
context.service(PrefService.class).remove(LogFormatter.class, nonMatchingKey);
24+
25+
// Assign some settings to a particular key.
26+
LogFormatter formatter1 = new LogFormatter(context, usedKey);
4427
formatter1.setVisible(LogFormatter.Field.ATTACHMENT, true);
4528
formatter1.setVisible(LogFormatter.Field.LEVEL, false);
46-
LogFormatter formatter2 = new LogFormatter();
47-
formatter2.setPrefService(prefService, "/abc");
29+
30+
// Check that matching key does share these settings.
31+
LogFormatter formatter2 = new LogFormatter(context, usedKey);
4832
assertTrue(formatter2.isVisible(LogFormatter.Field.ATTACHMENT));
4933
assertFalse(formatter2.isVisible(LogFormatter.Field.LEVEL));
34+
35+
// Check that non-matching key does not share these settings.
36+
LogFormatter formatter3 = new LogFormatter(context, nonMatchingKey);
37+
assertFalse(formatter3.isVisible(LogFormatter.Field.ATTACHMENT));
38+
assertTrue(formatter3.isVisible(LogFormatter.Field.LEVEL));
5039
}
5140
}

0 commit comments

Comments
 (0)