Beispiel #1
0
 @Override
 public void undeployBundle(String bundleName) throws BundleException {
   if (bundleName == null) {
     // ignore
     return;
   }
   log.info(
       String.format(
           "Before undeploy bundle with name '%s'.\n" + "%s", bundleName, getRuntimeStatus()));
   BundleContext ctx = getBundleContext();
   ServiceReference ref = ctx.getServiceReference(PackageAdmin.class.getName());
   PackageAdmin srv = (PackageAdmin) ctx.getService(ref);
   try {
     for (Bundle b : srv.getBundles(bundleName, null)) {
       if (b != null && b.getState() == Bundle.ACTIVE) {
         Transaction tx = TransactionHelper.suspendTransaction();
         try {
           b.stop();
           b.uninstall();
         } finally {
           TransactionHelper.resumeTransaction(tx);
         }
       }
     }
   } finally {
     ctx.ungetService(ref);
   }
   log.info(String.format("Undeploy done.\n" + "%s", getRuntimeStatus()));
 }
  /**
   * This will try and find a resource of the given name using the bundle from which was originally
   * loaded the given class so as to try and detect if it is jarred. If <code>clazz</code> hasn't
   * been loaded from a bundle class loader, we'll resort to the default class loader mechanism.
   * This will only return <code>null</code> in the case where the resource at <code>resourcePath
   * </code> cannot be located at all.
   *
   * @param clazz Class which class loader will be used to try and locate the resource.
   * @param resourcePath Path of the resource we seek, relative to the class.
   * @return The URL of the resource as we could locate it.
   * @throws IOException This will be thrown if we fail to convert bundle-scheme URIs into
   *     file-scheme URIs.
   */
  public static URL getResourceURL(Class<?> clazz, String resourcePath) throws IOException {
    BundleContext context = AcceleoCommonPlugin.getDefault().getContext();
    ServiceReference packageAdminReference =
        context.getServiceReference(PackageAdmin.class.getName());
    PackageAdmin packageAdmin = null;
    if (packageAdminReference != null) {
      packageAdmin = (PackageAdmin) context.getService(packageAdminReference);
    }

    URL resourceURL = null;
    if (packageAdmin != null) {
      Bundle bundle = packageAdmin.getBundle(clazz);
      if (bundle != null) {
        final String pathSeparator = "/"; // $NON-NLS-1$
        // We found the appropriate bundle. We'll now try and determine whether the emtl is jarred
        resourceURL = getBundleResourceURL(bundle, pathSeparator, resourcePath);
      }
    }
    /*
     * We couldn't locate either the bundle which loaded the class or the resource. Resort to the class
     * loader and return null if it cannot locate the resource either.
     */
    if (resourceURL == null) {
      resourceURL = clazz.getResource(resourcePath);
    }

    if (packageAdminReference != null) {
      context.ungetService(packageAdminReference);
    }
    return resourceURL;
  }
