You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by jb...@apache.org on 2010/09/21 22:56:35 UTC

svn commit: r999635 - in /incubator/aries/trunk: application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/ jmx/jmx-core/ jmx/jm...

Author: jbohn
Date: Tue Sep 21 20:56:34 2010
New Revision: 999635

URL: http://svn.apache.org/viewvc?rev=999635&view=rev
Log:
ARIES-408 consolidate manifest header split processing in aries.utils - patch by Emily Jiang

Added:
    incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java   (with props)
Modified:
    incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessor.java
    incubator/aries/trunk/application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/APPUTILSmessages.properties
    incubator/aries/trunk/jmx/jmx-core/pom.xml
    incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/util/FrameworkUtils.java
    incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/BundleStateMBeanTest.java
    incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/FrameworkMBeanTest.java
    incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/PackageStateMBeanTest.java
    incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java
    incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/permissionadmin/PermissionAdminMBeanTest.java
    incubator/aries/trunk/util/src/main/resources/org/apache/aries/util/messages/UTILmessages.properties

Modified: incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessor.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessor.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessor.java (original)
+++ incubator/aries/trunk/application/application-utils/src/main/java/org/apache/aries/application/utils/manifest/ManifestHeaderProcessor.java Tue Sep 21 20:56:34 2010
@@ -33,6 +33,7 @@ import org.apache.aries.application.Vers
 import org.apache.aries.application.impl.ContentImpl;
 import org.apache.aries.application.impl.VersionRangeImpl;
 import org.apache.aries.application.utils.internal.MessageUtil;
+import org.apache.aries.util.ManifestHeaderUtils;
 import org.osgi.framework.Constants;
 
 
@@ -187,47 +188,10 @@ public class ManifestHeaderProcessor
    */
   public static List<String> split(String value, String delimiter)
   {
-    List<String> result = new ArrayList<String>();
-    if (value != null) {
-      String[] packages = value.split(delimiter);
-      
-      for (int i = 0; i < packages.length; ) {
-        String tmp = packages[i++].trim();
-        // if there is a odd number of " in a string, we need to append
-        while (count(tmp, "\"") % 2 != 0) {
-          // check to see if we need to append the next package[i++]          
-            if (i<packages.length)
-              tmp = tmp + delimiter + packages[i++].trim();
-            else 
-              // oops. The double quotes are not paired up. We have reached to the end of the string.
-              throw new IllegalArgumentException(MessageUtil.getMessage("APPUTILS0008E",tmp));        
-        }
-        
-        result.add(tmp);
-        
-      }
-    }
-    return result;
+    return ManifestHeaderUtils.split(value, delimiter);
   }  
   
