org.aksw.xoperator.Agent.java Source code

Java tutorial

Introduction

Here is the source code for org.aksw.xoperator.Agent.java

Source

/*
 * 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);
        }

    }
}