예제 #1
0
  private void initialize(final BundleContext context) {
    if (Debug.DEBUG_GENERAL) Debug.println("> AspectJHook.initialize() context=" + context);

    this.bundleContext = context;

    final ISupplementerRegistry supplementerRegistry = getSupplementerRegistry();
    adaptorFactory.initialize(context, supplementerRegistry);

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

    supplementerRegistry.setBundleContext(context);
    supplementerRegistry.setPackageAdmin(packageAdmin);
    context.addBundleListener(new SupplementBundleListener(supplementerRegistry));

    // final re-build supplementer final registry state for final installed bundles
    final Bundle[] installedBundles = context.getBundles();
    for (int i = 0; i < installedBundles.length; i++) {
      supplementerRegistry.addSupplementer(installedBundles[i], false);
    }
    for (int i = 0; i < installedBundles.length; i++) {
      supplementerRegistry.addSupplementedBundle(installedBundles[i]);
    }

    if (Debug.DEBUG_GENERAL)
      Debug.println("< AspectJHook.initialize() adaptorFactory=" + adaptorFactory);
  }
  /** test the supplementer registry by adding a simple bundle without any supplementing to it */
  public void testSupplementerRegistryAddSimpleBundle() {
    EasyMock.expect(bundle.getHeaders()).andStubReturn(new Hashtable());

    EasyMock.replay(mocks);

    registry.addBundle(bundle);
    Supplementer[] supplementers = registry.getSupplementers(bundle);
    assertNotNull(supplementers);
    assertEquals(0, supplementers.length);

    supplementers = registry.getSupplementers(otherBundle);
    assertNotNull(supplementers);
    assertEquals(0, supplementers.length);

    EasyMock.verify(mocks);
  }
  /**
   * test different supplementers and different supplemented bundles
   *
   * @throws Exception
   */
  public void testSupplementerRegistryWithDifferentSupplementers() 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.replay(mocks);

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

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

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

    EasyMock.verify(mocks);
  }
  /**
   * test the supplementer registry with a supplemented bundle
   *
   * @throws Exception
   */
  public void testSupplementerRegistryWithSupplementedBundle() throws Exception {
    final Hashtable headers = new Hashtable();
    headers.put("Eclipse-SupplementBundle", "symbolic-name-supplementedBundle1");
    EasyMock.expect(bundle.getHeaders()).andStubReturn(headers);
    EasyMock.expect(context.getBundles()).andReturn(new Bundle[] {bundle});

    EasyMock.expect(supplementedBundle1.getHeaders()).andStubReturn(new Hashtable());

    EasyMock.replay(mocks);

    registry.addBundle(bundle);
    registry.addBundle(supplementedBundle1);

    final Supplementer[] supplementers = registry.getSupplementers(supplementedBundle1);
    assertSame(bundle, supplementers[0].getSupplementerBundle());

    EasyMock.verify(mocks);
  }
  /**
   * test the supplementer registry by adding a supplementing bundle to it
   *
   * @throws Exception
   */
  public void testSupplementerRegistryWithSupplementer() throws Exception {
    final Hashtable headers = new Hashtable();
    headers.put("Eclipse-SupplementBundle", "test.bundle1");
    EasyMock.expect(bundle.getHeaders()).andStubReturn(headers);
    EasyMock.expect(context.getBundles()).andReturn(new Bundle[] {bundle});

    EasyMock.replay(mocks);

    registry.addBundle(bundle);
    final ManifestElement[] imports =
        ManifestElement.parseHeader("Import-Package", "org.test1,\n org.test2");
    final ManifestElement[] exports =
        ManifestElement.parseHeader("Export-Package", "org.test3,\n org.test4");
    final List<Supplementer> supplementers =
        registry.getMatchingSupplementers("test.bundle1", imports, exports);
    assertNotNull(supplementers);
    assertEquals(1, supplementers.size());
    assertEquals(bundle, supplementers.get(0).getSupplementerBundle());

    EasyMock.verify(mocks);
  }
  /**
   * test the supplementer registry with a supplemented bundle
   *
   * @throws Exception
   */
  public void testSupplementerRegistryWithCombinedSupplementer() throws Exception {
    Hashtable headers = new Hashtable();
    headers.put("Eclipse-SupplementImporter", "test.import1");
    headers.put("Eclipse-SupplementExporter", "test.export1");
    headers.put("Eclipse-SupplementBundle", "symbolic-name-supplementedBundle1");
    EasyMock.expect(bundle.getHeaders()).andStubReturn(headers);
    EasyMock.expect(bundle.getSymbolicName()).andStubReturn("supplementer");
    EasyMock.expect(context.getBundles()).andReturn(new Bundle[] {bundle});

    EasyMock.expect(supplementedBundle1.getHeaders()).andStubReturn(new Hashtable());

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

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

    EasyMock.replay(mocks);

    registry.addBundle(bundle);
    registry.addBundle(supplementedBundle1);
    registry.addBundle(supplementedBundle2);
    registry.addBundle(supplementedBundle3);

    Supplementer[] supplementers = registry.getSupplementers(supplementedBundle1);
    assertSame(bundle, supplementers[0].getSupplementerBundle());
    supplementers = registry.getSupplementers(supplementedBundle2);
    assertSame(bundle, supplementers[0].getSupplementerBundle());
    supplementers = registry.getSupplementers(supplementedBundle3);
    assertSame(bundle, supplementers[0].getSupplementerBundle());

    EasyMock.verify(mocks);
  }
  /**
   * test an empty supplementer registry
   *
   * @throws Exception
   */
  public void testSupplementerRegistryEmpty() throws Exception {

    EasyMock.replay(mocks);

    Supplementer[] supplementers = registry.getSupplementers(0);
    assertNotNull(supplementers);
    assertEquals(0, supplementers.length);

    supplementers = registry.getSupplementers(bundle);
    assertNotNull(supplementers);
    assertEquals(0, supplementers.length);

    EasyMock.verify(mocks);

    final ManifestElement[] imports =
        ManifestElement.parseHeader("Import-Package", "org.test1,\n org.test2");
    final ManifestElement[] exports =
        ManifestElement.parseHeader("Export-Package", "org.test3,\n org.test4");
    final List<Supplementer> possibleSupplementers =
        registry.getMatchingSupplementers("symbolicName", imports, exports);
    assertNotNull(possibleSupplementers);
    assertEquals(0, possibleSupplementers.size());
  }
  /** @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);
  }