/*
* Copyright 2003-2006 Rick Knowles <winstone-devel at lists sourceforge net>
* Distributed under the terms of either:
* - the common development and distribution license (CDDL), v1.0; or
* - the GNU Lesser General Public License, v2.1 or later
*/
package winstone.tools;
import winstone.Launcher;
import winstone.Logger;
import winstone.WinstoneResourceBundle;
import winstone.cmdline.CmdLineParser;
import winstone.cmdline.Option;
import winstone.cmdline.Option.OInt;
import winstone.cmdline.Option.OString;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Map;
/**
* Included so that we can control winstone from the command line a little more
* easily.
*
* @author <a href="mailto:rick_knowles@hotmail.com">Rick Knowles</a>
* @version $Id: WinstoneControl.java,v 1.6 2006/03/13 15:37:29 rickknowles Exp $
*/
public class WinstoneControl {
private final static WinstoneResourceBundle TOOLS_RESOURCES = new WinstoneResourceBundle("winstone.tools.LocalStrings");
final static String OPERATION_SHUTDOWN = "shutdown";
final static String OPERATION_RELOAD = "reload:";
static int TIMEOUT = 10000;
public static OInt CONTROL_PORT = Option.integer("controlPort");
public static OInt PORT = Option.integer("port");
public static OInt DEBUG = new OInt("debug", 5) {
public int get(Map args) {
switch(super.get(args)) {
// before switching to java.util.Logging, winstone used a (1:9) range for log levels
case 1: return Logger.MIN.intValue();
case 2: return Logger.ERROR.intValue();
case 3: return Logger.WARNING.intValue();
case 4: return Logger.INFO.intValue();
case 6: return Logger.SPEED.intValue();
case 7: return Logger.DEBUG.intValue();
case 8: return Logger.FULL_DEBUG.intValue();
case 9: return Logger.MAX.intValue();
case 5:
default: return Logger.INFO.intValue();
}}};
public static OString HOST = Option.string("host", "localhost");
/**
* Parses command line parameters, and calls the appropriate method for
* executing the winstone operation required.
*/
public static void main(String argv[]) throws Exception {
// Load args from the config file
Map options = new CmdLineParser(Option.all(WinstoneControl.class)).parse(argv,"operation");
String operation = (String) options.get("operation");
if (operation.equals("")) {
printUsage();
return;
}
Logger.setCurrentDebugLevel(DEBUG.get(options));
String host = HOST.get(options);
int port = PORT.get(options, CONTROL_PORT.get(options));
Logger.log(Logger.INFO, TOOLS_RESOURCES, "WinstoneControl.UsingHostPort",host, port);
// Check for shutdown
if (operation.equalsIgnoreCase(OPERATION_SHUTDOWN)) {
Socket socket = new Socket(host, port);
socket.setSoTimeout(TIMEOUT);
OutputStream out = socket.getOutputStream();
out.write(Launcher.SHUTDOWN_TYPE);
out.close();
Logger.log(Logger.INFO, TOOLS_RESOURCES, "WinstoneControl.ShutdownOK",host, port);
}
// check for reload
else if (operation.toLowerCase().startsWith(OPERATION_RELOAD.toLowerCase())) {
String webappName = operation.substring(OPERATION_RELOAD.length());
Socket socket = new Socket(host, port);
socket.setSoTimeout(TIMEOUT);
OutputStream out = socket.getOutputStream();
out.write(Launcher.RELOAD_TYPE);
ObjectOutputStream objOut = new ObjectOutputStream(out);
objOut.writeUTF(host);
objOut.writeUTF(webappName);
objOut.close();
out.close();
Logger.log(Logger.INFO, TOOLS_RESOURCES, "WinstoneControl.ReloadOK",host, port);
}
else {
printUsage();
}
}
/**
* Displays the usage message
*/
private static void printUsage() {
System.out.println(TOOLS_RESOURCES.getString("WinstoneControl.Usage"));
}
}