/**
*
* The KTLuceneServer main().
*
* @license
*
*/
package com.knowledgetree.lucene;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.WebServer;
import com.knowledgetree.indexer.IndexerManager;
//import com.knowledgetree.openoffice.KTConverter;
public class KTLuceneServer {
public static WebServer webServer;
private static KTLuceneServer luceneServer;
public static final String KnowledgeTreeLoggingProperties = "KnowledgeTreeIndexer.Logging.properties";
private Logger logger;
private int port = 8875;
private boolean paranoid = true;
private String clientIps = "127.0.0.1,192.168.1.1";
private String propertiesFilename = "KnowledgeTreeIndexer.properties";
private String authenticationToken = "";
public static void main(String[] args) throws Exception
{
// load properties from configuration file
PropertyConfigurator.configure(KTLuceneServer.KnowledgeTreeLoggingProperties);
KTLuceneServer manager = KTLuceneServer.get();
// setup the basic web server
webServer = new WebServer(manager.getPort());
// check for paranoid settings - if the xmlrpc server should only allow connections from certain IPs
if (manager.isParanoid())
{
manager.getLogger().info("Server in paranoid mode!");
webServer.setParanoid(true);
String [] allow = manager.getAcceptableIps();
for(int i=0;i<allow.length;i++)
{
String ip = allow[i];
manager.getLogger().info("\tAccepting connections from: " + ip);
webServer.acceptClient(ip);
}
}
else
{
manager.getLogger().info("Server trusting everyone!");
}
// Get the indexing manager and set up the indexing parameters
IndexerManager indexer = IndexerManager.get();
// setup the xmlrpc server
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
PropertyHandlerMapping phm = new PropertyHandlerMapping();
/* Start-up the services */
phm.addHandler("indexer", com.knowledgetree.indexer.IndexerInterface.class);
phm.addHandler("textextraction", com.knowledgetree.textextraction.KTTextExtractorInterface.class);
phm.addHandler("metadata",com.knowledgetree.metadata.KTMetaDataInterface.class);
phm.addHandler("openoffice",com.knowledgetree.openoffice.KTConverterInterface.class);
phm.addHandler("control", com.knowledgetree.lucene.KTLuceneServerInterface.class);
xmlRpcServer.setHandlerMapping(phm);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
manager.getLogger().info("Starting web server on port: " + manager.getPort());
// start the server finally!
webServer.start();
}
public KTLuceneServer() {
this.logger = Logger.getLogger("com.knowledgetree");
this.logger.info("XML-RPC Server starting up...");
// load properties
this.logger.info("Loading properties file: " + this.propertiesFilename);
Properties properties = new Properties();
try
{
FileInputStream in = new FileInputStream(this.propertiesFilename);
properties.load(in);
in.close();
}
catch(Exception ex)
{
this.logger.error("Problem loading properties: " + ex.getMessage());
this.logger.error("Shutting down");
System.exit(1);
}
// get the default parameters
this.port = Integer.parseInt(properties.getProperty("server.port", Integer.toString(this.port)));
//this.threadDelay = Integer.parseInt(properties.getProperty("thread.delay", Integer.toString(this.threadDelay)));
this.paranoid = Boolean.parseBoolean(properties.getProperty("server.paranoid", Boolean.toString(this.paranoid)));
this.clientIps = properties.getProperty("server.accept", clientIps);
this.authenticationToken = properties.getProperty("auth.token", this.authenticationToken);
}
public static KTLuceneServer get() {
if(KTLuceneServer.luceneServer == null) {
KTLuceneServer.luceneServer = new KTLuceneServer();
}
return KTLuceneServer.luceneServer;
}
public boolean authenticate(String token) {
// TODO: THIS IS REALLY PRIMITIVE!!!! WE SHOULD MD5
return this.authenticationToken.equals(token);
}
public Logger getLogger() {
return this.logger;
}
public int getPort() { return port; }
public boolean isParanoid() { return paranoid; }
public String[] getAcceptableIps() { return clientIps.split(","); }
/**
* Shut the webserver down.
*
*/
public void shutdown()
{
this.logger.info("Shutting down...");
KTLuceneServer.webServer.shutdown();
}
}