/*
* 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.plugin.coldfusion;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.Collector;
import org.hyperic.hq.product.ProductPlugin;
import org.hyperic.sigar.FileInfo;
import org.hyperic.sigar.FileTail;
import org.hyperic.sigar.FileWatcherThread;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
public class ColdfusionCollector extends Collector
{
private List myLines = new ArrayList();
private String myStatsFile;
private FileTail myWatcher;
private BufferedReader myReader;
private static Log myLog = LogFactory.getLog(ColdfusionCollector.class);
private static final Pattern LINE_PATTERN =
Pattern.compile("\\w+=\\d+\\.?(\\d+)?");
private static final Pattern NAMEVAL_PATTERN =
Pattern.compile("^\\w+=\\d+\\.?(\\d+)?$");
protected void init()
{
try
{
Properties props = getProperties();
//read 1st line of filename and create a List or String[]
//of the field names
myStatsFile = props.getProperty(ProductPlugin.PROP_INSTALLPATH) + "/" +
props.getProperty("logfile");
myWatcher = getWatcher();
FileWatcherThread.getInstance().add(myWatcher);
FileWatcherThread.getInstance().doStart();
myWatcher.add(myStatsFile);
}
catch (SigarException e) {
myLog.error(e.getMessage(), e);
}
finally
{
try {
if (myReader != null) myReader.close();
}
catch (IOException e) {
myLog.error(e.getMessage(), e);
}
}
}
private FileTail getWatcher()
{
return new FileTail(new Sigar())
{
public void tail(FileInfo info, Reader reader)
{
String line;
BufferedReader buffer = new BufferedReader(reader);
try
{
synchronized(myLines) {
while ((line = buffer.readLine()) != null)
myLines.add(line);
}
}
catch (IOException e) {
myLog.error(e.getMessage(), e);
}
}
};
}
public void collect()
{
try
{
synchronized(myLines)
{
for (Iterator i=myLines.iterator(); i.hasNext(); )
{
String line = (String)i.next();
if (!LINE_PATTERN.matcher(line).find())
continue;
String[] tokens = line.split("\\s+");
for (int j=0; j<tokens.length; j++)
{
if (!NAMEVAL_PATTERN.matcher(tokens[j]).find())
continue;
String[] tmp = tokens[j].split("=");
myLog.debug("alias -> "+tmp[0]+", value -> "+tmp[1]);
setValue(tmp[0], tmp[1]);
}
}
}
}
finally
{
synchronized(myLines) {
myLines.clear();
}
}
}
}