001: /*
002: * @(#)PlainLauncher.java 1.4 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package lvmtest;
029:
030: import java.lang.reflect.Method;
031: import java.lang.reflect.InvocationTargetException;
032:
033: public class PlainLauncher {
034:
035: private static final String[] usageMessage = {
036: "",
037: "usage: <cvm> PlainLauncher [[num-lvm [intrl-msec]] "
038: + "MainClass [args...]", "",
039: " ex: <cvm> PlainLauncher 5 1000 HelloWorld", "", };
040:
041: private static final int DefaultLVMNum = 3;
042: private static final int DefaultIntvlMSec = -1;
043: private static final int DefaultTimeOut = -1;
044:
045: public static void main(String[] args) {
046:
047: int lvmNum = DefaultLVMNum;
048: int intvlMSec = DefaultIntvlMSec;
049: int timeOut = DefaultTimeOut;
050: int argp = 0;
051:
052: try {
053: lvmNum = Integer.valueOf(args[argp]).intValue();
054: argp++;
055: intvlMSec = Integer.valueOf(args[argp]).intValue();
056: argp++;
057: timeOut = Integer.valueOf(args[argp]).intValue();
058: argp++;
059: } catch (NumberFormatException e) {
060: /* Non-number argument encountered. Keep going */
061: } catch (ArrayIndexOutOfBoundsException e) {
062: /* There should be at least one non-number argument */
063: printUsage();
064: System.exit(-1);
065: }
066:
067: if (lvmNum <= 0 || args.length <= argp) {
068: printUsage();
069: System.exit(-1);
070: }
071:
072: String className = args[argp++];
073:
074: String[] as = new String[args.length - argp];
075: for (int i = 0; i < args.length - argp; i++) {
076: as[i] = args[argp + i];
077: }
078:
079: for (int i = 0; i < lvmNum; i++) {
080: String lvmName = "#" + (i + 1);
081: System.out.println("*** Starting Plain launcher " + lvmName
082: + ": " + className);
083:
084: Launcher la = new Launcher(className, as, lvmName);
085: la.start();
086:
087: if (intvlMSec >= 0) {
088: try {
089: Thread.sleep(intvlMSec);
090: } catch (InterruptedException e) {
091: System.err.println("Exception caught in sleep(): "
092: + e);
093: }
094: }
095: }
096:
097: if (timeOut >= 0) {
098: System.out.println("*** Time-out " + timeOut
099: + " is ignored");
100: }
101: }
102:
103: private static class Launcher extends Thread {
104: private String className;
105: private String[] args;
106: private String name;
107:
108: Launcher(String cn, String[] as, String n) {
109: className = cn;
110: args = as;
111: name = n;
112: }
113:
114: public void run() {
115: try {
116: Class cls = Class.forName(className);
117: Class[] argClses = { String[].class };
118: Method mainMethod = cls.getMethod("main", argClses);
119: Object[] argObjs = { args };
120: mainMethod.invoke(null, argObjs);
121: } catch (InvocationTargetException ite) {
122: ite.getTargetException().printStackTrace();
123: } catch (Exception e) {
124: e.printStackTrace();
125: }
126: }
127: }
128:
129: private static void printUsage() {
130: for (int i = 0; i < usageMessage.length; i++) {
131: System.err.println(usageMessage[i]);
132: }
133: }
134: }
|