use of org.knime.core.node.port.PortObjectSpec in project knime-core by knime.
the class FileNodePersistor method loadPort.
void loadPort(final Node node, final ReferencedFile portDir, final NodeSettingsRO settings, final ExecutionMonitor exec, final int portIdx, final Map<Integer, BufferedDataTable> loadTblRep, final HashMap<Integer, ContainerTable> tblRep, final FileStoreHandlerRepository fileStoreHandlerRepository) throws IOException, InvalidSettingsException, CanceledExecutionException {
final String specClass = settings.getString("port_spec_class");
final String objectClass = loadPortObjectClassName(settings);
PortType designatedType = node.getOutputType(portIdx);
PortObjectSpec spec = null;
PortObject object = null;
// this cannot be simplified as BDT must be loaded as BDT even if
// the port type is not BDT (but general PortObject)
boolean isBDT = (BufferedDataTable.TYPE.getPortObjectClass().getName().equals(objectClass) && BufferedDataTable.TYPE.getPortObjectSpecClass().getName().equals(specClass)) || designatedType.equals(BufferedDataTable.TYPE);
// an InactiveBranchPortObjectSpec can be put into any port!
boolean isInactive = InactiveBranchPortObjectSpec.class.getName().equals(specClass);
if (isBDT && !isInactive) {
if (specClass != null && !specClass.equals(BufferedDataTable.TYPE.getPortObjectSpecClass().getName())) {
throw new IOException("Actual spec class \"" + specClass + "\", expected \"" + BufferedDataTable.TYPE.getPortObjectSpecClass().getName() + "\"");
}
if (objectClass != null && !objectClass.equals(BufferedDataTable.TYPE.getPortObjectClass().getName())) {
throw new IOException("Actual object class \"" + objectClass + "\", expected \"" + BufferedDataTable.TYPE.getPortObjectClass().getName() + "\"");
}
if (objectClass != null) {
object = loadBufferedDataTable(portDir, exec, loadTblRep, tblRep, fileStoreHandlerRepository);
((BufferedDataTable) object).setOwnerRecursively(node);
spec = ((BufferedDataTable) object).getDataTableSpec();
} else if (specClass != null) {
spec = BufferedDataTable.loadSpec(portDir);
}
} else {
object = loadPortObject(portDir, settings, exec, fileStoreHandlerRepository).orElse(null);
spec = object != null ? object.getSpec() : null;
}
if (spec != null) {
if (!designatedType.getPortObjectSpecClass().isInstance(spec) && !isInactive) {
throw new IOException("Actual port spec type (\"" + spec.getClass().getSimpleName() + "\") does not match designated one (\"" + designatedType.getPortObjectSpecClass().getSimpleName() + "\")");
}
}
String summary = null;
if (object != null) {
if (!designatedType.getPortObjectClass().isInstance(object) && !isInactive) {
throw new IOException("Actual port object type (\"" + object.getClass().getSimpleName() + "\") does not match designated one (\"" + designatedType.getPortObjectClass().getSimpleName() + "\")");
}
summary = settings.getString("port_object_summary", null);
if (summary == null) {
summary = object.getSummary();
}
}
setPortObjectSpec(portIdx, spec);
setPortObject(portIdx, object);
setPortObjectSummary(portIdx, summary);
}
use of org.knime.core.node.port.PortObjectSpec in project knime-core by knime.
the class FileNodePersistor method loadPortObject.
/**
* @param portDir
* @param settings
* @param exec
* @param fileStoreHandlerRepository
* @return
* @throws IOException
* @throws InvalidSettingsException
* @throws FileNotFoundException
* @throws CanceledExecutionException
*/
private Optional<PortObject> loadPortObject(final ReferencedFile portDir, final NodeSettingsRO settings, final ExecutionMonitor exec, final FileStoreHandlerRepository fileStoreHandlerRepository) throws IOException, InvalidSettingsException, FileNotFoundException, CanceledExecutionException {
exec.setMessage("Loading port object");
final String specClass = settings.getString("port_spec_class");
final String objectClass = loadPortObjectClassName(settings);
PortObject object = null;
PortObjectSpec spec = null;
if (specClass != null) {
Class<? extends PortObjectSpec> cl = PortTypeRegistry.getInstance().getSpecClass(specClass).orElseThrow(() -> new IOException("Invalid spec class \"" + specClass + "\""));
ReferencedFile specDirRef = new ReferencedFile(portDir, settings.getString("port_spec_location"));
File specFile = specDirRef.getFile();
if (!specFile.isFile()) {
throw new IOException("Can't read spec file " + specFile.getAbsolutePath());
}
try (PortObjectSpecZipInputStream in = PortUtil.getPortObjectSpecZipInputStream(new BufferedInputStream(new FileInputStream(specFile)))) {
PortObjectSpecSerializer<?> serializer = PortTypeRegistry.getInstance().getSpecSerializer(cl).get();
spec = serializer.loadPortObjectSpec(in);
if (spec == null) {
throw new IOException("Serializer \"" + serializer.getClass().getName() + "\" restored null spec ");
}
}
}
if (spec != null && objectClass != null) {
Class<? extends PortObject> cl = PortTypeRegistry.getInstance().getObjectClass(objectClass).orElseThrow(() -> new IOException("Invalid object class \"" + objectClass + "\""));
ReferencedFile objectFileRef = new ReferencedFile(portDir, settings.getString("port_object_location"));
File objectFile = objectFileRef.getFile();
if (!objectFile.isFile()) {
throw new IOException("Can't read file " + objectFile.getAbsolutePath());
}
// buffering both disc I/O and the gzip stream pays off
try (PortObjectZipInputStream in = PortUtil.getPortObjectZipInputStream(new BufferedInputStream(new FileInputStream(objectFile)))) {
PortObjectSerializer<?> serializer = PortTypeRegistry.getInstance().getObjectSerializer(cl).get();
object = serializer.loadPortObject(in, spec, exec);
}
if (object instanceof FileStorePortObject) {
File fileStoreXML = new File(objectFile.getParent(), "filestore.xml");
final ModelContentRO fileStoreModelContent = ModelContent.loadFromXML(new FileInputStream(fileStoreXML));
List<FileStoreKey> fileStoreKeys = new ArrayList<FileStoreKey>();
if (getLoadVersion().isOlderThan(LoadVersion.V2100)) {
// only one filestore in <2.10 (bug 5227)
FileStoreKey fileStoreKey = FileStoreKey.load(fileStoreModelContent);
fileStoreKeys.add(fileStoreKey);
} else {
ModelContentRO keysContent = fileStoreModelContent.getModelContent("filestore_keys");
for (String id : keysContent.keySet()) {
ModelContentRO keyContent = keysContent.getModelContent(id);
fileStoreKeys.add(FileStoreKey.load(keyContent));
}
}
FileStoreUtil.retrieveFileStoreHandlerFrom((FileStorePortObject) object, fileStoreKeys, fileStoreHandlerRepository);
}
}
return Optional.ofNullable(object);
}
use of org.knime.core.node.port.PortObjectSpec in project knime-core by knime.
the class StringToDurationPeriodNodeModel method createStreamableOperator.
/**
* {@inheritDoc}
*/
@Override
public StreamableOperator createStreamableOperator(final PartitionInfo partitionInfo, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
return new StreamableOperator() {
private SimpleStreamableOperatorInternals m_internals = new SimpleStreamableOperatorInternals();
/**
* {@inheritDoc}
*/
@Override
public void runIntermediate(final PortInput[] inputs, final ExecutionContext exec) throws Exception {
final RowInput rowInput = (RowInput) inputs[0];
final DataRow row = rowInput.poll();
if (row != null) {
final DataTableSpec inSpec = rowInput.getDataTableSpec();
final int[] includeIndexes = Arrays.stream(m_colSelect.applyTo(inSpec).getIncludes()).mapToInt(s -> inSpec.findColumnIndex(s)).toArray();
final Config config = m_internals.getConfig();
// detect types
detectTypes(new OneRowAdditionalRowInput(rowInput, row));
for (int i = 0; i < m_detectedTypes.length; i++) {
config.addDataType("detected_type" + i, m_detectedTypes[i]);
}
// write detected types and column names into config
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
for (int i = 0; i < rowInput.getDataTableSpec().getNumColumns(); i++) {
final int searchIdx = Arrays.binarySearch(includeIndexes, i);
config.addString("colname" + i, inSpec.getColumnNames()[i]);
if (searchIdx < 0) {
config.addDataType("type" + i, inSpec.getColumnSpec(i).getType());
} else {
config.addDataType("type" + i, m_detectedTypes[searchIdx] != null ? m_detectedTypes[searchIdx] : null);
}
}
config.addInt("sizeRow", rowInput.getDataTableSpec().getNumColumns());
} else {
for (int i = 0; i < inSpec.getNumColumns(); i++) {
config.addString("colname" + i, inSpec.getColumnNames()[i]);
config.addDataType("type" + i, inSpec.getColumnSpec(i).getType());
}
for (int i = 0; i < m_detectedTypes.length; i++) {
config.addString("colname" + (i + inSpec.getNumColumns()), new UniqueNameGenerator(inSpec).newName(inSpec.getColumnSpec(includeIndexes[i]).getName() + m_suffix.getStringValue()));
config.addDataType("type" + (i + inSpec.getNumColumns()), m_detectedTypes[i]);
}
config.addInt("sizeRow", inSpec.getNumColumns() + m_detectedTypes.length);
}
config.addBoolean("needsIteration", false);
} else {
m_internals.getConfig().addInt("sizeRow", 0);
}
rowInput.close();
}
/**
* {@inheritDoc}
*/
@Override
public StreamableOperatorInternals saveInternals() {
return m_internals;
}
/**
* {@inheritDoc}
*/
@Override
public void loadInternals(final StreamableOperatorInternals internals) {
m_internals = (SimpleStreamableOperatorInternals) internals;
}
@Override
public void runFinal(final PortInput[] inputs, final PortOutput[] outputs, final ExecutionContext exec) throws Exception {
final RowInput in = (RowInput) inputs[0];
final RowOutput out = (RowOutput) outputs[0];
final DataTableSpec inSpec = in.getDataTableSpec();
final int[] includeIndexes = Arrays.stream(m_colSelect.applyTo(inSpec).getIncludes()).mapToInt(s -> inSpec.findColumnIndex(s)).toArray();
// read detected types from config
final DataType[] detectedTypes = new DataType[includeIndexes.length];
final Config config = m_internals.getConfig();
for (int i = 0; i < includeIndexes.length; i++) {
detectedTypes[i] = config.getDataType("detected_type" + i, null);
}
// compute every row
DataRow row;
while ((row = in.poll()) != null) {
exec.checkCanceled();
DataCell[] datacells = new DataCell[includeIndexes.length];
for (int i = 0; i < includeIndexes.length; i++) {
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
final StringToDurationPeriodCellFactory cellFac = new StringToDurationPeriodCellFactory(new DataColumnSpecCreator(inSpec.getColumnNames()[includeIndexes[i]], detectedTypes[i]).createSpec(), includeIndexes[i]);
datacells[i] = cellFac.getCells(row)[0];
} else {
final DataColumnSpec dataColSpec = new UniqueNameGenerator(inSpec).newColumn(inSpec.getColumnNames()[includeIndexes[i]] + m_suffix.getStringValue(), detectedTypes[i]);
final StringToDurationPeriodCellFactory cellFac = new StringToDurationPeriodCellFactory(dataColSpec, includeIndexes[i]);
datacells[i] = cellFac.getCells(row)[0];
}
}
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
out.push(new ReplacedColumnsDataRow(row, datacells, includeIndexes));
} else {
out.push(new AppendedColumnRow(row, datacells));
}
}
in.close();
out.close();
}
};
}
use of org.knime.core.node.port.PortObjectSpec in project knime-core by knime.
the class OldToNewTimeNodeModel method createStreamableOperator.
/**
* {@inheritDoc}
*/
@Override
public StreamableOperator createStreamableOperator(final PartitionInfo partitionInfo, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
return new StreamableOperator() {
SimpleStreamableOperatorInternals m_internals = new SimpleStreamableOperatorInternals();
/**
* {@inheritDoc}
*/
@Override
public void runIntermediate(final PortInput[] inputs, final ExecutionContext exec) throws Exception {
if (partitionInfo.getPartitionIndex() == 0) {
final RowInput rowInput = (RowInput) inputs[0];
final DataRow row = rowInput.poll();
if (row != null) {
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
final DataColumnSpec[] colSpecs = new DataColumnSpec[row.getNumCells()];
final DataTableSpec inSpec = rowInput.getDataTableSpec();
final DataColumnSpec[] newColumnSpecs = getNewIncludedColumnSpecs(inSpec, row);
final int[] includeIndexes = Arrays.stream(m_colSelect.applyTo(inSpec).getIncludes()).mapToInt(s -> inSpec.findColumnIndex(s)).toArray();
for (int i = 0; i < inSpec.getNumColumns(); i++) {
final int searchIdx = Arrays.binarySearch(includeIndexes, i);
if (searchIdx < 0) {
colSpecs[i] = inSpec.getColumnSpec(i);
} else {
colSpecs[i] = newColumnSpecs[searchIdx];
}
}
final Config config = m_internals.getConfig();
config.addBoolean("hasIterated", false);
for (int i = 0; i < inSpec.getNumColumns(); i++) {
config.addDataType("type" + i, colSpecs[i].getType());
config.addString("colname" + i, colSpecs[i].getName());
}
config.addInt("sizeRow", colSpecs.length);
} else {
final DataTableSpec inSpec = rowInput.getDataTableSpec();
final DataColumnSpec[] newColumnSpecs = getNewIncludedColumnSpecs(inSpec, row);
final int[] includeIndexes = Arrays.stream(m_colSelect.applyTo(inSpec).getIncludes()).mapToInt(s -> inSpec.findColumnIndex(s)).toArray();
final DataColumnSpec[] colSpecs = new DataColumnSpec[row.getNumCells() + includeIndexes.length];
for (int i = 0; i < inSpec.getNumColumns(); i++) {
colSpecs[i] = inSpec.getColumnSpec(i);
}
for (int i = 0; i < newColumnSpecs.length; i++) {
colSpecs[i + inSpec.getNumColumns()] = new UniqueNameGenerator(inSpec).newColumn(newColumnSpecs[i].getName() + m_suffix.getStringValue(), newColumnSpecs[i].getType());
}
final Config config = m_internals.getConfig();
config.addBoolean("hasIterated", false);
for (int i = 0; i < colSpecs.length; i++) {
config.addDataType("type" + i, colSpecs[i].getType());
config.addString("colname" + i, colSpecs[i].getName());
}
config.addInt("sizeRow", colSpecs.length);
}
} else {
m_internals.getConfig().addInt("sizeRow", 0);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public StreamableOperatorInternals saveInternals() {
return m_internals;
}
@Override
public void runFinal(final PortInput[] inputs, final PortOutput[] outputs, final ExecutionContext exec) throws Exception {
final RowInput in = (RowInput) inputs[0];
final RowOutput out = (RowOutput) outputs[0];
final DataTableSpec inSpec = in.getDataTableSpec();
final int[] includeIndexes = Arrays.stream(m_colSelect.applyTo(inSpec).getIncludes()).mapToInt(s -> inSpec.findColumnIndex(s)).toArray();
DataRow row;
while ((row = in.poll()) != null) {
exec.checkCanceled();
final DataColumnSpec[] newColumnSpecs = getNewIncludedColumnSpecs(inSpec, row);
DataCell[] datacells = new DataCell[includeIndexes.length];
for (int i = 0; i < includeIndexes.length; i++) {
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
ConvertTimeCellFactory cellFac = new ConvertTimeCellFactory(newColumnSpecs[i], i, includeIndexes[i]);
datacells[i] = cellFac.getCells(row)[0];
} else {
final DataColumnSpec dataColSpec = new UniqueNameGenerator(inSpec).newColumn(newColumnSpecs[i].getName() + m_suffix.getStringValue(), newColumnSpecs[i].getType());
ConvertTimeCellFactory cellFac = new ConvertTimeCellFactory(dataColSpec, i, includeIndexes[i]);
datacells[i] = cellFac.getCells(row)[0];
}
}
if (m_isReplaceOrAppend.getStringValue().equals(OPTION_REPLACE)) {
out.push(new ReplacedColumnsDataRow(row, datacells, includeIndexes));
} else {
out.push(new AppendedColumnRow(row, datacells));
}
}
in.close();
out.close();
}
};
}
use of org.knime.core.node.port.PortObjectSpec in project knime-core by knime.
the class RuleEngine2PortsNodeModel method computeFinalOutputSpecs.
/**
* {@inheritDoc}
*/
@Override
public PortObjectSpec[] computeFinalOutputSpecs(final StreamableOperatorInternals internals, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
final StreamInternalWithPortObject sipo = (StreamInternalWithPortObject) internals;
final DataTableSpec tableSpec = sipo.getTableSpec();
return new PortObjectSpec[] { tableSpec, sipo.getObject() != null ? new PMMLPortObjectSpecCreator(tableSpec).createSpec() : InactiveBranchPortObject.INSTANCE.getSpec() };
}
Aggregations