Search in sources :

Example 1 with DataCellToJavaConverterFactory

use of org.knime.core.data.convert.java.DataCellToJavaConverterFactory in project knime-core by knime.

the class ConverterFactoryJavaTypeListCellRenderer method getListCellRendererComponent.

@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
    // The super method will reset the icon if we call this method
    // last. So we let super do its job first and then we take care
    // that everything is properly set.
    final Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    assert c == this;
    if (value instanceof String) {
        setText((String) value);
    } else if (value instanceof Class) {
        setText(((Class) value).getSimpleName());
    } else if (value instanceof JavaToDataCellConverterFactory<?>) {
        final JavaToDataCellConverterFactory<?> factory = (JavaToDataCellConverterFactory<?>) value;
        setText(factory.getName());
    } else if (value instanceof DataCellToJavaConverterFactory) {
        final DataCellToJavaConverterFactory<?, ?> factory = (DataCellToJavaConverterFactory<?, ?>) value;
        setText(factory.getName());
    }
    super.setToolTipText(getText());
    return this;
}
Also used : Component(java.awt.Component) JavaToDataCellConverterFactory(org.knime.core.data.convert.datacell.JavaToDataCellConverterFactory) DataCellToJavaConverterFactory(org.knime.core.data.convert.java.DataCellToJavaConverterFactory)

Example 2 with DataCellToJavaConverterFactory

use of org.knime.core.data.convert.java.DataCellToJavaConverterFactory in project knime-core by knime.

the class JSnippetFieldsController method getFieldReadStatement.

/**
 * Get a statement to inserted in the document of a java snippet to read
 * the given column.
 * @param colSpec the column to be read
 * @return the statement
 */
public String getFieldReadStatement(final DataColumnSpec colSpec) {
    FieldsTableModel model = (FieldsTableModel) m_inFieldsTable.getTable().getModel();
    int index = -1;
    for (int r = 0; r < model.getRowCount(); r++) {
        Object value = model.getValueAt(r, Column.COLUMN);
        if (value instanceof DataColumnSpec) {
            DataColumnSpec foo = (DataColumnSpec) value;
            if (foo.getName().equals(colSpec.getName())) {
                index = r;
                break;
            }
        }
    }
    if (index >= 0) {
        // return java field name
        return (String) model.getValueAt(index, Column.JAVA_FIELD);
    } else {
        // try to add a row for the colSpec
        boolean success = m_inFieldsTable.addRow(colSpec);
        if (success) {
            TableModel tableModel = m_inFieldsTable.getTable().getModel();
            m_inFieldsTable.firePropertyChange(InFieldsTable.PROP_FIELD_ADDED, tableModel.getRowCount() - 1, tableModel.getRowCount());
            // return java field name
            return (String) model.getValueAt(model.getRowCount() - 1, Column.JAVA_FIELD);
        } else {
            // return generic code
            String name = colSpec.getName();
            final Collection<DataCellToJavaConverterFactory<?, ?>> factories = ConverterUtil.getFactoriesForSourceType(colSpec.getType());
            return "getCell(\"" + name + "\", " + Type.getIdentifierFor(factories.stream().findFirst().get().getDestinationType()) + ")";
        }
    }
}
Also used : DataColumnSpec(org.knime.core.data.DataColumnSpec) TableModel(javax.swing.table.TableModel) DataCellToJavaConverterFactory(org.knime.core.data.convert.java.DataCellToJavaConverterFactory)

Example 3 with DataCellToJavaConverterFactory

use of org.knime.core.data.convert.java.DataCellToJavaConverterFactory in project knime-core by knime.

the class JavaSnippet method getClassLoadersFor.

/**
 * Get the class loaders required for a specific converter factory
 *
 * @param converterFactoryId ID of the converter factory
 * @return A list of class loaders required for given converter factory
 * @noreference This method is not intended to be referenced by clients.
 */
