Author: jeremias
Date: Mon Jan 14 03:01:11 2008
New Revision: 611766

URL: http://svn.apache.org/viewvc?rev=611766&view=rev
Log:
java.net.URI doesn't eat non-escaped URIs so I added an escaping method to 
URISpecification that should cover most cases. Usually, it's just about a space 
in a filename.

Added:
    xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/
    
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
   (with props)
Modified:
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java   
(contents, props changed)
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java?rev=611766&r1=611765&r2=611766&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java 
(original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java 
Mon Jan 14 03:01:11 2008
@@ -19,6 +19,9 @@
 
 package org.apache.fop.datatypes;
 
+import java.io.UnsupportedEncodingException;
+
+
 /**
  * This class contains method to deal with the <uri-specification> datatype 
from XSL-FO.
  */
@@ -52,5 +55,87 @@
         return href;
     }
 
+    private static final String PUNCT = ",;:$&+=";
+    private static final String RESERVED = PUNCT + "?/[]@";
+    
+    private static boolean isValidURIChar(char ch) {
+        return true;
+    }
+    
+    private static boolean isDigit(char ch) {
+        return (ch >= '0' && ch <= '9');
+    }
+    
+    private static boolean isAlpha(char ch) {
+        return (ch >= 'A' && ch <= 'Z') || (ch >= 'A' && ch <= 'z');
+    }
+    
+    private static boolean isHexDigit(char ch) {
+        return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 
'a' && ch <= 'f');
+    }
+
+    private static boolean isReserved(char ch) {
+        if (RESERVED.indexOf(ch) >= 0) {
+            return true;
+        } else if ('#' == ch) {
+            //# is not a reserved character but is used for the fragment
+            return true;
+        }
+        return false;
+    }
+    
+    private static boolean isUnreserved(char ch) {
+        if (isDigit(ch) || isAlpha(ch)) {
+            return true;
+        } else if ("_-!.~\'()*".indexOf(ch) >= 0) {
+            //remaining unreserved characters
+            return true;
+        }
+        return false;
+    }
+    
+    private final static char[] HEX_DIGITS = {
+        '0', '1', '2', '3', '4', '5', '6', '7',
+        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+    };
+
+    private static void appendEscape(StringBuffer sb, byte b) {
+        sb.append('%').append(HEX_DIGITS[(b >> 4) & 
0x0f]).append(HEX_DIGITS[(b >> 0) & 0x0f]);
+    }
+
+    /**
+     * Escapes any illegal URI character in a given URI, for example, it 
escapes a space to "%20".
+     * Note: This method does not "parse" the URI and therefore does not treat 
the individual
+     * components (user-info, path, query etc.) individually.
+     * @param uri the URI to inspect
+     * @return the escaped URI
+     */
+    public static String escapeURI(String uri) {
+        uri = getURL(uri);
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0, c = uri.length(); i < c; i++) {
+            char ch = uri.charAt(i);
+            if (ch == '%') {
+                if (i < c - 3 && isHexDigit(uri.charAt(i + 1)) && 
isHexDigit(uri.charAt(i + 2))) {
+                    sb.append(ch);
+                    continue;
+                }
+            }
+            if (isReserved(ch) || isUnreserved(ch)) {
+                //Note: this may not be accurate for some very special cases.
+                sb.append(ch);
+            } else {
+                try {
+                    byte[] utf8 = Character.toString(ch).getBytes("UTF-8");
+                    for (int j = 0, cj = utf8.length; j < cj; j++) {
+                        appendEscape(sb, utf8[j]);
+                    }
+                } catch (UnsupportedEncodingException e) {
+                    throw new Error("Incompatible JVM. UTF-8 not supported.");
+                }
+            }
+        }
+        return sb.toString();
+    }
     
 }

Propchange: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/datatypes/URISpecification.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java?rev=611766&r1=611765&r2=611766&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java
 Mon Jan 14 03:01:11 2008
@@ -44,6 +44,7 @@
 import org.apache.fop.area.inline.Image;
 import org.apache.fop.area.inline.Viewport;
 import org.apache.fop.datatypes.FODimension;
+import org.apache.fop.datatypes.URISpecification;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.extensions.ExternalDocument;
 import org.apache.fop.layoutmgr.inline.ImageLayout;
@@ -114,7 +115,7 @@
                 }
                 URI originalURI;
                 try {
-                    originalURI = new URI(uri);
+                    originalURI = new URI(URISpecification.escapeURI(uri));
                     int pageIndex = 1;
                     while (hasMoreImages) {
                         URI tempURI = new URI(originalURI.getScheme(),

Added: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java?rev=611766&view=auto
==============================================================================
--- 
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
 (added)
+++ 
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
 Mon Jan 14 03:01:11 2008
@@ -0,0 +1,61 @@
+/*
+ * 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 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.datatypes;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for URISpecification.
+ */
+public class URISpecificationTestCase extends TestCase {
+
+    public void testGetURL() throws Exception {
+        String actual;
+        
+        actual = URISpecification.getURL("http://localhost/test";);
+        assertEquals("http://localhost/test";, actual);
+
+        actual = URISpecification.getURL("url(http://localhost/test)");
+        assertEquals("http://localhost/test";, actual);
+
+        actual = URISpecification.getURL("url('http://localhost/test')");
+        assertEquals("http://localhost/test";, actual);
+
+        actual = URISpecification.getURL("url(\"http://localhost/test\";)");
+        assertEquals("http://localhost/test";, actual);
+    }
+    
+    public void testEscapeURI() throws Exception {
+        String actual;
+        
+        actual = URISpecification.escapeURI("http://localhost/test";);
+        assertEquals("http://localhost/test";, actual);
+
+        actual = URISpecification.escapeURI("http://localhost/test%20test";);
+        assertEquals("http://localhost/test%20test";, actual);
+
+        actual = URISpecification.escapeURI("http://localhost/test test");
+        assertEquals("http://localhost/test%20test";, actual);
+
+        actual = URISpecification.escapeURI("http://localhost/test 
test.pdf#page=6");
+        assertEquals("http://localhost/test%20test.pdf#page=6";, actual);
+    }
+    
+}

Propchange: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xmlgraphics/fop/trunk/test/java/org/apache/fop/datatypes/URISpecificationTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Id



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to