You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ga...@apache.org on 2010/02/01 18:26:53 UTC

svn commit: r905342 - in /incubator/aries/trunk/web/web-urlhandler/src: main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java test/java/org/apache/aries/web/converter/impl/WabConverterTest.java

Author: gawor
Date: Mon Feb  1 17:26:52 2010
New Revision: 905342

URL: http://svn.apache.org/viewvc?rev=905342&view=rev
Log:
ARIES-135: Parse Import-Package parameters properly

Modified:
    incubator/aries/trunk/web/web-urlhandler/src/main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java
    incubator/aries/trunk/web/web-urlhandler/src/test/java/org/apache/aries/web/converter/impl/WabConverterTest.java

Modified: incubator/aries/trunk/web/web-urlhandler/src/main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/web/web-urlhandler/src/main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java?rev=905342&r1=905341&r2=905342&view=diff
==============================================================================
--- incubator/aries/trunk/web/web-urlhandler/src/main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java (original)
+++ incubator/aries/trunk/web/web-urlhandler/src/main/java/org/apache/aries/web/converter/impl/WarToWabConverterImpl.java Mon Feb  1 17:26:52 2010
@@ -29,6 +29,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -242,13 +243,11 @@
     classpath.addAll(classPath);
     
     // Get the list from the URL and add to classpath (removing duplicates)
-    mergePathList(properties.getProperty(Constants.BUNDLE_CLASSPATH),
-        classpath, ",");
+    mergePathList(properties.getProperty(Constants.BUNDLE_CLASSPATH), classpath, ",");
 
     // Get the existing list from the manifest file and add to classpath
     // (removing duplicates)
-    mergePathList(manifest.getMainAttributes().getValue(
-        Constants.BUNDLE_CLASSPATH), classpath, ",");
+    mergePathList(manifest.getMainAttributes().getValue(Constants.BUNDLE_CLASSPATH), classpath, ",");
 
     // Construct the classpath string and set it into the properties
     StringBuffer classPathValue = new StringBuffer();
@@ -257,9 +256,9 @@
       classPathValue.append(entry);
     }
 
-    if (!classpath.isEmpty())
-      properties.put(Constants.BUNDLE_CLASSPATH, classPathValue.toString()
-          .substring(1));
+    if (!classpath.isEmpty()) {
+      properties.put(Constants.BUNDLE_CLASSPATH, classPathValue.toString().substring(1));
+    }
 
     ArrayList<String> packages = new ArrayList<String>() {
       @Override
@@ -293,13 +292,11 @@
     packages.clear();
     
     // Get the list from the URL and add to classpath (removing duplicates)
-    mergePathList(properties.getProperty(Constants.IMPORT_PACKAGE), packages,
-        ",");
+    mergePathList(properties.getProperty(Constants.IMPORT_PACKAGE), packages, ",");
 
     // Get the existing list from the manifest file and add to classpath
     // (removing duplicates)
-    mergePathList(manifest.getMainAttributes().getValue(
-        Constants.IMPORT_PACKAGE), packages, ",");
+    mergePathList(manifest.getMainAttributes().getValue(Constants.IMPORT_PACKAGE), packages, ",");
 
     // Add the default set of packages
     mergePathList(DEFAULT_IMPORT_PACKAGE_LIST, packages, ",");
@@ -323,10 +320,10 @@
       importValues.append(",");
       importValues.append(entry);
     }
-    if (!packages.isEmpty())
-      properties.put(Constants.IMPORT_PACKAGE, importValues.toString()
-          .substring(1));
-
+    if (!packages.isEmpty()) {
+      properties.put(Constants.IMPORT_PACKAGE, importValues.toString().substring(1));
+    }
+    
     //
     // Web-ContextPath
     //
@@ -363,18 +360,67 @@
   }
 
   // pathlist = A "delim" delimitted list of path entries
