FELIX-1810: improvements to Main startup class, patch provided by Jarek Gawor

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@831274 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java b/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java
index 6b72775..fa12d90 100644
--- a/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java
+++ b/karaf/main/src/main/java/org/apache/felix/karaf/main/Main.java
@@ -187,36 +187,33 @@
             storage.mkdirs();
             configProps.setProperty(Constants.FRAMEWORK_STORAGE, storage.getAbsolutePath());
         }
+        
+        defaultStartLevel = Integer.parseInt(configProps.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
+        lockStartLevel = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_LEVEL, Integer.toString(lockStartLevel)));
+        lockDelay = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_DELAY, Integer.toString(lockDelay)));
+        configProps.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, Integer.toString(lockStartLevel));
+        // Start up the OSGI framework
 
-        try {
-            defaultStartLevel = Integer.parseInt(configProps.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
-            lockStartLevel = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_LEVEL, Integer.toString(lockStartLevel)));
-            lockDelay = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_DELAY, Integer.toString(lockDelay)));
-            configProps.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, Integer.toString(lockStartLevel));
-            // Start up the OSGI framework
-
-            InputStream is = getClass().getResourceAsStream("/META-INF/services/" + FrameworkFactory.class.getName());
-            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-            String factoryClass = br.readLine();
-            br.close();
-            FrameworkFactory factory = (FrameworkFactory) getClass().getClassLoader().loadClass(factoryClass).newInstance();
-            framework = factory.newFramework(new StringMap(configProps, false));
-            framework.start();
-            processAutoProperties(framework.getBundleContext());
-            // Start lock monitor
-            new Thread() {
-                public void run() {
-                    lock(configProps);
-                }
-            }.start();
-        }
-        catch (Exception ex) {
-            setExitCode(-1);
-            throw new Exception("Could not create framework", ex);
-        }
+        InputStream is = getClass().getResourceAsStream("/META-INF/services/" + FrameworkFactory.class.getName());
+        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+        String factoryClass = br.readLine();
+        br.close();
+        FrameworkFactory factory = (FrameworkFactory) getClass().getClassLoader().loadClass(factoryClass).newInstance();
+        framework = factory.newFramework(new StringMap(configProps, false));
+        framework.start();
+        processAutoProperties(framework.getBundleContext());
+        // Start lock monitor
+        new Thread() {
+            public void run() {
+                lock(configProps);
+            }
+        }.start();
     }
 
     public void destroy(boolean await) throws Exception {
+        if (framework == null) {
+            return;
+        }
         try {
             if (await) {
                 framework.waitForStop(0);
@@ -311,9 +308,15 @@
         final Main main = new Main(args);
         try {
             main.launch();
+        } catch (Throwable ex) {
+            main.setExitCode(-1);
+            System.err.println("Could not create framework: " + ex);
+            ex.printStackTrace();
+        }        
+        try {
             main.destroy(true);
-        }
-        catch (Throwable ex) {
+        } catch (Throwable ex) {
+            main.setExitCode(-2);
             System.err.println("Error occured shutting down framework: " + ex);
             ex.printStackTrace();
         } finally {
@@ -362,7 +365,7 @@
                             return;
                         }
                     }
-                    throw new Exception("Instance " + args[1] + " not found");
+                    throw new Exception("Instance " + instanceName + " not found");
                 }
             }
         } catch (Exception e) {
@@ -796,8 +799,7 @@
             String key = (String) e.nextElement();
             if (key.startsWith("felix.") ||
                     key.startsWith("karaf.") ||
-                    key.equals("org.osgi.framework.system.packages") ||
-                    key.equals("org.osgi.framework.bootdelegation")) {
+                    key.startsWith("org.osgi.framework.")) {
                 configProps.setProperty(key, System.getProperty(key));
             }
         }
@@ -1063,6 +1065,10 @@
         this.exitCode = exitCode;
     }
 
+    public Framework getFramework() {
+        return framework;
+    }
+    
     public void lock(Properties props) {
         try {
             if (Boolean.parseBoolean(props.getProperty(PROPERTY_USE_LOCK, "true"))) {