Beispiel #3
0
 private static Bundle getBundleForPackage(final String packageStr) {
   ExportedPackage pkg = null;
   final String pkgString;
   String versionString = null;
   final String[] tokens = StringUtils.splitString(packageStr, ";");
   pkgString = tokens[0];
   for (int j = 0; j < tokens.length; j++) {
     if (tokens[j].startsWith("version")) {
       versionString = tokens[j].substring("version=".length());
       break;
     }
   }
   if (RemoteOSGiServiceImpl.IS_R4 && versionString != null) {
     final ExportedPackage[] pkgs = pkgAdmin.getExportedPackages(pkgString);
     if (pkgs == null) {
       return null;
     }
     for (int j = 0; j < pkgs.length; j++) {
       final boolean matches = StringUtils.isVersionInRange(pkgs[j].getVersion(), versionString);
       if (matches && (pkg == null || pkgs[j].getVersion().compareTo(pkg.getVersion()) > 0)) {
         pkg = pkgs[j];
       }
     }
   } else {
     pkg = pkgAdmin.getExportedPackage(pkgString);
   }
   return pkg == null ? null : pkg.getExportingBundle();
 }
  @Test
  public void testAttachedFragmentEar() throws Exception {
    ModelControllerClient client =
        FrameworkUtils.waitForService(context, ModelControllerClient.class);
    ServerDeploymentHelper server = new ServerDeploymentHelper(client);

    // Deploy the fragment
    InputStream input = deployer.getDeployment(GOOD_FRAGMENT_EAR);
    String earName = server.deploy(GOOD_FRAGMENT_EAR, input);

    // Find the deployed fragment
    Bundle fragment = packageAdmin.getBundles(GOOD_FRAGMENT, null)[0];
    Assert.assertEquals("Bundle RESOLVED", Bundle.RESOLVED, fragment.getState());

    // Find the deployed bundle
    Bundle host = packageAdmin.getBundles(GOOD_BUNDLE, null)[0];
    Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, host.getState());

    Class<?> clazz =
        host.loadClass("org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType");
    Assert.assertNotNull("Class not null", clazz);
    Assert.assertSame(host, ((BundleReference) clazz.getClassLoader()).getBundle());

    server.undeploy(earName);
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, fragment.getState());
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, host.getState());
  }
  @Test
  public void testUnattachedFragment() throws Exception {
    ModelControllerClient client =
        FrameworkUtils.waitForService(context, ModelControllerClient.class);
    ServerDeploymentHelper server = new ServerDeploymentHelper(client);

    // Deploy the bundle
    InputStream input = deployer.getDeployment(GOOD_BUNDLE);
    String hostName = server.deploy("bundle-host", input);

    // Find the deployed bundle
    Bundle host = packageAdmin.getBundles(GOOD_BUNDLE, null)[0];
    Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, host.getState());

    // Deploy the fragment
    input = deployer.getDeployment(GOOD_FRAGMENT);
    String fragmentName = server.deploy("bundle-fragment", input);

    // Find the deployed bundle
    Bundle fragment = packageAdmin.getBundles(GOOD_FRAGMENT, null)[0];
    Assert.assertEquals("Bundle INSTALLED", Bundle.INSTALLED, fragment.getState());

    try {
      host.loadClass("org.jboss.as.test.integration.osgi.deployment.bundle.AttachedType");
      Assert.fail("ClassNotFoundException expected");
    } catch (ClassNotFoundException ex) {
      // expected
    }

    server.undeploy(fragmentName);
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, fragment.getState());

    server.undeploy(hostName);
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, host.getState());
  }
  @Test
  public void testRedeployAfterUndeploy() throws Exception {
    ModelControllerClient client =
        FrameworkUtils.waitForService(context, ModelControllerClient.class);
    ServerDeploymentHelper server = new ServerDeploymentHelper(client);

    // Deploy the bundle
    InputStream input = deployer.getDeployment(GOOD_BUNDLE);
    String runtimeName = server.deploy("redeploy", input);

    // Find the deployed bundle
    Bundle bundle = packageAdmin.getBundles(GOOD_BUNDLE, null)[0];
    Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState());

    server.undeploy(runtimeName);
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState());

    // Redeploy the same bundle
    input = deployer.getDeployment(GOOD_BUNDLE);
    runtimeName = server.deploy("redeploy", input);

    // Find the deployed bundle
    bundle = packageAdmin.getBundles(GOOD_BUNDLE, null)[0];
    Assert.assertEquals("Bundle ACTIVE", Bundle.ACTIVE, bundle.getState());

    server.undeploy(runtimeName);
    Assert.assertEquals("Bundle UNINSTALLED", Bundle.UNINSTALLED, bundle.getState());
  }
 /**
  * Finds the {@link BundleWire} on the specified bundle for the package name
  *
  * @param bundleContext Context to use to lookup OSGi services
  * @param bundle Bundle to find the {@link BundleWire} on
  * @param packageName Name of the import package to find the wiring for
  * @return {@link BundleWire} for the specified package or <code>null</code> if none found
  */
 public static BundleWire getBundleWire(
     BundleContext bundleContext, Bundle bundle, String packageName) {
   try {
     BundleWire result = null;
     final PackageAdmin packageAdmin = getPackageAdmin(bundleContext);
     final BundleWiring wiring = bundle.adapt(BundleWiring.class);
     if (wiring != null) {
       for (BundleWire required : wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE)) {
         final org.osgi.service.packageadmin.ExportedPackage[] exportedPackages =
             packageAdmin.getExportedPackages(required.getProviderWiring().getBundle());
         for (org.osgi.service.packageadmin.ExportedPackage exportedPackage : exportedPackages) {
           if (packageName.equals(exportedPackage.getName())) {
             result = required;
             break;
           }
         }
         if (result != null) {
           break;
         }
       }
     }
     return result;
   } catch (Exception exception) {
     throw new RuntimeException(
         String.format(
             "Failed to determine bundle wiring for bundle: %s Package: %s", bundle, packageName),
         exception);
   }
 }
 /**
  * Returns the bundle id of the bundle that contains the provided object, or <code>null</code> if
  * the bundle could not be determined.
  */
 public String getBundleId(Object object) {
   if (bundleTracker == null) {
     if (JobManager.DEBUG) JobMessages.message("Bundle tracker is not set"); // $NON-NLS-1$
     return null;
   }
   PackageAdmin packageAdmin = (PackageAdmin) bundleTracker.getService();
   if (object == null) return null;
   if (packageAdmin == null) return null;
   Bundle source = packageAdmin.getBundle(object.getClass());
   if (source != null && source.getSymbolicName() != null) return source.getSymbolicName();
   return null;
 }
 protected Bundle getBundle(String symbolicName) {
   PackageAdmin packageAdmin = packageAdminTracker.getService();
   if (packageAdmin == null) return null;
   Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
   if (bundles == null) return null;
   // Return the first bundle that is not installed or uninstalled
   for (int i = 0; i < bundles.length; i++) {
     if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
       return bundles[i];
     }
   }
   return null;
 }
 public Bundle getBundle(String bundleName) {
   PackageAdmin packageAdmin = getPackageAdmin();
   if (packageAdmin == null) return null;
   Bundle[] bundles = packageAdmin.getBundles(bundleName, null);
   if (bundles == null) return null;
   // Return the first bundle that is not installed or uninstalled
   for (int i = 0; i < bundles.length; i++) {
     if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
       return bundles[i];
     }
   }
   return null;
 }
