blob: ee21042159996591efd3f3860537a9ab1789cc14 [file]
/*
+-----------------------------------------------------------------------------+
| ILIAS open source |
+-----------------------------------------------------------------------------+
| Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
| |
| 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 2 |
| 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, write to the Free Software |
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
+-----------------------------------------------------------------------------+
*/
package de.ilias;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;
import de.ilias.services.rpc.RPCServer;
import de.ilias.services.settings.ClientSettings;
import de.ilias.services.settings.ConfigurationException;
import de.ilias.services.settings.IniFileParser;
import de.ilias.services.settings.ServerSettings;
/**
*
*
* @author Stefan Meyer <smeyer.ilias@gmx.de>
* @version $Id$
*/
public class ilServer {
private String version = "4.4.0.1";
private String[] arguments;
private String command;
private static final Logger logger = Logger.getLogger(ilServer.class);
/**
* @param args
*/
public ilServer(String[] args) {
arguments = args;
}
/**
* @param args
*/
public static void main(String[] args) {
ilServer server = null;
BasicConfigurator.configure();
logger.setLevel(Level.INFO);
Logger root = Logger.getLogger("org");
root.setLevel(Level.OFF);
server = new ilServer(args);
server.handleRequest();
}
/**
* @return success status
*/
private boolean handleRequest() {
if(arguments.length < 1) {
logger.error(getUsage());
return false;
}
if(arguments.length == 1) {
command = arguments[0];
if(command.compareTo("version") == 0) {
System.out.println("ILIAS java server version \"" + version + "\"");
return true;
}
}
command = arguments[1];
if(command.compareTo("start") == 0) {
if(arguments.length != 2) {
logger.error("Usage: java -jar ilServer.jar PATH_TO_SERVER_INI start");
return false;
}
return startServer();
}
else if(command.compareTo("stop") == 0) {
if(arguments.length != 2) {
logger.error("Usage: java -jar ilServer.jar PATH_TO_SERVER_INI stop");
return false;
}
return stopServer();
}
else if(command.compareTo("createIndex") == 0) {
if(arguments.length != 3) {
logger.error("Usage java -jar ilServer.jar PATH_TO_SERVER_INI createIndex CLIENT_KEY");
return false;
}
return createIndexer();
}
else if(command.compareTo("updateIndex") == 0) {
if(arguments.length < 3) {
logger.error("Usage java -jar ilServer.jar PATH_TO_SERVER_INI updateIndex CLIENT_KEY");
return false;
}
return updateIndexer();
}
else if(command.compareTo("search") == 0) {
if(arguments.length != 4) {
logger.error("Usage java -jar ilServer.jar PATH_TO_SERVER_INI CLIENT_KEY search QUERY_STRING");
return false;
}
return startSearch();
}
else if(command.compareTo("status") == 0) {
if(arguments.length != 2) {
logger.error("Usage java -jar ilServer.jar PATH_TO_SERVER_INI status");
return false;
}
return getStatus();
}
else {
logger.error(getUsage());
return false;
}
}
/**
* @return
*/
@SuppressWarnings("unchecked")
private boolean createIndexer() {
XmlRpcClient client;
IniFileParser parser;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],true);
if(!ClientSettings.exists(arguments[2])) {
throw new ConfigurationException("Unknown client given: " + arguments[2]);
}
client = initRpcClient();
Vector params = new Vector();
params.add(arguments[2]);
params.add(false);
client.execute("RPCIndexHandler.index",params);
return true;
}
catch (Exception e) {
System.err.println(e);
logger.fatal(e.getMessage());
System.exit(1);
}
return false;
}
/**
* @return
*/
@SuppressWarnings("unchecked")
private boolean updateIndexer() {
XmlRpcClient client;
IniFileParser parser;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],true);
if(!ClientSettings.exists(arguments[2])) {
throw new ConfigurationException("Unknown client given: " + arguments[2]);
}
client = initRpcClient();
Vector params = new Vector();
params.add(arguments[2]);
params.add(true);
client.execute("RPCIndexHandler.index",params);
return true;
}
catch (Exception e) {
System.err.println(e);
logger.fatal(e.getMessage());
System.exit(1);
}
return false;
}
/**
* @return
*/
@SuppressWarnings("unchecked")
private boolean startSearch() {
XmlRpcClient client;
IniFileParser parser;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],true);
if(!ClientSettings.exists(arguments[2])) {
throw new ConfigurationException("Unknown client given: " + arguments[2]);
}
client = initRpcClient();
Vector params = new Vector();
params.add(arguments[2]);
params.add(arguments[3]);
params.add(1);
String response = (String) client.execute("RPCSearchHandler.search",params);
System.out.println(response);
return true;
}
catch (Exception e) {
System.err.println(e);
logger.fatal(e.getMessage());
System.exit(1);
}
return false;
}
/**
* Start RPC services
*/
private boolean startServer() {
ServerSettings settings;
RPCServer rpc;
XmlRpcClient client;
IniFileParser parser;
String status;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],true);
client = initRpcClient();
// Check if server is already running
try {
status = (String) client.execute("RPCAdministration.status",new Vector());
System.err.println("Server already started. Aborting");
System.exit(1);
}
catch(XmlRpcException e) {
logger.info("No server running. Starting new instance...");
}
settings = ServerSettings.getInstance();
logger.info("New rpc server");
rpc = RPCServer.getInstance(settings.getHost(),settings.getPort());
logger.info("Server start");
rpc.start();
client = initRpcClient();
client.execute("RPCAdministration.start",new Vector());
// Check if webserver is alive
// otherwise stop execution
while(true) {
Thread.sleep(3000);
if(!rpc.isAlive()) {
rpc.shutdown();
break;
}
}
logger.info("WebServer shutdown. Aborting...");
return true;
}
catch (ConfigurationException e) {
//logger.error(e);
System.exit(1);
return false;
}
catch (InterruptedException e) {
logger.error("VM did not allow to sleep. Aborting!");
}
catch (XmlRpcException e) {
System.out.println("Error starting server: " + e);
System.exit(1);
}
catch (IOException e) {
logger.error("IOException " + e.getMessage());
}
catch (Exception e) {
logger.error("IOException " + e.getMessage());
}
catch(Throwable e) {
logger.error("IOException " + e.getMessage());
}
return false;
}
/**
* Call RPC stop method, which will stop the WebServer
* and after that stop the execution of the main thread
*
*/
@SuppressWarnings("unchecked")
private boolean stopServer() {
XmlRpcClient client;
IniFileParser parser;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],false);
client = initRpcClient();
client.execute("RPCAdministration.stop",new Vector());
return true;
}
catch (ConfigurationException e) {
logger.error("Configuration " + e.getMessage());
}
catch (XmlRpcException e) {
logger.error("XMLRPC " + e.getMessage());
}
catch (IOException e) {
logger.error("IOException " + e.getMessage());
}
return false;
}
@SuppressWarnings("unchecked")
private boolean getStatus() {
XmlRpcClient client;
IniFileParser parser;
ServerSettings settings;
String status;
try {
parser = new IniFileParser();
parser.parseServerSettings(arguments[0],false);
settings = ServerSettings.getInstance();
client = initRpcClient();
status = (String) client.execute("RPCAdministration.status",new Vector());
System.out.println(status);
return true;
}
catch (ConfigurationException e) {
logger.error("Configuration " + e.getMessage());
}
catch (XmlRpcException e) {
System.out.println(ilServerStatus.STOPPED);
System.exit(1);
}
catch (IOException e) {
System.out.println(ilServerStatus.STOPPED);
System.exit(1);
}
return false;
}
/**
*
* @return String usage
*/
private String getUsage() {
return "Usage: java -jar ilServer.jar PATH_TO_SERVER_INI start|stop|createIndex|updateIndex|search PARAMS";
}
/**
*
* @return XmlRpcClient
* @throws ConfigurationException
* @throws MalformedURLException
*/
private XmlRpcClient initRpcClient() throws ConfigurationException, MalformedURLException
{
XmlRpcClient client;
XmlRpcClientConfigImpl config;
ServerSettings settings;
settings = ServerSettings.getInstance();
config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL(settings.getServerUrl()));
config.setConnectionTimeout(10000);
config.setReplyTimeout(0);
client = new XmlRpcClient();
client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
client.setConfig(config);
return client;
}
}