use of org.knime.core.node.port.PortObjectZipOutputStream in project knime-core by knime.
the class Node method copyPortObject.
/**
* Copies the PortObject so that the copy can be given to the node model
* implementation (and potentially modified). The copy is carried out by
* means of the respective serializer (via streams).
*
* <p> Note that this method is meant to be used by the framework only.
* @param portObject The object to be copied.
* @param exec For progress/cancel
* @return The (deep) copy.
* @throws IOException In case of exceptions while accessing the stream or
* if the argument is an instance of {@link BufferedDataTable}.
* @throws CanceledExecutionException If canceled.
*/
public static PortObject copyPortObject(final PortObject portObject, final ExecutionContext exec) throws IOException, CanceledExecutionException {
if (portObject instanceof BufferedDataTable) {
throw new IOException("Can't copy BufferedDataTable objects");
}
// first copy the spec, then copy the object
final PortObjectSpec s = portObject.getSpec();
PortObjectSpec.PortObjectSpecSerializer ser = PortTypeRegistry.getInstance().getSpecSerializer(s.getClass()).get();
ByteArrayOutputStream byteOut = new ByteArrayOutputStream(10 * 1024);
PortObjectSpecZipOutputStream specOut = PortUtil.getPortObjectSpecZipOutputStream(byteOut);
specOut.setLevel(0);
ser.savePortObjectSpec(s, specOut);
specOut.close();
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
PortObjectSpecZipInputStream specIn = PortUtil.getPortObjectSpecZipInputStream(byteIn);
PortObjectSpec specCopy = ser.loadPortObjectSpec(specIn);
specIn.close();
DeferredFileOutputStream deferredOutputStream = new DeferredFileOutputStream(/* 10 MB */
10 * 1024 * 1024, "knime-portobject-copy-", ".bin", new File(KNIMEConstants.getKNIMETempDir()));
PortObject.PortObjectSerializer obSer = PortTypeRegistry.getInstance().getObjectSerializer(portObject.getClass()).get();
PortObjectZipOutputStream objOut = PortUtil.getPortObjectZipOutputStream(deferredOutputStream);
objOut.setLevel(0);
obSer.savePortObject(portObject, objOut, exec);
objOut.close();
InputStream inStream;
if (deferredOutputStream.isInMemory()) {
inStream = new ByteArrayInputStream(deferredOutputStream.getData());
} else {
inStream = new BufferedInputStream(new FileInputStream(deferredOutputStream.getFile()));
}
PortObjectZipInputStream objIn = PortUtil.getPortObjectZipInputStream(inStream);
PortObject result = obSer.loadPortObject(objIn, specCopy, exec);
objIn.close();
if (portObject instanceof FileStorePortObject) {
FileStorePortObject sourceFSObj = (FileStorePortObject) portObject;
FileStorePortObject resultFSObj = (FileStorePortObject) result;
FileStoreUtil.retrieveFileStoreHandlers(sourceFSObj, resultFSObj, exec.getFileStoreHandler());
}
if (!deferredOutputStream.isInMemory()) {
deferredOutputStream.getFile().delete();
}
return result;
}
use of org.knime.core.node.port.PortObjectZipOutputStream in project knime-core by knime.
the class FileNodePersistor method savePortObject.
private static void savePortObject(final PortObjectSpec spec, final PortObject object, final File portDir, final NodeSettingsWO settings, final ExecutionMonitor exec) throws IOException, FileNotFoundException, CanceledExecutionException {
settings.addString("port_spec_class", spec.getClass().getName());
settings.addString("port_object_class", object.getClass().getName());
String specDirName = "spec";
String specFileName = "spec.zip";
String specPath = specDirName + "/" + specFileName;
File specDir = createDirectory(new File(portDir, specDirName));
File specFile = new File(specDir, specFileName);
settings.addString("port_spec_location", specPath);
try (PortObjectSpecZipOutputStream out = PortUtil.getPortObjectSpecZipOutputStream(new BufferedOutputStream(new FileOutputStream(specFile)))) {
PortObjectSpecSerializer serializer = PortTypeRegistry.getInstance().getSpecSerializer(spec.getClass()).get();
serializer.savePortObjectSpec(spec, out);
}
String objectDirName = null;
objectDirName = "object";
File objectDir = createDirectory(new File(portDir, objectDirName));
String objectPath;
String objectFileName = "portobject.zip";
objectPath = objectDirName + "/" + objectFileName;
settings.addString("port_object_location", objectPath);
File file = new File(objectDir, objectFileName);
try (PortObjectZipOutputStream out = PortUtil.getPortObjectZipOutputStream(new BufferedOutputStream(new FileOutputStream(file)))) {
PortObjectSerializer serializer = PortTypeRegistry.getInstance().getObjectSerializer(object.getClass()).get();
serializer.savePortObject(object, out, exec);
if (object instanceof FileStorePortObject) {
List<FileStoreKey> fileStoreKeys = FileStoreUtil.getFileStores((FileStorePortObject) object).stream().map(FileStoreUtil::getFileStoreKey).collect(Collectors.toList());
File fileStoreXML = new File(objectDir, "filestore.xml");
final ModelContent fileStoreModelContent = new ModelContent("filestore");
ModelContentWO keysContent = fileStoreModelContent.addModelContent("filestore_keys");
for (int i = 0; i < fileStoreKeys.size(); i++) {
FileStoreKey key = fileStoreKeys.get(i);
ModelContentWO keyContent = keysContent.addModelContent("filestore_key_" + i);
key.save(keyContent);
}
fileStoreModelContent.saveToXML(new FileOutputStream(fileStoreXML));
}
}
}
Aggregations