private static Collection<ClassLoader> getClassLoadersFor(final String converterFactoryId) {
    final Optional<DataCellToJavaConverterFactory<?, ?>> factory = ConverterUtil.getDataCellToJavaConverterFactory(converterFactoryId);
    if (factory.isPresent()) {
        final ArrayList<ClassLoader> clsLoaders = new ArrayList<>(2);
        final ClassLoader sourceCL = factory.get().getSourceType().getClassLoader();
        if (sourceCL != null) {
            clsLoaders.add(sourceCL);
        }
        final ClassLoader destCL = factory.get().getDestinationType().getClassLoader();
        if (destCL != null) {
            clsLoaders.add(destCL);
        }
        return clsLoaders;
    } else {
        final Optional<JavaToDataCellConverterFactory<?>> factory2 = ConverterUtil.getJavaToDataCellConverterFactory(converterFactoryId);
        if (factory2.isPresent()) {
            final ClassLoader cl = factory2.get().getSourceType().getClassLoader();
            if (cl != null) {
                return Collections.singleton(cl);
            }
        }
        return Collections.emptyList();
    }
}
Also used : ArrayList(java.util.ArrayList) URLClassLoader(java.net.URLClassLoader) MultiParentClassLoader(org.knime.core.data.convert.util.MultiParentClassLoader) ModuleClassLoader(org.eclipse.osgi.internal.loader.ModuleClassLoader) DataCellToJavaConverterFactory(org.knime.core.data.convert.java.DataCellToJavaConverterFactory) JavaToDataCellConverterFactory(org.knime.core.data.convert.datacell.JavaToDataCellConverterFactory)

Example 4 with DataCellToJavaConverterFactory

use of org.knime.core.data.convert.java.DataCellToJavaConverterFactory in project knime-core by knime.

the class JavaSnippetCellFactory method getCells.

/**
 * {@inheritDoc}
 */
