You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by rw...@apache.org on 2010/09/14 11:24:53 UTC

svn commit: r996807 - in /incubator/aries/trunk/jmx/jmx-core/src: main/java/org/apache/aries/jmx/util/FrameworkUtils.java test/java/org/apache/aries/jmx/util/FrameworkUtilsTest.java

Author: rwonly
Date: Tue Sep 14 09:24:52 2010
New Revision: 996807

URL: http://svn.apache.org/viewvc?rev=996807&view=rev
Log:
ARIES-405 getBundleImportedPackages() of FrameworkUtils does not split package declarations correctly

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/util/FrameworkUtilsTest.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=996807&r1=996806&r2=996807&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 Tue Sep 14 09:24:52 2010
@@ -257,6 +257,7 @@ public class FrameworkUtils {
         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) {
@@ -277,10 +278,14 @@ public class FrameworkUtils {
             List<String> importPackages = new ArrayList<String>();
             String importPackageHeader = bundleHeaders.get(Constants.IMPORT_PACKAGE);
             if (importPackageHeader != null && importPackageHeader.length() > 0) {
-                importPackages.addAll(extractHeaderDeclaration(importPackageHeader));
+            	for (String headerDeclaration : extractHeaderDeclaration(importPackageHeader)) {
+            		importPackages.addAll(removeParameters(headerDeclaration));
+            	}
             }
             if (dynamicImportHeader != null) {
-                importPackages.addAll(extractHeaderDeclaration(dynamicImportHeader));
+            	for (String headerDeclaration : extractHeaderDeclaration(dynamicImportHeader)) {
+            		importPackages.addAll(removeParameters(headerDeclaration));
+            	}
             }
             for (String packageName : importPackages) {
                 ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(packageName);
@@ -491,7 +496,10 @@ public class FrameworkUtils {
         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);
+            List<String> bundleSymbolicNames = new ArrayList<String>();
+            for (String headerDeclaration : extractHeaderDeclaration(requireBundleHeader)) {
+            	bundleSymbolicNames.addAll(removeParameters(headerDeclaration));
+        	}
             for (String bundleSymbolicName: bundleSymbolicNames) {
                 RequiredBundle[] candidateRequiredBundles = packageAdmin.getRequiredBundles(bundleSymbolicName);
                 if (candidateRequiredBundles != null) {
@@ -619,11 +627,60 @@ public class FrameworkUtils {
      */
     public static List<String> extractHeaderDeclaration(String headerStatement) {
         List<String> result = new ArrayList<String>();
-        for (String headerDeclaration : headerStatement.split("\\s*,\\s*")) {
-            String name = headerDeclaration.contains(";") ? headerDeclaration.substring(0, headerDeclaration
-                    .indexOf(";")) : headerDeclaration;
-            result.add(name);
+        
+        while(true){
+        	int commaPoz = headerStatement.indexOf(",");
+        	
+        	while (commaPoz!= -1){
+        		String testStr = headerStatement.substring(0, commaPoz);
+        		
+        		int quoteNum = 0;
+        		int bracketNum = 0;
+        		for(char testStrChar : testStr.toCharArray()){
+        			switch (testStrChar) {
+	        			case '"': quoteNum++; break;
+	        			case '[':
+	        			case ']':
+	        			case '(':
+	        			case ')': bracketNum++;
+        			}
+        		}
+        		
+        		// there might be odd numbered quote marks or brackets in the left part,
+        		// which indicates the comma appears in version=[1.0,3.5) or uses="xxx,yyy,zzz"
+	        	if (quoteNum % 2 == 1 || bracketNum %2 ==1){
+	        		commaPoz = headerStatement.indexOf(",", commaPoz+1);
+	        	}else {
+	        		break;
+	        	}
+        	}
+        	
+        	if (commaPoz == -1){	//to the end
+        		result.add(headerStatement.trim());
+        		break;
+        	}else{
+        		result.add(headerStatement.substring(0,commaPoz).trim());
+        		if (commaPoz+1 < headerStatement.trim().length()){ //commaPoz is not the last char
+        			headerStatement = headerStatement.substring(commaPoz+1, headerStatement.length());
+        		}else{
+        			break;
+        		}
+        	}
         }
+        
         return result;
     }
+    
+    private static List<String> removeParameters(String headerDeclaration) {
+    	List<String> result = new ArrayList<String>();
+    	
+    	for (String headerSentence : headerDeclaration.split("\\s*;\\s*")) {
+            if (headerSentence.indexOf("=") == -1){
+            	result.add(headerSentence.trim());
+            }
+        }
+    	
+    	return result;
+    }
+    
 }

Modified: incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/util/FrameworkUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/util/FrameworkUtilsTest.java?rev=996807&r1=996806&r2=996807&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/util/FrameworkUtilsTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-core/src/test/java/org/apache/aries/jmx/util/FrameworkUtilsTest.java Tue Sep 14 09:24:52 2010
@@ -139,7 +139,6 @@ public class FrameworkUtilsTest {
         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"));
-       
         
         PackageAdmin admin = mock(PackageAdmin.class);
         when(admin.getExportedPackages(b1)).thenReturn(new ExportedPackage[] { ep1 });
@@ -155,7 +154,7 @@ public class FrameworkUtilsTest {
         
         //check with ImportPackage statement
         headers.remove(Constants.DYNAMICIMPORT_PACKAGE);
-        String importPackageStatement = "org.apache.aries.jmx.b1;version=0.0.0;resolution:=optional,org.apache.aries.jmx.b2;attribute:=value"; 
+        String importPackageStatement = "org.apache.aries.jmx.b1;version=0.0.0;resolution:=optional,org.apache.aries.jmx.b2;attribute:=value;version=\"[2.0, 3.0)\""; 
         headers.put(Constants.IMPORT_PACKAGE, importPackageStatement);
         when(admin.getExportedPackages("org.apache.aries.jmx.b1")).thenReturn(new ExportedPackage[] { ep1 });
         when(admin.getExportedPackages("org.apache.aries.jmx.b2")).thenReturn(new ExportedPackage[] { ep2 });