/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.hq.product.logparse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import org.hyperic.hq.product.RtPlugin;
import org.hyperic.hq.product.RtStat;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.oro.text.GlobCompiler;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.Perl5Matcher;
public abstract class BaseLogParser implements LogParseInterface {
protected ArrayList StatusDontLog;
protected ArrayList URLDontLog;
protected double timeMultiplier = 1;
protected Log log;
protected Integer id;
protected int svcType;
abstract public void initConfig(double timeMultiplier, String regex);
public BaseLogParser() {
StatusDontLog = new ArrayList();
URLDontLog = new ArrayList();
log = LogFactory.getLog(BaseLogParser.class);
}
public Hashtable parseLog (String fname, String re, Integer ID,
boolean collectIPs)
throws IOException
{
return parseLog(fname, re, ID, RtPlugin.UNKNOWN, collectIPs);
}
public Hashtable parseLog (String fname, String re, Integer ID,
int svcType, boolean collectIPs)
throws IOException
{
return parseLog(fname, re, 0, ID, collectIPs);
}
public Hashtable parseLog (String fname, String re, long len, Integer ID,
boolean collectIPs)
throws IOException
{
long parsedlen[] = new long[1];
return parseLog(new File(fname), re, len, ID, RtPlugin.UNKNOWN,
parsedlen, collectIPs);
}
public Hashtable parseLog (String fname, String re, long len, Integer ID,
int svcType, long parsedlen[], boolean collectIPs)
throws IOException
{
return parseLog(new File(fname), re, len, ID, svcType, parsedlen,
collectIPs);
}
/**
* @return If collecting IPs, this is a Hashtable
* of "ip:url" -> RtStat summary objects. If not collecting IPs, then
* the keys are just the urls, without the "ip:"
*/
public Hashtable parseLog (File f, String re, long len, Integer ID,
int svcType, long parsedlen[],
boolean collectIPs)
throws IOException
{
GlobCompiler gc = new GlobCompiler();
Perl5Matcher pm = new Perl5Matcher();
Hashtable urls = new Hashtable();
BufferedReader in = new BufferedReader(new FileReader(f));
in.skip(len);
String currentLine;
this.id = ID;
this.svcType = svcType;
initConfig(timeMultiplier, re);
while ( (currentLine = in.readLine ()) != null)
{
RtStat curr = parseLine(currentLine);
if (curr == null) {
continue;
}
if (!collectIPs) curr.resetIp();
boolean logit = true;
for (Iterator it = URLDontLog.iterator(); it.hasNext(); ) {
String current = (String)it.next();
try {
Pattern pa = gc.compile(current);
if (pm.matches(curr.getUrl(), pa)) {
logit = false;
break;
}
} catch (MalformedPatternException e) {
this.log.error("Invalid regular expression: " +
current);
continue;
}
}
/* We know that there will only be a single status in the
* curr.status hashtable, because we have only parsed a single
* line. So, find that status so that we can determine if we
* should keep this or not.
*/
Enumeration e = curr.getStatus().keys();
Integer stat;
if (e.hasMoreElements()) {
stat = (Integer)e.nextElement();
}
else {
stat = new Integer(200);
}
String ipUrlKey = curr.getIpUrlKey();
if (!StatusDontLog.contains(stat) && logit) {
// Determine if we have already found this URL
RtStat found = (RtStat) urls.get(ipUrlKey);
if (found == null) {
found = curr;
}
else {
found.recompute(curr);
}
urls.put(ipUrlKey, found);
}
}
in.close ();
postFileParse(f);
parsedlen[0] = f.length();
return urls;
}
public void setTimeMultiplier(double mult)
{
timeMultiplier = mult;
}
public double getTimeMultiplier()
{
return timeMultiplier;
}
public void DontLog(Long stat)
{
StatusDontLog.add(stat);
}
public void DontLog(String url)
{
URLDontLog.add(url);
}
public void urlDontLog(ArrayList urls)
{
URLDontLog = urls;
}
public void postFileParse(File f)
throws IOException
{
}
}