Skip to content

Commit 49c5ddd

Browse files
committed
Added possibility of any DataCell's types using for columns of the output table
1 parent 58115d7 commit 49c5ddd

3 files changed

Lines changed: 41 additions & 26 deletions

File tree

RubyScript/rb/knime.rb

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,23 @@ def add_cell(cell)
3030
[:double, DoubleCell],
3131
[:stringCell, StringCell] # workaround for RowKey class
3232
].each do |name, cls|
33-
Object.send(:define_method, name) do |val|
33+
Object.send(:define_method, name) do |val|
3434
add_cell cls.new(val)
35-
self
35+
self
3636
end
37-
end
37+
end
3838

3939
# generate an appropriate methods for any types annotated in the output model
40-
$outColumnTypes.each do |name|
41-
cls = const_get name
42-
Object.send(:define_method, name) do |val|
43-
add_cell cls.new(val)
40+
# name should be a fully qualified Java class name!
41+
$outColumnTypes.each do |name|
42+
cls = Java::JavaClass.for_name( name )
43+
import cls.to_s
44+
rb_cls = cls.ruby_class
45+
Object.send(:define_method, cls.simple_name) do |val|
46+
add_cell rb_cls.new(val)
4447
self
4548
end
46-
end
49+
end
4750
end
4851

4952
class Cells
@@ -117,7 +120,7 @@ def [](idx)
117120
end
118121

119122
# Extended knime class
120-
class BufferedDataTable
123+
class Java::OrgKnimeCoreNode::BufferedDataTable
121124
# Add Ruby specific methods
122125
def length
123126
getRowCount

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,11 @@ public void actionPerformed(final ActionEvent e) {
116116

117117
TableColumn typeColumn = table.getColumnModel().getColumn(1);
118118
JComboBox<String> typeSelector = new JComboBox<String>();
119-
typeSelector.addItem("StringCell");
120-
typeSelector.addItem("IntegerCell");
121-
typeSelector.addItem("DoubleCell");
119+
typeSelector.addItem("String");
120+
typeSelector.addItem("Integer");
121+
typeSelector.addItem("Double");
122+
typeSelector.setEditable(true);
123+
122124
typeColumn.setCellEditor(new DefaultCellEditor(typeSelector));
123125

124126
// construct the panel for script loading/authoring

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

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -301,25 +301,35 @@ protected final DataTableSpec[] configure(final DataTableSpec[] inSpecs)
301301
DataType type = StringCell.TYPE;
302302
String columnType = columnTypes[i];
303303

304+
// convert short classes names
304305
if ("String".equals(columnType)) {
305-
type = StringCell.TYPE;
306+
columnType = StringCell.class.getName();
306307
} else if ("Integer".equals(columnType)) {
307-
type = IntCell.TYPE;
308+
columnType = IntCell.class.getName();
308309
} else if ("Double".equals(columnType)) {
309-
type = DoubleCell.TYPE;
310-
} else {
311-
try {
312-
Class<DataCell> cls = (Class<DataCell>) Class.forName(columnType);
313-
if (cls != null)
314-
type = DataType.getType(cls);
315-
else
316-
columnType = "StringCell";
317-
318-
} catch (ClassNotFoundException e) {
319-
// e.printStackTrace();
310+
columnType = DoubleCell.class.getName();
311+
}
312+
313+
try {
314+
Class<DataCell> cls = (Class<DataCell>) Class
315+
.forName(columnType);
316+
if (cls != null)
317+
type = DataType.getType(cls);
318+
else
320319
columnType = "StringCell";
321-
}
320+
321+
} catch (ClassNotFoundException e) {
322+
// e.printStackTrace();
323+
throw new InvalidSettingsException (columnType
324+
+ " is an incorrect Java class name. "
325+
+ "Please check it and specify a fully qualified class name.");
326+
327+
//columnType = "StringCell";
322328
}
329+
330+
if (!columnTypes[i].equals(columnType))
331+
columnTypes[i] = columnType;
332+
323333
DataColumnSpec newColumn = new DataColumnSpecCreator(
324334
columnNames[i], type).createSpec();
325335

0 commit comments

Comments
 (0)