@SuppressWarnings("unchecked")
@Override
public DataCell[] getCells(final DataRow row) {
    try {
        if (null == m_jsnippet) {
            m_jsnippet = m_snippet.createSnippetInstance();
            // populate the fields in the m_jsnippet that are constant
            // across the rows.
            Field[] fs = m_jsnippet.getClass().getSuperclass().getDeclaredFields();
            for (Field field : fs) {
                if (field.getName().equals("m_flowVars")) {
                    field.setAccessible(true);
                    field.set(m_jsnippet, m_flowVars);
                }
                if (field.getName().equals(JavaSnippet.ROWCOUNT)) {
                    field.setAccessible(true);
                    field.set(m_jsnippet, m_rowCount);
                }
            }
        }
        // populate data structure with the input cells
        Map<String, Cell> cellsMap = createCellsMap(row);
        if (null == m_columns) {
            m_columns = new ArrayList<>();
            m_columns.addAll(cellsMap.keySet());
        }
        Field[] fs = m_jsnippet.getClass().getSuperclass().getDeclaredFields();
        for (Field field : fs) {
            if (field.getName().equals("m_cellsMap")) {
                field.setAccessible(true);
                field.set(m_jsnippet, cellsMap);
            }
            if (field.getName().equals("m_cells")) {
                field.setAccessible(true);
                List<Cell> cells = new ArrayList<>();
                cells.addAll(cellsMap.values());
                field.set(m_jsnippet, cells);
            }
            if (field.getName().equals("m_columns")) {
                field.setAccessible(true);
                field.set(m_jsnippet, m_columns);
            }
            if (field.getName().equals("m_inSpec")) {
                field.setAccessible(true);
                field.set(m_jsnippet, m_spec);
            }
            if (field.getName().equals(JavaSnippet.ROWID)) {
                field.setAccessible(true);
                field.set(m_jsnippet, row.getKey().getString());
            }
            if (field.getName().equals(JavaSnippet.ROWINDEX)) {
                field.setAccessible(true);
                field.set(m_jsnippet, m_rowIndex);
            }
        }
        // populate the system input column fields with data
        for (InCol inCol : m_snippet.getSystemFields().getInColFields()) {
            Field field = m_jsnippet.getClass().getField(inCol.getJavaName());
            final DataCell cell = row.getCell(m_spec.findColumnIndex(inCol.getKnimeName()));
            if (cell.isMissing()) {
                field.set(m_jsnippet, null);
                continue;
            }
            // Get the converter factory for this column
            final Optional<DataCellToJavaConverterFactory<?, ?>> factory = ConverterUtil.getDataCellToJavaConverterFactory(inCol.getConverterFactoryId());
            if (!factory.isPresent()) {
                throw new RuntimeException("Missing converter factory with ID: " + inCol.getConverterFactoryId());
            }
            final Object converted = factory.get().create().convertUnsafe(cell);
            field.set(m_jsnippet, converted);
        }
        // reset the system output fields to null (see also bug 3781)
        for (OutCol outCol : m_snippet.getSystemFields().getOutColFields()) {
            Field field = m_jsnippet.getClass().getField(outCol.getJavaName());
            field.set(m_jsnippet, null);
        }
        // populate the system input flow variable fields with data
        for (InVar inCol : m_snippet.getSystemFields().getInVarFields()) {
            Field field = m_jsnippet.getClass().getField(inCol.getJavaName());
            Object v = m_flowVars.getValueOfType(inCol.getKnimeName(), inCol.getJavaType());
            field.set(m_jsnippet, v);
        }
    } catch (Exception e) {
        // re-throw exception
        throw new RuntimeException(e);
    }
    try {
        // evaluate user script
        m_jsnippet.snippet();
    } catch (Throwable thr) {
        if (thr instanceof Abort) {
            StringBuilder builder = new StringBuilder("Calculation aborted: ");
            String message = thr.getMessage();
            builder.append(message == null ? "<no details>" : message);
            throw new RuntimeException(builder.toString(), thr);
        } else {
            Integer lineNumber = null;
            for (StackTraceElement ste : thr.getStackTrace()) {
                if (ste.getClassName().equals("JSnippet")) {
                    lineNumber = ste.getLineNumber();
                }
            }
            StringBuilder msg = new StringBuilder();
            msg.append("Evaluation of java snippet failed for row \"");
            msg.append(row.getKey());
            msg.append("\". ");
            if (lineNumber != null) {
                msg.append("The exception is caused by line ");
                msg.append(lineNumber);
                msg.append(" of the snippet. ");
            }
            if (thr.getMessage() != null) {
                msg.append("Exception message:");
                msg.append(thr.getMessage());
            }
            LOGGER.warn(msg.toString(), thr);
            OutVarList outVars = m_snippet.getSystemFields().getOutVarFields();
            if (outVars.size() > 0) {
                // Abort if flow variables are defined
                throw new RuntimeException("An error occured in an " + "expression with output flow variables.", thr);
            }
            OutColList outFields = m_snippet.getSystemFields().getOutColFields();
            DataCell[] out = new DataCell[outFields.size()];
            for (int i = 0; i < out.length; i++) {
                // Return missing values for output fields
                out[i] = DataType.getMissingCell();
            }
            m_rowIndex++;
            return out;
        }
    }
    try {
        // update m_flowVars with output flow variable fields.
        for (OutVar var : m_snippet.getSystemFields().getOutVarFields()) {
            Field field = m_jsnippet.getClass().getField(var.getJavaName());
            Object value = field.get(m_jsnippet);
            if (null != value) {
                Type type = var.getFlowVarType();
                FlowVariable flowVar = null;
                if (type.equals(Type.INTEGER)) {
                    flowVar = new FlowVariable(var.getKnimeName(), (Integer) value);
                } else if (type.equals(Type.DOUBLE)) {
                    flowVar = new FlowVariable(var.getKnimeName(), (Double) value);
                } else {
                    // case type.equals(Type.String)
                    flowVar = new FlowVariable(var.getKnimeName(), (String) value);
                }
                m_flowVars.put(flowVar);
            } else {
                throw new RuntimeException("Flow variable \"" + var.getKnimeName() + "\" has no value.");
            }
        }
        // get output column fields
        OutColList outFields = m_snippet.getSystemFields().getOutColFields();
        DataCell[] out = new DataCell[outFields.size()];
        for (int i = 0; i < out.length; i++) {
            OutCol outField = outFields.get(i);
            Field field = m_jsnippet.getClass().getField(outField.getJavaName());
            Object value = field.get(m_jsnippet);
            if (null == value) {
                out[i] = DataType.getMissingCell();
            } else {
                final String id = outField.getConverterFactoryId();
                Optional<JavaToDataCellConverterFactory<?>> factory = ConverterUtil.getJavaToDataCellConverterFactory(id);
                if (!factory.isPresent()) {
                    throw new RuntimeException("Missing converter factory with ID: " + id);
                }
                out[i] = ((JavaToDataCellConverterFactory<Object>) factory.get()).create(m_context).convert(value);
            }
        }
        // Cleanup Closeable inputs
        for (final OutCol outCol : m_snippet.getSystemFields().getOutColFields()) {
            final Field field = m_jsnippet.getClass().getField(outCol.getJavaName());
            final Object value = field.get(m_jsnippet);
            if (value instanceof Closeable) {
                ((Closeable) value).close();
            }
            if (value instanceof AutoCloseable) {
                // From the doc: Calling close more than once *can* have visible side effects!
                ((AutoCloseable) value).close();
            }
        }
        m_rowIndex++;
        return out;
    } catch (Exception e) {
        // but in case re-throw exception
        throw new RuntimeException(e);
    }
}
Also used : OutCol(org.knime.base.node.jsnippet.util.field.OutCol) Closeable(java.io.Closeable) ArrayList(java.util.ArrayList) OutColList(org.knime.base.node.jsnippet.util.JavaFieldList.OutColList) InCol(org.knime.base.node.jsnippet.util.field.InCol) DataCellToJavaConverterFactory(org.knime.core.data.convert.java.DataCellToJavaConverterFactory) Field(java.lang.reflect.Field) Abort(org.knime.base.node.jsnippet.expression.Abort) OutVarList(org.knime.base.node.jsnippet.util.JavaFieldList.OutVarList) InVar(org.knime.base.node.jsnippet.util.field.InVar) Cell(org.knime.base.node.jsnippet.expression.Cell) DataCell(org.knime.core.data.DataCell) OutVar(org.knime.base.node.jsnippet.util.field.OutVar) TypeException(org.knime.base.node.jsnippet.expression.TypeException) Type(org.knime.core.node.workflow.FlowVariable.Type) DataType(org.knime.core.data.DataType) DataCell(org.knime.core.data.DataCell) FlowVariable(org.knime.core.node.workflow.FlowVariable) JavaToDataCellConverterFactory(org.knime.core.data.convert.datacell.JavaToDataCellConverterFactory)

