Added: karaf/trunk/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java?rev=1143751&view=auto ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java (added) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/ShutdownSocketThread.java Thu Jul 7 10:26:31 2011 @@ -0,0 +1,102 @@ +package org.apache.karaf.main; + +import java.io.IOException; +import java.io.InputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.security.AccessControlException; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.osgi.framework.launch.Framework; + +class ShutdownSocketThread extends Thread { + Logger LOG = Logger.getLogger(this.getClass().getName()); + + /** + * + */ + private final String shutdown; + private Random random = null; + private ServerSocket shutdownSocket; + private Framework framework; + + public ShutdownSocketThread(String shutdown, ServerSocket shutdownSocket, Framework framework) { + this.shutdown = shutdown; + this.shutdownSocket = shutdownSocket; + this.framework = framework; + } + + public void run() { + try { + while (true) { + // Wait for the next connection + Socket socket = null; + InputStream stream = null; + try { + socket = shutdownSocket.accept(); + socket.setSoTimeout(10 * 1000); // Ten seconds + stream = socket.getInputStream(); + } catch (AccessControlException ace) { + LOG.log(Level.WARNING, "Karaf shutdown socket: security exception: " + + ace.getMessage(), ace); + continue; + } catch (IOException e) { + LOG.log(Level.SEVERE, "Karaf shutdown socket: accept: ", e); + System.exit(1); + } + + // Read a set of characters from the socket + StringBuilder command = new StringBuilder(); + int expected = 1024; // Cut off to avoid DoS attack + while (expected < shutdown.length()) { + if (random == null) { + random = new Random(); + } + expected += (random.nextInt() % 1024); + } + while (expected > 0) { + int ch; + try { + ch = stream.read(); + } catch (IOException e) { + LOG.log(Level.WARNING, "Karaf shutdown socket: read: ", e); + ch = -1; + } + if (ch < 32) { // Control character or EOF terminates loop + break; + } + command.append((char) ch); + expected--; + } + + // Close the socket now that we are done with it + try { + socket.close(); + } catch (IOException e) { + // Ignore + } + + // Match against our command string + boolean match = command.toString().equals(shutdown); + if (match) { + LOG.log(Level.INFO, "Karaf shutdown socket: received shutdown command. Stopping framework..."); + framework.stop(); + break; + } else { + LOG.log(Level.WARNING, "Karaf shutdown socket: Invalid command '" + + command.toString() + "' received"); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + shutdownSocket.close(); + } catch (IOException e) { + // Ignore + } + } + } +} \ No newline at end of file
Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java?rev=1143751&r1=1143750&r2=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java Thu Jul 7 10:26:31 2011 @@ -18,14 +18,6 @@ */ package org.apache.karaf.main; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.net.Socket; -import java.net.URL; -import java.util.Enumeration; -import java.util.Properties; /** * Main class used to stop the root Karaf instance @@ -33,46 +25,7 @@ import java.util.Properties; public class Stop { public static void main(String[] args) throws Exception { - File karafHome = Utils.getKarafHome(); - File karafBase = Utils.getKarafDirectory(Main.PROP_KARAF_BASE, Main.ENV_KARAF_BASE, karafHome, false, true); - File karafData = Utils.getKarafDirectory(Main.PROP_KARAF_DATA, Main.ENV_KARAF_DATA, new File(karafBase.getPath(), "data"), true, true); - - System.setProperty(Main.PROP_KARAF_HOME, karafHome.getPath()); - System.setProperty(Main.PROP_KARAF_BASE, karafBase.getPath()); - System.setProperty(Main.PROP_KARAF_DATA, karafData.getPath()); - - // Load system properties. - Main.loadSystemProperties(karafBase); - - File file = new File(new File(karafBase, "etc"), Main.CONFIG_PROPERTIES_FILE_NAME); - URL configPropURL = file.toURI().toURL(); - Properties props = Main.loadPropertiesFile(configPropURL, false); - Main.copySystemProperties(props); - - // Perform variable substitution for system properties. - for (Enumeration e = props.propertyNames(); e.hasMoreElements();) { - String name = (String) e.nextElement(); - props.setProperty(name, - Main.substVars(props.getProperty(name), name, null, props)); - } - - int port = Integer.parseInt(props.getProperty(Main.KARAF_SHUTDOWN_PORT, "0")); - String host = props.getProperty(Main.KARAF_SHUTDOWN_HOST, "localhost"); - String portFile = props.getProperty(Main.KARAF_SHUTDOWN_PORT_FILE); - String shutdown = props.getProperty(Main.KARAF_SHUTDOWN_COMMAND, Main.DEFAULT_SHUTDOWN_COMMAND); - if (port == 0 && portFile != null) { - BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(portFile))); - String portStr = r.readLine(); - port = Integer.parseInt(portStr); - r.close(); - } - if (port > 0) { - Socket s = new Socket(host, port); - s.getOutputStream().write(shutdown.getBytes()); - s.close(); - } else { - System.err.println("Unable to find port..."); - } - + Main.shutdown(); } + } Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.sql.Connection; import java.sql.DriverManager; @@ -27,6 +27,8 @@ import java.sql.Statement; import java.util.Properties; import java.util.logging.Logger; +import org.apache.karaf.main.util.BootstrapLogManager; + /** * Represents an exclusive lock on a database, * used to avoid multiple Karaf instances attempting Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.sql.Connection; import java.util.Properties; Propchange: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Lock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/Lock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Lock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Lock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/Lock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Lock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Lock.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; public interface Lock { Added: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java?rev=1143751&view=auto ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java (added) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java Thu Jul 7 10:26:31 2011 @@ -0,0 +1,29 @@ +package org.apache.karaf.main.lock; + +import java.util.Properties; + +public class LockFactory { + /** + * If a lock should be used before starting the runtime + */ + public static final String PROPERTY_USE_LOCK = "karaf.lock"; + + /** + * The lock implementation + */ + public static final String PROPERTY_LOCK_CLASS = "karaf.lock.class"; + + public static final String PROPERTY_LOCK_CLASS_DEFAULT = SimpleFileLock.class.getName(); + + public static Lock createLock(Properties props) { + if (Boolean.parseBoolean(props.getProperty(PROPERTY_USE_LOCK, "true"))) { + return new NoLock(); + } + String clz = props.getProperty(PROPERTY_LOCK_CLASS, PROPERTY_LOCK_CLASS_DEFAULT); + try { + return (Lock) Class.forName(clz).getConstructor(Properties.class).newInstance(props); + } catch (Exception e) { + throw new RuntimeException("Exception instantiating lock class " + clz, e); + } + } +} Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java Thu Jul 7 10:26:31 2011 @@ -16,11 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.sql.Connection; import java.util.Properties; + /** * Represents an exclusive lock on a database, * used to avoid multiple Karaf instances attempting Added: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/NoLock.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/NoLock.java?rev=1143751&view=auto ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/NoLock.java (added) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/NoLock.java Thu Jul 7 10:26:31 2011 @@ -0,0 +1,19 @@ +package org.apache.karaf.main.lock; + +public class NoLock implements Lock { + + @Override + public boolean lock() throws Exception { + return true; + } + + @Override + public void release() throws Exception { + } + + @Override + public boolean isAlive() throws Exception { + return true; + } + +} Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java Thu Jul 7 10:26:31 2011 @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; + /** * Represents an exclusive lock on a database, * used to avoid multiple Karaf instances attempting Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.io.File; import java.io.IOException; @@ -25,6 +25,8 @@ import java.nio.channels.FileLock; import java.util.Properties; import java.util.logging.Logger; +import org.apache.karaf.main.util.BootstrapLogManager; + public class SimpleFileLock implements Lock { private static final Logger LOG = Logger.getLogger(SimpleFileLock.class.getName()); Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Statements.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/Statements.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Statements.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Statements.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/Statements.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Statements.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/lock/Statements.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; public class Statements { Added: karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java?rev=1143751&view=auto ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java (added) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java Thu Jul 7 10:26:31 2011 @@ -0,0 +1,126 @@ +/* + * 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.karaf.main.util; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Handler; +import java.util.logging.LogRecord; +import java.util.logging.StreamHandler; + + +/** + * Convenience class for configuring java.util.logging to append to + * the configured log4j log. This could be used for bootstrap logging + * prior to start of the framework. + * + */ +public class BootstrapLogManager { + private static final String DEFAULT_LOG_FILE = "${karaf.data}/log/karaf.log"; + private static final String PROP_LOG4J_APPENDER_OUT_FILE = "log4j.appender.out.file"; + private static Handler handler; + private static final String KARAF_BOOTSTRAP_LOG = "karaf.bootstrap.log"; + + private static Properties configProps; + + public static Handler getDefaultHandler () { + File log; + String filename = configProps.getProperty(KARAF_BOOTSTRAP_LOG); + if (filename == null) { + Properties props = readLoggingConfig(); + if (props.getProperty(PROP_LOG4J_APPENDER_OUT_FILE) == null) { + props.setProperty(PROP_LOG4J_APPENDER_OUT_FILE, DEFAULT_LOG_FILE); + } + filename = PropertiesHelper.substVars(props.getProperty(PROP_LOG4J_APPENDER_OUT_FILE),PROP_LOG4J_APPENDER_OUT_FILE, null, null); + } + log = new File(filename); + try { + handler = new BootstrapLogManager.SimpleFileHandler(log); + } catch (IOException e) { + e.printStackTrace(); + } + + return handler; + } + + private static Properties readLoggingConfig() { + // Make a best effort to log to the default file appender configured for log4j + Properties props = new Properties(); + FileInputStream fis = null; + try { + fis = new FileInputStream(System.getProperty("karaf.base") + "/etc/org.ops4j.pax.logging.cfg"); + props.load(fis); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } + return props; + } + + public static void setProperties(Properties configProps) { + BootstrapLogManager.configProps = configProps; + } + + + /** + * Implementation of java.util.logging.Handler that does simple appending + * to a named file. Should be able to use this for bootstrap logging + * via java.util.logging prior to startup of pax logging. + */ + public static class SimpleFileHandler extends StreamHandler { + + public SimpleFileHandler (File file) throws IOException { + open(file, true); + } + + private void open (File logfile, boolean append) throws IOException { + if (!logfile.getParentFile().exists()) { + try { + logfile.getParentFile().mkdirs(); + } catch (SecurityException se) { + throw new IOException(se.getMessage()); + } + } + FileOutputStream fout = new FileOutputStream(logfile, append); + BufferedOutputStream out = new BufferedOutputStream(fout); + setOutputStream(out); + } + + public synchronized void publish (LogRecord record) { + if (!isLoggable(record)) { + return; + } + super.publish(record); + flush(); + } + } + + +} Added: karaf/trunk/main/src/main/java/org/apache/karaf/main/util/PropertiesHelper.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/util/PropertiesHelper.java?rev=1143751&view=auto ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/util/PropertiesHelper.java (added) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/util/PropertiesHelper.java Thu Jul 7 10:26:31 2011 @@ -0,0 +1,290 @@ +package org.apache.karaf.main.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; + +public class PropertiesHelper { + private static final String INCLUDES_PROPERTY = "${includes}"; + + private static final String DELIM_START = "${"; + private static final String DELIM_STOP = "}"; + + /** + * <p> + * Loads the properties into into <tt>System.setProperty()</tt>. These properties + * are not directly used by the framework in anyway. By default, the system + * property file is located in the <tt>etc/</tt> directory of the karaf + * installation directory and is called "<tt>system.properties</tt>". + * The precise file from which to load system properties can be set by + * initializing the "<tt>system.properties</tt>" system property to an + * arbitrary URL. + * </p> + */ + public static void updateSystemProperties(Properties props) { + for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements();) { + String name = (String) e.nextElement(); + String value = System.getProperty(name, props.getProperty(name)); + System.setProperty(name, substVars(value, name, null, props)); + } + } + + /** + * Perform variable substitution for the given properties + * @param configProps + */ + public static void substituteVariables(Properties configProps) { + for (Enumeration<?> e = configProps.propertyNames(); e.hasMoreElements();) { + String name = (String) e.nextElement(); + configProps.setProperty(name, + substVars(configProps.getProperty(name), name, null, configProps)); + } + } + + public static String nextLocation(StringTokenizer st) { + String retVal = null; + + if (st.countTokens() > 0) { + String tokenList = "\" "; + StringBuffer tokBuf = new StringBuffer(10); + String tok; + boolean inQuote = false; + boolean tokStarted = false; + boolean exit = false; + while ((st.hasMoreTokens()) && (!exit)) { + tok = st.nextToken(tokenList); + if (tok.equals("\"")) { + inQuote = !inQuote; + if (inQuote) { + tokenList = "\""; + } else { + tokenList = "\" "; + } + + } else if (tok.equals(" ")) { + if (tokStarted) { + retVal = tokBuf.toString(); + tokStarted = false; + tokBuf = new StringBuffer(10); + exit = true; + } + } else { + tokStarted = true; + tokBuf.append(tok.trim()); + } + } + + // Handle case where end of token stream and + // still got data + if ((!exit) && (tokStarted)) { + retVal = tokBuf.toString(); + } + } + + return retVal; + } + + public static Properties loadPropertiesFile(File baseFolder, String fileName, boolean failIfNotFound) throws Exception { + File file = new File(baseFolder, fileName); + URL configPropURL = file.toURI().toURL(); + return loadPropertiesUrl(configPropURL, failIfNotFound); + } + + protected static Properties loadPropertiesUrl(URL configPropURL, boolean failIfNotFound) throws Exception { + // Read the properties file. + Properties configProps = new Properties(); + InputStream is = null; + try { + is = configPropURL.openConnection().getInputStream(); + configProps.load(is); + is.close(); + } + catch (FileNotFoundException ex) { + if (failIfNotFound) { + throw ex; + } + } + catch (Exception ex) { + System.err.println("Error loading config properties from " + configPropURL); + System.err.println("Main: " + ex); + return configProps; + } finally { + try { + if (is != null) { + is.close(); + } + } + catch (IOException ex2) { + // Nothing we can do. + } + } + addIncludes(configPropURL, configProps); + trimValues(configProps); + return configProps; + } + + private static void trimValues(Properties configProps) { + for (Enumeration<?> e = configProps.propertyNames(); e.hasMoreElements();) { + Object key = e.nextElement(); + if (key instanceof String) { + String v = configProps.getProperty((String) key); + configProps.put(key, v.trim()); + } + } + } + + private static void addIncludes(URL configPropURL, Properties configProps) + throws MalformedURLException, Exception { + String includes = configProps.getProperty(INCLUDES_PROPERTY); + if (includes != null) { + StringTokenizer st = new StringTokenizer(includes, "\" ", true); + if (st.countTokens() > 0) { + String location; + do { + location = nextLocation(st); + if (location != null) { + URL url = new URL(configPropURL, location); + Properties props = loadPropertiesUrl(url, true); + configProps.putAll(props); + } + } + while (location != null); + } + configProps.remove(INCLUDES_PROPERTY); + } + } + + public static void copySystemProperties(Properties configProps) { + for (Enumeration<?> e = System.getProperties().propertyNames(); + e.hasMoreElements();) { + String key = (String) e.nextElement(); + if (key.startsWith("felix.") || + key.startsWith("karaf.") || + key.startsWith("org.osgi.framework.")) { + configProps.setProperty(key, System.getProperty(key)); + } + } + } + + /** + * <p> + * This method performs property variable substitution on the + * specified value. If the specified value contains the syntax + * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt> + * refers to either a configuration property or a system property, + * then the corresponding property value is substituted for the variable + * placeholder. Multiple variable placeholders may exist in the + * specified value as well as nested variable placeholders, which + * are substituted from inner most to outer most. Configuration + * properties override system properties. + * </p> + * + * @param val The string on which to perform property substitution. + * @param currentKey The key of the property being evaluated used to + * detect cycles. + * @param cycleMap Map of variable references used to detect nested cycles. + * @param configProps Set of configuration properties. + * @return The value of the specified string after system property substitution. + * @throws IllegalArgumentException If there was a syntax error in the + * property placeholder syntax or a recursive variable reference. + */ + public static String substVars(String val, String currentKey, + Map<String, String> cycleMap, Properties configProps) + throws IllegalArgumentException { + // If there is currently no cycle map, then create + // one for detecting cycles for this invocation. + if (cycleMap == null) { + cycleMap = new HashMap<String, String>(); + } + + // Put the current key in the cycle map. + cycleMap.put(currentKey, currentKey); + + // Assume we have a value that is something like: + // "leading ${foo.${bar}} middle ${baz} trailing" + + // Find the first ending '}' variable delimiter, which + // will correspond to the first deepest nested variable + // placeholder. + int stopDelim = val.indexOf(DELIM_STOP); + + // Find the matching starting "${" variable delimiter + // by looping until we find a start delimiter that is + // greater than the stop delimiter we have found. + int startDelim = val.indexOf(DELIM_START); + while (stopDelim >= 0) { + int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length()); + if ((idx < 0) || (idx > stopDelim)) { + break; + } else if (idx < stopDelim) { + startDelim = idx; + } + } + + // If we do not have a start or stop delimiter, then just + // return the existing value. + if ((startDelim < 0) && (stopDelim < 0)) { + return val; + } + // At this point, we found a stop delimiter without a start, + // so throw an exception. + else if (((startDelim < 0) || (startDelim > stopDelim)) + && (stopDelim >= 0)) { + throw new IllegalArgumentException( + "stop delimiter with no start delimiter: " + + val); + } + + // At this point, we have found a variable placeholder so + // we must perform a variable substitution on it. + // Using the start and stop delimiter indices, extract + // the first, deepest nested variable placeholder. + String variable = + val.substring(startDelim + DELIM_START.length(), stopDelim); + + // Verify that this is not a recursive variable reference. + if (cycleMap.get(variable) != null) { + throw new IllegalArgumentException( + "recursive variable reference: " + variable); + } + + // Get the value of the deepest nested variable placeholder. + // Try to configuration properties first. + String substValue = (configProps != null) + ? configProps.getProperty(variable, null) + : null; + if (substValue == null) { + // Ignore unknown property values. + substValue = System.getProperty(variable, ""); + } + + // Remove the found variable from the cycle map, since + // it may appear more than once in the value and we don't + // want such situations to appear as a recursive reference. + cycleMap.remove(variable); + + // Append the leading characters, the substituted value of + // the variable, and the trailing characters to get the new + // value. + val = val.substring(0, startDelim) + + substValue + + val.substring(stopDelim + DELIM_STOP.length(), val.length()); + + // Now perform substitution again, since there could still + // be substitutions to make. + val = substVars(val, currentKey, cycleMap, configProps); + + // Return the value. + return val; + } + + +} Copied: karaf/trunk/main/src/main/java/org/apache/karaf/main/util/Utils.java (from r1143300, karaf/trunk/main/src/main/java/org/apache/karaf/main/Utils.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/util/Utils.java?p2=karaf/trunk/main/src/main/java/org/apache/karaf/main/util/Utils.java&p1=karaf/trunk/main/src/main/java/org/apache/karaf/main/Utils.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/main/java/org/apache/karaf/main/Utils.java (original) +++ karaf/trunk/main/src/main/java/org/apache/karaf/main/util/Utils.java Thu Jul 7 10:26:31 2011 @@ -16,39 +16,37 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.util; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.net.URL; import java.net.JarURLConnection; import java.net.URI; - -import org.apache.karaf.main.Main; +import java.net.URL; public class Utils { - public static File getKarafHome() throws IOException { + public static File getKarafHome(Class<?> mainClass, String karafHomeProperty, String karafHomeEnv) throws IOException { File rc = null; // Use the system property if specified. - String path = System.getProperty(Main.PROP_KARAF_HOME); + String path = System.getProperty(karafHomeProperty); if (path != null) { - rc = validateDirectoryExists(path, "Invalid " + Main.PROP_KARAF_HOME + " system property", false, true); + rc = validateDirectoryExists(path, "Invalid " + karafHomeProperty + " system property", false, true); } if (rc == null) { - path = System.getenv(Main.ENV_KARAF_HOME); + path = System.getenv(karafHomeEnv); if (path != null) { - rc = validateDirectoryExists(path, "Invalid " + Main.ENV_KARAF_HOME + " environment variable", false, true); + rc = validateDirectoryExists(path, "Invalid " + karafHomeEnv + " environment variable", false, true); } } // Try to figure it out using the jar file this class was loaded from. if (rc == null) { // guess the home from the location of the jar - URL url = Main.class.getClassLoader().getResource(Main.class.getName().replace(".", "/") + ".class"); + URL url = mainClass.getClassLoader().getResource(mainClass.getName().replace(".", "/") + ".class"); if (url != null) { try { JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); @@ -70,7 +68,7 @@ public class Utils { } } if (rc == null) { - throw new IOException("The Karaf install directory could not be determined. Please set the " + Main.PROP_KARAF_HOME + " system property or the " + Main.ENV_KARAF_HOME + " environment variable."); + throw new IOException("The Karaf install directory could not be determined. Please set the " + karafHomeProperty + " system property or the " + karafHomeEnv + " environment variable."); } return rc; Modified: karaf/trunk/main/src/test/java/org/apache/karaf/main/MainStartTest.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/MainStartTest.java?rev=1143751&r1=1143750&r2=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/MainStartTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/MainStartTest.java Thu Jul 7 10:26:31 2011 @@ -21,6 +21,8 @@ package org.apache.karaf.main; import java.io.File; import junit.framework.Assert; + +import org.apache.karaf.main.util.Utils; import org.junit.Ignore; import org.junit.Test; import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles; @@ -51,7 +53,7 @@ public class MainStartTest { System.setProperty("karaf.maven.convert", "false"); Main main = new Main(args); - main.launch(); + LifecycleManager lifecacleManager = main.launch(); Thread.sleep(1000); Framework framework = main.getFramework(); Bundle[] bundles = framework.getBundleContext().getBundles(); @@ -60,7 +62,7 @@ public class MainStartTest { Assert.assertEquals(mvnUrl, bundles[2].getLocation()); Assert.assertEquals(Bundle.ACTIVE, bundles[1].getState()); Assert.assertEquals(Bundle.ACTIVE, bundles[2].getState()); - main.destroy(); + lifecacleManager.destroyKaraf(); } @Test @@ -78,7 +80,7 @@ public class MainStartTest { Main main = new Main(args); - main.launch(); + LifecycleManager lifecycleManager = main.launch(); Thread.sleep(1000); Framework framework = main.getFramework(); String activatorName = TimeoutShutdownActivator.class.getName().replace('.', '/') + ".class"; @@ -91,7 +93,7 @@ public class MainStartTest { bundle.start(); long t0 = System.currentTimeMillis(); - main.destroy(); + lifecycleManager.destroyKaraf(); long t1 = System.currentTimeMillis(); // System.err.println("Shutdown duration: " + (t1 - t0) + " ms"); Assert.assertTrue((t1 - t0) > TimeoutShutdownActivator.TIMEOUT / 2); Modified: karaf/trunk/main/src/test/java/org/apache/karaf/main/StatementsTest.java URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/StatementsTest.java?rev=1143751&r1=1143750&r2=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/StatementsTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/StatementsTest.java Thu Jul 7 10:26:31 2011 @@ -20,6 +20,7 @@ package org.apache.karaf.main; import static org.junit.Assert.*; +import org.apache.karaf.main.lock.Statements; import org.junit.Before; import org.junit.Test; Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -32,6 +32,9 @@ import java.sql.Statement; import java.util.Properties; import java.util.logging.Logger; +import org.apache.karaf.main.lock.DefaultJDBCLock; +import org.apache.karaf.main.lock.Lock; +import org.apache.karaf.main.util.BootstrapLogManager; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertFalse; @@ -30,6 +30,8 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; +import org.apache.karaf.main.lock.DefaultJDBCLock; +import org.apache.karaf.main.util.BootstrapLogManager; import org.easymock.EasyMock; import org.junit.Before; import org.junit.BeforeClass; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java Thu Jul 7 10:26:31 2011 @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertTrue; import java.util.Properties; +import org.apache.karaf.main.lock.DefaultJDBCLock; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java Thu Jul 7 10:26:31 2011 @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertEquals; import java.sql.Connection; import java.util.Properties; +import org.apache.karaf.main.lock.DefaultJDBCLock; import org.junit.Before; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java Thu Jul 7 10:26:31 2011 @@ -16,12 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertTrue; import java.util.Properties; +import org.apache.karaf.main.lock.DefaultJDBCLock; +import org.apache.karaf.main.lock.DerbyJDBCLock; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java Thu Jul 7 10:26:31 2011 @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertEquals; import java.sql.Connection; import java.util.Properties; +import org.apache.karaf.main.lock.DerbyJDBCLock; import org.junit.Before; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertFalse; @@ -24,6 +24,7 @@ import static org.junit.Assert.assertFal import java.sql.Connection; import java.util.Properties; +import org.apache.karaf.main.lock.MySQLJDBCLock; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java Thu Jul 7 10:26:31 2011 @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.junit.Assert.assertEquals; import java.sql.Connection; import java.util.Properties; +import org.apache.karaf.main.lock.MySQLJDBCLock; import org.junit.Before; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import java.sql.Connection; @@ -24,6 +24,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; +import org.apache.karaf.main.lock.OracleJDBCLock; import org.junit.Before; import org.junit.Ignore; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java ------------------------------------------------------------------------------ svn:eol-style = native Copied: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java (from r1143300, karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java) URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java?p2=karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java&p1=karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java&r1=1143300&r2=1143751&rev=1143751&view=diff ============================================================================== --- karaf/trunk/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java (original) +++ karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java Thu Jul 7 10:26:31 2011 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.karaf.main; +package org.apache.karaf.main.lock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; @@ -28,6 +28,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; +import org.apache.karaf.main.lock.OracleJDBCLock; import org.junit.Before; import org.junit.Test; Propchange: karaf/trunk/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: karaf/trunk/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java URL: http://svn.apache.org/viewvc/karaf/trunk/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java?rev=1143751&r1=1143750&r2=1143751&view=diff ============================================================================== --- karaf/trunk/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java (original) +++ karaf/trunk/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java Thu Jul 7 10:26:31 2011 @@ -16,6 +16,7 @@ */ package org.apache.karaf.shell.wrapper; +import org.apache.karaf.main.LifecycleManager; import org.apache.karaf.main.ShutdownCallback; import org.tanukisoftware.wrapper.WrapperListener; import org.tanukisoftware.wrapper.WrapperManager; @@ -25,8 +26,8 @@ import org.tanukisoftware.wrapper.Wrappe */ public class Main extends Thread implements WrapperListener, ShutdownCallback { - private org.apache.karaf.main.Main main; private volatile boolean destroying; + private LifecycleManager lifecycleManager; /*--------------------------------------------------------------- * Constructors @@ -52,11 +53,11 @@ public class Main extends Thread impleme */ public Integer start( String[] args ) { - main = new org.apache.karaf.main.Main( args ); + org.apache.karaf.main.Main main = new org.apache.karaf.main.Main( args ); try { - main.launch(); - main.setShutdownCallback(this); + lifecycleManager = main.launch(); + lifecycleManager.setShutdownCallback(this); start(); return null; } @@ -70,9 +71,9 @@ public class Main extends Thread impleme public void run() { try { - main.awaitShutdown(); + lifecycleManager.awaitShutdown(); if (!destroying) { - WrapperManager.stop(main.getExitCode()); + WrapperManager.stop(0); } } catch (Exception e) { // Ignore @@ -100,7 +101,7 @@ public class Main extends Thread impleme try { destroying = true; - if (!main.destroy()) + if (!lifecycleManager.destroyKaraf()) { System.err.println("Timeout waiting for Karaf to shutdown"); return -3; @@ -113,7 +114,7 @@ public class Main extends Thread impleme return -2; } - return main.getExitCode(); + return 0; } /**