Beispiel #11
0
  static byte[] getBundle(final Bundle bundle) throws IOException {
    final byte[] buffer = new byte[BUFFER_SIZE];
    final CRC32 crc = getEntry == null ? null : new CRC32();
    final ByteArrayOutputStream out =
        getEntry == null ? new ByteArrayOutputStream(BUFFER_SIZE) : null;

    if (getEntry == null) {
      return getBundleConcierge(bundle, buffer, out);
    }

    try {
      // workaround for Eclipse
      final String prefix =
          getEntry.invoke(
                      bundle,
                      new Object[] {
                        pkgAdmin.getExportedPackages(bundle)[0].getName().replace('.', '/')
                      })
                  == null
              ? "/bin" //$NON-NLS-1$
              : ""; //$NON-NLS-1$

      return generateBundle(bundle, prefix, buffer, crc);
    } catch (Exception e) {
      e.printStackTrace();
      throw new IOException(e.getMessage());
    }
  }
  /**
   * Stop the bundles in the supplied crates. Inter-crate dependencies are NOT expanded.
   *
   * @param context a bundle context
   * @param crates the list of crates to be stopped
   * @return the list of stopped Bundles
   * @throws CrateException wrapping any other exceptions that happen
   */
  public static List<Bundle> stopBundles(BundleContext context, Crate... crates)
      throws CrateException {
    Logger logger = Logger.getLogger(CrateStarterElf.class);

    // get the set of currently installed bundles...
    Map<String, Bundle> installed = new HashMap<String, Bundle>();
    for (Bundle bundle : context.getBundles()) {
      installed.put(bundle.getSymbolicName(), bundle);
    }

    ServiceReference reference = context.getServiceReference(PackageAdmin.class.getName());
    PackageAdmin packageAdmin = (PackageAdmin) context.getService(reference);

    List<Bundle> stoppedBundles = new ArrayList<Bundle>();

    // Shutdown in reverse order...
    List<Crate> cratesReversed = Arrays.asList(crates);
    Collections.reverse(cratesReversed);

    for (Crate crate : cratesReversed) {
      // Shutdown in reverse order...
      List<CrateBundle> bundles = crate.getBundles();
      Collections.reverse(bundles);

      for (CrateBundle cb : bundles) {
        Bundle bundle = installed.get(cb.getId());
        if (bundle != null && !bundle.getSymbolicName().startsWith("org.eclipse")) {
          try {
            Dictionary<?, ?> dict = bundle.getHeaders();
            String bundleVersion = (String) dict.get("Bundle-Version");
            if (bundleVersion != null && bundleVersion.equals(cb.getVersion())) {
              if (packageAdmin.getBundleType(bundle) != PackageAdmin.BUNDLE_TYPE_FRAGMENT) {
                logger.debug("Stopping bundle " + bundle.getSymbolicName() + " " + bundleVersion);
                bundle.stop();
              }
            }
          } catch (BundleException be) {
            logger.warn("Error stopping bundle " + cb.getId(), be);
          }
        }
      }
    }

    return stoppedBundles;
  }
  /**
   * Returns the bundles with the given name.
   *
   * @param bundleName The bundle name.
   * @return The bundles with the given name.
   */
  public static Bundle[] getBundles(String bundleName) {
    Bundle[] bundle = null;
    BundleContext context = AcceleoCommonPlugin.getDefault().getContext();
    ServiceReference packageAdminReference =
        context.getServiceReference(PackageAdmin.class.getName());
    PackageAdmin packageAdmin = null;
    if (packageAdminReference != null) {
      packageAdmin = (PackageAdmin) context.getService(packageAdminReference);
    }

    if (packageAdmin != null) {
      bundle = packageAdmin.getBundles(bundleName, null);
    }
    if (packageAdminReference != null) {
      context.ungetService(packageAdminReference);
    }
    return bundle;
  }
 private static Bundle getBundle(PackageAdmin packageAdmin, String symbolicName) {
   Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
   if (bundles == null) return null;
   for (int i = 0; i < bundles.length; i++) {
     Bundle bundle = bundles[i];
     if ((bundle.getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) return bundle;
   }
   return null;
 }
  /**
   * Refresh the persistence bundle. If persistence units have already been registered they should
   * have been unregistered before making this refresh call.
   *
   * @param b the bundle the p-units are in
   */
  public void refreshBundle(Bundle b) {
    debug("Extender.refreshBundle: ", b);

    // Add the list of currently refreshing bundles.
    // (It will be removed when the UNRESOLVED event is fired on it)
    addToRefreshingBundles(b);

    // Call refresh on all of the packages
    PackageAdmin admin = getPackageAdmin(mgr.getBundleContext());
    admin.refreshPackages(new Bundle[] {b});

    /* New 4.3 code to use to refresh bundle */
    /*
    Bundle systemBundle = mgr.getBundleContext().getBundle(0);
    FrameworkWiring fw = systemBundle.adapt(FrameworkWiring.class);
    fw.refreshBundles(Arrays.asList(b));
    */
  }
  @Test
  public void testAttachedFragment() throws Exception {
    Bundle hostA = installBundle(getHostA());
    assertBundleState(Bundle.INSTALLED, hostA.getState());

    Bundle fragA = installBundle(getFragmentA());
    assertBundleState(Bundle.INSTALLED, fragA.getState());

    hostA.start();
    assertBundleState(Bundle.ACTIVE, hostA.getState());
    assertBundleState(Bundle.RESOLVED, fragA.getState());

    URL entryURL = hostA.getEntry("resource.txt");
    assertNull("Entry URL null", entryURL);

    URL resourceURL = hostA.getResource("resource.txt");
    assertEquals("bundle", resourceURL.getProtocol());
    assertEquals("/resource.txt", resourceURL.getPath());

    BufferedReader br = new BufferedReader(new InputStreamReader(resourceURL.openStream()));
    assertEquals("fragA", br.readLine());

    // Load class provided by the fragment
    assertLoadClass(hostA, FragBeanA.class.getName());

    // Load a private class from host
    assertLoadClass(hostA, SubBeanA.class.getName());

    // PackageAdmin.getBundleType
    PackageAdmin pa = getPackageAdmin();
    assertEquals("Bundle type", 0, pa.getBundleType(hostA));
    assertEquals("Bundle type", PackageAdmin.BUNDLE_TYPE_FRAGMENT, pa.getBundleType(fragA));

    // PackageAdmin.getHosts
    Bundle[] hosts = pa.getHosts(hostA);
    assertNull("Not a fragment", hosts);

    hosts = pa.getHosts(fragA);
    assertNotNull("Hosts not null", hosts);
    assertEquals("Hosts length", 1, hosts.length);
    assertEquals("Hosts equals", hostA, hosts[0]);

    // PackageAdmin.getFragments
    Bundle[] fragments = pa.getFragments(fragA);
    assertNull("Not a host", fragments);

    fragments = pa.getFragments(hostA);
    assertNotNull("Fragments not null", fragments);
    assertEquals("Fragments length", 1, fragments.length);
    assertEquals("Fragments equals", fragA, fragments[0]);

    hostA.uninstall();
    assertBundleState(Bundle.UNINSTALLED, hostA.getState());
    assertBundleState(Bundle.RESOLVED, fragA.getState());

    fragA.uninstall();
    assertBundleState(Bundle.UNINSTALLED, fragA.getState());
  }
  /**
   * This can be used to check whether the given class is located in a dynamically installed bundle.
   *
   * @param clazz The class of which we need to determine the originating bundle.
   * @return <code>true</code> if the given class has been loaded from a dynamic bundle, <code>false
   *     </code> otherwise.
   */
  public boolean isInDynamicBundle(Class<?> clazz) {
    BundleContext context = AcceleoCommonPlugin.getDefault().getContext();
    ServiceReference packageAdminReference =
        context.getServiceReference(PackageAdmin.class.getName());
    PackageAdmin packageAdmin = null;
    if (packageAdminReference != null) {
      packageAdmin = (PackageAdmin) context.getService(packageAdminReference);
    }

    if (packageAdmin != null) {
      Bundle bundle = packageAdmin.getBundle(clazz);
      if (workspaceInstalledBundles.values().contains(bundle)) {
        return true;
      }
    }

    if (packageAdminReference != null) {
      context.ungetService(packageAdminReference);
    }

    return false;
  }
    protected String getPathsToRequiredBundles(String requireTldBundles) throws Exception {
      if (requireTldBundles == null) return null;

      ServiceReference ref =
          _bundle
              .getBundleContext()
              .getServiceReference(org.osgi.service.packageadmin.PackageAdmin.class.getName());
      PackageAdmin packageAdmin =
          (ref == null) ? null : (PackageAdmin) _bundle.getBundleContext().getService(ref);
      if (packageAdmin == null)
        throw new IllegalStateException(
            "Unable to get PackageAdmin reference to locate required Tld bundles");

      StringBuilder paths = new StringBuilder();
      String[] symbNames = requireTldBundles.split(", ");

      for (String symbName : symbNames) {
        Bundle[] bs = packageAdmin.getBundles(symbName, null);
        if (bs == null || bs.length == 0) {
          throw new IllegalArgumentException(
              "Unable to locate the bundle '"
                  + symbName
                  + "' specified by "
                  + OSGiWebappConstants.REQUIRE_TLD_BUNDLE
                  + " in manifest of "
                  + (_bundle == null ? "unknown" : _bundle.getSymbolicName()));
        }

        File f =
            BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(bs[0]);
        if (paths.length() > 0) paths.append(", ");
        paths.append(f.toURI().toURL().toString());
        LOG.debug(
            "getPathsToRequiredBundles: bundle path=" + bs[0].getLocation() + " uri=" + f.toURI());
      }

      return paths.toString();
    }
 /** On start, we do two things We register a listener for bundles and we start our JPA server */
 public void start(BundleContext context) throws Exception {
   Activator.context = context;
   String initializer = null;
   ServiceReference packageAdminRef =
       context.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
   PackageAdmin packageAdmin = (PackageAdmin) context.getService(packageAdminRef);
   Bundle[] fragments = packageAdmin.getFragments(context.getBundle());
   if (fragments != null) {
     for (int i = 0; i < fragments.length; i++) {
       Bundle fragment = fragments[i];
       initializer = (String) fragment.getHeaders().get("JPA-Initializer");
       if (initializer != null) {
         AbstractSessionLog.getLog()
             .log(
                 SessionLog.CONFIG,
                 LoggingLocalization.buildMessage("osgi_initializer", new Object[] {initializer}));
         break;
       }
     }
   }
   osgiProvider = new PersistenceProvider(initializer);
   registerBundleListener();
 }
Beispiel #20
0
 private boolean isFragment(Bundle b) {
   return padmin != null && padmin.getBundleType(b) == PackageAdmin.BUNDLE_TYPE_FRAGMENT;
 }
Beispiel #21
0
  /**
   * @param systemContext
   * @throws MalformedURLException
   * @throws FileNotFoundException
   * @throws IOException
   */
  private void update() throws Exception {
    trace("Updating framework with %s", parms.runbundles);

    // Turn the bundle location paths into files
    List<File> desired = new ArrayList<File>();
    for (Object o : parms.runbundles) {
      File file = new File((String) o).getAbsoluteFile();
      if (!file.exists()) error("Bundle files does not exist: " + file);
      else desired.add(file);
    }

    // deleted = old - new
    List<File> tobedeleted = new ArrayList<File>(installedBundles.keySet());
    tobedeleted.removeAll(desired);

    // updated = old /\ new
    List<File> tobeupdated = new ArrayList<File>(installedBundles.keySet());
    tobeupdated.retainAll(desired);

    // install = new - old
    List<File> tobeinstalled = new ArrayList<File>(desired);
    tobeinstalled.removeAll(installedBundles.keySet());

    List<Bundle> tobestarted = new ArrayList<Bundle>();

    for (File f : tobedeleted)
      try {
        trace("uninstalling %s", f);
        installedBundles.get(f).uninstall();
        installedBundles.remove(f);
      } catch (Exception e) {
        error("Failed to uninstall bundle %s, exception %s", f, e);
      }

    for (File f : tobeinstalled)
      try {
        trace("installing %s", f);
        Bundle b = install(f);
        installedBundles.put(f, b);
        tobestarted.add(b);
      } catch (Exception e) {
        error("Failed to uninstall bundle %s, exception %s", f, e);
      }

    for (File f : tobeupdated)
      try {
        Bundle b = installedBundles.get(f);
        if (b.getLastModified() < f.lastModified()) {
          trace("updating %s", f);
          if (b.getState() == Bundle.ACTIVE) {
            tobestarted.add(b);
            b.stop();
          }
          b.update();
        } else trace("bundle is still current according to timestamp %s", f);
      } catch (Exception e) {
        error("Failed to update bundle %s, exception %s", f, e);
      }

    if (padmin != null) padmin.refreshPackages(null);

    trace("bundles administered %s", installedBundles.keySet());

    // From now on, the bundles are on their own. They have
    // by default AllPermission, but if they install bundles
    // they will not automatically get AllPermission anymore

    // Get the resolved status
    if (padmin != null && padmin.resolveBundles(null) == false) {
      error("could not resolve the bundles");
      // return LauncherConstants.RESOLVE_ERROR;
    }

    // Now start all the installed bundles in the same order
    // (unless they're a fragment)

    trace("Will start bundles: %s", tobestarted);
    for (Bundle b : tobestarted) {
      try {
        trace("starting %s", b.getSymbolicName());
        if (!isFragment(b)) b.start(Bundle.START_ACTIVATION_POLICY);
        trace("started  %s", b.getSymbolicName());
      } catch (BundleException e) {
        error("Failed to start bundle %s-%s, exception %s", b.getSymbolicName(), b.getVersion(), e);
      }
    }
  }
 public Bundle[] getHosts(Bundle bundle) {
   PackageAdmin packageAdmin = getPackageAdmin();
   if (packageAdmin == null) return null;
   return packageAdmin.getHosts(bundle);
 }
 public boolean isFragment(Bundle bundle) {
   PackageAdmin packageAdmin = getPackageAdmin();
   if (packageAdmin == null) return false;
   return (packageAdmin.getBundleType(bundle) & PackageAdmin.BUNDLE_TYPE_FRAGMENT) > 0;
 }
  /** @see junit.framework.TestCase#setUp() */
  @Override
  protected void setUp() throws Exception {
    super.setUp();

    adaptorProvider = EasyMock.createNiceMock(IAdaptorProvider.class);
    context = EasyMock.createNiceMock(BundleContext.class);
    bundle = EasyMock.createMock(Bundle.class);
    otherBundle = EasyMock.createMock(Bundle.class);
    supplementerBundle1 = EasyMock.createMock(Bundle.class);
    supplementerBundle2 = EasyMock.createMock(Bundle.class);
    supplementerBundle3 = EasyMock.createMock(Bundle.class);
    supplementedBundle1 = EasyMock.createMock(Bundle.class);
    supplementedBundle2 = EasyMock.createMock(Bundle.class);
    supplementedBundle3 = EasyMock.createMock(Bundle.class);

    packageAdmin = EasyMock.createMock(PackageAdmin.class);

    EasyMock.expect(packageAdmin.getHosts(bundle)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementedBundle1)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementedBundle2)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementedBundle3)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementerBundle1)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementerBundle2)).andStubReturn(null);
    EasyMock.expect(packageAdmin.getHosts(supplementerBundle3)).andStubReturn(null);

    registry = new SupplementerRegistry(adaptorProvider);
    registry.setBundleContext(context);
    registry.setPackageAdmin(packageAdmin);

    EasyMock.expect(bundle.getBundleId()).andStubReturn(1l);
    EasyMock.expect(otherBundle.getBundleId()).andStubReturn(2l);
    EasyMock.expect(supplementerBundle1.getBundleId()).andStubReturn(3l);
    EasyMock.expect(supplementerBundle2.getBundleId()).andStubReturn(4l);
    EasyMock.expect(supplementerBundle3.getBundleId()).andStubReturn(5l);
    EasyMock.expect(supplementedBundle1.getBundleId()).andStubReturn(6l);
    EasyMock.expect(supplementedBundle2.getBundleId()).andStubReturn(7l);
    EasyMock.expect(supplementedBundle3.getBundleId()).andStubReturn(8l);

    EasyMock.expect(bundle.getSymbolicName()).andStubReturn("symbolic-name-bundle");
    EasyMock.expect(otherBundle.getSymbolicName()).andStubReturn("symbolic-name-otherBundle");
    EasyMock.expect(supplementerBundle1.getSymbolicName())
        .andStubReturn("symbolic-name-supplementerBundle1");
    EasyMock.expect(supplementerBundle2.getSymbolicName())
        .andStubReturn("symbolic-name-supplementerBundle2");
    EasyMock.expect(supplementerBundle3.getSymbolicName())
        .andStubReturn("symbolic-name-supplementerBundle3");
    EasyMock.expect(supplementedBundle1.getSymbolicName())
        .andStubReturn("symbolic-name-supplementedBundle1");
    EasyMock.expect(supplementedBundle2.getSymbolicName())
        .andStubReturn("symbolic-name-supplementedBundle2");
    EasyMock.expect(supplementedBundle3.getSymbolicName()).andStubReturn("different-symbolic-name");

    mocks =
        new Object[] {
          adaptorProvider,
          packageAdmin,
          context,
          bundle,
          otherBundle,
          supplementedBundle1,
          supplementedBundle2,
          supplementedBundle3,
          supplementerBundle1,
          supplementerBundle2,
          supplementerBundle3
        };
  }
  /**
   * test different supplementers and removed supplementers
   *
   * @throws Exception
   */
  public void testSupplementerRegistryWithDifferentRemovedSupplementers() throws Exception {
    Hashtable headers = new Hashtable();
    headers.put("Eclipse-SupplementImporter", "test.import1");
    EasyMock.expect(supplementerBundle1.getHeaders()).andStubReturn(headers);

    headers = new Hashtable();
    headers.put("Eclipse-SupplementExporter", "test.export1");
    EasyMock.expect(supplementerBundle2.getHeaders()).andStubReturn(headers);

    headers = new Hashtable();
    headers.put("Eclipse-SupplementBundle", "symbolic-name-supplementedBundle*");
    EasyMock.expect(supplementerBundle3.getHeaders()).andStubReturn(headers);

    EasyMock.expect(context.getBundles())
        .andStubReturn(
            new Bundle[] {supplementerBundle1, supplementerBundle2, supplementerBundle3});

    headers = new Hashtable();
    headers.put("Import-Package", "test.import1");
    headers.put("Export-Package", "test.export1");
    EasyMock.expect(supplementedBundle1.getHeaders()).andStubReturn(headers);

    headers = new Hashtable();
    EasyMock.expect(supplementedBundle2.getHeaders()).andStubReturn(headers);

    EasyMock.expect(supplementedBundle1.getState()).andStubReturn(Bundle.RESOLVED);
    EasyMock.expect(supplementedBundle2.getState()).andStubReturn(Bundle.RESOLVED);

    packageAdmin.refreshPackages(EasyMock.aryEq(new Bundle[] {supplementedBundle1}));
    packageAdmin.refreshPackages(
        EasyMock.aryEq(new Bundle[] {supplementedBundle1, supplementedBundle2}));

    IWeavingAdaptor adaptor = EasyMock.createNiceMock(IWeavingAdaptor.class);
    EasyMock.expect(adaptorProvider.getAdaptor(6l)).andStubReturn(adaptor);
    EasyMock.expect(adaptorProvider.getAdaptor(7l)).andStubReturn(adaptor);

    EasyMock.replay(mocks);

    registry.addBundle(supplementerBundle1);
    registry.addBundle(supplementerBundle2);
    registry.addBundle(supplementerBundle3);
    registry.addBundle(supplementedBundle1);
    registry.addBundle(supplementedBundle2);

    registry.removeBundle(supplementerBundle1);
    registry.removeBundle(supplementerBundle3);

    Supplementer[] supplementers = registry.getSupplementers(supplementedBundle1);
    assertEquals(1, supplementers.length);
    assertFalse(containsSupplementer(supplementers, supplementerBundle1));
    assertTrue(containsSupplementer(supplementers, supplementerBundle2));
    assertFalse(containsSupplementer(supplementers, supplementerBundle3));

    supplementers = registry.getSupplementers(supplementedBundle2);
    assertEquals(0, supplementers.length);
    assertFalse(containsSupplementer(supplementers, supplementerBundle1));
    assertFalse(containsSupplementer(supplementers, supplementerBundle2));
    assertFalse(containsSupplementer(supplementers, supplementerBundle3));

    EasyMock.verify(mocks);
  }
 /*
  * (non-Javadoc)
  *
  * @see org.araqne.bundle.BundleManager#refresh()
  */
 @Override
 public void refresh() {
   ServiceReference<?> ref = context.getServiceReference(PackageAdmin.class.getName());
   PackageAdmin packageAdmin = (PackageAdmin) context.getService(ref);
   packageAdmin.refreshPackages(null);
 }
 public Bundle getProvider(BundleContext context) {
   ServiceReference sref = context.getServiceReference(PackageAdmin.class.getName());
   PackageAdmin packageAdmin = (PackageAdmin) context.getService(sref);
   Bundle provider = packageAdmin.getBundle(getClass());
   return provider;
 }
  /**
   * Install all bundles contained in the specified crates from the given crate location.
   *
   * @param context The bundle context to use for interacting with OSGi.
   * @param location The location containing the crates.
   * @param crates The set of crates to activate.
   * @return an ordered list of bundles whose 'start' flag is set to true in their containing crate
   * @throws CrateException on read error.
   */
  public static List<Bundle> installBundles(
      BundleContext context, InstallLocation location, Crate... crates) throws CrateException {
    Logger logger = Logger.getLogger(CrateStarterElf.class);

    List<Crate> toLoad = expandDependencies(location, crates);

    Map<String, Bundle> installed = new HashMap<String, Bundle>();
    for (Bundle bundle : context.getBundles()) {
      installed.put(bundle.getSymbolicName(), bundle);
    }

    // prevent osgi from trying to be installed.
    installed.put("org.eclipse.osgi", null);

    ServiceReference reference = context.getServiceReference(StartLevel.class.getName());
    StartLevel start = (StartLevel) context.getService(reference);

    List<Bundle> bundles = new ArrayList<Bundle>();
    List<Bundle> toStart = new LinkedList<Bundle>();

    for (Crate crate : toLoad) {
      for (CrateBundle bundle : crate.getBundles()) {
        if (installed.containsKey(bundle.getId())) {
          if (bundle.isStart()) {
            Bundle alreadyInstalledBundle = installed.get(bundle.getId());
            if (alreadyInstalledBundle != null) {
              int state = alreadyInstalledBundle.getState();
              if (state != Bundle.ACTIVE && state != Bundle.STARTING) {
                toStart.add(alreadyInstalledBundle);
              }
            }
          }

          continue;
        }

        installed.put(bundle.getId(), null);

        // exclude fragments not applicable for the platform.
        if (!location.isApplicable(bundle)) {
          continue;
        }

        File file = getFileForBundle(location.getRoot(), bundle);

        try {
          Bundle b = context.installBundle("reference:file:" + file.toString());
          bundles.add(b);

          if (bundle.getStartLevel() > 0) {
            start.setBundleStartLevel(b, bundle.getStartLevel());
          }

          if (bundle.isStart()) {
            toStart.add(b);
          }

          logger.debug("Installed bundle: " + bundle.getId());
        } catch (BundleException e) {
          logger.warn("Error installing bundle: " + bundle.getId(), e);
        }
      }
    }
    context.ungetService(reference);

    reference = context.getServiceReference(PackageAdmin.class.getName());

    PackageAdmin packageAdmin = (PackageAdmin) context.getService(reference);
    packageAdmin.resolveBundles(bundles.toArray(new Bundle[bundles.size()]));

    context.ungetService(reference);

    return toStart;
  }
  /**
   * Refreshes all exported packages of the given bundles. This must be called after installing the
   * bundle.
   *
   * @param bundles Bundles which exported packages are to be refreshed.
   */
  @SuppressWarnings("restriction")
  void refreshPackages(Bundle[] bundles) {
    BundleContext context = AcceleoCommonPlugin.getDefault().getContext();
    ServiceReference packageAdminReference =
        context.getServiceReference(PackageAdmin.class.getName());
    PackageAdmin packageAdmin = null;
    if (packageAdminReference != null) {
      packageAdmin = (PackageAdmin) context.getService(packageAdminReference);
    }

    if (packageAdmin != null) {
      final boolean[] flag =
          new boolean[] {
            false,
          };
      FrameworkListener listener =
          new FrameworkListener() {
            public void frameworkEvent(FrameworkEvent event) {
              if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
                synchronized (flag) {
                  flag[0] = true;
                  flag.notifyAll();
                }
              }
            }
          };

      /*
       * Hack-ish : Make sure the contributions from this bundle won't be parsed. When installing a
       * bundle, the EclipseBundleListener will _always_ parse the plugin.xml and notify the extension
       * registry (and its listeners) of the new contributions. Problem is : some bundles listen to new
       * contributions, but ignore the event of contribution removals (when we uninstall the bundle). We
       * would thus end with "invalid registry object" exceptions thrown ... with no way to prevent or
       * fix them whatsoever. Equinox does not provide us with an API to disable the contributions from
       * the bundle we're installing, temporarily disable the extension listeners... or any other way to
       * workaround this registry issue. We'll then make use of the fact that the EclipseBundleListener
       * does not add contributions from a contributor which has already been added: we'll add the
       * contributor beforehand with an empty plugin.xml, disabling all potential contributions this
       * bundle would have made otherwise.
       */

      if (bundles != null && Platform.getExtensionRegistry() instanceof IDynamicExtensionRegistry) {
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        for (Bundle bundle : bundles) {
          IContributor contributor = ContributorFactoryOSGi.createContributor(bundle);
          if (!((IDynamicExtensionRegistry) registry).hasContributor(contributor)) {
            registry.addContribution(
                new ByteArrayInputStream(EMPTY_PLUGIN_XML.getBytes()),
                contributor,
                false,
                null,
                null,
                ((ExtensionRegistry) registry).getTemporaryUserToken());
          }
        }
      }

      context.addFrameworkListener(listener);
      packageAdmin.refreshPackages(bundles);
      synchronized (flag) {
        while (!flag[0]) {
          try {
            flag.wait(OSGI_TIMEOUT);
          } catch (InterruptedException e) {
            // discard
            break;
          }
        }
      }
      context.removeFrameworkListener(listener);
      if (packageAdminReference != null) {
        context.ungetService(packageAdminReference);
      }
    }
  }