package nl.ipo.cds.nagios.harvester; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import nl.ipo.cds.nagios.ast.HostStatusNode; import nl.ipo.cds.nagios.ast.ObjectNode; import nl.ipo.cds.nagios.ast.ServiceStatusNode; import nl.ipo.cds.nagios.config.NagiosStatusConfiguration; import nl.ipo.cds.nagios.parser.Lexer; import nl.ipo.cds.nagios.parser.LexerContext; import nl.ipo.cds.nagios.parser.Parser; import nl.ipo.cds.nagios.parser.ParserContext; public class Harvester { private NagiosStatusConfiguration configuration; private LexerContext lexerContext; private ParserContext parserContext; private static final Log log = LogFactory.getLog (Harvester.class); public Harvester (final NagiosStatusConfiguration configuration) { this.configuration = configuration; lexerContext = new LexerContext (configuration.getLocation ().getPath ()); parserContext = new ParserContext() { @Override public void reportError(int line, int column, String message) { logError (configuration.getLocation ().getPath (), line, column, message); } @Override public String getFilename() { return configuration.getLocation ().getPath (); } }; } public void harvest (final HarvesterListener harvesterListener) { harvest (harvesterListener, null); } protected void harvest (final HarvesterListener harvesterListener, final InputStream is) { try { final InputStream inputStream = is != null ? is : new FileInputStream (configuration.getLocation ()); final InputStreamReader reader = new InputStreamReader (inputStream, configuration.getCharset ()); final Parser parser = new Parser(parserContext, new Lexer (lexerContext, reader)); for (final ObjectNode node: parser) { if (node instanceof ServiceStatusNode) { final ServiceStatusNode status = (ServiceStatusNode)node; if (configuration.getHosts ().contains (status.getHostName ()) && configuration.getServices().contains (status.getServiceDescription ())) { harvesterListener.putStatus ((ServiceStatusNode)node); } } else if (node instanceof HostStatusNode) { final HostStatusNode status = (HostStatusNode)node; if (configuration.getHosts ().contains (status.getHostName ())) { harvesterListener.putStatus ((HostStatusNode)node); } } } } catch (FileNotFoundException e) { logError (configuration.getLocation ().getPath (), 0, 0, "File not found"); } } private void logError (final String filename, final int line, final int column, String message) { log.error (String.format ("%s:%d,%d: %s", filename, line, column, message)); } }