package de.mpicbg.knime.scripting.r.port; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.zip.ZipEntry; import org.knime.core.node.CanceledExecutionException; import org.knime.core.node.ExecutionMonitor; import org.knime.core.node.port.PortObject.PortObjectSerializer; import org.knime.core.node.port.PortObjectSpec; import org.knime.core.node.port.PortObjectZipInputStream; import org.knime.core.node.port.PortObjectZipOutputStream; public final class RPortObjectSerializer2 extends PortObjectSerializer<RPortObject2> { private static final String ZIP_ENTRY_WS = "Rworkspace.RData"; @Override public void savePortObject(RPortObject2 portObject, PortObjectZipOutputStream out, ExecutionMonitor exec) throws IOException, CanceledExecutionException { out.putNextEntry(new ZipEntry(ZIP_ENTRY_WS)); Files.copy(portObject.getFile().toPath(), out); out.flush(); out.closeEntry(); out.close(); } @Override public RPortObject2 loadPortObject(PortObjectZipInputStream in, PortObjectSpec spec, ExecutionMonitor exec) throws IOException, CanceledExecutionException { ZipEntry nextEntry = in.getNextEntry(); if ((nextEntry == null) || !nextEntry.getName().equals(ZIP_ENTRY_WS)) { throw new IOException("Expected zip entry '" + ZIP_ENTRY_WS + "' not present"); } File tempFile = File.createTempFile("genericR", ".RData"); Files.copy(in, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); in.close(); return new RPortObject2(tempFile); } }