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});