You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mc...@apache.org on 2010/10/11 20:43:55 UTC

svn commit: r1021457 - /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java

Author: mconcini
Date: Mon Oct 11 18:43:55 2010
New Revision: 1021457

URL: http://svn.apache.org/viewvc?rev=1021457&view=rev
Log:
MYFACES-2941 - handle escaped white spaces in filesystem paths in _getAlternativeJarFile()

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java?rev=1021457&r1=1021456&r2=1021457&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/util/Classpath.java Mon Oct 11 18:43:55 2010
@@ -34,7 +34,8 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 import org.apache.myfaces.shared_impl.util.ClassUtils;
-
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 /**
  * @author Jacob Hookom
  * @author Roland Huss
@@ -43,6 +44,7 @@ import org.apache.myfaces.shared_impl.ut
  */
 public final class Classpath
 {
+    private static final Charset UTF8 = Charset.forName("UTF-8");
     private Classpath()
     {
     }
@@ -265,7 +267,8 @@ public final class Classpath
             {
                 jarFileUrl = jarFileUrl.substring("file:".length());
             }
-
+            // make sure this is a valid file system path by removing escaping of white-space characters, etc. 
+            jarFileUrl = decodeFilesystemUrl(jarFileUrl);
             return new JarFile(jarFileUrl);
         }
 
@@ -296,5 +299,39 @@ public final class Classpath
             }
         }
     }
+    
+    private static String decodeFilesystemUrl(String url) {
+        //borrowed from commons-io FileUtils.
+        String decoded = url;
+        if (url != null && url.indexOf('%') >= 0) {
+            int n = url.length();
+            StringBuffer buffer = new StringBuffer();
+            ByteBuffer bytes = ByteBuffer.allocate(n);
+            for (int i = 0; i < n;) {
+                if (url.charAt(i) == '%') {
+                    try {
+                        do {
+                            byte octet = (byte) Integer.parseInt(url.substring(i + 1, i + 3), 16);
+                            bytes.put(octet);
+                            i += 3;
+                        } while (i < n && url.charAt(i) == '%');
+                        continue;
+                    } catch (RuntimeException e) {
+                        // malformed percent-encoded octet, fall through and
+                        // append characters literally
+                    } finally {
+                        if (bytes.position() > 0) {
+                            bytes.flip();
+                            buffer.append(UTF8.decode(bytes).toString());
+                            bytes.clear();
+                        }
+                    }
+                }
+                buffer.append(url.charAt(i++));
+            }
+            decoded = buffer.toString();
+        }
+        return decoded;
+    }
 
 }