-  public static void mergePathList(String pathlist, ArrayList<String> classpath,
-      String delim) {
-    if (pathlist != null) {
-      StringTokenizer tok = new StringTokenizer(pathlist, delim);
-      while (tok.hasMoreTokens()) {
-        String token = tok.nextToken().trim();
-        if (!classpath.contains(token))
-          classpath.add(token);
+  private static void mergePathList(String pathlist, ArrayList<String> paths, String delim) {
+      if (pathlist != null) {
+          List<String> tokens = parseDelimitedString(pathlist, delim, true);
+          for (String token : tokens) {
+              if (!paths.contains(token)) {
+                  paths.add(token);
+              }
+          }
       }
-    }
   }
+  
+  private static List<String> parseDelimitedString(String value, String delim, boolean includeQuotes) {   
+      if (value == null) {       
+          value = "";
+      }
 
+      List<String> list = new ArrayList<String>();
+
+      int CHAR = 1;
+      int DELIMITER = 2;
+      int STARTQUOTE = 4;
+      int ENDQUOTE = 8;
+
+      StringBuffer sb = new StringBuffer();
+
+      int expecting = (CHAR | DELIMITER | STARTQUOTE);
+
+      for (int i = 0; i < value.length(); i++) {        
+          char c = value.charAt(i);
+
+          boolean isDelimiter = (delim.indexOf(c) >= 0);
+          boolean isQuote = (c == '"');
+
+          if (isDelimiter && ((expecting & DELIMITER) > 0)) {            
+              list.add(sb.toString().trim());
+              sb.delete(0, sb.length());
+              expecting = (CHAR | DELIMITER | STARTQUOTE);
+          } else if (isQuote && ((expecting & STARTQUOTE) > 0)) { 
+              if (includeQuotes) {
+                  sb.append(c);
+              }
+              expecting = CHAR | ENDQUOTE;
+          } else if (isQuote && ((expecting & ENDQUOTE) > 0)) {    
+              if (includeQuotes) {
+                  sb.append(c);
+              }
+              expecting = (CHAR | STARTQUOTE | DELIMITER);
+          } else if ((expecting & CHAR) > 0) {            
+              sb.append(c);
+          } else {
+              throw new IllegalArgumentException("Invalid delimited string: " + value);
+          }
+      }
+
+      if (sb.length() > 0) {        
+          list.add(sb.toString().trim());
+      }
+
+      return list;
+  }
+  
   public InputStream getWAB() throws IOException {
     ensureConverted();
     return new ByteArrayInputStream(wabFile);

Modified: incubator/aries/trunk/web/web-urlhandler/src/test/java/org/apache/aries/web/converter/impl/WabConverterTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/web/web-urlhandler/src/test/java/org/apache/aries/web/converter/impl/WabConverterTest.java?rev=905342&r1=905341&r2=905342&view=diff
==============================================================================
--- incubator/aries/trunk/web/web-urlhandler/src/test/java/org/apache/aries/web/converter/impl/WabConverterTest.java (original)
+++ incubator/aries/trunk/web/web-urlhandler/src/test/java/org/apache/aries/web/converter/impl/WabConverterTest.java Mon Feb  1 17:26:52 2010
@@ -83,6 +83,24 @@
   }
     
   @Test
+  public void testImportPackageWithAttributesMerge() throws Exception
+  {
+      Attributes attrs = convertWithProperties(
+                Constants.IMPORT_PACKAGE, "javax.servlet.jsp; version=\"[2.0,2.1]\",javax.servlet.jsp.tagext; version=\"[2.0,2.1]\"");
+      
+      String actual = attrs.getValue("Import-Package");
+      System.out.println(actual);
+      assertEquals(
+           "javax.servlet.jsp; version=\"[2.0,2.1]\"," +
+           "javax.servlet.jsp.tagext; version=\"[2.0,2.1]\"," +
+           "javax.servlet;version=2.5," +
+           "javax.servlet.http;version=2.5," +
+           "javax.el;version=2.1," +
+           "javax.servlet.jsp.el;version=2.1",
+          actual);
+  }
+
+  @Test
   public void testAcceptNoManifest() throws Exception
   {
     final ByteArrayOutputStream bout = new ByteArrayOutputStream();