| /* |
| * 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. |
| */ |
| |
| 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; |
| StringBuilder buffer = new StringBuilder(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 |