Skip to content

Commit 488620f

Browse files
committed
Use NodeLogger for logging in NodeModules and implement KNIMELogService
Signed-off-by: Squareys <[email protected]>
1 parent 24bc5ad commit 488620f

File tree

7 files changed

+205
-19
lines changed

7 files changed

+205
-19
lines changed

org.knime.scijava.commands/src/org/knime/scijava/commands/CellOutput.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public interface CellOutput {
1414
*
1515
* @param cells
1616
* The cells which make the output row
17+
* @throws InterruptedException If canceled.
1718
*/
18-
void push(final DataCell[] cells);
19+
void push(final DataCell[] cells) throws InterruptedException;
1920
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package org.knime.scijava.commands.log;
2+
3+
import org.knime.core.node.NodeLogger;
4+
import org.scijava.Prioritized;
5+
import org.scijava.Priority;
6+
import org.scijava.log.LogService;
7+
import org.scijava.service.AbstractService;
8+
9+
/**
10+
* Implementation of KNIMELogService to manually set to NodeModules to delegate
11+
* logging from withing wrapped Scijava modules to KNIME.
12+
*
13+
* This class is not intededed to be instantiated by Scijava plugin managers but
14+
* rather manually.
15+
*
16+
* @author Jonathan Hale, University of Konstanz
17+
*/
18+
public class KNIMELogService extends AbstractService implements LogService {
19+
20+
public static final double PRIORITY = Priority.HIGH_PRIORITY;
21+
22+
private final NodeLogger logger;
23+
24+
/**
25+
* Constructor.
26+
*
27+
* @param logger
28+
* KNIME {@link NodeLogger} to delegate log to.
29+
*/
30+
public KNIMELogService(final NodeLogger logger) {
31+
this.logger = logger;
32+
}
33+
34+
@Override
35+
public int compareTo(final Prioritized o) {
36+
return new Double(PRIORITY).compareTo(o.getPriority());
37+
}
38+
39+
@Override
40+
public LogService log() {
41+
return this;
42+
}
43+
44+
@Override
45+
public String getIdentifier() {
46+
return getClass().getName();
47+
}
48+
49+
@Override
50+
public void debug(final Object msg) {
51+
logger.debug(msg);
52+
}
53+
54+
@Override
55+
public void debug(final Throwable t) {
56+
logger.debug(t);
57+
}
58+
59+
@Override
60+
public void debug(final Object msg, final Throwable t) {
61+
logger.debug(msg, t);
62+
}
63+
64+
@Override
65+
public void error(final Object msg) {
66+
logger.error(msg);
67+
}
68+
69+
@Override
70+
public void error(final Throwable t) {
71+
logger.error(t);
72+
}
73+
74+
@Override
75+
public void error(final Object msg, final Throwable t) {
76+
logger.error(msg, t);
77+
}
78+
79+
@Override
80+
public void info(final Object msg) {
81+
logger.info(msg);
82+
}
83+
84+
@Override
85+
public void info(final Throwable t) {
86+
logger.info(t);
87+
}
88+
89+
@Override
90+
public void info(final Object msg, final Throwable t) {
91+
logger.info(msg, t);
92+
}
93+
94+
@Override
95+
public void trace(final Object msg) {
96+
// not supported
97+
}
98+
99+
@Override
100+
public void trace(final Throwable t) {
101+
// not supported
102+
}
103+
104+
@Override
105+
public void trace(final Object msg, final Throwable t) {
106+
// not supported
107+
}
108+
109+
@Override
110+
public void warn(final Object msg) {
111+
logger.warn(msg);
112+
}
113+
114+
@Override
115+
public void warn(final Throwable t) {
116+
logger.warn(t);
117+
}
118+
119+
@Override
120+
public void warn(final Object msg, final Throwable t) {
121+
logger.error(msg, t);
122+
}
123+
124+
@Override
125+
public boolean isDebug() {
126+
return logger.isDebugEnabled();
127+
}
128+
129+
@Override
130+
public boolean isError() {
131+
return true;
132+
}
133+
134+
@Override
135+
public boolean isInfo() {
136+
return true;
137+
}
138+
139+
@Override
140+
public boolean isTrace() {
141+
return false; // not supported
142+
}
143+
144+
@Override
145+
public boolean isWarn() {
146+
return true;
147+
}
148+
149+
@Override
150+
public int getLevel() {
151+
return logger.getLevel().ordinal();
152+
}
153+
154+
@Override
155+
public void setLevel(final int level) {
156+
// We do not want to allow Scijava commands to modify the node logger.
157+
}
158+
159+
@Override
160+
public void setLevel(final String classOrPackageName, final int level) {
161+
// We do not want to allow Scijava commands to modify the node logger.
162+
}
163+
164+
}

org.knime.scijava.commands/src/org/knime/scijava/commands/module/DefaultNodeModule.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
import org.knime.core.data.DataRow;
1010
import org.knime.core.data.DataType;
1111
import org.knime.core.node.ExecutionContext;
12+
import org.knime.core.node.NodeLogger;
1213
import org.knime.scijava.commands.CellOutput;
1314
import org.knime.scijava.commands.MultiOutputListener;
1415
import org.knime.scijava.commands.converter.KNIMEConverterService;
16+
import org.knime.scijava.commands.log.KNIMELogService;
1517
import org.scijava.Context;
18+
import org.scijava.log.LogService;
1619
import org.scijava.module.Module;
1720
import org.scijava.module.ModuleInfo;
1821
import org.scijava.module.ModuleItem;
@@ -47,6 +50,8 @@ class DefaultNodeModule implements NodeModule {
4750

4851
private final NodeModuleOutputChangedListener outputListener;
4952

53+
private final LogService logService;
54+
5055
/**
5156
* Constructor.
5257
*
@@ -60,17 +65,21 @@ class DefaultNodeModule implements NodeModule {
6065
* mapping of input column index to input items of the module
6166
* @param outputMapping
6267
* mapping of output items to types for the cells to for them
68+
* @param logger
69+
* NodeLogger to delegate output to.
6370
*/
6471
public DefaultNodeModule(final Context context, final ModuleInfo info,
6572
final Map<String, Object> params,
6673
final Map<Integer, ModuleItem<?>> inputMapping,
67-
final Map<ModuleItem<?>, DataType> outputMapping) {
74+
final Map<ModuleItem<?>, DataType> outputMapping,
75+
final NodeLogger logger) {
6876
context.inject(this);
6977

7078
this.inputMapping = inputMapping;
7179
this.outputMapping = outputMapping;
7280
this.module = ms.createModule(info);
7381
this.outputListener = new NodeModuleOutputChangedListener();
82+
this.logService = new KNIMELogService(logger);
7483

7584
preProcess(params);
7685
}
@@ -97,11 +106,18 @@ private void preProcess(final Map<String, Object> params) {
97106

98107
for (final ModuleItem<?> item : this.module.getInfo().inputs()) {
99108
if (MultiOutputListener.class.equals(item.getType())) {
109+
/* MultiOutputListener */
100110
final String name = item.getName();
101111

102112
module.setInput(name, outputListener);
103113
module.resolveInput(name);
104114
outputListener.enableManualPush(true);
115+
} else if (LogService.class.equals(item.getType())) {
116+
/* LogService */
117+
final String name = item.getName();
118+
119+
module.setInput(name, logService);
120+
module.resolveInput(name);
105121
}
106122
}
107123
}
@@ -164,8 +180,7 @@ public void notifyListener() {
164180
output.push(cells.toArray(new DataCell[cells.size()]));
165181
}
166182
} catch (final Exception e) {
167-
// FIXME
168-
e.printStackTrace();
183+
logService.error("Unable to push output row.", e);
169184
}
170185
}
171186

