Refactor Argeo init
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / OsgiBoot.java
index d9f3b3c7bf76bc5e9cdf919fd68535dc4d8d0655..67ee7b6dffd32189e316f365afbbef6ecc38f7a8 100644 (file)
@@ -20,8 +20,9 @@ import java.util.SortedMap;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 
-import org.argeo.init.a2.A2Source;
-import org.argeo.init.a2.ProvisioningManager;
+import org.argeo.api.a2.A2Source;
+import org.argeo.api.a2.ProvisioningManager;
+import org.argeo.api.init.InitConstants;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
@@ -37,10 +38,6 @@ import org.osgi.framework.wiring.FrameworkWiring;
  * methods, configured via properties.
  */
 public class OsgiBoot implements OsgiBootConstants {
-       final static String PROP_ARGEO_OSGI_START = "argeo.osgi.start";
-       final static String PROP_ARGEO_OSGI_MAX_START_LEVEL = "argeo.osgi.maxStartLevel";
-       final static String PROP_ARGEO_OSGI_SOURCES = "argeo.osgi.sources";
-
        @Deprecated
        final static String PROP_ARGEO_OSGI_BUNDLES = "argeo.osgi.bundles";
        final static String PROP_ARGEO_OSGI_BASE_URL = "argeo.osgi.baseUrl";
@@ -55,21 +52,10 @@ public class OsgiBoot implements OsgiBootConstants {
        final static String PROP_ARGEO_OSGI_BOOT_APPCLASS = "argeo.osgi.boot.appclass";
        final static String PROP_ARGEO_OSGI_BOOT_APPARGS = "argeo.osgi.boot.appargs";
 
-       final static String DEFAULT_BASE_URL = "reference:file:";
+       @Deprecated
+       public final static String DEFAULT_BASE_URL = "reference:file:";
        final static String DEFAULT_MAX_START_LEVEL = "32";
 
-       // OSGi standard properties
-       final static String PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL = "osgi.bundles.defaultStartLevel";
-       final static String PROP_OSGI_STARTLEVEL = "osgi.startLevel";
-       public final static String PROP_OSGI_INSTANCE_AREA = "osgi.instance.area";
-       public final static String PROP_OSGI_CONFIGURATION_AREA = "osgi.configuration.area";
-       public final static String PROP_OSGI_SHARED_CONFIGURATION_AREA = "osgi.sharedConfiguration.area";
-       public final static String PROP_OSGI_USE_SYSTEM_PROPERTIES = "osgi.framework.useSystemProperties";
-
-       // Symbolic names
-       final static String SYMBOLIC_NAME_OSGI_BOOT = "org.argeo.init";
-       final static String SYMBOLIC_NAME_EQUINOX = "org.eclipse.osgi";
-
        private final BundleContext bundleContext;
        private final String localCache;
        private final ProvisioningManager provisioningManager;
@@ -85,7 +71,7 @@ public class OsgiBoot implements OsgiBootConstants {
                localCache = getProperty(PROP_ARGEO_OSGI_LOCAL_CACHE, homeUri + ".m2/repository/");
 
                provisioningManager = new ProvisioningManager(bundleContext);
-               String sources = getProperty(PROP_ARGEO_OSGI_SOURCES);
+               String sources = getProperty(InitConstants.PROP_ARGEO_OSGI_SOURCES);
                if (sources == null) {
                        provisioningManager.registerDefaultSource();
                } else {
@@ -97,12 +83,25 @@ public class OsgiBoot implements OsgiBootConstants {
                                        queryPart = source.substring(qmIndex);
                                        source = source.substring(0, qmIndex);
                                }
+                               // TODO centralise in A" package?
                                if (source.trim().equals(A2Source.DEFAULT_A2_URI)) {
                                        if (Files.exists(homePath))
                                                provisioningManager.registerSource(
                                                                A2Source.SCHEME_A2 + "://" + homePath.toString() + "/.local/share/a2" + queryPart);
                                        provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/local/lib/a2" + queryPart);
                                        provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2 + ":///usr/lib/a2" + queryPart);
+                               } else if (source.trim().equals(A2Source.DEFAULT_A2_REFERENCE_URI)) {
+                                       if (Files.exists(homePath))
+                                               provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + "://" + homePath.toString()
+                                                               + "/.local/share/a2" + queryPart);
+                                       provisioningManager
+                                                       .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/share/a2" + queryPart);
+                                       provisioningManager
+                                                       .registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/local/lib/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/share/a2" + queryPart);
+                                       provisioningManager.registerSource(A2Source.SCHEME_A2_REFERENCE + ":///usr/lib/a2" + queryPart);
                                } else {
                                        provisioningManager.registerSource(source + queryPart);
                                }
@@ -125,41 +124,11 @@ public class OsgiBoot implements OsgiBootConstants {
        public void bootstrap(Map<String, String> properties) {
                try {
                        long begin = System.currentTimeMillis();
-                       // check properties
-//                     if (properties != null) {
-//                             for (String property : properties.keySet()) {
-//                                     String value = properties.get(property);
-//                                     String bcValue = bundleContext.getProperty(property);
-//                                     if (PROP_OSGI_CONFIGURATION_AREA.equals(property) || PROP_OSGI_INSTANCE_AREA.equals(property)) {
-//                                             try {
-//                                                     if (value.startsWith("/"))
-//                                                             value = "file://" + value;
-//                                                     URL uri = new URL(value);
-//                                                     URL bcUri = new URL(bcValue);
-//                                                     if (!uri.equals(bcUri))
-//                                                             throw new IllegalArgumentException("Property " + property + "=" + uri
-//                                                                             + " is inconsistent with bundle context : " + bcUri);
-//                                             } catch (MalformedURLException e) {
-//                                                     throw new IllegalArgumentException("Malformed property " + property, e);
-//                                             }
-//
-//                                     } else {
-//                                             if (!value.equals(bcValue))
-//                                                     throw new IllegalArgumentException("Property " + property + "=" + value
-//                                                                     + " is inconsistent with bundle context : " + bcValue);
-//                                     }
-//                             }
-//                     } else {
-//                             String useSystemProperties = bundleContext.getProperty(PROP_OSGI_USE_SYSTEM_PROPERTIES);
-//                             if (useSystemProperties == null || !useSystemProperties.equals("true")) {
-//                                     OsgiBootUtils.warn("No properties passed but " + PROP_OSGI_USE_SYSTEM_PROPERTIES + " is not set.");
-//                             }
-//                     }
 
                        // notify start
-                       String osgiInstancePath = getProperty(PROP_OSGI_INSTANCE_AREA);
-                       String osgiConfigurationPath = getProperty(PROP_OSGI_CONFIGURATION_AREA);
-                       String osgiSharedConfigurationPath = getProperty(PROP_OSGI_CONFIGURATION_AREA);
+                       String osgiInstancePath = getProperty(InitConstants.PROP_OSGI_INSTANCE_AREA);
+                       String osgiConfigurationPath = getProperty(InitConstants.PROP_OSGI_CONFIGURATION_AREA);
+                       String osgiSharedConfigurationPath = getProperty(InitConstants.PROP_OSGI_CONFIGURATION_AREA);
                        OsgiBootUtils.info("OSGi bootstrap starting" //
                                        + (osgiInstancePath != null ? " data: " + osgiInstancePath + "" : "") //
                                        + (osgiConfigurationPath != null ? " state: " + osgiConfigurationPath + "" : "") //
@@ -173,6 +142,9 @@ public class OsgiBoot implements OsgiBootConstants {
                        // A2 install bundles
                        provisioningManager.install(null);
 
+                       // Make sure fragments are properly considered by refreshing
+                       refreshFramework();
+
                        // start bundles
 //                     if (properties != null && !Boolean.parseBoolean(properties.get(PROP_OSGI_USE_SYSTEM_PROPERTIES)))
                        startBundles(properties);
@@ -241,7 +213,7 @@ public class OsgiBoot implements OsgiBootConstants {
                        String url = (String) urls.get(i);
                        installUrl(url, installedBundles);
                }
-               refreshFramework();
+//             refreshFramework();
        }
 
        /** Actually install the provided URL */
@@ -251,8 +223,8 @@ public class OsgiBoot implements OsgiBootConstants {
                                Bundle bundle = (Bundle) installedBundles.get(url);
                                if (OsgiBootUtils.isDebug())
                                        debug("Bundle " + bundle.getSymbolicName() + " already installed from " + url);
-                       } else if (url.contains("/" + SYMBOLIC_NAME_EQUINOX + "/")
-                                       || url.contains("/" + SYMBOLIC_NAME_OSGI_BOOT + "/")) {
+                       } else if (url.contains("/" + InitConstants.SYMBOLIC_NAME_EQUINOX + "/")
+                                       || url.contains("/" + InitConstants.SYMBOLIC_NAME_INIT + "/")) {
                                if (OsgiBootUtils.isDebug())
                                        warn("Skip " + url);
                                return;
@@ -298,8 +270,8 @@ public class OsgiBoot implements OsgiBootConstants {
                } catch (BundleException e) {
                        final String ALREADY_INSTALLED = "is already installed";
                        String message = e.getMessage();
-                       if ((message.contains("Bundle \"" + SYMBOLIC_NAME_OSGI_BOOT + "\"")
-                                       || message.contains("Bundle \"" + SYMBOLIC_NAME_EQUINOX + "\""))
+                       if ((message.contains("Bundle \"" + InitConstants.SYMBOLIC_NAME_INIT + "\"")
+                                       || message.contains("Bundle \"" + InitConstants.SYMBOLIC_NAME_EQUINOX + "\""))
                                        && message.contains(ALREADY_INSTALLED)) {
                                // silent, in order to avoid warnings: we know that both
                                // have already been installed...
@@ -318,15 +290,6 @@ public class OsgiBoot implements OsgiBootConstants {
        /*
         * START
         */
-//     /**
-//      * Start bundles based on system properties.
-//      * 
-//      * @see OsgiBoot#doStartBundles(Map)
-//      */
-//     public void startBundles() {
-//             Properties properties = System.getProperties();
-//             startBundles(properties);
-//     }
 
        /**
         * Start bundles based on these properties.
@@ -339,15 +302,15 @@ public class OsgiBoot implements OsgiBootConstants {
                if (properties != null) {
                        for (String key : properties.keySet()) {
                                String property = key;
-                               if (property.startsWith(PROP_ARGEO_OSGI_START)) {
+                               if (property.startsWith(InitConstants.PROP_ARGEO_OSGI_START)) {
                                        map.put(property, properties.get(property));
                                }
                        }
                }
                // then try all start level until a maximum
-               int maxStartLevel = Integer.parseInt(getProperty(PROP_ARGEO_OSGI_MAX_START_LEVEL, DEFAULT_MAX_START_LEVEL));
+               int maxStartLevel = Integer.parseInt(getProperty(InitConstants.PROP_ARGEO_OSGI_MAX_START_LEVEL, DEFAULT_MAX_START_LEVEL));
                for (int i = 1; i <= maxStartLevel; i++) {
-                       String key = PROP_ARGEO_OSGI_START + "." + i;
+                       String key = InitConstants.PROP_ARGEO_OSGI_START + "." + i;
                        String value = getProperty(key);
                        if (value != null)
                                map.put(key, value);
@@ -355,7 +318,7 @@ public class OsgiBoot implements OsgiBootConstants {
                }
                // finally, override with system properties
                for (Object key : System.getProperties().keySet()) {
-                       if (key.toString().startsWith(PROP_ARGEO_OSGI_START)) {
+                       if (key.toString().startsWith(InitConstants.PROP_ARGEO_OSGI_START)) {
                                map.put(key.toString(), System.getProperty(key.toString()));
                        }
                }
@@ -370,7 +333,7 @@ public class OsgiBoot implements OsgiBootConstants {
                if (properties != null) {
                        for (Object key : properties.keySet()) {
                                String property = key.toString();
-                               if (property.startsWith(PROP_ARGEO_OSGI_START)) {
+                               if (property.startsWith(InitConstants.PROP_ARGEO_OSGI_START)) {
                                        map.put(property, properties.get(property).toString());
                                }
                        }
@@ -378,13 +341,22 @@ public class OsgiBoot implements OsgiBootConstants {
                startBundles(map);
        }
 
-       /** Start bundle based on keys starting with {@link #PROP_ARGEO_OSGI_START}. */
+       /** Start bundle based on keys starting with {@link InitConstants#PROP_ARGEO_OSGI_START}. */
        protected void doStartBundles(Map<String, String> properties) {
                FrameworkStartLevel frameworkStartLevel = bundleContext.getBundle(0).adapt(FrameworkStartLevel.class);
 
                // default and active start levels from System properties
-               Integer defaultStartLevel = Integer.parseInt(getProperty(PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL, "4"));
-               Integer activeStartLevel = Integer.parseInt(getProperty(PROP_OSGI_STARTLEVEL, "6"));
+               int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel();
+               int defaultStartLevel = Integer.parseInt(getProperty(InitConstants.PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL, "4"));
+               int activeStartLevel = Integer.parseInt(getProperty(InitConstants.PROP_OSGI_STARTLEVEL, "6"));
+               if (OsgiBootUtils.isDebug()) {
+                       OsgiBootUtils.debug("OSGi default start level: "
+                                       + getProperty(InitConstants.PROP_OSGI_BUNDLES_DEFAULTSTARTLEVEL, "<not set>") + ", using " + defaultStartLevel);
+                       OsgiBootUtils.debug("OSGi active start level: " + getProperty(InitConstants.PROP_OSGI_STARTLEVEL, "<not set>")
+                                       + ", using " + activeStartLevel);
+                       OsgiBootUtils.debug("Framework start level: " + frameworkStartLevel.getStartLevel() + " (initial: "
+                                       + initialStartLevel + ")");
+               }
 
                SortedMap<Integer, List<String>> startLevels = new TreeMap<Integer, List<String>>();
                computeStartLevels(startLevels, properties, defaultStartLevel);
@@ -394,7 +366,23 @@ public class OsgiBoot implements OsgiBootConstants {
                        for (String bsn : startLevels.get(level))
                                bundleStartLevels.put(bsn, level);
                }
-               for (Bundle bundle : bundleContext.getBundles()) {
+
+               // keep only bundles with the highest version
+               Map<String, Bundle> startableBundles = new HashMap<>();
+               bundles: for (Bundle bundle : bundleContext.getBundles()) {
+                       if (bundle.getVersion() == null)
+                               continue bundles;
+                       String bsn = bundle.getSymbolicName();
+                       if (!startableBundles.containsKey(bsn)) {
+                               startableBundles.put(bsn, bundle);
+                       } else {
+                               if (bundle.getVersion().compareTo(startableBundles.get(bsn).getVersion()) > 0) {
+                                       startableBundles.put(bsn, bundle);
+                               }
+                       }
+               }
+
+               for (Bundle bundle : startableBundles.values()) {
                        String bsn = bundle.getSymbolicName();
                        if (bundleStartLevels.containsKey(bsn)) {
                                BundleStartLevel bundleStartLevel = bundle.adapt(BundleStartLevel.class);
@@ -407,28 +395,55 @@ public class OsgiBoot implements OsgiBootConstants {
                                                OsgiBootUtils.error("Cannot mark " + bsn + " as started", e);
                                        }
                                        if (OsgiBootUtils.isDebug())
-                                               OsgiBootUtils.debug(bsn + " starts at level " + level);
+                                               OsgiBootUtils.debug(bsn + " v" + bundle.getVersion() + " starts at level " + level);
                                }
                        }
                }
+
+               if (OsgiBootUtils.isDebug())
+                       OsgiBootUtils.debug("About to set framework start level to " + activeStartLevel + " ...");
+
                frameworkStartLevel.setStartLevel(activeStartLevel, (FrameworkEvent event) -> {
-                       if (OsgiBootUtils.isDebug())
-                               OsgiBootUtils.debug("Framework event: " + event);
-                       int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel();
-                       int startLevel = frameworkStartLevel.getStartLevel();
-                       OsgiBootUtils.debug("Framework start level: " + startLevel + " (initial: " + initialStartLevel + ")");
+                       if (event.getType() == FrameworkEvent.ERROR) {
+                               OsgiBootUtils.error("Start sequence failed", event.getThrowable());
+                       } else {
+                               if (OsgiBootUtils.isDebug())
+                                       OsgiBootUtils.debug("Framework started at level " + frameworkStartLevel.getStartLevel());
+                       }
                });
+
+//             // Start the framework level after level
+//             int currentStartLevel = frameworkStartLevel.getStartLevel();
+//             stages: for (int stage = currentStartLevel + 1; stage <= activeStartLevel; stage++) {
+//                     if (OsgiBootUtils.isDebug())
+//                             OsgiBootUtils.debug("Starting stage " + stage + "...");
+//                     final int nextStage = stage;
+//                     final CompletableFuture<FrameworkEvent> stageCompleted = new CompletableFuture<>();
+//                     frameworkStartLevel.setStartLevel(nextStage, (FrameworkEvent event) -> {
+//                             stageCompleted.complete(event);
+//                     });
+//                     FrameworkEvent event;
+//                     try {
+//                             event = stageCompleted.get();
+//                     } catch (InterruptedException | ExecutionException e) {
+//                             throw new IllegalStateException("Cannot continue start", e);
+//                     }
+//                     if (event.getThrowable() != null) {
+//                             OsgiBootUtils.error("Stage " + nextStage + " failed, aborting start.", event.getThrowable());
+//                             break stages;
+//                     }
+//             }
        }
 
        private static void computeStartLevels(SortedMap<Integer, List<String>> startLevels, Map<String, String> properties,
                        Integer defaultStartLevel) {
 
                // default (and previously, only behaviour)
-               appendToStartLevels(startLevels, defaultStartLevel, properties.getOrDefault(PROP_ARGEO_OSGI_START, ""));
+               appendToStartLevels(startLevels, defaultStartLevel, properties.getOrDefault(InitConstants.PROP_ARGEO_OSGI_START, ""));
 
                // list argeo.osgi.start.* system properties
                Iterator<String> keys = properties.keySet().iterator();
-               final String prefix = PROP_ARGEO_OSGI_START + ".";
+               final String prefix = InitConstants.PROP_ARGEO_OSGI_START + ".";
                while (keys.hasNext()) {
                        String key = keys.next();
                        if (key.startsWith(prefix)) {
@@ -467,109 +482,6 @@ public class OsgiBoot implements OsgiBootConstants {
                }
        }
 
-//     /**
-//      * Start the provided list of bundles
-//      *
-//      * @return whether all bundles are now in active state
-//      * @deprecated
-//      */
-//     @Deprecated
-//     public boolean startBundles(List<String> bundlesToStart) {
-//             if (bundlesToStart.size() == 0)
-//                     return true;
-//
-//             // used to monitor ACTIVE states
-//             List<Bundle> startedBundles = new ArrayList<Bundle>();
-//             // used to log the bundles not found
-//             List<String> notFoundBundles = new ArrayList<String>(bundlesToStart);
-//
-//             Bundle[] bundles = bundleContext.getBundles();
-//             long startBegin = System.currentTimeMillis();
-//             for (int i = 0; i < bundles.length; i++) {
-//                     Bundle bundle = bundles[i];
-//                     String symbolicName = bundle.getSymbolicName();
-//                     if (bundlesToStart.contains(symbolicName))
-//                             try {
-//                                     try {
-//                                             bundle.start();
-//                                             if (OsgiBootUtils.isDebug())
-//                                                     debug("Bundle " + symbolicName + " started");
-//                                     } catch (Exception e) {
-//                                             OsgiBootUtils.warn("Start of bundle " + symbolicName + " failed because of " + e
-//                                                             + ", maybe bundle is not yet resolved," + " waiting and trying again.");
-//                                             waitForBundleResolvedOrActive(startBegin, bundle);
-//                                             bundle.start();
-//                                             startedBundles.add(bundle);
-//                                     }
-//                                     notFoundBundles.remove(symbolicName);
-//                             } catch (Exception e) {
-//                                     OsgiBootUtils.warn("Bundle " + symbolicName + " cannot be started: " + e.getMessage());
-//                                     if (OsgiBootUtils.isDebug())
-//                                             e.printStackTrace();
-//                                     // was found even if start failed
-//                                     notFoundBundles.remove(symbolicName);
-//                             }
-//             }
-//
-//             for (int i = 0; i < notFoundBundles.size(); i++)
-//                     OsgiBootUtils.warn("Bundle '" + notFoundBundles.get(i) + "' not started because it was not found.");
-//
-//             // monitors that all bundles are started
-//             long beginMonitor = System.currentTimeMillis();
-//             boolean allStarted = !(startedBundles.size() > 0);
-//             List<String> notStarted = new ArrayList<String>();
-//             while (!allStarted && (System.currentTimeMillis() - beginMonitor) < defaultTimeout) {
-//                     notStarted = new ArrayList<String>();
-//                     allStarted = true;
-//                     for (int i = 0; i < startedBundles.size(); i++) {
-//                             Bundle bundle = (Bundle) startedBundles.get(i);
-//                             // TODO check behaviour of lazs bundles
-//                             if (bundle.getState() != Bundle.ACTIVE) {
-//                                     allStarted = false;
-//                                     notStarted.add(bundle.getSymbolicName());
-//                             }
-//                     }
-//                     try {
-//                             Thread.sleep(100);
-//                     } catch (InterruptedException e) {
-//                             // silent
-//                     }
-//             }
-//             long duration = System.currentTimeMillis() - beginMonitor;
-//
-//             if (!allStarted)
-//                     for (int i = 0; i < notStarted.size(); i++)
-//                             OsgiBootUtils.warn("Bundle '" + notStarted.get(i) + "' not ACTIVE after " + (duration / 1000) + "s");
-//
-//             return allStarted;
-//     }
-
-//     /** Waits for a bundle to become active or resolved */
-//     @Deprecated
-//     private void waitForBundleResolvedOrActive(long startBegin, Bundle bundle) throws Exception {
-//             int originalState = bundle.getState();
-//             if ((originalState == Bundle.RESOLVED) || (originalState == Bundle.ACTIVE))
-//                     return;
-//
-//             String originalStateStr = OsgiBootUtils.stateAsString(originalState);
-//
-//             int currentState = bundle.getState();
-//             while (!(currentState == Bundle.RESOLVED || currentState == Bundle.ACTIVE)) {
-//                     long now = System.currentTimeMillis();
-//                     if ((now - startBegin) > defaultTimeout * 10)
-//                             throw new Exception("Bundle " + bundle.getSymbolicName() + " was not RESOLVED or ACTIVE after "
-//                                             + (now - startBegin) + "ms (originalState=" + originalStateStr + ", currentState="
-//                                             + OsgiBootUtils.stateAsString(currentState) + ")");
-//
-//                     try {
-//                             Thread.sleep(100l);
-//                     } catch (InterruptedException e) {
-//                             // silent
-//                     }
-//                     currentState = bundle.getState();
-//             }
-//     }
-
        /*
         * BUNDLE PATTERNS INSTALLATION
         */
@@ -595,6 +507,7 @@ public class OsgiBoot implements OsgiBootConstants {
        }
 
        /** Implements the path matching logic */
+       @Deprecated
        public List<String> getBundlesUrls(String baseUrl, String bundlePatterns) {
                List<String> urls = new ArrayList<String>();
                if (bundlePatterns == null)
@@ -689,16 +602,6 @@ public class OsgiBoot implements OsgiBootConstants {
 
                        distributionBundle = new DistributionBundle(baseUrl, distributionUrl, localCache);
                }
-               // if (baseUrl != null && !(distributionUrl.startsWith("http") ||
-               // distributionUrl.startsWith("file"))) {
-               // // relative url
-               // distributionBundle = new DistributionBundle(baseUrl, distributionUrl,
-               // localCache);
-               // } else {
-               // distributionBundle = new DistributionBundle(distributionUrl);
-               // if (baseUrl != null)
-               // distributionBundle.setBaseUrl(baseUrl);
-               // }
                distributionBundle.processUrl();
                return distributionBundle.listUrls();
        }
@@ -806,6 +709,7 @@ public class OsgiBoot implements OsgiBootConstants {
        private void refreshFramework() {
                Bundle systemBundle = bundleContext.getBundle(0);
                FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
+               // TODO deal with refresh breaking native loading (e.g SWT)
                frameworkWiring.refreshBundles(null);
        }
 
@@ -830,36 +734,8 @@ public class OsgiBoot implements OsgiBootConstants {
         * BEAN METHODS
         */
 
-//     public boolean getDebug() {
-//             return OsgiBootUtils.debug;
-//     }
-
-       // public void setDebug(boolean debug) {
-       // this.debug = debug;
-       // }
-
        public BundleContext getBundleContext() {
                return bundleContext;
        }
 
-//     public String getLocalCache() {
-//             return localCache;
-//     }
-
-       // public void setDefaultTimeout(long defaultTimeout) {
-       // this.defaultTimeout = defaultTimeout;
-       // }
-
-       // public boolean isExcludeSvn() {
-       // return excludeSvn;
-       // }
-       //
-       // public void setExcludeSvn(boolean excludeSvn) {
-       // this.excludeSvn = excludeSvn;
-       // }
-
-       /*
-        * INTERNAL CLASSES
-        */
-
 }