/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015
*/
package com.ibm.streamsx.topology.file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import com.ibm.streams.operator.AbstractOperator;
import com.ibm.streams.operator.OperatorContext;
import com.ibm.streams.operator.OutputTuple;
import com.ibm.streams.operator.StreamingInput;
import com.ibm.streams.operator.StreamingOutput;
import com.ibm.streams.operator.Tuple;
import com.ibm.streams.operator.model.InputPortSet;
import com.ibm.streams.operator.model.OutputPortSet;
import com.ibm.streams.operator.model.Parameter;
import com.ibm.streams.operator.model.PrimitiveOperator;
import com.ibm.streams.operator.types.RString;
@PrimitiveOperator
@InputPortSet(cardinality = 1)
@OutputPortSet(cardinality = 1)
public class TextFileReader extends AbstractOperator {
private String encoding = "UTF-8";
private Charset charset;
public String getEncoding() {
return encoding;
}
@Parameter(optional = true)
public void setEncoding(String encoding) {
this.encoding = encoding;
}
@Override
public void initialize(OperatorContext context) throws Exception {
super.initialize(context);
charset = Charset.forName(getEncoding());
}
@Override
public void process(StreamingInput<Tuple> stream, Tuple tuple)
throws Exception {
final StreamingOutput<OutputTuple> out = getOutput(0);
String fileName = tuple.getString(0);
File file = new File(fileName);
if (!file.isAbsolute()) {
file = new File(getOperatorContext().getPE().getDataDirectory(),
fileName);
}
FileInputStream fis = new FileInputStream(file);
try {
BufferedReader br = new BufferedReader(new InputStreamReader(fis,
charset), 128 * 1024);
for (;;) {
String line = br.readLine();
if (line == null)
break;
out.submitAsTuple(new RString(line));
}
br.close();
} finally {
fis.close();
}
}
}