org.knime.scijava.commands/src/org/knime/scijava/commands/module/DefaultNodeModuleService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.knime.core.data.DataTableSpec;
1212
import org.knime.core.data.DataType;
1313
import org.knime.core.data.convert.datacell.JavaToDataCellConverterFactory;
14+
import org.knime.core.node.NodeLogger;
1415
import org.knime.core.node.defaultnodesettings.SettingsModel;
1516
import org.knime.core.node.defaultnodesettings.SettingsModelString;
1617
import org.knime.core.util.UniqueNameGenerator;
@@ -48,7 +49,7 @@ public class DefaultNodeModuleService extends AbstractService
4849

4950
@Override
5051
public NodeModule createNodeModule(final ModuleInfo info,
51-
final Map<String, SettingsModel> models, final DataTableSpec spec) {
52+
final Map<String, SettingsModel> models, final DataTableSpec spec, final NodeLogger knimeLogger) {
5253

5354
final Map<Integer, ModuleItem<?>> inputMapping = new HashMap<>();
5455
final Map<String, Object> params = new HashMap<String, Object>();
@@ -81,7 +82,7 @@ public NodeModule createNodeModule(final ModuleInfo info,
8182
}
8283

8384
return new DefaultNodeModule(getContext(), info, params, inputMapping,
84-
outputMapping);
85+
outputMapping, knimeLogger);
8586

