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>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</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;
     }
     
     /**


Reply via email to