Note: This was originally posted by an inactive account. Content was preserved by moving under an admin account.
Originally posted by: phouriganHi,
I am creating a series of java nodes to perform zip compression/decompression of a collection of files.
I'd like to be able to set the location and filename of the compressed output from a runtime parameter. Is ths possible?
I'm using LAE 4.1.5.
Here's my Java Node:
About half way down I have ToDo comment:
//ToDo: PatrickH, fetch these from Runtime parameters
String compressedFileName = "d:/documents/compressed.zip";
package {{^JavaPackage^}};
import java.lang.*;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.Adler32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import com.lavastorm.brain.io.data.Record;
import com.lavastorm.brain.io.data.RecordInput;
import com.lavastorm.brain.io.data.RecordMetadata;
import com.lavastorm.brain.io.data.RecordOutput;
import com.lavastorm.brain.io.data.SimpleFieldMetadata;
import com.lavastorm.brain.io.data.SimpleRecordMetadata;
import com.lavastorm.brain.io.data.RecordIo.State;
import com.lavastorm.brain.node.AbstractJavaNode;
import com.lavastorm.brain.node.Log.Level;
import com.lavastorm.brain.node.io.NodeOutput;
/**
*
* @author patrick.hourigan
* @version 1.0
*/
public class {{^JavaClass^}} extends AbstractJavaNode
{
private static final int BUFFER = 2048;
public void setup()
{
//check the input and open it
try {
input(0).open();
} catch (IOException e) {
throw new RuntimeException("Error opening input", e);
}
try {
int outputNum = findOutput("CompressedFileName");
if (outputNum < 0) {
throw new RuntimeException("Can't find output CompressedFileName");
}
RecordMetadata metadata = new SimpleRecordMetadata();
metadata.add(new SimpleFieldMetadata("FileLocation", java.lang.String.class));
metadata.lock();
output(outputNum).metadata(metadata);
output(outputNum).open();
} catch (IOException e) {
throw new RuntimeException("Error opening output", e);
}
}
public void processAll()
{
Record record = null;
int outputNum = findOutput("CompressedFileName");
if (outputNum < 0) {
throw new RuntimeException("Can't find output CompressedFileName");
}
NodeOutput output = output(outputNum);
RecordMetadata metadata = output.metadata();
if (null == metadata) {
throw new RuntimeException("Metadata not available for output CompressedFileName");
}
try {
//ToDo: PatrickH, fetch these from Runtime parameters
String compressedFileName = "d:/documents/compressed.zip";
// Create the ZIP stream to the compressed file required.
FileOutputStream dest = new FileOutputStream(compressedFileName);
// Create a checksum based on Alder32 algorithm. Alder32 is lighter
// and more performant than CRC32
CheckedOutputStream checksum = new CheckedOutputStream(dest, new Adler32());
// Create the checksummed stream
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(checksum));
byte data[] = new byte[BUFFER];
while((record = input(0).read()) != RecordInput.EOF) {
// Load the file required for each entry in the overall zip
String fileToCompress = (String) record.field(input(0).metadata().find("FileName")) ;
File f = new File(fileToCompress);
FileInputStream fi = new FileInputStream(f);
BufferedInputStream origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(f.getAbsolutePath());
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
Record outputRecord = metadata.newRecord();
outputRecord.field(metadata.find("FileLocation"), compressedFileName);
output.write(outputRecord);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void cleanup()
{
// Cleanup code here
RuntimeException rte = null;
for (int i=0; i < numInputs(); i++) {
try {
if (input(i)!=null && input(i).state()!=State.CLOSED_STATE)
input(i).close(false);
} catch (IOException e) {
if (rte==null)
rte = new RuntimeException("Error closing input ("+i+").", e);
}
}
for (int i=0; i < numOutputs(); i++) {
try {
if (output(i)!=null && output(i).state()!=State.CLOSED_STATE)
output(i).close(false);
} catch (IOException e) {
if (rte==null)
rte = new RuntimeException("Error closing output ("+i+").", e);
}
}
if (rte!=null) throw rte;
}
public String propertyBase() {
return "ls.brain.node";
}
}