8687
}
8788

org.knime.scijava.commands/src/org/knime/scijava/commands/module/NodeModuleService.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.knime.core.data.DataTableSpec;
66
import org.knime.core.data.DataType;
7+
import org.knime.core.node.NodeLogger;
78
import org.knime.core.node.defaultnodesettings.SettingsModel;
89
import org.scijava.module.ModuleInfo;
910
import org.scijava.module.ModuleItem;
@@ -50,12 +51,18 @@ Map<ModuleItem<?>, DataType> getOutputMapping(final ModuleInfo info,
5051
* module info for KNIME.
5152
*
5253
* @param info
54+
* the module info to create a NodeModule for.
5355
* @param models
56+
* settings models for {@link ModuleItem}s in info
5457
* @param spec
55-
* @return
58+
* Input data table spec
59+
* @param knimeLogger
60+
* KNIME {@link NodeLogger} to delegate output to.
61+
* @return the {@link NodeModule}
5662
*/
5763
NodeModule createNodeModule(final ModuleInfo info,
58-
final Map<String, SettingsModel> models, final DataTableSpec spec);
64+
final Map<String, SettingsModel> models, final DataTableSpec spec,
65+
NodeLogger knimeLogger);
5966

6067
/**
6168
* @param info

org.knime.scijava.commands/src/org/knime/scijava/commands/nodes/SciJavaCommandNodeModel.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.knime.core.node.ExecutionContext;
1515
import org.knime.core.node.ExecutionMonitor;
1616
import org.knime.core.node.InvalidSettingsException;
17+
import org.knime.core.node.NodeLogger;
1718
import org.knime.core.node.NodeModel;
1819
import org.knime.core.node.NodeSettingsRO;
1920
import org.knime.core.node.NodeSettingsWO;
@@ -53,13 +54,17 @@ public class SciJavaCommandNodeModel extends NodeModel {
5354

5455
private Context context;
5556

57+
private final NodeLogger logger;
58+
5659
protected SciJavaCommandNodeModel(final Context ctx, final ModuleInfo info,
5760
final Map<String, SettingsModel> models, final int numInports,
5861
final int numOutports) {
5962
super(numInports, numOutports);
6063
setContext(ctx);
6164
this.info = info;
6265
this.models = models;
66+
67+
logger = NodeLogger.getLogger(info.getName());
6368
}
6469

6570
private void setContext(final Context ctx) {
@@ -110,21 +115,16 @@ private void run(final DataTableSpec spec, final RowInput rowInput,
110115
final KeyGenerator keyGen = createKeyGenerator(rowInput, rowOutput);
111116

112117
final NodeModule module = nodeService.createNodeModule(info, models,
113-
spec);
118+
spec, logger);
114119

115120
CellOutput output = null;
116121
if (getNrOutPorts() > 0) {
117122
output = new CellOutput() {
118123

119124
@Override
120-
public void push(final DataCell[] cells) {
121-
try {
122-
rowOutput.push(
123-
new DefaultRow(keyGen.create(), cells));
124-
} catch (final InterruptedException e) {
125-
// FIXME
126-
e.printStackTrace();
127-
}
125+
public void push(final DataCell[] cells)
126+
throws InterruptedException {
127+
rowOutput.push(new DefaultRow(keyGen.create(), cells));
128128
}
129129
};
130130
}

org.knime.scijava.commands/src/org/knime/scijava/commands/widget/ColumnSelectionWidget.java

-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public void set(final WidgetModel model) {
7070
try {
7171
colBox.update(getSpecFromModel(), null);
7272
} catch (final NotConfigurableException e) {
73-
// TODO Logging
7473
throw new IllegalStateException(e);
7574
}
7675
}
@@ -109,7 +108,6 @@ protected void doRefresh() {
109108
colBox.repaint();
110109
}
111110
} catch (final NotConfigurableException e) {
112-
// TODO Logging
113111
throw new IllegalStateException(e);
114112
}
115113
}

0 commit comments

Comments
 (0)