package com.asgow.ciel.examples.smithwaterman;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.asgow.ciel.executor.Ciel;
import com.asgow.ciel.references.Reference;
import com.asgow.ciel.tasks.ConstantNumOutputsTask;
import com.asgow.ciel.tasks.FirstClassJavaTask;
public class PartitionInputString implements ConstantNumOutputsTask {
private final Reference input;
private final int numChunks;
public PartitionInputString(Reference input, int numChunks) {
this.input = input;
this.numChunks = numChunks;
}
public int getNumOutputs() {
return this.numChunks;
}
public void invoke() throws Exception {
/**
* inputs: full input string. Whole thing will be read into memory.
*/
ByteArrayOutputStream inputStringBuffer = new ByteArrayOutputStream();
InputStream in = Ciel.RPC.getStreamForReference(this.input);
int c;
while ((c = in.read()) != -1) {
inputStringBuffer.write(c);
}
byte[] inputString = inputStringBuffer.toByteArray();
in.close();
/**
* outputs: n output blocks.
*/
int blockLength = (inputString.length / this.numChunks) + ((inputString.length % this.numChunks == 0) ? 0 : 1);
int currentPos = 0;
for (int i = 0; i < this.numChunks; ++i) {
OutputStream out = Ciel.RPC.getOutputFilename(i).open();
for (int j = 0; j < blockLength && currentPos < inputString.length; ++j, ++currentPos) {
out.write(inputString[currentPos]);
}
out.close();
}
}
public Reference[] getDependencies() {
return new Reference[] { this.input };
}
public void setup() {
}
}