package net.jforum.util.legacy.clickstream.config;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import net.jforum.util.preferences.ConfigKeys;
import net.jforum.util.preferences.SystemGlobals;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*Loads clickstream.xml for JForum.
*
* @author <a href="plightbo@hotmail.com">Patrick Lightbody</a>
* @author Rafael Steil (little hacks for JForum)
* @version $Id: ConfigLoader.java,v 1.6 2005/12/18 02:12:52 rafaelsteil Exp $
*/
public class ConfigLoader
{
private static final Logger log = Logger.getLogger(ConfigLoader.class);
private ClickstreamConfig config;
private static ConfigLoader instance = new ConfigLoader();;
public static ConfigLoader instance()
{
return instance;
}
private ConfigLoader() {}
public ClickstreamConfig getConfig()
{
if (this.config != null) {
return this.config;
}
synchronized (instance) {
this.config = new ClickstreamConfig();
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
String path = SystemGlobals.getValue(ConfigKeys.CLICKSTREAM_CONFIG);
if (path != null) {
if (log.isInfoEnabled()) {
log.info("Loading clickstream config from " + path);
}
File fileInput = new File(path);
if (fileInput.exists()) {
parser.parse(fileInput, new ConfigHandler());
}
else {
parser.parse(new InputSource(path), new ConfigHandler());
}
}
return config;
}
catch (SAXException e) {
log.error("Could not parse clickstream XML", e);
throw new RuntimeException(e.getMessage());
}
catch (IOException e) {
log.error("Could not read clickstream config from stream", e);
throw new RuntimeException(e.getMessage());
}
catch (ParserConfigurationException e) {
log.fatal("Could not obtain SAX parser", e);
throw new RuntimeException(e.getMessage());
}
catch (RuntimeException e) {
log.fatal("RuntimeException", e);
throw e;
}
catch (Throwable e) {
log.fatal("Exception", e);
throw new RuntimeException(e.getMessage());
}
}
}
/**
* SAX Handler implementation for handling tags in config file and building config objects.
*/
private class ConfigHandler extends DefaultHandler
{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if (qName.equals("bot-host")) {
config.addBotHost(attributes.getValue("name"));
}
else if (qName.equals("bot-agent")) {
config.addBotAgent(attributes.getValue("name"));
}
}
}
}