sandygao    2002/10/25 09:17:35

  Modified:    java/src/javax/xml/parsers DocumentBuilder.java
                        SAXParser.java
  Added:       java/src/javax/xml/parsers FilePathToURI.java
  Log:
  Use a different way to convert the file path to a URI. This approach is similar
  to what's in XMLEntityManager, and it can handle non-ASCII characters.
  When "ConvertToURI" is updated to be able to handle non-ASCII characters,
  we can come back and choose the better solution.
  
  Revision  Changes    Path
  1.10      +1 -2      xml-xerces/java/src/javax/xml/parsers/DocumentBuilder.java
  
  Index: DocumentBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/javax/xml/parsers/DocumentBuilder.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- DocumentBuilder.java      26 Sep 2002 09:02:06 -0000      1.9
  +++ DocumentBuilder.java      25 Oct 2002 16:17:34 -0000      1.10
  @@ -190,8 +190,7 @@
               throw new IllegalArgumentException("File cannot be null");
           }
           
  -        String escapedURI = ConvertToURI.getEscapedURI(f.getAbsolutePath()) ;
  -        escapedURI = "file://" + escapedURI ;
  +        String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
   
           if(DEBUG)
               System.out.println("Escaped URI = " + escapedURI) ;
  
  
  
  1.8       +2 -4      xml-xerces/java/src/javax/xml/parsers/SAXParser.java
  
  Index: SAXParser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/javax/xml/parsers/SAXParser.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SAXParser.java    26 Sep 2002 09:02:06 -0000      1.7
  +++ SAXParser.java    25 Oct 2002 16:17:34 -0000      1.8
  @@ -294,8 +294,7 @@
               throw new IllegalArgumentException("File cannot be null");
           }
           
  -        String escapedURI = ConvertToURI.getEscapedURI(f.getAbsolutePath()) ;
  -        escapedURI = "file://" + escapedURI ;
  +        String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
   
           if(DEBUG)
           System.out.println("Escaped URI = " + escapedURI) ;
  @@ -325,8 +324,7 @@
               throw new IllegalArgumentException("File cannot be null");
           }
           
  -        String escapedURI = ConvertToURI.getEscapedURI(f.getAbsolutePath()) ;
  -        escapedURI = "file://" + escapedURI ;
  +        String escapedURI = FilePathToURI.filepath2URI(f.getAbsolutePath()) ;
   
           if(DEBUG)
           System.out.println("Escaped URI = " + escapedURI) ;
  
  
  
  1.1                  xml-xerces/java/src/javax/xml/parsers/FilePathToURI.java
  
  Index: FilePathToURI.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2002 The Apache Software Foundation.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xerces" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 1999, International
   * Business Machines, Inc., http://www.apache.org.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package javax.xml.parsers;
  
  class FilePathToURI {
  
      // which ASCII characters need to be escaped
      private static boolean gNeedEscaping[] = new boolean[128];
      // the first hex character if a character needs to be escaped
      private static char gAfterEscaping1[] = new char[128];
      // the second hex character if a character needs to be escaped
      private static char gAfterEscaping2[] = new char[128];
      private static char[] gHexChs = {'0', '1', '2', '3', '4', '5', '6', '7',
                                       '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
      // initialize the above 3 arrays
      static {
          for (int i = 0; i <= 0x1f; i++) {
              gNeedEscaping[i] = true;
              gAfterEscaping1[i] = gHexChs[i >> 4];
              gAfterEscaping2[i] = gHexChs[i & 0xf];
          }
          gNeedEscaping[0x7f] = true;
          gAfterEscaping1[0x7f] = '7';
          gAfterEscaping2[0x7f] = 'F';
          char[] escChs = {' ', '<', '>', '#', '%', '"', '"', '}',
                           '|', '\\', '^', '~', '[', ']', '`'};
          int len = escChs.length;
          char ch;
          for (int i = 0; i < len; i++) {
              ch = escChs[i];
              gNeedEscaping[ch] = true;
              gAfterEscaping1[ch] = gHexChs[ch >> 4];
              gAfterEscaping2[ch] = gHexChs[ch & 0xf];
          }
      }
  
      // To escape a file path to a URI, by using %HH to represent
      // special ASCII characters: 0x00~0x1F, 0x7F, ' ', '<', '>', '#', '%'
      // and '"' and non-ASCII characters (whose value >= 128).
      public static String filepath2URI(String path){
          // return null if path is null.
          if (path == null)
              return null;
  
          char separator = java.io.File.separatorChar;
          path = path.replace(separator, '/');
  
          int len = path.length(), ch;
          StringBuffer buffer = new StringBuffer(len*3);
          buffer.append("file://");
          // change C:/blah to /C:/blah
          if (len >= 2 && path.charAt(1) == ':') {
              ch = Character.toUpperCase(path.charAt(0));
              if (ch >= 'A' && ch <= 'Z') {
                  buffer.append('/');
              }
          }
  
          // for each character in the path
          int i = 0;
          for (; i < len; i++) {
              ch = path.charAt(i);
              // if it's not an ASCII character, break here, and use UTF-8 encoding
              if (ch >= 128)
                  break;
              if (gNeedEscaping[ch]) {
                  buffer.append('%');
                  buffer.append(gAfterEscaping1[ch]);
                  buffer.append(gAfterEscaping2[ch]);
                  // record the fact that it's escaped
              }
              else {
                  buffer.append((char)ch);
              }
          }
          
          // we saw some non-ascii character
          if (i < len) {
              // get UTF-8 bytes for the remaining sub-string
              byte[] bytes = null;
              byte b;
              try {
                  bytes = path.substring(i).getBytes("UTF-8");
              } catch (java.io.UnsupportedEncodingException e) {
                  // should never happen
                  return path;
              }
              len = bytes.length;
  
              // for each byte
              for (i = 0; i < len; i++) {
                  b = bytes[i];
                  // for non-ascii character: make it positive, then escape
                  if (b < 0) {
                      ch = b + 256;
                      buffer.append('%');
                      buffer.append(gHexChs[ch >> 4]);
                      buffer.append(gHexChs[ch & 0xf]);
                  }
                  else if (gNeedEscaping[b]) {
                      buffer.append('%');
                      buffer.append(gAfterEscaping1[b]);
                      buffer.append(gAfterEscaping2[b]);
                  }
                  else {
                      buffer.append((char)b);
                  }
              }
          }
  
          return buffer.toString();
      }
  
  }//FilePathToURI
  
  
  

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

Reply via email to