package hu.sztaki.ilab.longneck.weblog.parser; import hu.sztaki.ilab.longneck.Record; import hu.sztaki.ilab.longneck.RecordImpl; import hu.sztaki.ilab.longneck.process.CheckError; import hu.sztaki.ilab.longneck.process.access.NoMoreRecordsException; import hu.sztaki.ilab.longneck.weblog.parser.processor.LogParser; import hu.sztaki.ilab.longneck.weblog.parser.processor.LogParserFactory; import java.util.InputMismatchException; import org.apache.log4j.Logger; /** * Main class that defines a weblog parser as a data source. * * This parser provides 1) a data source: WeblogFileSource gives a field with a * name logLine as one line of the file. 2) a block: WeblogLine processes * logLin, and produces derived fields. * * Note: If the parser fails, no error messages appear in the error output. If * it is expected use the 2 steps process. * * @author Bendig LorĂ¡nd <lbendig@ilab.sztaki.hu> * */ public class WeblogParserSource extends AbstractLogFileSource { /** * Logger. */ private static final Logger LOG = Logger.getLogger(WeblogParserSource.class); /** * The log parser factory. */ private LogParserFactory logParserFactory; /** * The log parser object. */ private LogParser logParser; @Override public void init() { // Call parent initializer super.init(); // Create log parser logParser = logParserFactory.getLogParser(); } @Override public Record getRecord() throws NoMoreRecordsException { Record result = new RecordImpl(); //source is prefetched and queried one-by-one String oneData; if (dataSegment == null || dataSegment.isEmpty()) { dataSegment = bf.getDataSegment(); } if (dataSegment.isEmpty()) { throw new NoMoreRecordsException("No more records to read"); } oneData = dataSegment.removeFirst(); if (oneData == null) { throw new NoMoreRecordsException("No more records to read"); } try { logParser.doProcess(result, oneData); } catch (InputMismatchException e) { logParser.LOG.error(e); result = null; } catch (CheckError ex) { LOG.error(ex); result = null; } return result; } @Override public void close() { } public LogParserFactory getLogParserFactory() { return logParserFactory; } public void setLogParserFactory(LogParserFactory logParserFactory) { this.logParserFactory = logParserFactory; } }