/*
* Created on 25.10.2003
*
*/
package alma.acs.commandcenter;
import java.awt.Rectangle;
import java.io.File;
import java.io.PrintStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import alma.acs.commandcenter.app.CommandCenterLogic;
import alma.acs.commandcenter.app.CommandCenterLogic.StartupOptions;
import alma.acs.commandcenter.util.MiscUtils;
/**
* Launches AcsCommandCenter.
*
* @author mschilli
*
*/
public class CommandCenter {
private static Logger log = MiscUtils.getPackageLogger(CommandCenter.class);
private static CommandCenterLogic commandCenterLogic;
public static void main(String[] args) {
// --- tweak console log format when started from command line
for (Handler h: Logger.getLogger("").getHandlers()) {
if (h instanceof ConsoleHandler) {
h.setFormatter(new Formatter(){
DateFormat df = new SimpleDateFormat("HH:mm:ss ");
@Override public String format (LogRecord record) {
String s = df.format(new Date(record.getMillis()));
s += record.getMessage() + "\n";
return s;
}
});
}
}
// --- parse the command line
StartupOptions startupOptions = new StartupOptions();
for (int i=0; i<args.length; i++) {
if (i==0 && equalsOneOf(args[i], new String[]{"-h", "-help", "--help"})) {
printUsage(System.out);
return;
}
try {
if (equalsOneOf(args[i], new String[]{"-r", "-retrieve", "--retrieve"})) {
startupOptions.project = new File(args[++i]);
continue;
}
if (equalsOneOf(args[i], new String[]{"-g", "-geometry", "--geometry"})) {
StringTokenizer toky = new StringTokenizer(args[++i], "x+");
int w = Integer.parseInt(toky.nextToken());
int h = Integer.parseInt(toky.nextToken());
int x = Integer.parseInt(toky.nextToken());
int y = Integer.parseInt(toky.nextToken());
startupOptions.geometry = new Rectangle(x, y, w, h);
continue;
}
if (equalsOneOf(args[i], new String[]{"-x", "-noexit", "--noexit"})) {
startupOptions.doExitOnClose = false;
continue;
}
if (equalsOneOf(args[i], new String[]{"-useNativeSSH", "--useNativeSSH"})) {
log.warning("command line option '-useNativeSSH' no longer supported.");
continue;
}
if (equalsOneOf(args[i], new String[]{"-killNativeSSH", "--killNativeSSH"})) {
log.warning("command line option '-killNativeSSH' no longer supported.");
continue;
}
// msc (Oct 24, 2005): stand-alone argument should be considered a project name
// msc (Apr 28, 2006): alternatively it could be a manager location
String standalone = args[i];
if (standalone.length()>8 && standalone.substring(0, 8).equalsIgnoreCase("corbaloc")) {
startupOptions.manager = standalone;
continue;
}
String mgrArg = MiscUtils.convertShortNotationToCorbaloc(standalone);
if (mgrArg != null) {
startupOptions.manager = mgrArg;
continue;
}
startupOptions.project = new File(standalone);
} catch (Exception exc) { // ArrayIndexOutOfBounds, NumberFormat, ...
startupOptions = new StartupOptions();
log.warning("command line argument(s) invalid, some arguments may be ignored: "+Arrays.asList(args));
printUsage(System.err);
}
}
// --- instantiate appropriate logic
commandCenterLogic = new CommandCenterLogic();
commandCenterLogic.prepare(startupOptions);
if (startupOptions.project != null) {
commandCenterLogic.loadProject(startupOptions.project);
}
commandCenterLogic.go();
}
/**
* Whether <code>a</code> equals one of the elements of <code>b</code>.
* Comparison is case-INsensitive.
*/
private static boolean equalsOneOf(String a, String[] bb) {
for (int i=0; i < bb.length; i++)
if (bb[i].equalsIgnoreCase(a))
return true;
return false;
}
private static void printUsage(PrintStream s) {
String msg = "" +
"Usage: (this) [ARGUMENTS] [OPTIONS]\n" +
"Arguments:\n" +
" CORBALOC instantly connect to existing Acs\n" +
" HOST:INSTANCE instantly connect to existing Acs\n" +
" PROJ load a project file on startup\n" +
"Options:\n" +
" -r | -retrieve | --retrieve PROJ load a project file on startup\n" +
" -g | -geometry | --geometry WIDTHxHEIGHT+XPOS+YPOS size and location of window\n" +
" -x | -noexit | --noexit don't exit the JVM when quitting\n";
s.println(msg);
}
//
//
// =============================
//
public static void dbg_printProps(Properties p) {
dbg_printProps(p, System.err);
}
public static void dbg_printProps(Properties p, String filesuffix) {
PrintStream s = null;
try {
java.io.File f = java.io.File.createTempFile(filesuffix, ".tmp");
s = new java.io.PrintStream(new java.io.FileOutputStream(f));
System.err.println("CommandCenter.dbg_printProps: writing props to "+f.getAbsolutePath());
}catch (java.io.IOException exc) {
System.err.println("CommandCenter.dbg_printProps: could not open print stream to a tmp file; writing to stderr");
s = System.err;
}
dbg_printProps(p, s);
s.close();
}
@SuppressWarnings("rawtypes")
public static void dbg_printProps(Properties p, PrintStream s) {
Set<Map.Entry<Object, Object>> e1 = p.entrySet();
Map.Entry[] e2 = e1.toArray(new Map.Entry[e1.size()]);
Comparator<Map.Entry> c = new Comparator<Map.Entry>() {
public int compare(Map.Entry a, Map.Entry b) {
return ((String)a.getKey()).compareTo((String)b.getKey());
}
};
Arrays.sort(e2, c);
s.println("------------ (time now is: "+System.currentTimeMillis()+")");
for (int i=0; i<e2.length; i++) {
Map.Entry next = (Map.Entry)e2[i];
s.println(next.getKey()+"="+next.getValue());
}
s.println("------------");
s.flush();
}
}