- /**
-  * count the number of characters in a string
-  * @param parent The string to be searched
-  * @param subString The substring to be found
-  * @return the number of occurrence of the subString
-  */
-  private static int count(String parent, String subString) {
-    
-    int count = 0 ;
-    int i = parent.indexOf(subString);
-    while (i > -1) {
-      if (parent.length() >= i+1)
-        parent = parent.substring(i+1);
-      count ++;
-      i = parent.indexOf(subString);
-    }
-    return count;
-  }
+ 
   /**
    * Internal method to parse headers with the format<p>
    *   [Name](;[Name])*(;[attribute-name]=[attribute-value])*<br> 

Modified: incubator/aries/trunk/application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/APPUTILSmessages.properties
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/APPUTILSmessages.properties?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/APPUTILSmessages.properties (original)
+++ incubator/aries/trunk/application/application-utils/src/main/resources/org/apache/aries/application/utils/messages/APPUTILSmessages.properties Tue Sep 21 20:56:34 2010
@@ -18,5 +18,4 @@
 #
 APPUTILS0004E=APPUTILS0004E: Unable to create ContentImpl object based on content: {0}.
 APPUTILS0007E=APPUTILS0007E: The path {0} does not denote a valid file.
-APPUTILS0008E=APPUTILS0008E: Unable to parse the string, because one of the quotations marks (") is missing: {0}.
 APPUTILS0012E=APPUTILS0012E: Unable to create temporary output directory for file {0}.

Modified: incubator/aries/trunk/jmx/jmx-core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/pom.xml?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-core/pom.xml (original)
+++ incubator/aries/trunk/jmx/jmx-core/pom.xml Tue Sep 21 20:56:34 2010
@@ -81,6 +81,11 @@
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <artifactId>org.apache.aries.util</artifactId>
+            <groupId>org.apache.aries</groupId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 
  </project>

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=999635&r1=999634&r2=999635&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 21 20:56:34 2010
@@ -31,6 +31,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.aries.util.ManifestHeaderUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -278,14 +279,10 @@ public class FrameworkUtils {
             List<String> importPackages = new ArrayList<String>();
             String importPackageHeader = bundleHeaders.get(Constants.IMPORT_PACKAGE);
             if (importPackageHeader != null && importPackageHeader.length() > 0) {
-            	for (String headerDeclaration : extractHeaderDeclaration(importPackageHeader)) {
-            		importPackages.addAll(removeParameters(headerDeclaration));
-            	}
+            	importPackages.addAll(extractHeaderDeclaration(importPackageHeader));
             }
             if (dynamicImportHeader != null) {
-            	for (String headerDeclaration : extractHeaderDeclaration(dynamicImportHeader)) {
-            		importPackages.addAll(removeParameters(headerDeclaration));
-            	}
+            	importPackages.addAll(extractHeaderDeclaration(dynamicImportHeader));
             }
             for (String packageName : importPackages) {
                 ExportedPackage[] candidateExports = packageAdmin.getExportedPackages(packageName);
@@ -496,10 +493,7 @@ 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 = new ArrayList<String>();
-            for (String headerDeclaration : extractHeaderDeclaration(requireBundleHeader)) {
-            	bundleSymbolicNames.addAll(removeParameters(headerDeclaration));
-        	}
+        	List<String> bundleSymbolicNames = extractHeaderDeclaration(requireBundleHeader);
             for (String bundleSymbolicName: bundleSymbolicNames) {
                 RequiredBundle[] candidateRequiredBundles = packageAdmin.getRequiredBundles(bundleSymbolicName);
                 if (candidateRequiredBundles != null) {
@@ -628,59 +622,14 @@ public class FrameworkUtils {
     public static List<String> extractHeaderDeclaration(String headerStatement) {
         List<String> result = new ArrayList<String>();
         
-        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;
-        		}
-        	}
+        for (String headerDeclaration : ManifestHeaderUtils.split(headerStatement, ",")) {
+            String name = headerDeclaration.contains(";") ? headerDeclaration.substring(0, headerDeclaration
+                    .indexOf(";")) : headerDeclaration;
+            result.add(name);
         }
         
         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-itests/src/test/java/org/apache/aries/jmx/framework/BundleStateMBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/BundleStateMBeanTest.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/BundleStateMBeanTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/BundleStateMBeanTest.java Tue Sep 21 20:56:34 2010
@@ -62,6 +62,7 @@ public class BundleStateMBeanTest extend
                         mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
                         mavenBundle("org.osgi", "org.osgi.compendium"),
                         mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx"),
+                        mavenBundle("org.apache.aries", "org.apache.aries.util"),
                         provision(newBundle()
                                 .add(org.apache.aries.jmx.test.bundlea.Activator.class)
                                 .add(org.apache.aries.jmx.test.bundlea.api.InterfaceA.class)

Modified: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/FrameworkMBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/FrameworkMBeanTest.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/FrameworkMBeanTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/FrameworkMBeanTest.java Tue Sep 21 20:56:34 2010
@@ -52,7 +52,8 @@ public class FrameworkMBeanTest extends 
             CoreOptions.equinox(),
             mavenBundle("org.ops4j.pax.logging", "pax-logging-api"), 
             mavenBundle("org.ops4j.pax.logging", "pax-logging-service"), 
-            mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx")
+            mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx"),
+            mavenBundle("org.apache.aries", "org.apache.aries.util")
         );
         
         options = updateOptions(options);

Modified: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/PackageStateMBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/PackageStateMBeanTest.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/PackageStateMBeanTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/PackageStateMBeanTest.java Tue Sep 21 20:56:34 2010
@@ -46,7 +46,7 @@ public class PackageStateMBeanTest exten
     public static Option[] configuration() {
         Option[] options = CoreOptions.options(CoreOptions.equinox(), mavenBundle("org.ops4j.pax.logging",
                 "pax-logging-api"), mavenBundle("org.ops4j.pax.logging", "pax-logging-service"), mavenBundle(
-                "org.apache.aries.jmx", "org.apache.aries.jmx"));
+                "org.apache.aries.jmx", "org.apache.aries.jmx"),mavenBundle("org.apache.aries", "org.apache.aries.util"));
         options = updateOptions(options);
         return options;
     }

Modified: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java Tue Sep 21 20:56:34 2010
@@ -69,6 +69,7 @@ public class ServiceStateMBeanTest exten
                         mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
                         mavenBundle("org.osgi", "org.osgi.compendium"),
                         mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx"),
+                        mavenBundle("org.apache.aries", "org.apache.aries.util"),
                         new Customizer() {
                             public InputStream customizeTestProbe(InputStream testProbe) throws Exception {
                                 return modifyBundle(testProbe)

Modified: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/permissionadmin/PermissionAdminMBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/permissionadmin/PermissionAdminMBeanTest.java?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/permissionadmin/PermissionAdminMBeanTest.java (original)
+++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/permissionadmin/PermissionAdminMBeanTest.java Tue Sep 21 20:56:34 2010
@@ -52,6 +52,7 @@ public class PermissionAdminMBeanTest ex
             mavenBundle("org.ops4j.pax.logging", "pax-logging-api"), 
             mavenBundle("org.ops4j.pax.logging", "pax-logging-service"), 
             mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx"),
+            mavenBundle("org.apache.aries", "org.apache.aries.util"),
             provision(newBundle()
                     .add(org.apache.aries.jmx.test.bundlea.Activator.class)
                     .add(org.apache.aries.jmx.test.bundlea.api.InterfaceA.class)

Added: incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java?rev=999635&view=auto
==============================================================================
--- incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java (added)
+++ incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java Tue Sep 21 20:56:34 2010
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.aries.util.internal.MessageUtil;
+
+
+
+public class ManifestHeaderUtils {
+
+     /**
+     * 
+     * Splits a delimiter separated string, tolerating presence of non separator commas
+     * within double quoted segments.
+     * 
+     * Eg.
+     * com.ibm.ws.eba.helloWorldService;version="[1.0.0, 1.0.0]" &
+     * com.ibm.ws.eba.helloWorldService;version="1.0.0"
+     * com.ibm.ws.eba.helloWorld;version="2";bundle-version="[2,30)"
+     * com.acme.foo;weirdAttr="one;two;three";weirdDir:="1;2;3"
+     *  @param value          the value to be split
+     *  @param delimiter      the delimiter string such as ',' etc.
+     *  @return List<String>  the components of the split String in a list
+     */
+    public static List<String> split(String value, String delimiter)
+    {
+      List<String> result = new ArrayList<String>();
+      if (value != null) {
+        String[] packages = value.split(delimiter);
+        
+        for (int i = 0; i < packages.length; ) {
+          String tmp = packages[i++].trim();
+          // if there is a odd number of " in a string, we need to append
+          while (count(tmp, "\"") % 2 != 0) {
+            // check to see if we need to append the next package[i++]          
+              if (i<packages.length)
+                tmp = tmp + delimiter + packages[i++].trim();
+              else 
+                // oops. The double quotes are not paired up. We have reached to the end of the string.
+                throw new IllegalArgumentException(MessageUtil.getMessage("UTIL0008E",tmp));        
+          }
+          
+          result.add(tmp);
+          
+        }
+      }
+      return result;
+    }  
+   
+    /**
+     * count the number of characters in a string
+     * @param parent The string to be searched
+     * @param subString The substring to be found
+     * @return the number of occurrence of the subString
+     */
+     private static int count(String parent, String subString) {
+       
+       int count = 0 ;
+       int i = parent.indexOf(subString);
+       while (i > -1) {
+         if (parent.length() >= i+1)
+           parent = parent.substring(i+1);
+         count ++;
+         i = parent.indexOf(subString);
+       }
+       return count;
+     }
+}

Propchange: incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/util/src/main/java/org/apache/aries/util/ManifestHeaderUtils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/aries/trunk/util/src/main/resources/org/apache/aries/util/messages/UTILmessages.properties
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/util/src/main/resources/org/apache/aries/util/messages/UTILmessages.properties?rev=999635&r1=999634&r2=999635&view=diff
==============================================================================
--- incubator/aries/trunk/util/src/main/resources/org/apache/aries/util/messages/UTILmessages.properties (original)
+++ incubator/aries/trunk/util/src/main/resources/org/apache/aries/util/messages/UTILmessages.properties Tue Sep 21 20:56:34 2010
@@ -16,6 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+UTIL0008E=UTIL0008E: Unable to parse the string, because one of the quotations marks (") is missing: {0}.
 UTIL0009E=UTIL0009E: Unable to parse the version. Could not parse {0}.
 UTIL0010E=UTIL0010E: Unable to parse the version. Could not parse empty string.
 UTIL0011E=UTIL0011E: Unable to parse {0} for the exact version. Could not parse {0}.