001: /* Copyright (c) 2001-2007, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb.util;
032:
033: import java.lang.reflect.InvocationTargetException;
034: import java.lang.reflect.Method;
035: import java.util.ArrayList;
036:
037: /**
038: * Invokes the static main(String[]) method from each class specified.
039: *
040: * This class <b>will System.exit()</b> if any invocation fails.
041: *
042: * @author Blaine Simpson, unsaved@users
043: * @since HSQLDB 1.8.0
044: * @version $Revision: 1.9 $
045: */
046: public class MainInvoker {
047:
048: /*
049: * This class currently consists of just a static utility.
050: * It may or may not make sense to make this into a class with real
051: * instances that can keep track of status of stuff invoked by it.
052: */
053: private static String[] emptyStringArray = new String[0];
054:
055: private static void syntaxFailure() {
056: System.err.println(SYNTAX_MSG);
057: System.exit(2);
058: }
059:
060: /**
061: * Invokes the static main(String[]) method from each specified class.
062: * This method <b>will System.exit()</b> if any invocation fails.
063: *
064: * Note that multiple class invocations are delimited by empty-string
065: * parameters. How the user supplies these empty strings is determined
066: * entirely by the caller's environment. From Windows this can
067: * generally be accomplished with double-quotes like "". From all
068: * popular UNIX shells, this can be accomplished with single or
069: * double-quotes: '' or "".
070: *
071: * @param sa Run java org.hsqldb.util.MainInvoker --help for syntax help
072: */
073: public static void main(String[] sa) {
074:
075: if (sa.length > 0 && sa[0].equals("--help")) {
076: System.err.println(SYNTAX_MSG);
077: System.exit(0);
078: }
079:
080: ArrayList outList = new ArrayList();
081: int curInArg = -1;
082:
083: try {
084: while (++curInArg < sa.length) {
085: if (sa[curInArg].length() < 1) {
086: if (outList.size() < 1) {
087: syntaxFailure();
088: }
089:
090: invoke((String) outList.remove(0),
091: (String[]) outList
092: .toArray(emptyStringArray));
093: outList.clear();
094: } else {
095: outList.add(sa[curInArg]);
096: }
097: }
098:
099: if (outList.size() < 1) {
100: syntaxFailure();
101: }
102:
103: invoke((String) outList.remove(0), (String[]) outList
104: .toArray(emptyStringArray));
105: } catch (Exception e) {
106: e.printStackTrace();
107: System.exit(1);
108: }
109: }
110:
111: public static String LS = System.getProperty("line.separator");
112: private static String SYNTAX_MSG = " java org.hsqldb.util.MainInvoker "
113: + "[package1.Class1 [arg1a arg1b...] \"\"]... \\\n"
114: + " packageX.ClassX [argXa argXb...]\n"
115: + "OR\n"
116: + " java org.hsqldb.util.MainInvoker --help\n\n"
117: + "Note that you can only invoke classes in 'named' (non-default) "
118: + "packages. Delimit multiple classes with empty strings.";
119: static {
120: if (!LS.equals("\n")) {
121: SYNTAX_MSG = SYNTAX_MSG.replaceAll("\n", LS);
122: }
123: }
124:
125: /**
126: * Invokes the static main(String[]) method from each specified class.
127: */
128: public static void invoke(String className, String[] args)
129: throws ClassNotFoundException, NoSuchMethodException,
130: IllegalAccessException, InvocationTargetException {
131:
132: Class c;
133: Method method;
134: Class[] stringArrayCA = { emptyStringArray.getClass() };
135: Object[] objectArray = { (args == null) ? emptyStringArray
136: : args };
137:
138: c = Class.forName(className);
139: method = c.getMethod("main", stringArrayCA);
140:
141: method.invoke(null, objectArray);
142:
143: //System.err.println(c.getName() + ".main() invoked");
144: }
145: }
|