use of org.knime.core.node.FileNodePersistor in project knime-core by knime.
the class FileNativeNodeContainerPersistor method guessPortTypesFromConnectedNodes.
/**
* {@inheritDoc}
*/
@Override
public void guessPortTypesFromConnectedNodes(final NodeAndBundleInformation nodeInfo, final NodeSettingsRO additionalFactorySettings, final ArrayList<PersistorWithPortIndex> upstreamNodes, final ArrayList<List<PersistorWithPortIndex>> downstreamNodes) {
if (m_node == null) {
/* Input ports from the connection table. */
// first is flow var port
PortType[] inPortTypes = new PortType[Math.max(upstreamNodes.size() - 1, 0)];
// default to BDT for unconnected ports
Arrays.fill(inPortTypes, BufferedDataTable.TYPE);
for (int i = 0; i < inPortTypes.length; i++) {
// first is flow var port
PersistorWithPortIndex p = upstreamNodes.get(i + 1);
if (p != null) {
PortType portTypeFromUpstreamNode = p.getPersistor().getUpstreamPortType(p.getPortIndex());
if (portTypeFromUpstreamNode != null) {
// null if upstream is missing, too
inPortTypes[i] = portTypeFromUpstreamNode;
}
}
}
/* Output ports from node settings (saved ports) -- if possible (executed) */
String nodeName = nodeInfo.getNodeNameNotNull();
PortType[] outPortTypes;
try {
LoadResult guessLoadResult = new LoadResult("Port type guessing for missing node \"" + nodeName + "\"");
NodeSettingsRO settingsForNode = loadSettingsForNode(guessLoadResult);
FileNodePersistor nodePersistor = createNodePersistor(settingsForNode);
outPortTypes = nodePersistor.guessOutputPortTypes(guessLoadResult, nodeName);
if (guessLoadResult.hasErrors()) {
getLogger().debug("Errors guessing port types for missing node \"" + nodeName + "\": " + guessLoadResult.getFilteredError("", LoadResultEntryType.Error));
}
} catch (Exception e) {
getLogger().debug("Unable to guess port types for missing node \"" + nodeName + "\"", e);
outPortTypes = null;
}
if (outPortTypes == null) {
// couldn't guess port types from looking at node settings (e.g. not executed)
// default to BDT for unconnected ports
outPortTypes = new PortType[Math.max(downstreamNodes.size() - 1, 0)];
}
for (int i = 0; i < outPortTypes.length; i++) {
PortType type = outPortTypes[i];
// output types may be partially filled by settings guessing above, list may be empty or too short
List<PersistorWithPortIndex> list = i < downstreamNodes.size() - 1 ? downstreamNodes.get(i + 1) : null;
if (list != null) {
assert !list.isEmpty();
for (PersistorWithPortIndex p : list) {
PortType current = p.getPersistor().getDownstreamPortType(p.getPortIndex());
if (current == null) {
// ignore, downstream node is also missing
} else if (type == null) {
type = current;
} else if (type.equals(current)) {
// keep type
} else {
// this shouldn't really happen - someone changed port types between versions
type = PortObject.TYPE;
}
}
outPortTypes[i] = type;
}
if (outPortTypes[i] == null) {
// might still be null if missing node is only connected to missing node, fallback: BDT
outPortTypes[i] = BufferedDataTable.TYPE;
}
}
MissingNodeFactory nodefactory = new MissingNodeFactory(nodeInfo, additionalFactorySettings, inPortTypes, outPortTypes);
if (getLoadVersion().ordinal() < FileWorkflowPersistor.VERSION_LATEST.ordinal()) {
nodefactory.setCopyInternDirForWorkflowVersionChange(true);
}
nodefactory.init();
m_node = new Node((NodeFactory) nodefactory);
}
}
use of org.knime.core.node.FileNodePersistor in project knime-core by knime.
the class FileNativeNodeContainerPersistor method loadNCAndWashModelSettings.
/**
* {@inheritDoc}
*/
@Override
NodeSettingsRO loadNCAndWashModelSettings(final NodeSettingsRO settingsForNode, final NodeSettingsRO modelSettings, final Map<Integer, BufferedDataTable> tblRep, final ExecutionMonitor exec, final LoadResult result) throws InvalidSettingsException, CanceledExecutionException, IOException {
final FileNodePersistor nodePersistor = createNodePersistor(settingsForNode);
nodePersistor.preLoad(m_node, result);
NodeSettingsRO washedModelSettings = modelSettings;
try {
if (modelSettings != null) {
// null if the node never had settings - no reason to load them
m_node.validateModelSettings(modelSettings);
m_node.loadModelSettingsFrom(modelSettings);
// previous versions of KNIME (2.7 and before) kept the model settings only in the node;
// NodeModel#saveSettingsTo was always called before the dialog was opened (some dialog implementations
// rely on the exact structure of the NodeSettings ... which may change between versions).
// We wash the settings through the node so that the model settings are updated (they possibly
// no longer map to the variable settings loaded further down below - if so, the inconsistency
// is warned later during configuration)
NodeSettings washedSettings = new NodeSettings("model");
m_node.saveModelSettingsTo(washedSettings);
washedModelSettings = washedSettings;
}
} catch (Exception e) {
final String error;
if (e instanceof InvalidSettingsException) {
error = "Loading model settings failed: " + e.getMessage();
} else {
error = "Caught \"" + e.getClass().getSimpleName() + "\", " + "Loading model settings failed: " + e.getMessage();
}
final LoadNodeModelSettingsFailPolicy pol = getModelSettingsFailPolicy(getMetaPersistor().getState(), nodePersistor.isInactive());
switch(pol) {
case IGNORE:
if (!(e instanceof InvalidSettingsException)) {
getLogger().coding(error, e);
}
break;
case FAIL:
result.addError(error);
m_node.createErrorMessageAndNotify(error, e);
setNeedsResetAfterLoad();
break;
case WARN:
m_node.createWarningMessageAndNotify(error, e);
result.addWarning(error);
setDirtyAfterLoad();
break;
}
}
try {
HashMap<Integer, ContainerTable> globalTableRepository = getGlobalTableRepository();
WorkflowFileStoreHandlerRepository fileStoreHandlerRepository = getFileStoreHandlerRepository();
nodePersistor.load(m_node, getParentPersistor(), exec, tblRep, globalTableRepository, fileStoreHandlerRepository, result);
} catch (final Exception e) {
String error = "Error loading node content: " + e.getMessage();
getLogger().warn(error, e);
needsResetAfterLoad();
result.addError(error);
}
if (nodePersistor.isDirtyAfterLoad()) {
setDirtyAfterLoad();
}
if (nodePersistor.needsResetAfterLoad()) {
setNeedsResetAfterLoad();
}
return washedModelSettings;
}
Aggregations