private void installBundle(String bundleLocation, Set<String> mask, List<Bundle> out) throws BundleException {
        bundleLocation = BundleLocationResolver.resolve(bundleLocation);
        if (mask.contains(bundleLocation)) {
            log.finer("OSGi bundle from '" + bundleLocation + "' already installed.");
            return;
        }
        log.finer("Installing OSGi bundle from '" + bundleLocation + "'.");
        mask.add(bundleLocation);

        Bundle bundle = felix.getBundleContext().installBundle(bundleLocation);
        String symbol = bundle.getSymbolicName();
        if (symbol == null) {
            bundle.uninstall();
            throw new BundleException("Missing Bundle-SymbolicName in manifest from '" + bundleLocation + " " +
                                      "(it might not be an OSGi bundle).");
        }
        out.add(bundle);
        for (String preInstall : OsgiHeader.asList(bundle, OsgiHeader.PREINSTALL_BUNDLE)) {
            log.finer("OSGi bundle '" + symbol + "' requires install from '" + preInstall + "'.");
            installBundle(preInstall, mask, out);
        }
    }
NOTE: This method is no longer used by the Jdisc container framework, but kept for completeness.
jdisc_core/src/main/java/com/yahoo/jdisc/core/FelixFramework.java