001: /* ====================================================================
002: * The LateralNZ Software License, Version 1.0
003: *
004: * Copyright (c) 2003 LateralNZ. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by
021: * LateralNZ (http://www.lateralnz.org/) and other third parties."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "LateralNZ" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please
028: * contact oss@lateralnz.org.
029: *
030: * 5. Products derived from this software may not be called "Panther",
031: * or "Lateral" or "LateralNZ", nor may "PANTHER" or "LATERAL" or
032: * "LATERALNZ" appear in their name, without prior written
033: * permission of LateralNZ.
034: *
035: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: *
049: * This software consists of voluntary contributions made by many
050: * individuals on behalf of LateralNZ. For more
051: * information on Lateral, please see http://www.lateralnz.com/ or
052: * http://www.lateralnz.org
053: *
054: */
055: package org.lateralnz.launchpad;
056:
057: import java.io.IOException;
058: import java.util.Arrays;
059: import java.util.Properties;
060:
061: import javax.servlet.ServletConfig;
062: import javax.servlet.ServletException;
063: import javax.servlet.http.HttpServlet;
064: import javax.servlet.http.HttpServletRequest;
065: import javax.servlet.http.HttpServletResponse;
066:
067: import org.apache.log4j.Logger;
068: import org.python.util.PythonInterpreter;
069:
070: import org.lateralnz.common.util.ResourceUtils;
071: import org.lateralnz.common.util.ServletUtils;
072: import org.lateralnz.common.util.StringUtils;
073: import org.lateralnz.common.util.SystemUtils;
074:
075: /**
076: *
077: *
078: * @author J R Briggs
079: */
080: public class Launcher extends HttpServlet {
081: private static final Logger log = Logger.getLogger(Launcher.class
082: .getName());
083:
084: private PythonInterpreter interp = new PythonInterpreter();
085:
086: private Properties props;
087: private String launchpadHome;
088: private String initDir;
089:
090: public void init(ServletConfig config) throws ServletException {
091: try {
092: Properties props = ServletUtils.toProperties(config);
093:
094: launch(props);
095: } catch (Exception e) {
096: log.error(e);
097: throw new ServletException(e);
098: }
099: }
100:
101: protected void processRequest(HttpServletRequest request,
102: HttpServletResponse response) throws ServletException,
103: IOException {
104: throw new ServletException("not available");
105: }
106:
107: protected void doGet(HttpServletRequest request,
108: HttpServletResponse response) throws ServletException,
109: IOException {
110: processRequest(request, response);
111: }
112:
113: protected void doPost(HttpServletRequest request,
114: HttpServletResponse response) throws ServletException,
115: IOException {
116: processRequest(request, response);
117: }
118:
119: public String getServletInfo() {
120: return "Short description";
121: }
122:
123: private void launch(Properties props) throws Exception {
124: this .props = props;
125:
126: launchpadHome = System.getProperty("LAUNCHPAD_HOME");
127: if (StringUtils.isEmpty(launchpadHome)) {
128: launchpadHome = System.getProperty("launchpad_home");
129: }
130:
131: if (StringUtils.isEmpty(launchpadHome)) {
132: throw new Exception("property 'launchpad_home' is required");
133: }
134: launchpadHome = StringUtils.toDirectory(launchpadHome);
135:
136: initDir = props.getProperty("conf_directory");
137: if (!StringUtils.isEmpty(initDir)) {
138: initDir = StringUtils.toDirectory(initDir);
139: }
140:
141: if (log.isInfoEnabled()) {
142: log.info("Launchpad (" + launchpadHome + initDir + ")");
143: }
144:
145: // startup scripts
146: String[] filelist = SystemUtils.getFileList(launchpadHome
147: + initDir, "^s.*\\.py$");
148: Arrays.sort(filelist);
149: exec(filelist, true);
150:
151: Runtime.getRuntime().addShutdownHook(new ShutdownThread());
152: }
153:
154: private final void exec(String[] files, boolean throwErrors)
155: throws Exception {
156: for (int i = 0; i < files.length; i++) {
157: if (log.isInfoEnabled()) {
158: log.info("executing : " + files[i]);
159: }
160:
161: String py = StringUtils.readFromFile(launchpadHome
162: + initDir + files[i]);
163: interp.set("sysprops", props);
164: try {
165: interp.exec(py);
166: } catch (Exception e) {
167: log.warn("unable to execute " + files[i]);
168: if (throwErrors) {
169: throw e;
170: } else {
171: e.printStackTrace();
172: }
173: }
174: }
175: }
176:
177: class ShutdownThread extends Thread {
178: public void run() {
179: try {
180: //shutdown scripts
181: String[] filelist = SystemUtils.getFileList(
182: launchpadHome + initDir, "^k.*\\.py$");
183: Arrays.sort(filelist);
184: exec(filelist, false);
185: } catch (Exception e) {
186: log.error(e);
187: }
188: }
189: }
190:
191: /**
192: * for running a standalone server
193: */
194: public static final void main(String[] args) {
195: try {
196: Properties props = System.getProperties();
197:
198: Launcher launcher = new Launcher();
199: launcher.launch(props);
200:
201: while (true) {
202: try {
203: Thread.currentThread().sleep(9999999999999L);
204: } catch (Exception e) {
205: }
206: }
207:
208: } catch (Exception e) {
209: e.printStackTrace();
210: }
211: }
212: }
|