package org.krakenapps.logdb.query.command;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import org.krakenapps.log.api.LogParser;
import org.krakenapps.logdb.LogQueryCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TextFile extends LogQueryCommand {
private final Logger logger = LoggerFactory.getLogger(TextFile.class.getName());
private FileInputStream is;
private LogParser parser;
private int offset;
private int limit;
public TextFile(FileInputStream is, LogParser parser, int offset, int limit) {
this.is = is;
this.parser = parser;
this.offset = offset;
this.limit = limit;
}
@Override
public void start() {
status = Status.Running;
BufferedReader br = null;
try {
Charset utf8 = Charset.forName("utf-8");
br = new BufferedReader(new InputStreamReader(new BufferedInputStream(is), utf8));
int i = 0;
int count = 0;
while (true) {
if (limit > 0 && count >= limit)
break;
String line = br.readLine();
if (line == null)
break;
Map<String, Object> m = new HashMap<String, Object>();
Map<String, Object> parsed = null;
m.put("line", line);
if (parser != null) {
parsed = parser.parse(m);
if (parsed == null)
continue;
}
if (i >= offset) {
write(new LogMap(parsed != null ? parsed : m));
count++;
}
i++;
}
} catch (Throwable t) {
logger.error("kraken logdb: file error", t);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
}
}
}
eof();
}
@Override
public void push(LogMap m) {
throw new UnsupportedOperationException();
}
@Override
public boolean isReducer() {
return false;
}
}