001: /*
002: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License version
007: * 2 only, as published by the Free Software Foundation.
008: *
009: * This program is distributed in the hope that it will be useful, but
010: * WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * General Public License version 2 for more details (a copy is
013: * included at /legal/license.txt).
014: *
015: * You should have received a copy of the GNU General Public License
016: * version 2 along with this work; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
018: * 02110-1301 USA
019: *
020: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
021: * Clara, CA 95054 or visit www.sun.com if you need additional
022: * information or have any questions.
023: */
024:
025: package com.sun.jumpimpl.isolate.jvmprocess.main;
026:
027: import com.sun.jump.isolate.jvmprocess.JUMPIsolateProcess;
028: import com.sun.jump.isolate.jvmprocess.JUMPAppContainer;
029: import com.sun.jump.isolate.jvmprocess.JUMPAppContainerContext;
030: import com.sun.jump.common.JUMPApplication;
031: import com.sun.jump.message.JUMPMessage;
032: import com.sun.jump.message.JUMPMessageHandler;
033:
034: import java.io.IOException;
035: import java.io.File;
036: import java.lang.reflect.Method;
037: import java.lang.reflect.InvocationTargetException;
038: import java.net.URL;
039: import java.net.MalformedURLException;
040: import java.util.StringTokenizer;
041: import sun.misc.CDCAppClassLoader;
042:
043: /*
044: * Application Container for the main(String[]) app model.
045: *
046: * FIXME: We should move this class into the cdc/fp/pbp repository
047: * and compile it there, to be aligned with midp app container in the
048: * midp repository. The code needs to be compiled before jump api
049: * and after jump impl.
050: */
051:
052: public class AppContainerImpl extends JUMPAppContainer implements
053: Runnable {
054:
055: private JUMPAppContainerContext context;
056:
057: public static JUMPAppContainer getInstance(
058: JUMPAppContainerContext context) {
059: return new AppContainerImpl(context);
060: }
061:
062: public static final String CLASSPATH_KEY = "MAINApplication_classpath";
063: public static final String INITIAL_CLASS_KEY = "MAINApplication_initialClass";
064:
065: private static JUMPApplication currentApp = null;
066: private String[] args;
067:
068: /**
069: * Creates a new instance of JUMPAppContainer
070: * For main app, there is only one per vm - ignore appId.
071: */
072: public AppContainerImpl(JUMPAppContainerContext context) {
073: this .context = context;
074: }
075:
076: /**
077: * Start the application specific by the JUMPApplication object.
078: */
079: public int startApp(JUMPApplication app, String[] mainArgs) {
080:
081: currentApp = app;
082: args = mainArgs;
083:
084: Thread t = new Thread(this );
085: t.setDaemon(false);
086: t.start();
087:
088: context.terminateKeepAliveThread();
089:
090: return Integer
091: .parseInt(app.getProperty(JUMPApplication.ID_KEY));
092: }
093:
094: /**
095: * Invokes the application's main() method.
096: */
097: public void run() {
098:
099: try {
100: String className = currentApp
101: .getProperty(INITIAL_CLASS_KEY);
102: String classPath = currentApp.getProperty(CLASSPATH_KEY);
103:
104: StringTokenizer st = new StringTokenizer(classPath,
105: File.pathSeparator);
106: int count = st.countTokens();
107: URL[] pathArray = new URL[count];
108:
109: count = 0;
110:
111: while (st.hasMoreTokens()) {
112: try {
113: pathArray[count++] = new File(st.nextToken())
114: .toURL();
115: } catch (MalformedURLException e) {
116: System.err.println("Caught: " + e);
117: pathArray[count] = null;
118: }
119: }
120:
121: CDCAppClassLoader loader = new CDCAppClassLoader(pathArray,
122: null);
123:
124: try {
125:
126: Class[] args1 = { new String[0].getClass() };
127:
128: // Main app typically expect zero length array for the main(Str[])
129: // parameter, instead of null.
130: String[] args2 = (args == null) ? new String[0] : args;
131:
132: Class mainClass = loader.loadClass(className);
133: Method mainMethod = mainClass.getMethod("main", args1);
134: mainMethod.setAccessible(true);
135: mainMethod.invoke(null, new Object[] { args2 });
136:
137: } catch (InvocationTargetException i) {
138: throw i.getTargetException();
139: }
140:
141: } catch (Throwable e) {
142: if (e instanceof Error)
143: throw (Error) e;
144:
145: e.printStackTrace();
146: }
147:
148: }
149:
150: public void pauseApp(int appId) {
151: System.out.println("Main AppContainer pausing " + currentApp);
152: }
153:
154: public void resumeApp(int appId) {
155: System.out.println("Main AppContainer resuming " + currentApp);
156: }
157:
158: public void destroyApp(int appId, boolean force) {
159: System.out
160: .println("Main AppContainer destroying " + currentApp);
161:
162: currentApp = null;
163:
164: context.terminateIsolate();
165: }
166:
167: public void handleMessage(JUMPMessage message) {
168: }
169:
170: }
|