package topasin.processor;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import topasin.filter.AsinDetailFilter;
import topasin.util.AsinDetail;
/**
* base class for process asin detail file
*
* @author mengzang
*
*/
public abstract class AbstractAsinDetailFileProcessor implements Runnable {
private final BufferedReader reader;
private final AtomicInteger totalCounter;
private final AsinDetailFilter filter;
private final int batchSize = 50000;
public AbstractAsinDetailFileProcessor(final BufferedReader reader, final AsinDetailFilter filter,
final AtomicInteger totalCounter) {
this.reader = reader;
this.filter = filter;
this.totalCounter = totalCounter;
}
@Override
public void run() {
final AsinDetail asinDetail = new AsinDetail();
final String[] batch = new String[batchSize];
while (true) {
try {
readLineBatch(batch);
if (batch[0] == null) {
break;
}
processLineBatch(asinDetail, batch);
} catch (Throwable e) {
e.printStackTrace();
// result will be incorrect when any exception occurs, there is no need to continue process
System.exit(1);
}
}
}
private void processLineBatch(AsinDetail asinDetail, final String[] batch) {
int count = 0;
String asinDetailLine = null;
for (int i = 0; i < batchSize; i++) {
asinDetailLine = batch[i];
batch[i] = null;
if (asinDetailLine == null) {
return;
}
asinDetail.fillAsinDetailsWithNeededFields(asinDetailLine);
if (filter != null && (filter.filterAsinDetailLine(asinDetail) == null)) {
continue;
}
processAsinDetailLine(asinDetailLine, asinDetail);
count++;
if (count == 10000) {
totalCounter.addAndGet(count);
count = 0;
}
}
totalCounter.addAndGet(count);
}
private void readLineBatch(final String[] batch) throws IOException {
synchronized (reader) {
String line = null;
int counter = 0;
while (counter < batchSize && (line = reader.readLine()) != null) {
batch[counter] = line;
counter++;
}
}
}
public abstract void processAsinDetailLine(String asinDetailLine, AsinDetail asinDetail);
}