Example 5 with DataCellToJavaConverterFactory

use of org.knime.core.data.convert.java.DataCellToJavaConverterFactory in project knime-core by knime.

the class SerializeUtilTest method testStoreAndLoadDataCellToJava.

@Test
public void testStoreAndLoadDataCellToJava() throws InvalidSettingsException {
    final Optional<? extends DataCellToJavaConverterFactory<? extends DataValue, Integer>> factory = DataCellToJavaConverterRegistry.getInstance().getConverterFactories(IntCell.TYPE, Integer.class).stream().findFirst();
    assumeTrue(factory.isPresent());
    final NodeSettings testSettings = new NodeSettings(getClass().getName());
    SerializeUtil.storeConverterFactory(factory.get(), testSettings, "the-factory");
    final Optional<DataCellToJavaConverterFactory<?, ?>> loadedFactory = SerializeUtil.loadDataCellToJavaConverterFactory(testSettings, "the-factory");
    assertTrue(loadedFactory.isPresent());
    assertEquals(factory.get(), loadedFactory.get());
}
Also used : NodeSettings(org.knime.core.node.NodeSettings) SimpleDataCellToJavaConverterFactory(org.knime.core.data.convert.java.SimpleDataCellToJavaConverterFactory) DataCellToJavaConverterFactory(org.knime.core.data.convert.java.DataCellToJavaConverterFactory) Test(org.junit.Test)

Aggregations

DataCellToJavaConverterFactory (org.knime.core.data.convert.java.DataCellToJavaConverterFactory)11 DataColumnSpec (org.knime.core.data.DataColumnSpec)4 JavaToDataCellConverterFactory (org.knime.core.data.convert.datacell.JavaToDataCellConverterFactory)4 DataType (org.knime.core.data.DataType)3 FlowVariable (org.knime.core.node.workflow.FlowVariable)3 Component (java.awt.Component)2 ArrayList (java.util.ArrayList)2 Optional (java.util.Optional)2 Test (org.junit.Test)2 TypeConverter (org.knime.base.node.jsnippet.type.flowvar.TypeConverter)2 InCol (org.knime.base.node.jsnippet.util.field.InCol)2 SimpleDataCellToJavaConverterFactory (org.knime.core.data.convert.java.SimpleDataCellToJavaConverterFactory)2 NodeSettings (org.knime.core.node.NodeSettings)2 Closeable (java.io.Closeable)1 Field (java.lang.reflect.Field)1 URLClassLoader (java.net.URLClassLoader)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Collectors (java.util.stream.Collectors)1