You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ma...@apache.org on 2010/10/30 22:05:36 UTC
svn commit: r1029176 - in /incubator/aries/trunk/jmx/jmx-core/src:
main/java/org/apache/aries/jmx/util/FrameworkUtils.java
test/java/org/apache/aries/jmx/codec/BundleDataTest.java
Author: mahrwald
Date: Sat Oct 30 20:05:35 2010
New Revision: 1029176
URL: http://svn.apache.org/viewvc?rev=1029176&view=rev
Log:
ARIES-457: Performance improvement by reusing optimizations in FrameworkUtils#getBundleImportedPackages
Modified:
incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java
incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/codec/BundleDataTest.java
Modified: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java?rev=1029176&r1=1029175&r2=1029176&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java (original)
+++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java Sat Oct 30 20:05:35 2010
@@ -26,6 +26,7 @@ import static org.osgi.jmx.framework.Bun
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.List;
@@ -245,7 +246,6 @@ public class FrameworkUtils {
* @throws IllegalArgumentException
* if fragment or packageAdmin are null
*/
- @SuppressWarnings("unchecked")
public static String[] getBundleImportedPackages(BundleContext localBundleContext, Bundle bundle,
PackageAdmin packageAdmin) throws IllegalArgumentException {
if (bundle == null) {
@@ -254,49 +254,61 @@ public class FrameworkUtils {
if (packageAdmin == null) {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
+
List<String> result = new ArrayList<String>();
- Dictionary<String, String> bundleHeaders = bundle.getHeaders();
- String dynamicImportHeader = bundleHeaders.get(Constants.DYNAMICIMPORT_PACKAGE);
- // if DynamicImport-Package used, then do full iteration
- // else means no dynamic import or has dynamic import but no wildcard "*" in it.
- if (dynamicImportHeader != null && dynamicImportHeader.contains("*")) {
- Bundle[] bundles = localBundleContext.getBundles();
- for (Bundle candidate : bundles) {
- if (candidate.equals(bundle)) {
- continue;
- }
- ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(candidate);
- if (candidateExports != null) {
- for (ExportedPackage exportedPackage : candidateExports) {
- Bundle[] userBundles = exportedPackage.getImportingBundles();
- if (userBundles != null && arrayContains(userBundles, bundle)) {
- result.add(exportedPackage.getName() + ";" + exportedPackage.getVersion().toString());
- }
- }// end for candidateExports
- }
- }// end for bundles
- } else { // only query ExportPackage for package names declared as imported
- List<String> importPackages = new ArrayList<String>();
- String importPackageHeader = bundleHeaders.get(Constants.IMPORT_PACKAGE);
- if (importPackageHeader != null && importPackageHeader.length() > 0) {
- importPackages.addAll(extractHeaderDeclaration(importPackageHeader));
- }
- if (dynamicImportHeader != null) {
- importPackages.addAll(extractHeaderDeclaration(dynamicImportHeader));
- }
- for (String packageName : importPackages) {
- ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(packageName);
- if (candidateExports != null) {
- for (ExportedPackage exportedPackage : candidateExports) {
- Bundle[] userBundles = exportedPackage.getImportingBundles();
- if (userBundles != null && arrayContains(userBundles, bundle)) {
- result.add(exportedPackage.getName() + ";" + exportedPackage.getVersion().toString());
- }
- }// end for candidateExports
- }
- }
+ for (ExportedPackage ep : getBundleImportedPackagesRaw(localBundleContext, bundle, packageAdmin)) {
+ result.add(ep.getName()+";"+ep.getVersion());
}
- return result.toArray(new String[result.size()]);
+
+ return result.toArray(new String[0]);
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Collection<ExportedPackage> getBundleImportedPackagesRaw(BundleContext localBundleContext, Bundle bundle, PackageAdmin packageAdmin) throws IllegalArgumentException
+ {
+ List<ExportedPackage> result = new ArrayList<ExportedPackage>();
+ Dictionary<String, String> bundleHeaders = bundle.getHeaders();
+ String dynamicImportHeader = bundleHeaders.get(Constants.DYNAMICIMPORT_PACKAGE);
+ // if DynamicImport-Package used, then do full iteration
+ // else means no dynamic import or has dynamic import but no wildcard "*" in it.
+ if (dynamicImportHeader != null && dynamicImportHeader.contains("*")) {
+ Bundle[] bundles = localBundleContext.getBundles();
+ for (Bundle candidate : bundles) {
+ if (candidate.equals(bundle)) {
+ continue;
+ }
+ ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(candidate);
+ if (candidateExports != null) {
+ for (ExportedPackage exportedPackage : candidateExports) {
+ Bundle[] userBundles = exportedPackage.getImportingBundles();
+ if (userBundles != null && arrayContains(userBundles, bundle)) {
+ result.add(exportedPackage);
+ }
+ }// end for candidateExports
+ }
+ }// end for bundles
+ } else { // only query ExportPackage for package names declared as imported
+ List<String> importPackages = new ArrayList<String>();
+ String importPackageHeader = bundleHeaders.get(Constants.IMPORT_PACKAGE);
+ if (importPackageHeader != null && importPackageHeader.length() > 0) {
+ importPackages.addAll(extractHeaderDeclaration(importPackageHeader));
+ }
+ if (dynamicImportHeader != null) {
+ importPackages.addAll(extractHeaderDeclaration(dynamicImportHeader));
+ }
+ for (String packageName : importPackages) {
+ ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(packageName);
+ if (candidateExports != null) {
+ for (ExportedPackage exportedPackage : candidateExports) {
+ Bundle[] userBundles = exportedPackage.getImportingBundles();
+ if (userBundles != null && arrayContains(userBundles, bundle)) {
+ result.add(exportedPackage);
+ }
+ }// end for candidateExports
+ }
+ }
+ }
+ return result;
}
/**
@@ -473,22 +485,11 @@ public class FrameworkUtils {
throw new IllegalArgumentException("Argument packageAdmin cannot be null");
}
Set<Bundle> dependencies = new HashSet<Bundle>();
- // Handle imported packages (statically or dynamically)
- for (Bundle exportBundle : localBundleContext.getBundles()) {
- if (exportBundle == bundle) {
- continue;
- }
- ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(exportBundle);
- if (exportedPackages != null) {
- for (ExportedPackage exportedPackage : exportedPackages) {
- Bundle[] importingBundles = exportedPackage.getImportingBundles();
- if (importingBundles != null && arrayContains(importingBundles, bundle)) {
- dependencies.add(exportBundle);
- break;
- }
- }
- }
+
+ 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);
Modified: incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/codec/BundleDataTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/codec/BundleDataTest.java?rev=1029176&r1=1029175&r2=1029176&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/codec/BundleDataTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/codec/BundleDataTest.java Sat Oct 30 20:05:35 2010
@@ -115,6 +115,7 @@ public class BundleDataTest {
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
@@ -122,10 +123,12 @@ public class BundleDataTest {
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 });
@@ -161,7 +164,7 @@ public class BundleDataTest {
CompositeData compositeData = b.toCompositeData();
assertEquals("test", compositeData.get(SYMBOLIC_NAME));
- assertEquals("0.0.0", (String) compositeData.get(VERSION));
+ 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});