/*
* This file is part of the xOperator SPARQL/XMPP agent.
* For further information see: http://xoperator.aksw.org
* Copyright (C) 2007-2008 Jrg Unbehauen
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* 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, see <http://www.gnu.org/licenses/>.
*/
package org.aksw.xoperator;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.aksw.xoperator.aiml.AimlFacade;
import org.aksw.xoperator.aiml.AliceBotFactory;
import org.aksw.xoperator.aiml.ExternalListener;
import org.aksw.xoperator.aiml.ExternalListenerGroovy;
import org.aksw.xoperator.command.Command;
import org.aksw.xoperator.command.QueryCommand;
import org.aksw.xoperator.conf.AgentConfiguration;
import org.aksw.xoperator.conf.ConfigurationSerializer;
import org.aksw.xoperator.roster.RosterManager;
import org.aksw.xoperator.security.SimpleSecurityProvider;
import org.aksw.xoperator.sparql.SparqlEndpointFacade;
import org.aksw.xoperator.sparql.http.RemoteSparqlEndpoint;
import org.aksw.xoperator.sparql.local.LocalSparqlEndpoint;
import org.aksw.xoperator.sparql.p2p.P2PFacade;
import org.aksw.xoperator.transform.SimpleXslTransformer;
import org.aksw.xoperator.xmpp.JabberClientManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.Parameter;
import org.picocontainer.behaviors.Caching;
import org.picocontainer.parameters.BasicComponentParameter;
import org.picocontainer.parameters.ComponentParameter;
/**
* This class ties the components of the agent together and starts them.
*
* @author joerg
*/
public class Agent {
private MutablePicoContainer container = new DefaultPicoContainer(new Caching());
private Log log = LogFactory.getLog(Agent.class);
private String confDir = "./conf";
public Agent() {
super();
}
public Agent(String confDir) {
super();
this.confDir = confDir;
}
/**
* Starts the components, that need starting. For example the agent will log into the netork.
*/
public void start() {
try{
validateConf();
registerComponents(container);
registerCommands(container);
container.getComponents();
container.start();
} catch (Exception e){
log.error("Exception caught:",e);
}
}
private void registerCommands(MutablePicoContainer container2) {
//List<Class> commands = new ArrayList();
//commands.add(new QueryCommand);
container.addComponent(QueryCommand.class);
}
private void registerComponents(MutablePicoContainer container) {
container.addComponent(Controller.class, Controller.class,
new Parameter[] {
new ComponentParameter(Command.class, false),
new BasicComponentParameter(), new BasicComponentParameter(),
new BasicComponentParameter(),new BasicComponentParameter()
});
container.addComponent(loadConfigurations());
container.addComponent(JabberClientManager.class);
container.addComponent(SparqlEndpointFacade.class);
container.addComponent(SimpleXslTransformer.class);
container.addComponent(AimlFacade.class);
container.addComponent(ExternalListenerGroovy.class);
container.addComponent(SimpleSecurityProvider.class);
container.addComponent(AliceBotFactory.class, AliceBotFactory.class,
new Parameter[] {
new BasicComponentParameter(),
new ComponentParameter(ExternalListener.class, false)
});
container.addComponent(LocalSparqlEndpoint.class);
container.addComponent(RemoteSparqlEndpoint.class);
container.addComponent(RosterManager.class);
container.addComponent(P2PFacade.class);
container.addComponent(new ThreadPoolExecutor(5, 10, 60,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100)));
}
private AgentConfiguration loadConfigurations() {
File confDirFile = new File(confDir);
log.info("Loading configuration from: " + confDirFile.getAbsolutePath());
ConfigurationSerializer confSer = new ConfigurationSerializer(confDirFile.getAbsolutePath());
return confSer.load();
}
/**
* main method for starting from the command line.
*
* @param args The first String can be the location of a the config file.
*/
public static void main(String[] args) {
Agent agent;
if ((args.length > 0) && !args[0].isEmpty()) {
agent = new Agent(args[0]);
} else {
agent = new Agent();
}
agent.start();
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* simple check if the conf folder is valid
*/
private void validateConf(){
File agentConfFile = new File(confDir+File.separator+"agent.conf.xml");
if (agentConfFile.exists()){
log.warn("Starting the Agent, loading config data from: " + confDir);
log.info("Absoulte path of conf dir is: " + new File(confDir).getAbsolutePath());
}else{
log.error("No configuration found in: " + confDir);
System.exit(0);
}
}
}
|