/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.openejb.server; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.Connect; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Map; import java.util.Set; public class Start { public static void main(final String[] args) { // System.exit(new Start().start()?0:1); new Start().start(); } public static boolean connect() { final int port = SystemInstance.get().getOptions().get("ejbd.port", 4201); return Connect.connect(1, "localhost", port); } public boolean start() { if (!connect()) { forkServerProcess(); final int port = SystemInstance.get().getOptions().get("ejbd.port", 4201); return Connect.connect(10, "localhost", port); } else { System.out.println(":: server already started ::"); return true; } } private void forkServerProcess() { try { final ArrayList<String> cmd = new ArrayList<String>(); final String s = java.io.File.separator; //Not really required here for exec, but as a reminder that we run on all platforms final boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win"); String java = System.getProperty("java.home") + s + "bin" + s + (isWindows ? "java.exe" : "java"); cmd.add(java); addSystemProperties(cmd); cmd.add("-classpath"); cmd.add(getClasspath()); cmd.add("org.apache.openejb.server.Main"); final String[] command = cmd.toArray(new String[cmd.size()]); final Runtime runtime = Runtime.getRuntime(); Process server = runtime.exec(command); InputStream out = server.getInputStream(); Thread serverOut = new Thread(new Pipe(out, System.out)); serverOut.setDaemon(true); serverOut.start(); final InputStream err = server.getErrorStream(); Thread serverErr = new Thread(new Pipe(err, System.err)); serverErr.setDaemon(true); serverErr.start(); } catch (Exception e) { throw new ServerRuntimeException("Cannot start the server."); } } private void addSystemProperties(final ArrayList<String> cmd) { final Set set = System.getProperties().entrySet(); for (final Object aSet : set) { final Map.Entry entry = (Map.Entry) aSet; String key = (String) entry.getKey(); String value = (String) entry.getValue(); if (key.matches("^-X.*")) { cmd.add(key + value); } else if (!key.matches("^(java|javax|os|sun|user|file|awt|line|path)\\..*")) { cmd.add("-D" + key + "=" + value); } } } @SuppressWarnings("unchecked") private String getClasspath() { String classpath = System.getProperty("java.class.path"); final ClassLoader cl = Thread.currentThread().getContextClassLoader(); String antLoader = "org.apache.tools.ant.AntClassLoader"; if (cl.getClass().getName().equals(antLoader)) { try { final Class ant = cl.getClass(); Method getClasspath = ant.getMethod("getClasspath", new Class[0]); classpath += File.pathSeparator + getClasspath.invoke(cl, new Object[0]); } catch (Exception e) { e.printStackTrace(); } } return classpath; } private static final class Pipe implements Runnable { private final InputStream is; private final OutputStream out; private Pipe(final InputStream is, final OutputStream out) { super(); this.is = is; this.out = out; } @Override public void run() { try { int i = is.read(); out.write(i); while (i != -1) { i = is.read(); out.write(i); } } catch (final Exception e) { e.printStackTrace(); } } } }