use of org.osgi.service.packageadmin.RequiredBundle in project aries by apache.
the class FrameworkUtils method isBundleRequiredByOthers.
/**
* Checks if the given bundle is currently required by other bundles
*
* @param bundle
* @param packageAdmin
* @return
* @throws IllegalArgumentException
* if bundle or packageAdmin are null
*/
public static boolean isBundleRequiredByOthers(Bundle bundle, PackageAdmin packageAdmin) throws IllegalArgumentException {
if (bundle == null) {
throw new IllegalArgumentException("Argument bundle cannot be null");
}
if (packageAdmin == null) {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
boolean result = false;
// Check imported packages (statically or dynamically)
ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
if (exportedPackages != null) {
for (ExportedPackage exportedPackage : exportedPackages) {
Bundle[] importingBundles = exportedPackage.getImportingBundles();
if (importingBundles != null && importingBundles.length > 0) {
result = true;
break;
}
}
}
if (!result) {
// Check required bundles
RequiredBundle[] requiredBundles = packageAdmin.getRequiredBundles(bundle.getSymbolicName());
if (requiredBundles != null) {
for (RequiredBundle requiredBundle : requiredBundles) {
Bundle required = requiredBundle.getBundle();
if (required == bundle) {
Bundle[] requiring = requiredBundle.getRequiringBundles();
if (requiring != null && requiring.length > 0) {
result = true;
break;
}
}
}
}
}
if (!result) {
// Check fragment bundles
Bundle[] fragments = packageAdmin.getFragments(bundle);
if (fragments != null && fragments.length > 0) {
result = true;
}
}
return result;
}
use of org.osgi.service.packageadmin.RequiredBundle in project aries by apache.
the class FrameworkUtils method getDependentBundles.
/**
* Returns an array of ids of bundles that depend on the given bundle
*
* @param bundle
* @param packageAdmin
* @return
* @throws IllegalArgumentException
* if bundle or packageAdmin are null
*/
public static long[] getDependentBundles(Bundle bundle, PackageAdmin packageAdmin) throws IllegalArgumentException {
if (bundle == null) {
throw new IllegalArgumentException("Argument bundle cannot be null");
}
if (packageAdmin == null) {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
Set<Bundle> dependencies = new HashSet<Bundle>();
// Handle imported packages (statically or dynamically)
ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
if (exportedPackages != null) {
for (ExportedPackage exportedPackage : exportedPackages) {
Bundle[] importingBundles = exportedPackage.getImportingBundles();
if (importingBundles != null) {
for (Bundle importingBundle : importingBundles) {
dependencies.add(importingBundle);
}
}
}
}
// Handle required bundles
RequiredBundle[] requiredBundles = packageAdmin.getRequiredBundles(bundle.getSymbolicName());
if (requiredBundles != null) {
for (RequiredBundle requiredBundle : requiredBundles) {
Bundle required = requiredBundle.getBundle();
if (required == bundle) {
Bundle[] requiringBundles = requiredBundle.getRequiringBundles();
if (requiringBundles != null) {
for (Bundle requiringBundle : requiringBundles) {
dependencies.add(requiringBundle);
}
}
}
}
}
// Handle fragment bundles
Bundle[] fragments = packageAdmin.getFragments(bundle);
if (fragments != null) {
for (Bundle fragment : fragments) {
dependencies.add(fragment);
}
}
return getBundleIds(dependencies.toArray(new Bundle[dependencies.size()]));
}
use of org.osgi.service.packageadmin.RequiredBundle in project aries by apache.
the class FrameworkUtils method getBundleDependencies.
/**
* Returns an array of ids of bundles the given bundle depends on
*
* @param localBundleContext
* BundleContext object of this bundle/caller
* @param bundle
* target Bundle object to query dependencies for
* @param packageAdmin
*
* @return
* @throws IllegalArgumentException
* if bundle or packageAdmin are null
*/
@SuppressWarnings("unchecked")
public static long[] getBundleDependencies(BundleContext localBundleContext, Bundle bundle, PackageAdmin packageAdmin) throws IllegalArgumentException {
if (bundle == null) {
throw new IllegalArgumentException("Argument bundle cannot be null");
}
if (packageAdmin == null) {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
Set<Bundle> dependencies = new HashSet<Bundle>();
for (ExportedPackage ep : getBundleImportedPackagesRaw(localBundleContext, bundle, packageAdmin)) {
dependencies.add(ep.getExportingBundle());
}
// Handle required bundles
Dictionary<String, String> bundleHeaders = bundle.getHeaders();
String requireBundleHeader = bundleHeaders.get(Constants.REQUIRE_BUNDLE);
if (requireBundleHeader != null) {
// only check if Require-Bundle is used
List<String> bundleSymbolicNames = extractHeaderDeclaration(requireBundleHeader);
for (String bundleSymbolicName : bundleSymbolicNames) {
RequiredBundle[] candidateRequiredBundles = packageAdmin.getRequiredBundles(bundleSymbolicName);
if (candidateRequiredBundles != null) {
for (RequiredBundle candidateRequiredBundle : candidateRequiredBundles) {
Bundle[] bundlesRequiring = candidateRequiredBundle.getRequiringBundles();
if (bundlesRequiring != null && arrayContains(bundlesRequiring, bundle)) {
dependencies.add(candidateRequiredBundle.getBundle());
}
}
}
}
}
// Handle fragment bundles
Bundle[] hosts = packageAdmin.getHosts(bundle);
if (hosts != null) {
for (Bundle host : hosts) {
dependencies.add(host);
}
}
return getBundleIds(dependencies.toArray(new Bundle[dependencies.size()]));
}
use of org.osgi.service.packageadmin.RequiredBundle in project aries by apache.
the class BundleDataTest method testToCompositeData.
@Test
public void testToCompositeData() throws Exception {
Bundle bundle = mock(Bundle.class);
BundleContext context = mock(BundleContext.class);
PackageAdmin packageAdmin = mock(PackageAdmin.class);
StartLevel startLevel = mock(StartLevel.class);
Bundle b1 = mock(Bundle.class);
when(b1.getSymbolicName()).thenReturn("b1");
when(b1.getBundleId()).thenReturn(new Long(44));
Bundle b2 = mock(Bundle.class);
when(b2.getSymbolicName()).thenReturn("b2");
when(b2.getBundleId()).thenReturn(new Long(55));
Bundle b3 = mock(Bundle.class);
when(b3.getSymbolicName()).thenReturn("b3");
when(b3.getBundleId()).thenReturn(new Long(66));
when(context.getBundles()).thenReturn(new Bundle[] { bundle, b1, b2, b3 });
when(bundle.getSymbolicName()).thenReturn("test");
when(bundle.getVersion()).thenReturn(Version.emptyVersion);
when(bundle.getBundleId()).thenReturn(new Long(1));
when(bundle.getLastModified()).thenReturn(new Long(12345));
when(bundle.getLocation()).thenReturn("location");
//headers
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(Constants.BUNDLE_SYMBOLICNAME, "test");
headers.put(Constants.BUNDLE_VERSION, "0.0.0");
when(bundle.getHeaders()).thenReturn(headers);
//exported packages
ExportedPackage exported = mock(ExportedPackage.class);
when(exported.getName()).thenReturn("org.apache.aries.jmx");
when(exported.getVersion()).thenReturn(new Version("1.0.0"));
when(exported.getExportingBundle()).thenReturn(bundle);
when(packageAdmin.getExportedPackages(bundle)).thenReturn(new ExportedPackage[] { exported });
//imported packages
ExportedPackage ep1 = mock(ExportedPackage.class);
when(ep1.getImportingBundles()).thenReturn(new Bundle[] { bundle, b2, b3 });
when(ep1.getName()).thenReturn("org.apache.aries.jmx.b1");
when(ep1.getVersion()).thenReturn(Version.emptyVersion);
when(ep1.getExportingBundle()).thenReturn(b1);
ExportedPackage ep2 = mock(ExportedPackage.class);
when(ep2.getImportingBundles()).thenReturn(new Bundle[] { bundle, b3 });
when(ep2.getName()).thenReturn("org.apache.aries.jmx.b2");
when(ep2.getVersion()).thenReturn(Version.parseVersion("2.0.1"));
when(ep2.getExportingBundle()).thenReturn(b2);
headers.put(Constants.DYNAMICIMPORT_PACKAGE, "*");
when(packageAdmin.getExportedPackages(b1)).thenReturn(new ExportedPackage[] { ep1 });
when(packageAdmin.getExportedPackages(b2)).thenReturn(new ExportedPackage[] { ep2 });
when(packageAdmin.getExportedPackages(b3)).thenReturn(null);
//required bundles
RequiredBundle rb1 = mock(RequiredBundle.class);
when(rb1.getBundle()).thenReturn(b1);
when(rb1.getRequiringBundles()).thenReturn(new Bundle[] { bundle, b2 });
RequiredBundle rb2 = mock(RequiredBundle.class);
when(rb2.getBundle()).thenReturn(b2);
when(rb2.getRequiringBundles()).thenReturn(new Bundle[] { b1 });
RequiredBundle rb3 = mock(RequiredBundle.class);
when(rb3.getBundle()).thenReturn(b3);
when(rb3.getRequiringBundles()).thenReturn(new Bundle[] { bundle, b1, b2 });
headers.put(Constants.REQUIRE_BUNDLE, "b1;bundle-version=\"1.0.0\",b3;bundle-version=\"2.0.0\"");
when(packageAdmin.getRequiredBundles("b1")).thenReturn(new RequiredBundle[] { rb1 });
when(packageAdmin.getRequiredBundles("b2")).thenReturn(new RequiredBundle[] { rb2 });
when(packageAdmin.getRequiredBundles("b3")).thenReturn(new RequiredBundle[] { rb3 });
//services in use
ServiceReference s1 = mock(ServiceReference.class);
when(s1.getProperty(Constants.SERVICE_ID)).thenReturn(new Long(15));
ServiceReference s2 = mock(ServiceReference.class);
when(s2.getProperty(Constants.SERVICE_ID)).thenReturn(new Long(16));
ServiceReference s3 = mock(ServiceReference.class);
when(s3.getProperty(Constants.SERVICE_ID)).thenReturn(new Long(17));
when(bundle.getServicesInUse()).thenReturn(new ServiceReference[] { s1, s2, s3 });
BundleData b = new BundleData(context, bundle, packageAdmin, startLevel);
CompositeData compositeData = b.toCompositeData();
assertEquals("test", compositeData.get(SYMBOLIC_NAME));
assertEquals("0.0.0", compositeData.get(VERSION));
TabularData headerTable = (TabularData) compositeData.get(HEADERS);
assertEquals(4, headerTable.values().size());
CompositeData header = headerTable.get(new Object[] { Constants.BUNDLE_SYMBOLICNAME });
assertNotNull(header);
String value = (String) header.get(VALUE);
assertEquals("test", value);
String key = (String) header.get(KEY);
assertEquals(Constants.BUNDLE_SYMBOLICNAME, key);
TabularData bundleTable = new TabularDataSupport(BUNDLES_TYPE);
bundleTable.put(b.toCompositeData());
CompositeData bundleData = bundleTable.get(new Object[] { Long.valueOf(1) });
assertNotNull(bundleData);
String location = (String) bundleData.get(LOCATION);
assertEquals("location", location);
assertArrayEquals(new String[] { "org.apache.aries.jmx;1.0.0" }, (String[]) compositeData.get(EXPORTED_PACKAGES));
assertArrayEquals(new String[] { "org.apache.aries.jmx.b1;0.0.0", "org.apache.aries.jmx.b2;2.0.1" }, (String[]) compositeData.get(IMPORTED_PACKAGES));
assertEquals(toSet(new long[] { 44, 55, 66 }), toSet((Long[]) compositeData.get(REQUIRED_BUNDLES)));
assertArrayEquals(new Long[] { new Long(15), new Long(16), new Long(17) }, (Long[]) compositeData.get(SERVICES_IN_USE));
//default no return stub
assertEquals("UNKNOWN", compositeData.get(STATE));
assertEquals(0, ((Long[]) compositeData.get(HOSTS)).length);
assertEquals(0, ((Long[]) compositeData.get(FRAGMENTS)).length);
}
use of org.osgi.service.packageadmin.RequiredBundle in project aries by apache.
the class FrameworkUtils method isBundlePendingRemoval.
/**
* Returns the status of pending removal
*
* @param bundle
* @return true if the bundle is pending removal
* @throws IllegalArgumentException
* if bundle or packageAdmin are null
*/
public static boolean isBundlePendingRemoval(Bundle bundle, PackageAdmin packageAdmin) throws IllegalArgumentException {
if (bundle == null) {
throw new IllegalArgumentException("Argument bundle cannot be null");
}
if (packageAdmin == null) {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
boolean result = false;
ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
if (exportedPackages != null) {
for (ExportedPackage exportedPackage : exportedPackages) {
if (exportedPackage.isRemovalPending()) {
result = true;
break;
}
}
}
if (!result) {
RequiredBundle[] requiredBundles = packageAdmin.getRequiredBundles(bundle.getSymbolicName());
if (requiredBundles != null) {
for (RequiredBundle requiredBundle : requiredBundles) {
Bundle required = requiredBundle.getBundle();
if (required == bundle) {
result = requiredBundle.isRemovalPending();
break;
}
}
}
}
return result;
}
Aggregations