Skip to content

Commit c47aa88

Browse files
committed
Added a simple error line highlighting
1 parent 4c83051 commit c47aa88

6 files changed

Lines changed: 80 additions & 44 deletions

File tree

RubyScript/src/org/knime/ext/jruby/RubyScriptNodeDialog.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,16 @@ public class RubyScriptNodeDialog extends NodeDialogPane {
5050
private JTable table;
5151
private int counter = 1;
5252
private JCheckBox m_appendColsCB;
53+
private RubyScriptNodeFactory m_factory;
5354

5455
/**
5556
* New pane for configuring ScriptedNode node dialog.
5657
*
5758
*/
58-
protected RubyScriptNodeDialog() {
59+
protected RubyScriptNodeDialog(RubyScriptNodeFactory factory) {
5960
super();
61+
62+
m_factory = factory;
6063

6164
//scriptTextArea.setAutoscrolls(true);
6265
//Font font = new Font(Font.MONOSPACED, Font.PLAIN, 12);
@@ -211,6 +214,17 @@ protected final void loadSettingsFrom(final NodeSettingsRO settings,
211214
script = "";
212215
}
213216
m_scriptTextArea.setText(script);
217+
m_scriptTextArea.removeAllLineHighlights();
218+
RubyScriptNodeModel.ScriptError error = m_factory.getModel().getErrorData();
219+
if ( error.lineNum != -1 ) {
220+
try {
221+
m_scriptTextArea.addLineHighlight(error.lineNum - 1, Color.red);
222+
} catch (BadLocationException e1) {
223+
// nothing to do
224+
// e1.printStackTrace();
225+
}
226+
}
227+
214228

215229
boolean appendCols = settings.getBoolean(
216230
RubyScriptNodeModel.APPEND_COLS, true);

RubyScript/src/org/knime/ext/jruby/RubyScriptNodeFactory.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,28 @@
1212
*/
1313
public class RubyScriptNodeFactory extends NodeFactory<RubyScriptNodeModel> {
1414

15+
private RubyScriptNodeModel m_model;
16+
private RubyScriptNodeDialog m_dialog;
17+
18+
protected RubyScriptNodeModel setModel(RubyScriptNodeModel model) {
19+
m_model = model;
20+
return model;
21+
}
22+
23+
public RubyScriptNodeModel getModel() {
24+
return m_model;
25+
}
26+
27+
public RubyScriptNodeDialog getDialog() {
28+
return m_dialog;
29+
}
30+
1531
/**
1632
* {@inheritDoc}
1733
*/
1834
@Override
1935
public RubyScriptNodeModel createNodeModel() {
20-
return new RubyScriptNodeModel(1, 1, false);
36+
return setModel(new RubyScriptNodeModel(1, 1, false));
2137
}
2238

2339
/**
@@ -50,6 +66,7 @@ public final boolean hasDialog() {
5066
*/
5167
@Override
5268
public final NodeDialogPane createNodeDialogPane() {
53-
return new RubyScriptNodeDialog();
69+
m_dialog = new RubyScriptNodeDialog(this);
70+
return m_dialog;
5471
}
5572
}

RubyScript/src/org/knime/ext/jruby/RubyScriptNodeFactory01.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public class RubyScriptNodeFactory01 extends RubyScriptNodeFactory {
1313
*/
1414
@Override
1515
public final RubyScriptNodeModel createNodeModel() {
16-
return new RubyScriptNodeModel(0, 1, false);
16+
return setModel(new RubyScriptNodeModel(0, 1, false));
1717
}
1818
}

RubyScript/src/org/knime/ext/jruby/RubyScriptNodeFactory22.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public class RubyScriptNodeFactory22 extends RubyScriptNodeFactory {
1313
*/
1414
@Override
1515
public final RubyScriptNodeModel createNodeModel() {
16-
return new RubyScriptNodeModel(2, 2, false);
16+
return setModel(new RubyScriptNodeModel(2, 2, false));
1717
}
1818
}

RubyScript/src/org/knime/ext/jruby/RubyScriptNodeModel.java

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,33 @@ public class RubyScriptNodeModel extends NodeModel {
7676

7777
private boolean snippetMode;
7878

79-
private class ScriptError {
80-
public int errorLine;
81-
public int errorColumn;
82-
public String errorType;
83-
public String errorText;
84-
public String errorTrace;
79+
public class ScriptError {
80+
public int lineNum;
81+
public int columnNum;
82+
public String type;
83+
public String text;
84+
public String trace;
8585
public String msg;
8686

8787
public ScriptError() {
8888
clear();
8989
}
9090

9191
public void clear() {
92-
errorLine = -1;
93-
errorColumn = -1;
94-
errorType = "--UnKnown--";
95-
errorText = "--UnKnown--";
96-
errorTrace = "";
92+
lineNum = -1;
93+
columnNum = -1;
94+
type = "--UnKnown--";
95+
text = "--UnKnown--";
96+
trace = "";
9797
msg = "";
9898
}
9999
}
100100

101101
private ScriptError m_script_error;
102+
103+
public ScriptError getErrorData() {
104+
return m_script_error;
105+
}
102106

103107
protected RubyScriptNodeModel(int inNumInputs, int inNumOutputs, boolean snippetMode) {
104108
super(inNumInputs, inNumOutputs);
@@ -319,7 +323,7 @@ protected final BufferedDataTable[] execute(final BufferedDataTable[] inData,
319323
} else {
320324
findErrorSource(e, script_fn);
321325
logger.error("Script error in line: "
322-
+ m_script_error.errorLine);
326+
+ m_script_error.lineNum);
323327
}
324328
throw new CanceledExecutionException(e.getMessage());
325329
}
@@ -338,7 +342,6 @@ protected final BufferedDataTable[] execute(final BufferedDataTable[] inData,
338342
*/
339343
protected final DataTableSpec[] configure(final DataTableSpec[] inSpecs)
340344
throws InvalidSettingsException {
341-
m_script_error.clear();
342345

343346
appendCols &= numInputs > 0;
344347
// append the property columns to the data table spec
@@ -445,6 +448,8 @@ protected final void loadValidatedSettingsFrom(final NodeSettingsRO settings)
445448
appendCols = settings.getBoolean(APPEND_COLS, true);
446449
columnNames = settings.getStringArray(COLUMN_NAMES);
447450
columnTypes = settings.getStringArray(COLUMN_TYPES);
451+
452+
m_script_error.clear();
448453
}
449454

450455
/**
@@ -484,12 +489,12 @@ private int findErrorSource(Throwable thr, String filename) {
484489
Matcher mLine = pLineS.matcher(err);
485490
if (mLine.find()) {
486491
logger.debug("SyntaxError error line: " + mLine.group(1));
487-
m_script_error.errorText = mLine.group(2) == null ? m_script_error.errorText
492+
m_script_error.text = mLine.group(2) == null ? m_script_error.text
488493
: mLine.group(2);
489-
logger.debug("SyntaxError: " + m_script_error.errorText);
490-
m_script_error.errorLine = Integer.parseInt(mLine.group(1));
491-
m_script_error.errorColumn = -1;
492-
m_script_error.errorType = "SyntaxError";
494+
logger.debug("SyntaxError: " + m_script_error.text);
495+
m_script_error.lineNum = Integer.parseInt(mLine.group(1));
496+
m_script_error.columnNum = -1;
497+
m_script_error.type = "SyntaxError";
493498
}
494499
} else {
495500
// if (err.startsWith("(NameError)")) {
@@ -500,48 +505,48 @@ private int findErrorSource(Throwable thr, String filename) {
500505
Pattern type = Pattern.compile("(?<=\\()(\\w*)");
501506
Matcher mLine = type.matcher(err);
502507
if (mLine.find()) {
503-
m_script_error.errorType = mLine.group(1);
508+
m_script_error.type = mLine.group(1);
504509
}
505510
Throwable cause = thr.getCause();
506511
// cause.printStackTrace();
507512
for (StackTraceElement line : cause.getStackTrace()) {
508513
if (line.getFileName().equals(filename)) {
509-
m_script_error.errorText = cause.getMessage();
510-
m_script_error.errorColumn = -1;
511-
m_script_error.errorLine = line.getLineNumber();
512-
m_script_error.errorText = thr.getMessage();
514+
m_script_error.text = cause.getMessage();
515+
m_script_error.columnNum = -1;
516+
m_script_error.lineNum = line.getLineNumber();
517+
m_script_error.text = thr.getMessage();
513518

514519
Pattern knimeType = Pattern
515520
.compile("(?<=org.knime.)(.*)(?=:)");
516521
Matcher mKnimeType = knimeType
517-
.matcher(m_script_error.errorText);
522+
.matcher(m_script_error.text);
518523

519524
if (mKnimeType.find()) {
520-
m_script_error.errorType = mKnimeType.group(1);
525+
m_script_error.type = mKnimeType.group(1);
521526
}
522527

523-
m_script_error.errorType = "RuntimeError";
528+
m_script_error.type = "RuntimeError";
524529

525530
break;
526531
}
527532
}
528533
}
529534

530535
m_script_error.msg = "script";
531-
if (m_script_error.errorLine != -1) {
536+
if (m_script_error.lineNum != -1) {
532537
m_script_error.msg += " stopped with error in line "
533-
+ m_script_error.errorLine;
534-
if (m_script_error.errorColumn != -1) {
538+
+ m_script_error.lineNum;
539+
if (m_script_error.columnNum != -1) {
535540
m_script_error.msg += " at column "
536-
+ m_script_error.errorColumn;
541+
+ m_script_error.columnNum;
537542
}
538543
} else {
539544
m_script_error.msg += "] stopped with error at line --unknown--";
540545
}
541546

542-
if (m_script_error.errorType == "RuntimeError") {
543-
logger.error(m_script_error.msg + "\n" + m_script_error.errorType
544-
+ " ( " + m_script_error.errorText + " )");
547+
if (m_script_error.type == "RuntimeError") {
548+
logger.error(m_script_error.msg + "\n" + m_script_error.type
549+
+ " ( " + m_script_error.text + " )");
545550

546551
Throwable cause = thr.getCause();
547552
// cause.printStackTrace();
@@ -563,19 +568,19 @@ private int findErrorSource(Throwable thr, String filename) {
563568
builder.append('\n');
564569
}
565570

566-
m_script_error.errorTrace = builder.toString();
567-
if (m_script_error.errorTrace.length() > 0) {
571+
m_script_error.trace = builder.toString();
572+
if (m_script_error.trace.length() > 0) {
568573
logger.error("\n--- Traceback --- error source first\n"
569574
+ "line: class ( method ) file \n"
570-
+ m_script_error.errorTrace
575+
+ m_script_error.trace
571576
+ "--- Traceback --- end --------------");
572577
}
573578

574-
} else if (m_script_error.errorType != "SyntaxError") {
579+
} else if (m_script_error.type != "SyntaxError") {
575580
logger.error(m_script_error.msg);
576581
logger.error("Could not evaluate error source nor reason. Analyze StackTrace!");
577582
logger.error(err);
578583
}
579-
return m_script_error.errorLine;
584+
return m_script_error.lineNum;
580585
}
581586
}

RubyScript/src/org/knime/ext/jruby/RubySnippetNodeFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public class RubySnippetNodeFactory extends RubyScriptNodeFactory {
1313
*/
1414
@Override
1515
public final RubyScriptNodeModel createNodeModel() {
16-
return new RubyScriptNodeModel(1, 1, true);
16+
return setModel(new RubyScriptNodeModel(1, 1, true));
1717
}
1818
}

0 commit comments

Comments
 (0)