private RegionFilter createFilter(final String... packageNames) throws InvalidSyntaxException { Collection<String> filters = new ArrayList<String>(packageNames.length); for (String pkg : packageNames) { filters.add('(' + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + '=' + pkg + ')'); } RegionFilterBuilder builder = digraph.createRegionFilterBuilder(); for (String filter : filters) { builder.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, filter); } return builder.build(); }
private RegionFilter createBundleFilter(String bundleSymbolicName, Version bundleVersion) throws InvalidSyntaxException { String bundleFilter = "(&(" + RegionFilter.VISIBLE_BUNDLE_NAMESPACE + '=' + bundleSymbolicName + ')' + '(' + Constants.BUNDLE_VERSION_ATTRIBUTE + ">=" + (bundleVersion == null ? "0" : bundleVersion.toString()) + "))"; RegionFilterBuilder builder = digraph.createRegionFilterBuilder(); return builder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, bundleFilter).build(); }
public void testBundleCollisionConnectedRegions() throws BundleException, InvalidSyntaxException { // get the system region Region systemRegion = digraph.getRegion(0); // create 3 connected test regions and install each bundle into each region int numRegions = 4; String regionName = "ConnectedRegion_"; for (int i = 0; i < numRegions; i++) { Region region = digraph.createRegion(regionName + i); // Import the system bundle from the systemRegion digraph.connect(region, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build(), systemRegion); // must import Boolean services into systemRegion to test digraph.connect(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build(), region); } Region region0 = digraph.getRegion(regionName + 0); Region region1 = digraph.getRegion(regionName + 1); Region region2 = digraph.getRegion(regionName + 2); // create connections that share the bundles we want RegionFilterBuilder filterBuilder = digraph.createRegionFilterBuilder(); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + PP1 + ")"); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + SP1 + ")"); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + CP1 + ")"); region1.connectRegion(region0, filterBuilder.build()); region2.connectRegion(region1, filterBuilder.build()); // install a bundle in each region bundleInstaller.installBundle(PP1, region0); bundleInstaller.installBundle(SP1, region1); bundleInstaller.installBundle(CP1, region2); // Should not be able to install SP1 into region0 because that would collide with SP1->region1->region0 assertInstallFail(SP1, region0); // Should not be able to install PP1 into region1 because that would collide with region1->region0->PP1 assertInstallFail(PP1, region1); // Should not be able to install PP1 into region2 because that would collide with region2->region1->region0->PP1 assertInstallFail(PP1, region2); // Should not be able to install CP1 into region0 because that would collide with CP1->region2->region1->region0 assertInstallFail(CP1, region0); }
public void testPersistenceBug343020() throws BundleException, InvalidSyntaxException { // get the system region Region systemRegion = digraph.getRegion(0); // create a test region Region testRegion = digraph.createRegion(getName()); RegionFilterBuilder builder = digraph.createRegionFilterBuilder(); // Import the system bundle from the systemRegion builder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)"); // import PP1 builder.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg1.*)"); digraph.connect(testRegion, builder.build(), systemRegion); // install CP2 Bundle cp2 = bundleInstaller.installBundle(CP2, testRegion); bundleInstaller.resolveBundles(new Bundle[] {cp2}); assertEquals("Wrong state for pc1.", Bundle.INSTALLED, cp2.getState()); regionBundle.stop(); // install PP1 there is no region alive bundleInstaller.installBundle(PP1); // start region bundle and confirm we can resolve cp2 now startRegionBundle(); bundleInstaller.refreshPackages(new Bundle[] {cp2}); assertEquals("Wrong state for pc1.", Bundle.RESOLVED, cp2.getState()); // stop region bundle to test uninstalling bundles while stopped regionBundle.stop(); cp2.uninstall(); startRegionBundle(); testRegion = digraph.getRegion(getName()); assertNotNull("No test region found.", testRegion); Set<Long> testIds = testRegion.getBundleIds(); assertEquals("Wrong number of test ids.", 0, testIds.size()); }
private void doCyclicRegions(int numLevels) throws BundleException, InvalidSyntaxException, InterruptedException { String regionName1 = getName() + "_1"; String regionName2 = getName() + "_2"; // get the system region Region systemRegion = digraph.getRegion(0); // create two regions to hold the bundles Region testRegion1 = digraph.createRegion(regionName1); Region testRegion2 = digraph.createRegion(regionName2); // connect to the system bundle testRegion1.connectRegion(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build()); testRegion2.connectRegion(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build()); // must import Boolean services into systemRegion to test systemRegion.connectRegion(testRegion1, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build()); systemRegion.connectRegion(testRegion2, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build()); Map<String, Bundle> bundles = new HashMap<String, Bundle>(); // add bundles to region1 bundles.put(PP1, bundleInstaller.installBundle(PP1, testRegion1)); bundles.put(SP2, bundleInstaller.installBundle(SP2, testRegion1)); bundles.put(CP2, bundleInstaller.installBundle(CP2, testRegion1)); bundles.put(PC1, bundleInstaller.installBundle(PC1, testRegion1)); bundles.put(BC1, bundleInstaller.installBundle(BC1, testRegion1)); // add bundles to region2 bundles.put(SP1, bundleInstaller.installBundle(SP1, testRegion2)); bundles.put(CP1, bundleInstaller.installBundle(CP1, testRegion2)); bundles.put(PP2, bundleInstaller.installBundle(PP2, testRegion2)); bundles.put(SC1, bundleInstaller.installBundle(SC1, testRegion2)); bundles.put(CC1, bundleInstaller.installBundle(CC1, testRegion2)); RegionFilterBuilder testRegionFilter1 = digraph.createRegionFilterBuilder(); // SP2 -> PP2 testRegionFilter1.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg2.*)"); // CP2 -> SP1 testRegionFilter1.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(" + Constants.OBJECTCLASS + "=pkg1.*)"); // PC1 -> PP2 // this is not needed because we already import pkg2.* above //testRegionFilter1.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg2.*)"); // BC1 -> PP2 testRegionFilter1.allow(RegionFilter.VISIBLE_REQUIRE_NAMESPACE, "(" + RegionFilter.VISIBLE_REQUIRE_NAMESPACE + "=" + PP2 + ")"); RegionFilterBuilder testRegionFilter2 = digraph.createRegionFilterBuilder(); //SP1 -> PP1 testRegionFilter2.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg1.*)"); //SC1 -> SP2 testRegionFilter2.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(" + Constants.OBJECTCLASS + "=pkg2.*)"); //CC1 -> CP2 testRegionFilter2.allow(CP2, "(name=" + CP2 + ")"); Region r1, r2 = null; for (int i = 0; i <= numLevels; i++) { r1 = (i > 0) ? r2 : testRegion1; r2 = (i < numLevels) ? digraph.createRegion(getName() + "_level_" + i) : testRegion2; r1.connectRegion(r2, testRegionFilter1.build()); r2.connectRegion(r1, testRegionFilter2.build()); } bundleInstaller.resolveBundles(bundles.values().toArray(new Bundle[bundles.size()])); for (Bundle bundle : bundles.values()) { assertEquals("Bundle did not resolve: " + bundle.getSymbolicName(), Bundle.RESOLVED, bundle.getState()); bundle.start(); } BundleContext context = getContext(); ServiceTracker<Boolean, Boolean> cp2Tracker = new ServiceTracker<Boolean, Boolean>(context, context.createFilter("(&(objectClass=java.lang.Boolean)(bundle.id=" + bundles.get(CP2).getBundleId() + "))"), null); ServiceTracker<Boolean, Boolean> sc1Tracker = new ServiceTracker<Boolean, Boolean>(context, context.createFilter("(&(objectClass=java.lang.Boolean)(bundle.id=" + bundles.get(SC1).getBundleId() + "))"), null); cp2Tracker.open(); sc1Tracker.open(); assertNotNull("The cp2 bundle never found the service.", cp2Tracker.waitForService(2000)); assertNotNull("The sc1 bundle never found the service.", sc1Tracker.waitForService(2000)); cp2Tracker.close(); sc1Tracker.close(); }