use of org.knime.core.data.filestore.internal.IFileStoreHandler in project knime-core by knime.
the class NativeNodeContainer method initFileStore.
private IWriteFileStoreHandler initFileStore(final WorkflowFileStoreHandlerRepository fileStoreHandlerRepository) {
final FlowObjectStack flowObjectStack = getFlowObjectStack();
FlowLoopContext upstreamFLC = flowObjectStack.peek(FlowLoopContext.class);
if (upstreamFLC == null) {
// if node is contained in subnode check if the subnode is in a loop (see AP-5667)
final FlowSubnodeScopeContext subnodeSC = flowObjectStack.peek(FlowSubnodeScopeContext.class);
if (subnodeSC != null) {
upstreamFLC = subnodeSC.getOuterFlowLoopContext();
}
}
NodeID outerStartNodeID = upstreamFLC == null ? null : upstreamFLC.getHeadNode();
// loop start nodes will put their loop context on the outgoing flow object stack
assert !getID().equals(outerStartNodeID) : "Loop start on incoming flow stack can't be node itself";
final FlowLoopContext innerFLC = getOutgoingFlowObjectStack().peek(FlowLoopContext.class);
NodeID innerStartNodeID = innerFLC == null ? null : innerFLC.getHeadNode();
// if there is a loop context on this node's stack, this node must be the start
assert !(this.isModelCompatibleTo(LoopStartNode.class)) || getID().equals(innerStartNodeID);
IFileStoreHandler oldFSHandler = m_node.getFileStoreHandler();
IWriteFileStoreHandler newFSHandler;
if (innerFLC == null && upstreamFLC == null) {
// node is not a start node and not contained in a loop
if (oldFSHandler instanceof IWriteFileStoreHandler) {
clearFileStoreHandler();
/*assert false : "Node " + getNameWithID() + " must not have file store handler at this point (not a "
+ "loop start and not contained in loop), disposing old handler";*/
}
newFSHandler = new WriteFileStoreHandler(getNameWithID(), UUID.randomUUID());
newFSHandler.addToRepository(fileStoreHandlerRepository);
} else if (innerFLC != null) {
// node is a loop start node
int loopIteration = innerFLC.getIterationIndex();
if (loopIteration == 0) {
if (oldFSHandler instanceof IWriteFileStoreHandler) {
assert false : "Loop Start " + getNameWithID() + " must not have file store handler at this point " + "(no iteration ran), disposing old handler";
clearFileStoreHandler();
}
if (upstreamFLC != null) {
ILoopStartWriteFileStoreHandler upStreamFSHandler = upstreamFLC.getFileStoreHandler();
newFSHandler = new LoopStartReferenceWriteFileStoreHandler(upStreamFSHandler, innerFLC);
} else {
newFSHandler = new LoopStartWritableFileStoreHandler(this, UUID.randomUUID(), innerFLC);
}
newFSHandler.addToRepository(fileStoreHandlerRepository);
innerFLC.setFileStoreHandler((ILoopStartWriteFileStoreHandler) newFSHandler);
} else {
assert oldFSHandler instanceof IWriteFileStoreHandler : "Loop Start " + getNameWithID() + " must have file store handler in iteration " + loopIteration;
newFSHandler = (IWriteFileStoreHandler) oldFSHandler;
// keep the old one
}
} else {
// ordinary node contained in loop
assert innerFLC == null && upstreamFLC != null;
ILoopStartWriteFileStoreHandler upStreamFSHandler = upstreamFLC.getFileStoreHandler();
if (this.isModelCompatibleTo(LoopEndNode.class)) {
if (upstreamFLC.getIterationIndex() > 0) {
newFSHandler = (IWriteFileStoreHandler) oldFSHandler;
} else {
newFSHandler = new LoopEndWriteFileStoreHandler(upStreamFSHandler);
newFSHandler.addToRepository(fileStoreHandlerRepository);
}
} else {
newFSHandler = new ReferenceWriteFileStoreHandler(upStreamFSHandler);
newFSHandler.addToRepository(fileStoreHandlerRepository);
}
}
return newFSHandler;
}
use of org.knime.core.data.filestore.internal.IFileStoreHandler in project knime-core by knime.
the class FileNodePersistor method loadFileStoreHandler.
IFileStoreHandler loadFileStoreHandler(final Node node, final ExecutionMonitor execMon, final NodeSettingsRO settings, final WorkflowFileStoreHandlerRepository fileStoreHandlerRepository) throws InvalidSettingsException {
if (getLoadVersion().isOlderThan(FileWorkflowPersistor.LoadVersion.V260)) {
return new EmptyFileStoreHandler(fileStoreHandlerRepository);
}
NodeSettingsRO fsSettings = settings.getNodeSettings("filestores");
String dirNameInFlow = fsSettings.getString("file_store_location");
if (dirNameInFlow == null) {
return new EmptyFileStoreHandler(fileStoreHandlerRepository);
} else {
String uuidS = fsSettings.getString("file_store_id");
UUID uuid = UUID.fromString(uuidS);
ReferencedFile subDirFile = new ReferencedFile(getNodeDirectory(), dirNameInFlow);
IFileStoreHandler fsh = WriteFileStoreHandler.restore(node.getName(), uuid, fileStoreHandlerRepository, subDirFile.getFile());
return fsh;
}
}
use of org.knime.core.data.filestore.internal.IFileStoreHandler in project knime-core by knime.
the class NativeNodeContainer method initVirtualScopeFileStoreHandler.
/**
* Inits file store handler for nodes that are part of a {@link FlowVirtualScopeContext}.
*
* @return the file store handler or <code>null</code> if not a virtual scope
*/
private IWriteFileStoreHandler initVirtualScopeFileStoreHandler() {
FlowVirtualScopeContext virtualScope = getFlowScopeContextFromHierarchy(FlowVirtualScopeContext.class, getFlowObjectStack());
NativeNodeContainer hostNode = virtualScope != null ? virtualScope.getHostNode().orElse(null) : null;
if (hostNode != null) {
IFileStoreHandler fsh = hostNode.getNode().getFileStoreHandler();
if (fsh instanceof IWriteFileStoreHandler) {
return initWriteFileStoreHandlerReference((IWriteFileStoreHandler) fsh);
} else if (fsh == null) {
// can happen if the node associated with the virtual scope is reset
throw new IllegalStateException("No file store handler given. Try to re-execute '" + hostNode.getNameWithID() + "'");
} else {
throw new IllegalStateException("No file store handler given. Most likely an implementation error");
}
} else {
return null;
}
}
use of org.knime.core.data.filestore.internal.IFileStoreHandler in project knime-core by knime.
the class NativeNodeContainer method initLoopScopeFileStoreHandler.
/**
* Inits the file store handler if node is part of a loop scope (including start and end).
*
* @param upstreamFLC optional loop context this node might be part of
* @param innerFLC optional loop context beginning at this node if this node is a loop start
* @param targetFSH file store handler to be referenced if given
* @return the file store handler or <code>null</code> if not a loop scope
*/
private IWriteFileStoreHandler initLoopScopeFileStoreHandler(final FlowLoopContext upstreamFLC, final FlowLoopContext innerFLC, final IWriteFileStoreHandler targetFSH) {
IFileStoreHandler oldFSHandler = m_node.getFileStoreHandler();
IWriteFileStoreHandler newFSHandler = null;
if (innerFLC != null) {
// node is a loop start node
assert innerFLC.getIterationIndex() == 0;
if (oldFSHandler instanceof IWriteFileStoreHandler) {
assert false : "Loop Start " + getNameWithID() + " must not have file store handler at this point " + "(no iteration ran), disposing old handler";
clearFileStoreHandler();
}
if (upstreamFLC != null) {
ILoopStartWriteFileStoreHandler upStreamFSHandler = upstreamFLC.getFileStoreHandler();
newFSHandler = new NestedLoopStartWriteFileStoreHandler(upStreamFSHandler, innerFLC);
} else if (targetFSH != null) {
// there is another target file store handler
// -> loop start file store handler references it
newFSHandler = new LoopStartWriteFileStoreHandler(this, targetFSH, innerFLC);
} else {
// create entirely new loop start file store handler (without referencing another handler)
newFSHandler = new LoopStartWriteFileStoreHandler(this, UUID.randomUUID(), innerFLC);
}
innerFLC.setFileStoreHandler((ILoopStartWriteFileStoreHandler) newFSHandler);
} else {
// ordinary node contained in loop
assert upstreamFLC != null;
assert upstreamFLC.getIterationIndex() == 0;
ILoopStartWriteFileStoreHandler upStreamFSHandler = upstreamFLC.getFileStoreHandler();
if (upStreamFSHandler != null) {
if (this.isModelCompatibleTo(LoopEndNode.class)) {
newFSHandler = new LoopEndWriteFileStoreHandler(upStreamFSHandler);
} else {
newFSHandler = new ReferenceWriteFileStoreHandler(upStreamFSHandler);
}
} else {
// for an 'InactiveBranchConsumer-loop end'
assert this.isModelCompatibleTo(InactiveBranchConsumer.class);
}
}
return newFSHandler;
}
use of org.knime.core.data.filestore.internal.IFileStoreHandler in project knime-core by knime.
the class NativeNodeContainer method initDefaultFileStoreHandler.
/**
* Inits the default file store handler for a node, i.e. file stores are stored with the node itself.
*
* @return the file store handler, never <code>null</code>
*/
private IWriteFileStoreHandler initDefaultFileStoreHandler() {
// node is not a start node and not contained in a loop
IFileStoreHandler oldFSHandler = m_node.getFileStoreHandler();
if (oldFSHandler instanceof IWriteFileStoreHandler) {
clearFileStoreHandler();
/*assert false : "Node " + getNameWithID() + " must not have file store handler at this point (not a "
+ "loop start and not contained in loop), disposing old handler";*/
}
IWriteFileStoreHandler newFSHandler = new WriteFileStoreHandler(getNameWithID(), UUID.randomUUID());
return newFSHandler;
}
Aggregations