You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2013/04/01 09:47:45 UTC
svn commit: r1463106 [3/4] - in /river/jtsk/skunk/qa_refactor/trunk: ./ qa/
qa/jtreg/net/jini/loader/pref/PreferredClassProvider/registryRetainCodebase/
qa/jtreg/net/jini/loader/pref/PreferredResources/correctInterpretation/
qa/src/com/sun/jini/test/im...
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/UriParser.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/UriParser.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/UriParser.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/net/UriParser.java Mon Apr 1 07:47:44 2013
@@ -19,972 +19,18 @@ package org.apache.river.api.net;
import java.io.File;
import java.net.URISyntaxException;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.river.impl.Messages;
/**
*
- * @author peter
+ *
*/
final class UriParser {
- private static final char [] latin = new char[256];
- private static final String [] latinEsc = new String[256];
- private final static Map<String, Character> unreserved = new HashMap<String, Character>(66); // To be unescaped during normalisation.
-
- /* 2.1. Percent-Encoding
- *
- * A percent-encoding mechanism is used to represent a data octet in a
- * component when that octet's corresponding character is outside the
- * allowed set or is being used as a delimiter of, or within, the
- * component. A percent-encoded octet is encoded as a character
- * triplet, consisting of the percent character "%" followed by the two
- * hexadecimal digits representing that octet's numeric value. For
- * example, "%20" is the percent-encoding for the binary octet
- * "00100000" (ABNF: %x20), which in US-ASCII corresponds to the space
- * character (SP). Section 2.4 describes when percent-encoding and
- * decoding is applied.
- *
- * pct-encoded = "%" HEXDIG HEXDIG
- *
- * The uppercase hexadecimal digits 'A' through 'F' are equivalent to
- * the lowercase digits 'a' through 'f', respectively. If two URIs
- * differ only in the case of hexadecimal digits used in percent-encoded
- * octets, they are equivalent. For consistency, URI producers and
- * normalizers should use uppercase hexadecimal digits for all percent-
- * encodings.
- */
- // Any character that is not part of the reserved and unreserved sets must
- // be encoded.
- // Section 2.1 Percent encoding must be converted to upper case during normalisation.
- private static final char escape = '%';
- /* RFC3986 obsoletes RFC2396 and RFC2732
- *
- * reserved = gen-delims / sub-delims
- *
- * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
- *
- * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
- * / "*" / "+" / "," / ";" / "="
- */
- // Section 2.2 Reserved set is protected from normalisation.
- private static final char [] gen_delims = {':', '/', '?', '#', '[', ']', '@'};
- private static final char [] sub_delims = {'!', '$', '&', '\'', '(', ')', '*',
- '+', ',', ';', '='};
-
- /*
- * For consistency, percent-encoded octets in the ranges of ALPHA
- * (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D), period (%2E),
- * underscore (%5F), or tilde (%7E) should not be created by URI
- * producers and, when found in a URI, should be decoded to their
- * corresponding unreserved characters by URI normalizers.
- */
- // Section 2.3 Unreserved characters (Allowed) must be decoded during normalisation if % encoded.
- private static final char [] lowalpha = "abcdefghijklmnopqrstuvwxyz".toCharArray();
- private static final char [] upalpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
- private static final char [] numeric = "0123456789".toCharArray();
- private static final char [] unres_punct = {'-' , '.' , '_' , '~'};
- private static final char [] schemeEx = "+-.".toCharArray(); // + ALPHA and numeric.
-
- static {
- processLatin();
- processUnreserved();
- }
-
- private static void processUnreserved(){
- int l = lowalpha.length;
- for (int i = 0, n = 97; i < l; i++, n++){
- unreserved.put(String.valueOf(latinEsc[n]), Character.valueOf(lowalpha[i]));
- }
- l = upalpha.length;
- for (int i = 0, n = 65; i < l; i++, n++){
- unreserved.put(String.valueOf(latinEsc[n]), Character.valueOf(upalpha[i]));
- }
- l = numeric.length;
- for (int i = 0, n = 48; i < l; i++, n++){
- unreserved.put(String.valueOf(latinEsc[n]), Character.valueOf(numeric[i]));
- }
- l = unres_punct.length;
- for (int i = 0; i < l; i++){
- int n = index(latin, unres_punct[i]);
- unreserved.put(String.valueOf(latinEsc[n]), Character.valueOf(unres_punct[i]));
- }
- l = schemeEx.length;
- for (int i = 0; i < l; i++){
- int n = index(latin, schemeEx[i]);
- unreserved.put(String.valueOf(latinEsc[n]), Character.valueOf(schemeEx[i]));
- }
- }
-
- /**
- * Finds a character in an array and returns the index at which it exists,
- * or returns -1 if it doesn't
- *
- * @param array
- * @param character
- * @return
- */
- public static int index(char [] array, char character){
- int l = array.length;
- for (int i = 0; i < l; i++){
- if (array[i] == character) return i;
- }
- return -1;
- }
-
- /**
- * Encodes illegal characters according to RFC3986, "%" characters are not
- * encoded, since they are legal and in case the string already
- * contains escaped characters. The percent character must be encoded
- * manually prior to calling this method.
- * <p>
- * No normalisation or platform specific changes are performed.
- *
- * @param str
- * @return
- * @throws URISyntaxException
- */
- public static String escapeIllegalCharacters(String str) throws URISyntaxException {
- if (str == null) return null;
- char [] chars = str.toCharArray();
- int len = chars.length;
- StringBuilder sb = new StringBuilder(len + 12);
- boolean esc = false;
- for (int i = 0; i < len; i++){
- if (chars[i] == escape){
- /* Section 2.4
- * Because the percent ("%") character serves as the indicator for
- * percent-encoded octets, it must be percent-encoded as "%25" for that
- * octet to be used as data within a URI. Implementations must not
- * percent-encode or decode the same string more than once, as decoding
- * an already decoded string might lead to misinterpreting a percent
- * data octet as the beginning of a percent-encoding, or vice versa in
- * the case of percent-encoding an already percent-encoded string.
- */
- sb.append(chars[i]);
- }else if ( index(gen_delims, chars[i]) != -1
- || index(sub_delims, chars[i]) != -1
- || index(lowalpha, chars[i]) != -1
- || index(upalpha, chars[i]) != -1
- || index(numeric, chars[i]) != -1
- || index(unres_punct, chars[i]) != -1){
- sb.append(chars[i]);
- }else {
- int n = index(latin, chars[i]);
- if (n < 0) throw new URISyntaxException(str, "String contains unescapable character");
- sb.append(latinEsc[n]);
- esc = true;
- }
- }
- if (!esc) return str;
- return sb.toString();
- }
-
- /** Fixes windows file URI string by converting back slashes to forward
- * slashes and inserting a forward slash before the drive letter if it is
- * missing. No normalisation or modification of case is performed.
- */
- public static String fixWindowsURI(String uri) {
- if (uri == null) return null;
- if ( uri.startsWith("file:") || uri.startsWith("FILE:")){
- char [] u = uri.toCharArray();
- int l = u.length;
- StringBuilder sb = new StringBuilder();
- for (int i=0; i<l; i++){
- // Ensure we use forward slashes
- if (u[i] == File.separatorChar) {
- sb.append('/');
- continue;
- }
- if (i == 5 && uri.startsWith(":", 6 )) {
- // Windows drive letter without leading slashes doesn't comply
- // with URI spec, fix it here
- sb.append("/");
- }
- sb.append(u[i]);
- }
- return sb.toString();
- }
- return uri;
- }
-
- private static void processLatin(){
- /* Complete list of Unicode Latin possible to represent with percentage encoding.*/
- // Basic Latin
- // Position Decimal Name Appearance
- // 0x0000 0 <control>: NULL
- latin[0] = '\u0000';
- latinEsc[0] = "%00";
- // 0x0001 1 <control>: START OF HEADING
- latin[1] = '\u0001';
- latinEsc[1] = "%01";
- // 0x0002 2 <control>: START OF TEXT
- latin[2] = '\u0002';
- latinEsc[2] = "%02";
- // 0x0003 3 <control>: END OF TEXT
- latin[3] = '\u0003';
- latinEsc[3] = "%03";
- // 0x0004 4 <control>: END OF TRANSMISSION
- latin[4] = '\u0004';
- latinEsc[4] = "%04";
- // 0x0005 5 <control>: ENQUIRY
- latin[5] = '\u0005';
- latinEsc[5] = "%05";
- // 0x0006 6 <control>: ACKNOWLEDGE
- latin[6] = '\u0006';
- latinEsc[6] = "%06";
- // 0x0007 7 <control>: BELL
- latin[7] = '\u0007';
- latinEsc[7] = "%07";
- // 0x0008 8 <control>: BACKSPACE
- latin[8] = '\u0008';
- latinEsc[8] = "%08";
- // 0x0009 9 <control>: HORIZONTAL TABULATION
- latin[9] = '\u0009';
- latinEsc[9] = "%09";
- // 0x000A 10 <control>: LINE FEED
- latin[10] = '\n';
- latinEsc[10] = "%0A";
- // 0x000B 11 <control>: VERTICAL TABULATION
- latin[11] = '\u000B';
- latinEsc[11] = "%0B";
- // 0x000C 12 <control>: FORM FEED
- latin[12] = '\u000C';
- latinEsc[12] = "%0C";
- // 0x000D 13 <control>: CARRIAGE RETURN
- latin[13] = '\r';
- latinEsc[13] = "%0D";
- // 0x000E 14 <control>: SHIFT OUT
- latin[14] = '\u000E';
- latinEsc[14] = "%0E";
- // 0x000F 15 <control>: SHIFT IN
- latin[15] = '\u000F';
- latinEsc[15] = "%0F";
- // 0x0010 16 <control>: DATA LINK ESCAPE
- latin[16] = '\u0010';
- latinEsc[16] = "%10";
- // 0x0011 17 <control>: DEVICE CONTROL ONE
- latin[17] = '\u0011';
- latinEsc[17] = "%11";
- // 0x0012 18 <control>: DEVICE CONTROL TWO
- latin[18] = '\u0012';
- latinEsc[18] = "%12";
- // 0x0013 19 <control>: DEVICE CONTROL THREE
- latin[19] = '\u0013';
- latinEsc[19] = "%13";
- // 0x0014 20 <control>: DEVICE CONTROL FOUR
- latin[20] = '\u0014';
- latinEsc[20] = "%14";
- // 0x0015 21 <control>: NEGATIVE ACKNOWLEDGE
- latin[21] = '\u0015';
- latinEsc[21] = "%15";
- // 0x0016 22 <control>: SYNCHRONOUS IDLE
- latin[22] = '\u0016';
- latinEsc[22] = "%16";
- // 0x0017 23 <control>: END OF TRANSMISSION BLOCK
- latin[23] = '\u0017';
- latinEsc[23] = "%17";
- // 0x0018 24 <control>: CANCEL
- latin[24] = '\u0018';
- latinEsc[24] = "%18";
- // 0x0019 25 <control>: END OF MEDIUM
- latin[25] = '\u0019';
- latinEsc[25] = "%19";
- // 0x001A 26 <control>: SUBSTITUTE
- latin[26] = '\u001A';
- latinEsc[26] = "%1A";
- // 0x001B 27 <control>: ESCAPE
- latin[27] = '\u001B';
- latinEsc[27] = "%1B";
- // 0x001C 28 <control>: FILE SEPARATOR
- latin[28] = '\u001C';
- latinEsc[28] = "%1C";
- // 0x001D 29 <control>: GROUP SEPARATOR
- latin[29] = '\u001D';
- latinEsc[29] = "%1D";
- // 0x001E 30 <control>: RECORD SEPARATOR
- latin[30] = '\u001E';
- latinEsc[30] = "%1E";
- // 0x001F 31 <control>: UNIT SEPARATOR
- latin[31] = '\u001F';
- latinEsc[31] = "%1F";
- // 0x0020 32 SPACE
- latin[32] = '\u0020';
- latinEsc[32] = "%20";
- // 0x0021 33 EXCLAMATION MARK !
- latin[33] = '\u0021';
- latinEsc[33] = "%21";
- // 0x0022 34 QUOTATION MARK "
- latin[34] = '\u0022';
- latinEsc[34] = "%22";
- // 0x0023 35 NUMBER SIGN #
- latin[35] = '\u0023';
- latinEsc[35] = "%23";
- // 0x0024 36 DOLLAR SIGN $
- latin[36] = '\u0024';
- latinEsc[36] = "%24";
- // 0x0025 37 PERCENT SIGN %
- latin[37] = '\u0025';
- latinEsc[37] = "%25";
- // 0x0026 38 AMPERSAND &
- latin[38] = '\u0026';
- latinEsc[38] = "%26";
- // 0x0027 39 APOSTROPHE '
- latin[39] = '\'';
- latinEsc[39] = "%27";
- // 0x0028 40 LEFT PARENTHESIS (
- latin[40] = '\u0028';
- latinEsc[40] = "%28";
- // 0x0029 41 RIGHT PARENTHESIS )
- latin[41] = '\u0029';
- latinEsc[41] = "%29";
- // 0x002A 42 ASTERISK *
- latin[42] = '\u002A';
- latinEsc[42] = "%2A";
- // 0x002B 43 PLUS SIGN +
- latin[43] = '\u002B';
- latinEsc[43] = "%2B";
- // 0x002C 44 COMMA ,
- latin[44] = '\u002C';
- latinEsc[44] = "%2C";
- // 0x002D 45 HYPHEN-MINUS -
- latin[45] = '\u002D';
- latinEsc[0] = "%2D";
- // 0x002E 46 FULL STOP .
- latin[46] = '\u002E';
- latinEsc[46] = "%2E";
- // 0x002F 47 SOLIDUS /
- latin[47] = '\u002F';
- latinEsc[47] = "%2F";
- // 0x0030 48 DIGIT ZERO 0
- latin[48] = '\u0030';
- latinEsc[48] = "%30";
- // 0x0031 49 DIGIT ONE 1
- latin[49] = '\u0031';
- latinEsc[49] = "%31";
- // 0x0032 50 DIGIT TWO 2
- latin[50] = '\u0032';
- latinEsc[50] = "%32";
- // 0x0033 51 DIGIT THREE 3
- latin[51] = '\u0033';
- latinEsc[51] = "%33";
- // 0x0034 52 DIGIT FOUR 4
- latin[52] = '\u0034';
- latinEsc[52] = "%34";
- // 0x0035 53 DIGIT FIVE 5
- latin[53] = '\u0035';
- latinEsc[53] = "%35";
- // 0x0036 54 DIGIT SIX 6
- latin[54] = '\u0036';
- latinEsc[54] = "%36";
- // 0x0037 55 DIGIT SEVEN 7
- latin[55] = '\u0037';
- latinEsc[55] = "%37";
- // 0x0038 56 DIGIT EIGHT 8
- latin[56] = '\u0038';
- latinEsc[56] = "%38";
- // 0x0039 57 DIGIT NINE 9
- latin[57] = '\u0039';
- latinEsc[57] = "%39";
- // 0x003A 58 COLON :
- latin[58] = '\u003A';
- latinEsc[58] = "%3A";
- // 0x003B 59 SEMICOLON ;
- latin[59] = '\u003B';
- latinEsc[59] = "%3B";
- // 0x003C 60 LESS-THAN SIGN <
- latin[60] = '\u003C';
- latinEsc[60] = "%3C";
- // 0x003D 61 EQUALS SIGN =
- latin[61] = '\u003D';
- latinEsc[61] = "%3D";
- // 0x003E 62 GREATER-THAN SIGN >
- latin[62] = '\u003E';
- latinEsc[62] = "%3E";
- // 0x003F 63 QUESTION MARK ?
- latin[63] = '\u003F';
- latinEsc[63] = "%3F";
- // 0x0040 64 COMMERCIAL AT @
- latin[64] = '\u0040';
- latinEsc[64] = "%40";
- // 0x0041 65 LATIN CAPITAL LETTER A A
- latin[65] = '\u0041';
- latinEsc[65] = "%41";
- // 0x0042 66 LATIN CAPITAL LETTER B B
- latin[66] = '\u0042';
- latinEsc[66] = "%42";
- // 0x0043 67 LATIN CAPITAL LETTER C C
- latin[67] = '\u0043';
- latinEsc[67] = "%43";
- // 0x0044 68 LATIN CAPITAL LETTER D D
- latin[68] = '\u0044';
- latinEsc[68] = "%44";
- // 0x0045 69 LATIN CAPITAL LETTER E E
- latin[69] = '\u0045';
- latinEsc[69] = "%45";
- // 0x0046 70 LATIN CAPITAL LETTER F F
- latin[70] = '\u0046';
- latinEsc[70] = "%46";
- // 0x0047 71 LATIN CAPITAL LETTER G G
- latin[71] = '\u0047';
- latinEsc[71] = "%47";
- // 0x0048 72 LATIN CAPITAL LETTER H H
- latin[72] = '\u0048';
- latinEsc[72] = "%48";
- // 0x0049 73 LATIN CAPITAL LETTER I I
- latin[73] = '\u0049';
- latinEsc[73] = "%49";
- // 0x004A 74 LATIN CAPITAL LETTER J J
- latin[74] = '\u004A';
- latinEsc[74] = "%4A";
- // 0x004B 75 LATIN CAPITAL LETTER K K
- latin[75] = '\u004B';
- latinEsc[75] = "%4B";
- // 0x004C 76 LATIN CAPITAL LETTER L L
- latin[76] = '\u004C';
- latinEsc[76] = "%4C";
- // 0x004D 77 LATIN CAPITAL LETTER M M
- latin[77] = '\u004D';
- latinEsc[77] = "%4D";
- // 0x004E 78 LATIN CAPITAL LETTER N N
- latin[78] = '\u004E';
- latinEsc[78] = "%4E";
- // 0x004F 79 LATIN CAPITAL LETTER O O
- latin[79] = '\u004F';
- latinEsc[79] = "%4F";
- // 0x0050 80 LATIN CAPITAL LETTER P P
- latin[80] = '\u0050';
- latinEsc[80] = "%50";
- // 0x0051 81 LATIN CAPITAL LETTER Q Q
- latin[81] = '\u0051';
- latinEsc[81] = "%51";
- // 0x0052 82 LATIN CAPITAL LETTER R R
- latin[82] = '\u0052';
- latinEsc[82] = "%52";
- // 0x0053 83 LATIN CAPITAL LETTER S S
- latin[83] = '\u0053';
- latinEsc[83] = "%53";
- // 0x0054 84 LATIN CAPITAL LETTER T T
- latin[84] = '\u0054';
- latinEsc[84] = "%54";
- // 0x0055 85 LATIN CAPITAL LETTER U U
- latin[85] = '\u0055';
- latinEsc[85] = "%55";
- // 0x0056 86 LATIN CAPITAL LETTER V V
- latin[86] = '\u0056';
- latinEsc[86] = "%56";
- // 0x0057 87 LATIN CAPITAL LETTER W W
- latin[87] = '\u0057';
- latinEsc[87] = "%57";
- // 0x0058 88 LATIN CAPITAL LETTER X X
- latin[88] = '\u0058';
- latinEsc[88] = "%58";
- // 0x0059 89 LATIN CAPITAL LETTER Y Y
- latin[89] = '\u0059';
- latinEsc[89] = "%59";
- // 0x005A 90 LATIN CAPITAL LETTER Z Z
- latin[90] = '\u005A';
- latinEsc[90] = "%5A";
- // 0x005B 91 LEFT SQUARE BRACKET [
- latin[91] = '\u005B';
- latinEsc[91] = "%5B";
- // 0x005C 92 REVERSE SOLIDUS \
- latin[92] = '\\';
- latinEsc[92] = "%5C";
- // 0x005D 93 RIGHT SQUARE BRACKET ]
- latin[93] = '\u005D';
- latinEsc[93] = "%5D";
- // 0x005E 94 CIRCUMFLEX ACCENT ^
- latin[94] = '\u005E';
- latinEsc[94] = "%5E";
- // 0x005F 95 LOW LINE _
- latin[95] = '\u005F';
- latinEsc[95] = "%5F";
- // 0x0060 96 GRAVE ACCENT `
- latin[96] = '\u0060';
- latinEsc[96] = "%60";
- // 0x0061 97 LATIN SMALL LETTER A a
- latin[97] = '\u0061';
- latinEsc[97] = "%61";
- // 0x0062 98 LATIN SMALL LETTER B b
- latin[98] = '\u0062';
- latinEsc[98] = "%62";
- // 0x0063 99 LATIN SMALL LETTER C c
- latin[99] = '\u0063';
- latinEsc[99] = "%63";
- // 0x0064 100 LATIN SMALL LETTER D d
- latin[100] = '\u0064';
- latinEsc[100] = "%64";
- // 0x0065 101 LATIN SMALL LETTER E e
- latin[101] = '\u0065';
- latinEsc[101] = "%65";
- // 0x0066 102 LATIN SMALL LETTER F f
- latin[102] = '\u0066';
- latinEsc[102] = "%66";
- // 0x0067 103 LATIN SMALL LETTER G g
- latin[103] = '\u0067';
- latinEsc[103] = "%67";
- // 0x0068 104 LATIN SMALL LETTER H h
- latin[104] = '\u0068';
- latinEsc[104] = "%68";
- // 0x0069 105 LATIN SMALL LETTER I i
- latin[105] = '\u0069';
- latinEsc[105] = "%69";
- // 0x006A 106 LATIN SMALL LETTER J j
- latin[106] = '\u006A';
- latinEsc[106] = "%6A";
- // 0x006B 107 LATIN SMALL LETTER K k
- latin[107] = '\u006B';
- latinEsc[107] = "%6B";
- // 0x006C 108 LATIN SMALL LETTER L l
- latin[108] = '\u006C';
- latinEsc[108] = "%6C";
- // 0x006D 109 LATIN SMALL LETTER M m
- latin[109] = '\u006D';
- latinEsc[109] = "%6D";
- // 0x006E 110 LATIN SMALL LETTER N n
- latin[110] = '\u006E';
- latinEsc[110] = "%6E";
- // 0x006F 111 LATIN SMALL LETTER O o
- latin[111] = '\u006F';
- latinEsc[111] = "%6F";
- // 0x0070 112 LATIN SMALL LETTER P p
- latin[112] = '\u0070';
- latinEsc[112] = "%70";
- // 0x0071 113 LATIN SMALL LETTER Q q
- latin[113] = '\u0071';
- latinEsc[113] = "%71";
- // 0x0072 114 LATIN SMALL LETTER R r
- latin[114] = '\u0072';
- latinEsc[114] = "%72";
- // 0x0073 115 LATIN SMALL LETTER S s
- latin[115] = '\u0073';
- latinEsc[115] = "%73";
- // 0x0074 116 LATIN SMALL LETTER T t
- latin[116] = '\u0074';
- latinEsc[116] = "%74";
- // 0x0075 117 LATIN SMALL LETTER U u
- latin[117] = '\u0075';
- latinEsc[117] = "%75";
- // 0x0076 118 LATIN SMALL LETTER V v
- latin[118] = '\u0076';
- latinEsc[118] = "%76";
- // 0x0077 119 LATIN SMALL LETTER W w
- latin[119] = '\u0077';
- latinEsc[119] = "%77";
- // 0x0078 120 LATIN SMALL LETTER X x
- latin[120] = '\u0078';
- latinEsc[120] = "%78";
- // 0x0079 121 LATIN SMALL LETTER Y y
- latin[121] = '\u0079';
- latinEsc[121] = "%79";
- // 0x007A 122 LATIN SMALL LETTER Z z
- latin[122] = '\u007A';
- latinEsc[122] = "%7A";
- // 0x007B 123 LEFT CURLY BRACKET {
- latin[123] = '\u007B';
- latinEsc[123] = "%7B";
- // 0x007C 124 VERTICAL LINE |
- latin[124] = '\u007C';
- latinEsc[124] = "%7C";
- // 0x007D 125 RIGHT CURLY BRACKET }
- latin[125] = '\u007D';
- latinEsc[125] = "%7D";
- // 0x007E 126 TILDE ~
- latin[126] = '\u007E';
- latinEsc[126] = "%7E";
- // 0x007F 127 <control>: DELETE
- latin[127] = '\u007F';
- latinEsc[127] = "%7F";
-
- // Latin-1 Supplement
- // Position Decimal Name Appearance
- // 0x0080 128 <control>:
- latin[128] = '\u0080';
- latinEsc[128] = "%80";
- // 0x0081 129 <control>: ?
- latin[129] = '\u0081';
- latinEsc[129] = "%81";
- // 0x0082 130 <control>: BREAK PERMITTED HERE
- latin[130] = '\u0082';
- latinEsc[130] = "%82";
- // 0x0083 131 <control>: NO BREAK HERE
- latin[131] = '\u0083';
- latinEsc[131] = "%83";
- // 0x0084 132 <control>:
- latin[132] = '\u0084';
- latinEsc[132] = "%84";
- // 0x0085 133 <control>: NEXT LINE
- latin[133] = '\u0085';
- latinEsc[133] = "%85";
- // 0x0086 134 <control>: START OF SELECTED AREA
- latin[134] = '\u0086';
- latinEsc[134] = "%86";
- // 0x0087 135 <control>: END OF SELECTED AREA
- latin[135] = '\u0087';
- latinEsc[135] = "%87";
- // 0x0088 136 <control>: CHARACTER TABULATION SET
- latin[136] = '\u0088';
- latinEsc[136] = "%88";
- // 0x0089 137 <control>: CHARACTER TABULATION WITH JUSTIFICATION
- latin[137] = '\u0089';
- latinEsc[137] = "%89";
- // 0x008A 138 <control>: LINE TABULATION SET
- latin[138] = '\u008A';
- latinEsc[138] = "%8A";
- // 0x008B 139 <control>: PARTIAL LINE DOWN
- latin[139] = '\u008B';
- latinEsc[139] = "%8B";
- // 0x008C 140 <control>: PARTIAL LINE UP
- latin[140] = '\u008C';
- latinEsc[140] = "%8C";
- // 0x008D 141 <control>: REVERSE LINE FEED
- latin[141] = '\u008D';
- latinEsc[141] = "%8D";
- // 0x008E 142 <control>: SINGLE SHIFT TWO
- latin[142] = '\u008E';
- latinEsc[142] = "%8E";
- // 0x008F 143 <control>: SINGLE SHIFT THREE
- latin[143] = '\u008F';
- latinEsc[143] = "%8F";
- // 0x0090 144 <control>: DEVICE CONTROL STRING
- latin[144] = '\u0090';
- latinEsc[144] = "%90";
- // 0x0091 145 <control>: PRIVATE USE ONE
- latin[145] = '\u0091';
- latinEsc[145] = "%91";
- // 0x0092 146 <control>: PRIVATE USE TWO
- latin[146] = '\u0092';
- latinEsc[146] = "%92";
- // 0x0093 147 <control>: SET TRANSMIT STATE
- latin[147] = '\u0093';
- latinEsc[147] = "%93";
- // 0x0094 148 <control>: CANCEL CHARACTER
- latin[148] = '\u0094';
- latinEsc[148] = "%94";
- // 0x0095 149 <control>: MESSAGE WAITING
- latin[149] = '\u0095';
- latinEsc[149] = "%95";
- // 0x0096 150 <control>: START OF GUARDED AREA
- latin[150] = '\u0096';
- latinEsc[150] = "%96";
- // 0x0097 151 <control>: END OF GUARDED AREA
- latin[151] = '\u0097';
- latinEsc[151] = "%97";
- // 0x0098 152 <control>: START OF STRING
- latin[152] = '\u0098';
- latinEsc[152] = "%98";
- // 0x0099 153 <control>:
- latin[153] = '\u0099';
- latinEsc[153] = "%99";
- // 0x009A 154 <control>: SINGLE CHARACTER INTRODUCER
- latin[154] = '\u009A';
- latinEsc[154] = "%9A";
- // 0x009B 155 <control>: CONTROL SEQUENCE INTRODUCER
- latin[155] = '\u009B';
- latinEsc[155] = "%9B";
- // 0x009C 156 <control>: STRING TERMINATOR
- latin[156] = '\u009C';
- latinEsc[156] = "%9C";
- // 0x009D 157 <control>: OPERATING SYSTEM COMMAND
- latin[157] = '\u009D';
- latinEsc[157] = "%9D";
- // 0x009E 158 <control>: PRIVACY MESSAGE
- latin[158] = '\u009E';
- latinEsc[158] = "%9E";
- // 0x009F 159 <control>: APPLICATION PROGRAM COMMAND
- latin[159] = '\u009F';
- latinEsc[159] = "%9F";
- // 0x00A0 160 NO-BREAK SPACE
- latin[160] = '\u00A0';
- latinEsc[160] = "%A0";
- // 0x00A1 161 INVERTED EXCLAMATION MARK
- latin[161] = '\u00A1';
- latinEsc[161] = "%A1";
- // 0x00A2 162 CENT SIGN
- latin[162] = '\u00A2';
- latinEsc[162] = "%A2";
- // 0x00A3 163 POUND SIGN
- latin[163] = '\u00A3';
- latinEsc[163] = "%A3";
- // 0x00A4 164 CURRENCY SIGN
- latin[164] = '\u00A4';
- latinEsc[164] = "%A4";
- // 0x00A5 165 YEN SIGN
- latin[165] = '\u00A5';
- latinEsc[165] = "%A5";
- // 0x00A6 166 BROKEN BAR
- latin[166] = '\u00A6';
- latinEsc[166] = "%A6";
- // 0x00A7 167 SECTION SIGN
- latin[167] = '\u00A7';
- latinEsc[167] = "%A7";
- // 0x00A8 168 DIAERESIS
- latin[168] = '\u00A8';
- latinEsc[168] = "%A8";
- // 0x00A9 169 COPYRIGHT SIGN
- latin[169] = '\u00A9';
- latinEsc[169] = "%A9";
- // 0x00AA 170 FEMININE ORDINAL INDICATOR
- latin[170] = '\u00AA';
- latinEsc[170] = "%AA";
- // 0x00AB 171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- latin[171] = '\u00AB';
- latinEsc[171] = "%AB";
- // 0x00AC 172 NOT SIGN
- latin[172] = '\u00AC';
- latinEsc[172] = "%AC";
- // 0x00AD 173 SOFT HYPHEN
- latin[173] = '\u00AD';
- latinEsc[173] = "%AD";
- // 0x00AE 174 REGISTERED SIGN
- latin[174] = '\u00AE';
- latinEsc[174] = "%AE";
- // 0x00AF 175 MACRON
- latin[175] = '\u00AF';
- latinEsc[175] = "%AF";
- // 0x00B0 176 DEGREE SIGN
- latin[176] = '\u00B0';
- latinEsc[176] = "%B0";
- // 0x00B1 177 PLUS-MINUS SIGN
- latin[177] = '\u00B1';
- latinEsc[177] = "%B1";
- // 0x00B2 178 SUPERSCRIPT TWO
- latin[178] = '\u00B2';
- latinEsc[178] = "%B2";
- // 0x00B3 179 SUPERSCRIPT THREE
- latin[179] = '\u00B3';
- latinEsc[179] = "%B3";
- // 0x00B4 180 ACUTE ACCENT
- latin[180] = '\u00B4';
- latinEsc[180] = "%B4";
- // 0x00B5 181 MICRO SIGN
- latin[181] = '\u00B5';
- latinEsc[181] = "%B5";
- // 0x00B6 182 PILCROW SIGN
- latin[182] = '\u00B6';
- latinEsc[182] = "%B6";
- // 0x00B7 183 MIDDLE DOT
- latin[183] = '\u00B7';
- latinEsc[183] = "%B7";
- // 0x00B8 184 CEDILLA
- latin[184] = '\u00B8';
- latinEsc[184] = "%B8";
- // 0x00B9 185 SUPERSCRIPT ONE
- latin[185] = '\u00B9';
- latinEsc[185] = "%B9";
- // 0x00BA 186 MASCULINE ORDINAL INDICATOR
- latin[186] = '\u00BA';
- latinEsc[186] = "%BA";
- // 0x00BB 187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- latin[187] = '\u00BB';
- latinEsc[187] = "%BB";
- // 0x00BC 188 VULGAR FRACTION ONE QUARTER
- latin[188] = '\u00BC';
- latinEsc[188] = "%BC";
- // 0x00BD 189 VULGAR FRACTION ONE HALF
- latin[189] = '\u00BD';
- latinEsc[189] = "%BD";
- // 0x00BE 190 VULGAR FRACTION THREE QUARTERS
- latin[190] = '\u00BE';
- latinEsc[190] = "%BE";
- // 0x00BF 191 INVERTED QUESTION MARK
- latin[191] = '\u00BF';
- latinEsc[191] = "%BF";
- // 0x00C0 192 LATIN CAPITAL LETTER A WITH GRAVE
- latin[192] = '\u00C0';
- latinEsc[192] = "%C0";
- // 0x00C1 193 LATIN CAPITAL LETTER A WITH ACUTE
- latin[193] = '\u00C1';
- latinEsc[193] = "%C1";
- // 0x00C2 194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- latin[194] = '\u00C2';
- latinEsc[194] = "%C2";
- // 0x00C3 195 LATIN CAPITAL LETTER A WITH TILDE
- latin[195] = '\u00C3';
- latinEsc[195] = "%C3";
- // 0x00C4 196 LATIN CAPITAL LETTER A WITH DIAERESIS
- latin[196] = '\u00C4';
- latinEsc[196] = "%C4";
- // 0x00C5 197 LATIN CAPITAL LETTER A WITH RING ABOVE
- latin[197] = '\u00C5';
- latinEsc[197] = "%C5";
- // 0x00C6 198 LATIN CAPITAL LETTER AE
- latin[198] = '\u00C6';
- latinEsc[198] = "%C6";
- // 0x00C7 199 LATIN CAPITAL LETTER C WITH CEDILLA
- latin[199] = '\u00C7';
- latinEsc[199] = "%C7";
- // 0x00C8 200 LATIN CAPITAL LETTER E WITH GRAVE
- latin[200] = '\u00C8';
- latinEsc[200] = "%C8";
- // 0x00C9 201 LATIN CAPITAL LETTER E WITH ACUTE
- latin[201] = '\u00C9';
- latinEsc[201] = "%C9";
- // 0x00CA 202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- latin[202] = '\u00CA';
- latinEsc[202] = "%CA";
- // 0x00CB 203 LATIN CAPITAL LETTER E WITH DIAERESIS
- latin[203] = '\u00CB';
- latinEsc[203] = "%CB";
- // 0x00CC 204 LATIN CAPITAL LETTER I WITH GRAVE
- latin[204] = '\u00CC';
- latinEsc[204] = "%CC";
- // 0x00CD 205 LATIN CAPITAL LETTER I WITH ACUTE
- latin[205] = '\u00CD';
- latinEsc[205] = "%CD";
- // 0x00CE 206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- latin[206] = '\u00CE';
- latinEsc[206] = "%CE";
- // 0x00CF 207 LATIN CAPITAL LETTER I WITH DIAERESIS
- latin[207] = '\u00CF';
- latinEsc[207] = "%CF";
- // 0x00D0 208 LATIN CAPITAL LETTER ETH
- latin[208] = '\u00D0';
- latinEsc[208] = "%D0";
- // 0x00D1 209 LATIN CAPITAL LETTER N WITH TILDE
- latin[209] = '\u00D1';
- latinEsc[209] = "%D1";
- // 0x00D2 210 LATIN CAPITAL LETTER O WITH GRAVE
- latin[210] = '\u00D2';
- latinEsc[210] = "%D2";
- // 0x00D3 211 LATIN CAPITAL LETTER O WITH ACUTE
- latin[211] = '\u00D3';
- latinEsc[211] = "%D3";
- // 0x00D4 212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- latin[212] = '\u00D4';
- latinEsc[212] = "%D4";
- // 0x00D5 213 LATIN CAPITAL LETTER O WITH TILDE
- latin[213] = '\u00D5';
- latinEsc[213] = "%D5";
- // 0x00D6 214 LATIN CAPITAL LETTER O WITH DIAERESIS
- latin[214] = '\u00D6';
- latinEsc[214] = "%D6";
- // 0x00D7 215 MULTIPLICATION SIGN
- latin[215] = '\u00D7';
- latinEsc[215] = "%D7";
- // 0x00D8 216 LATIN CAPITAL LETTER O WITH STROKE
- latin[216] = '\u00D8';
- latinEsc[216] = "%D8";
- // 0x00D9 217 LATIN CAPITAL LETTER U WITH GRAVE
- latin[217] = '\u00D9';
- latinEsc[217] = "%D9";
- // 0x00DA 218 LATIN CAPITAL LETTER U WITH ACUTE
- latin[218] = '\u00DA';
- latinEsc[218] = "%DA";
- // 0x00DB 219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- latin[219] = '\u00DB';
- latinEsc[219] = "%DB";
- // 0x00DC 220 LATIN CAPITAL LETTER U WITH DIAERESIS
- latin[220] = '\u00DC';
- latinEsc[220] = "%DC";
- // 0x00DD 221 LATIN CAPITAL LETTER Y WITH ACUTE
- latin[221] = '\u00DD';
- latinEsc[221] = "%DD";
- // 0x00DE 222 LATIN CAPITAL LETTER THORN
- latin[222] = '\u00DE';
- latinEsc[222] = "%DE";
- // 0x00DF 223 LATIN SMALL LETTER SHARP S
- latin[223] = '\u00DF';
- latinEsc[223] = "%DF";
- // 0x00E0 224 LATIN SMALL LETTER A WITH GRAVE
- latin[224] = '\u00E0';
- latinEsc[224] = "%E0";
- // 0x00E1 225 LATIN SMALL LETTER A WITH ACUTE
- latin[225] = '\u00E1';
- latinEsc[225] = "%E1";
- // 0x00E2 226 LATIN SMALL LETTER A WITH CIRCUMFLEX
- latin[226] = '\u00E2';
- latinEsc[226] = "%E2";
- // 0x00E3 227 LATIN SMALL LETTER A WITH TILDE
- latin[227] = '\u00E3';
- latinEsc[227] = "%E3";
- // 0x00E4 228 LATIN SMALL LETTER A WITH DIAERESIS
- latin[228] = '\u00E4';
- latinEsc[228] = "%E4";
- // 0x00E5 229 LATIN SMALL LETTER A WITH RING ABOVE
- latin[229] = '\u00E5';
- latinEsc[229] = "%E5";
- // 0x00E6 230 LATIN SMALL LETTER AE
- latin[230] = '\u00E6';
- latinEsc[230] = "%E6";
- // 0x00E7 231 LATIN SMALL LETTER C WITH CEDILLA
- latin[231] = '\u00E7';
- latinEsc[231] = "%E7";
- // 0x00E8 232 LATIN SMALL LETTER E WITH GRAVE
- latin[232] = '\u00E8';
- latinEsc[232] = "%E8";
- // 0x00E9 233 LATIN SMALL LETTER E WITH ACUTE
- latin[233] = '\u00E9';
- latinEsc[233] = "%E9";
- // 0x00EA 234 LATIN SMALL LETTER E WITH CIRCUMFLEX
- latin[234] = '\u00EA';
- latinEsc[234] = "%EA";
- // 0x00EB 235 LATIN SMALL LETTER E WITH DIAERESIS
- latin[235] = '\u00EB';
- latinEsc[235] = "%EB";
- // 0x00EC 236 LATIN SMALL LETTER I WITH GRAVE
- latin[236] = '\u00EC';
- latinEsc[236] = "%EC";
- // 0x00ED 237 LATIN SMALL LETTER I WITH ACUTE
- latin[237] = '\u00ED';
- latinEsc[237] = "%ED";
- // 0x00EE 238 LATIN SMALL LETTER I WITH CIRCUMFLEX
- latin[238] = '\u00EE';
- latinEsc[238] = "%EE";
- // 0x00EF 239 LATIN SMALL LETTER I WITH DIAERESIS
- latin[239] = '\u00EF';
- latinEsc[239] = "%EF";
- // 0x00F0 240 LATIN SMALL LETTER ETH
- latin[240] = '\u00F0';
- latinEsc[240] = "%F0";
- // 0x00F1 241 LATIN SMALL LETTER N WITH TILDE
- latin[241] = '\u00F1';
- latinEsc[241] = "%F1";
- // 0x00F2 242 LATIN SMALL LETTER O WITH GRAVE
- latin[242] = '\u00F2';
- latinEsc[242] = "%F2";
- // 0x00F3 243 LATIN SMALL LETTER O WITH ACUTE
- latin[243] = '\u00F3';
- latinEsc[243] = "%F3";
- // 0x00F4 244 LATIN SMALL LETTER O WITH CIRCUMFLEX
- latin[244] = '\u00F4';
- latinEsc[244] = "%F4";
- // 0x00F5 245 LATIN SMALL LETTER O WITH TILDE
- latin[245] = '\u00F5';
- latinEsc[245] = "%F5";
- // 0x00F6 246 LATIN SMALL LETTER O WITH DIAERESIS
- latin[246] = '\u00F6';
- latinEsc[246] = "%F6";
- // 0x00F7 247 DIVISION SIGN
- latin[247] = '\u00F7';
- latinEsc[247] = "%F7";
- // 0x00F8 248 LATIN SMALL LETTER O WITH STROKE
- latin[248] = '\u00F8';
- latinEsc[248] = "%F8";
- // 0x00F9 249 LATIN SMALL LETTER U WITH GRAVE
- latin[249] = '\u00F9';
- latinEsc[249] = "%F9";
- // 0x00FA 250 LATIN SMALL LETTER U WITH ACUTE
- latin[250] = '\u00FA';
- latinEsc[250] = "%FA";
- // 0x00FB 251 LATIN SMALL LETTER U WITH CIRCUMFLEX
- latin[251] = '\u00FB';
- latinEsc[251] = "%FB";
- // 0x00FC 252 LATIN SMALL LETTER U WITH DIAERESIS
- latin[252] = '\u00FC';
- latinEsc[252] = "%FC";
- // 0x00FD 253 LATIN SMALL LETTER Y WITH ACUTE
- latin[253] = '\u00FD';
- latinEsc[253] = "%FD";
- // 0x00FE 254 LATIN SMALL LETTER THORN
- latin[254] = '\u00FE';
- latinEsc[254] = "%FE";
- // 0x00FF 255 LATIN SMALL LETTER Y WITH DIAERESIS
- latin[255] = '\u00FF';
- latinEsc[255] = "%FF";
- }
+ private static final boolean isFileCaseInsensitiveOS = File.separatorChar == '\\';
String string;
String scheme;
@@ -1000,9 +46,11 @@ final class UriParser {
boolean absolute;
boolean serverAuthority = false;
int hash = -1;
+ boolean fileSchemeCaseInsensitiveOS;
void parseURI(String uri, boolean forceServer) throws URISyntaxException {
char fSlash = '/';
+ boolean fileURI;
StringBuilder temp = new StringBuilder(uri);
// assign uri string to the input value per spec
string = uri;
@@ -1030,11 +78,13 @@ final class UriParser {
if (index != -1 && (index2 >= index || index2 == -1) && (index3 >= index || index3 == -1)) {
// the characters up to the first ':' comprise the scheme
absolute = true;
- scheme = temp.substring(0, index);
+ scheme = temp.substring(0, index).toLowerCase(Locale.ENGLISH);
if (scheme.length() == 0) {
throw new URISyntaxException(uri, Messages.getString("luni.83"), index);
}
validateScheme(uri, scheme, 0);
+ fileURI = (scheme.equalsIgnoreCase("file"));
+ fileSchemeCaseInsensitiveOS = (fileURI && isFileCaseInsensitiveOS);
schemespecificpart = temp.substring(index + 1);
if (schemespecificpart.length() == 0) {
throw new URISyntaxException(uri, Messages.getString("luni.84"), index + 1);
@@ -1054,6 +104,7 @@ final class UriParser {
query = temp.substring(index + 1);
temp.delete(index, temp.length());
validateQuery(uri, query, index2 + 1 + index);
+ if (query == "") query = null;
}
// Authority and Path
if (temp.length() >= 2 && temp.charAt(0) == fSlash && temp.charAt(1) == fSlash) {
@@ -1061,7 +112,15 @@ final class UriParser {
index = temp.indexOf("/", 2);
if (index != -1) {
authority = temp.substring(2, index);
- path = temp.substring(index);
+ path = temp.substring(index);// begins with "/"
+ // path = path-abempty ; begins with "/" or is empty
+ String [] segment = path.split("/");
+ int l = segment.length;
+ int index4 = 1;
+ for (int i = 0; i < l ; i++){
+ validateSegment(uri, segment[i], index1 + index + index4, Uri.segmentLegal);
+ index4 += (segment[i].length() + 1);
+ }
} else {
authority = temp.substring(2);
if (authority.length() == 0 && query == null && fragment == null) {
@@ -1073,27 +132,73 @@ final class UriParser {
}
if (authority.length() == 0) {
authority = null;
- } else {
- validateAuthority(uri, authority, index1 + 3);
- }
+ }
+ // Authority validated by userinfo, host and port, later.
+// else {
+// validateAuthority(uri, authority, index1 + 3);
+// }
} else {
// no authority specified
+ String legal;
+ int index4 = 0;
+ if (scheme == null){
+ // path-noscheme ; begins with a non-colon segment
+ // path-noscheme = segment-nz-nc *( "/" segment )
+ legal = Uri.segmentNzNcLegal;
+ } else {
+ legal = Uri.segmentLegal;
+ index4 = index;
+ // increment index4 if starts with slash.
+ //if (temp.charAt(0) == fSlash) index4 ++;
+ }
path = temp.toString();
+ String [] segment = path.split("/");
+ int l = segment.length;
+ for (int i = 0; i < l ; i++){
+ // in case scheme == null only first segment is segment-nz-nc
+ if (i == 1) legal = Uri.segmentLegal;
+ validateSegment(uri, segment[i], index4, legal);
+ index4 += (segment[i].length() + 1);
+ }
}
- int pathIndex = 0;
- if (index2 > -1) {
- pathIndex += index2;
- }
- if (index > -1) {
- pathIndex += index;
- }
- validatePath(uri, path, pathIndex);
} else {
// if not hierarchical, URI is opaque
opaque = true;
validateSsp(uri, schemespecificpart, index2 + 2 + index);
}
parseAuthority(forceServer);
+ // Normalise path and replace string.
+ if (!opaque){
+ StringBuilder result = new StringBuilder();
+ String normalizedPath = normalize(path);
+ if (scheme != null) {
+ result.append(scheme);
+ result.append(':');
+ }
+
+ schemespecificpart = setSchemeSpecificPart(authority, normalizedPath , query);
+
+ if (authority != null) {
+ result.append("//"); //$NON-NLS-1$
+ result.append(authority);
+ }
+
+ if (path != null) {
+ result.append(normalizedPath);
+ }
+
+ if (query != null) {
+ result.append('?');
+ result.append(query);
+ }
+
+ if (fragment != null) {
+ result.append('#');
+ result.append(fragment);
+ }
+
+ this.string = result.toString();
+ }
}
private void validateScheme(String uri, String scheme, int index) throws URISyntaxException {
@@ -1111,31 +216,37 @@ final class UriParser {
private void validateSsp(String uri, String ssp, int index) throws URISyntaxException {
try {
- URIEncoderDecoder.validate(ssp, Uri.allLegal);
+ URIEncoderDecoder.validate(ssp, Uri.allLegalUnescaped);
} catch (URISyntaxException e) {
throw new URISyntaxException(uri, Messages.getString("luni.86", e.getReason()), index + e.getIndex());
}
}
- private void validateAuthority(String uri, String authority, int index) throws URISyntaxException {
- try {
- URIEncoderDecoder.validate(authority, "@[]" + Uri.someLegal); //$NON-NLS-1$
- } catch (URISyntaxException e) {
- throw new URISyntaxException(uri, Messages.getString("luni.87", e.getReason()), index + e.getIndex());
- }
- }
-
- private void validatePath(String uri, String path, int index) throws URISyntaxException {
+// private void validateAuthority(String uri, String authority, int index) throws URISyntaxException {
+// try {
+// URIEncoderDecoder.validate(authority, "@[]" + Uri.someLegal); //$NON-NLS-1$
+// } catch (URISyntaxException e) {
+// throw new URISyntaxException(uri, Messages.getString("luni.87", e.getReason()), index + e.getIndex());
+// }
+// }
+//
+// private void validatePath(String uri, String path, int index) throws URISyntaxException {
+// try {
+// URIEncoderDecoder.validate(path, "/@" + Uri.someLegal); //$NON-NLS-1$
+// } catch (URISyntaxException e) {
+// throw new URISyntaxException(uri, Messages.getString("luni.88", e.getReason()), index + e.getIndex());
+// }
+// }
+ private void validateSegment(String uri, String segment, int index, String legal) throws URISyntaxException {
try {
- URIEncoderDecoder.validate(path, "/@" + Uri.someLegal); //$NON-NLS-1$
+ URIEncoderDecoder.validate(segment, legal); //$NON-NLS-1$
} catch (URISyntaxException e) {
throw new URISyntaxException(uri, Messages.getString("luni.88", e.getReason()), index + e.getIndex());
}
}
-
private void validateQuery(String uri, String query, int index) throws URISyntaxException {
try {
- URIEncoderDecoder.validate(query, Uri.queryLegal);
+ URIEncoderDecoder.validate(query, Uri.queryFragLegal);
} catch (URISyntaxException e) {
throw new URISyntaxException(uri, Messages.getString("luni.89", e.getReason()), index + e.getIndex());
}
@@ -1143,7 +254,7 @@ final class UriParser {
private void validateFragment(String uri, String fragment, int index) throws URISyntaxException {
try {
- URIEncoderDecoder.validate(fragment, Uri.allLegal);
+ URIEncoderDecoder.validate(fragment, Uri.queryFragLegal);
} catch (URISyntaxException e) {
throw new URISyntaxException(uri, Messages.getString("luni.8A", e.getReason()), index + e.getIndex());
}
@@ -1224,12 +335,18 @@ final class UriParser {
}
private void validateUserinfo(String uri, String userinfo, int index) throws URISyntaxException {
- for (int i = 0; i < userinfo.length(); i++) {
- char ch = userinfo.charAt(i);
- if (ch == ']' || ch == '[') {
- throw new URISyntaxException(uri, Messages.getString("luni.8C"), index + i);
- }
+ try {
+ URIEncoderDecoder.validate(userinfo, Uri.userinfoLegal); //$NON-NLS-1$
+ } catch (URISyntaxException e) {
+ throw new URISyntaxException(uri, Messages.getString("luni.8C", e.getReason()), index + e.getIndex());
}
+//
+// for (int i = 0; i < userinfo.length(); i++) {
+// char ch = userinfo.charAt(i);
+// if (ch == ']' || ch == '[') {
+// throw new URISyntaxException(uri, Messages.getString("luni.8C"), index + i);
+// }
+// }
}
/**
@@ -1238,10 +355,12 @@ final class UriParser {
*/
private boolean isValidHost(boolean forceServer, String host) throws URISyntaxException {
if (host.charAt(0) == '[') {
- // ipv6 address
+ // ipv6 address or IPvFuture
if (host.charAt(host.length() - 1) != ']') {
throw new URISyntaxException(host, Messages.getString("luni.8D"), 0); //$NON-NLS-1$
}
+ // check for valid IPvFuture syntax.
+ if (isValidIPvFutureAddress(host)) return true;
if (!isValidIP6Address(host)) {
throw new URISyntaxException(host, Messages.getString("luni.8E")); //$NON-NLS-1$
}
@@ -1273,12 +392,8 @@ final class UriParser {
return false;
}
- private boolean isValidDomainName(String host) {
- try {
- URIEncoderDecoder.validateSimple(host, "-."); //$NON-NLS-1$
- } catch (URISyntaxException e) {
- return false;
- }
+ private boolean isValidDomainName(String host) throws URISyntaxException {
+ URIEncoderDecoder.validate(host, Uri.hostRegNameLegal); //$NON-NLS-1$
String label = null;
StringTokenizer st = new StringTokenizer(host, "."); //$NON-NLS-1$
while (st.hasMoreTokens()) {
@@ -1456,5 +571,125 @@ final class UriParser {
private boolean isValidHexChar(char c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
}
+
+ private boolean isValidIPvFutureAddress(String ipvFuture) throws URISyntaxException {
+ // [ at index 0 has been checked.
+ if (ipvFuture.charAt(1) != 'v') return false;
+ if (!isValidHexChar(ipvFuture.charAt(2))) return false;
+ if (ipvFuture.charAt(3) != '.') return false;
+ String sub = ipvFuture.substring(4, ipvFuture.length()-1);
+ URIEncoderDecoder.validate(sub, Uri.iPvFuture);
+ return true;
+ }
+
+ /*
+ * normalize path, and return the resulting string
+ */
+ private String normalize(String path) {
+ // count the number of '/'s, to determine number of segments
+ int index = -1;
+ int pathlen = path.length();
+ int size = 0;
+ if (pathlen > 0 && path.charAt(0) != '/') {
+ size++;
+ }
+ while ((index = path.indexOf('/', index + 1)) != -1) {
+ if (index + 1 < pathlen && path.charAt(index + 1) != '/') {
+ size++;
+ }
+ }
+
+ String[] seglist = new String[size];
+ boolean[] include = new boolean[size];
+
+ // break the path into segments and store in the list
+ int current = 0;
+ int index2 = 0;
+ index = (pathlen > 0 && path.charAt(0) == '/') ? 1 : 0;
+ while ((index2 = path.indexOf('/', index + 1)) != -1) {
+ seglist[current++] = path.substring(index, index2);
+ index = index2 + 1;
+ }
+
+ // if current==size, then the last character was a slash
+ // and there are no more segments
+ if (current < size) {
+ seglist[current] = path.substring(index);
+ }
+
+ // determine which segments get included in the normalized path
+ for (int i = 0; i < size; i++) {
+ include[i] = true;
+ if (seglist[i].equals("..")) { //$NON-NLS-1$
+ int remove = i - 1;
+ // search back to find a segment to remove, if possible
+ while (remove > -1 && !include[remove]) {
+ remove--;
+ }
+ // if we find a segment to remove, remove it and the ".."
+ // segment
+ if (remove > -1 && !seglist[remove].equals("..")) { //$NON-NLS-1$
+ include[remove] = false;
+ include[i] = false;
+ }
+ } else if (seglist[i].equals(".")) { //$NON-NLS-1$
+ include[i] = false;
+ }
+ }
+
+ // put the path back together
+ StringBuilder newpath = new StringBuilder();
+ if (path.startsWith("/")) { //$NON-NLS-1$
+ newpath.append('/');
+ }
+
+ for (int i = 0; i < seglist.length; i++) {
+ if (include[i]) {
+ newpath.append(seglist[i]);
+ newpath.append('/');
+ }
+ }
+
+ // if we used at least one segment and the path previously ended with
+ // a slash and the last segment is still used, then delete the extra
+ // trailing '/'
+ if (!path.endsWith("/") && seglist.length > 0 //$NON-NLS-1$
+ && include[seglist.length - 1]) {
+ newpath.deleteCharAt(newpath.length() - 1);
+ }
+
+ String result = newpath.toString();
+
+ // check for a ':' in the first segment if one exists,
+ // prepend "./" to normalize
+ index = result.indexOf(':');
+ index2 = result.indexOf('/');
+ if (index != -1 && (index < index2 || index2 == -1)) {
+ newpath.insert(0, "./"); //$NON-NLS-1$
+ result = newpath.toString();
+ }
+ return result;
+ }
+ /**
+ * UriParser method used to re-calculate the scheme specific part of the
+ * resolved or normalized URIs
+ */
+ private String setSchemeSpecificPart(String authority,
+ String path,
+ String query) {
+ // ssp = [//authority][path][?query]
+ StringBuilder ssp = new StringBuilder();
+ if (authority != null) {
+ ssp.append("//" + authority); //$NON-NLS-1$
+ }
+ if (path != null) {
+ ssp.append(path);
+ }
+ if (query != null) {
+ ssp.append("?" + query); //$NON-NLS-1$
+ }
+ // reset string, so that it can be re-calculated correctly when asked.
+ return ssp.toString();
+ }
}
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/DefaultPolicyParser.java Mon Apr 1 07:47:44 2013
@@ -189,7 +189,7 @@ class DefaultPolicyParser implements Pol
PermissionGrant resolveGrant(DefaultPolicyScanner.GrantEntry ge,
KeyStore ks, Properties system, boolean resolve) throws Exception {
if ( ge == null ) return null;
- List<URI> codebases = new ArrayList<URI>(8);
+ List<String> codebases = new ArrayList<String>(8);
Certificate[] signers = null;
Set<Principal> principals = new HashSet<Principal>();
Set<Permission> permissions = new HashSet<Permission>();
@@ -249,7 +249,7 @@ class DefaultPolicyParser implements Pol
}
}
PermissionGrantBuilder pgb = PermissionGrantBuilder.newBuilder();
- Iterator<URI> iter = codebases.iterator();
+ Iterator<String> iter = codebases.iterator();
while (iter.hasNext()){
pgb.uri(iter.next());
}
@@ -261,13 +261,11 @@ class DefaultPolicyParser implements Pol
.build();
}
- URI getURI(String uriString) throws MalformedURLException, URISyntaxException{
+ String getURI(String uriString) throws MalformedURLException, URISyntaxException{
// We do this to support windows, this is to ensure that path
// capitalisation is correct and illegal strings are escaped correctly.
if (uriString == null) return null;
- uriString = UriString.fixWindowsURI(uriString);
- uriString = UriString.escapeIllegalCharacters(uriString);
- return new URI(uriString);
+ return UriString.fixWindowsURI(uriString);
}
Segment segment(String s, Properties p) throws ExpansionFailedException{
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilder.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilder.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilder.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilder.java Mon Apr 1 07:47:44 2013
@@ -211,7 +211,7 @@ public abstract class PermissionGrantBui
* @param uri - RFC3986 compliant URI or null.
* @return
*/
- public abstract PermissionGrantBuilder uri(URI uri);
+ public abstract PermissionGrantBuilder uri(String path);
/**
* Extracts ProtectionDomain
* from the Class for use in the PermissionGrantBuilder. The ClassLoader
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilderImp.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilderImp.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilderImp.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/PermissionGrantBuilderImp.java Mon Apr 1 07:47:44 2013
@@ -36,6 +36,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.river.api.net.Uri;
/**
* PermissionGrantBuilderImp represents the serialized form of all
@@ -56,7 +57,7 @@ class PermissionGrantBuilderImp extends
/*@serial */
- private URI[] uri;
+ private String[] uri;
/*@serial */
private Certificate[] certs;
/*@serial */
@@ -69,7 +70,7 @@ class PermissionGrantBuilderImp extends
private boolean hasDomain;
// Transient Fields
- private transient Collection<URI> uris;
+ private transient Collection<String> uris;
private transient WeakReference<ProtectionDomain> domain;
PermissionGrantBuilderImp() {
@@ -105,9 +106,9 @@ class PermissionGrantBuilderImp extends
}
@Override
- public PermissionGrantBuilder uri(java.net.URI uri) {
- if (this.uris == null) this.uris = new ArrayList<URI>(6);
- this.uris.add(uri);
+ public PermissionGrantBuilder uri(String path) {
+ if (this.uris == null) this.uris = new ArrayList<String>(6);
+ this.uris.add(path);
return this;
}
@@ -152,8 +153,8 @@ class PermissionGrantBuilderImp extends
// are treated special.
return new ClassLoaderGrant(domain, principals, permissions );
case URI:
- if (uris != null && !uris.isEmpty() ) uri = uris.toArray(new URI[uris.size()]);
- if (uri == null ) uri = new URI[0];
+ if (uris != null && !uris.isEmpty() ) uri = uris.toArray(new String[uris.size()]);
+ if (uri == null ) uri = new String[0];
return new URIGrant(uri, certs, principals, permissions);
case CODESOURCE_CERTS:
return new CertificateGrant(certs, principals, permissions);
@@ -180,7 +181,7 @@ class PermissionGrantBuilderImp extends
}
private void writeObject(ObjectOutputStream out) throws IOException{
- if (uris != null && !uris.isEmpty()) uri = uris.toArray(new URI[uris.size()]);
+ if (uris != null && !uris.isEmpty()) uri = uris.toArray(new String[uris.size()]);
out.defaultWriteObject();
}
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/URIGrant.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/URIGrant.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/URIGrant.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/security/URIGrant.java Mon Apr 1 07:47:44 2013
@@ -36,6 +36,7 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.river.api.net.Uri;
import org.apache.river.impl.net.UriString;
/**
@@ -44,20 +45,21 @@ import org.apache.river.impl.net.UriStri
*/
class URIGrant extends CertificateGrant {
private static final long serialVersionUID = 1L;
- private final Collection<URI> location;
+ private final Collection<Uri> location;
private final int hashCode;
@SuppressWarnings("unchecked")
- URIGrant(URI[] uri, Certificate[] certs, Principal[] pals, Permission[] perm){
+ URIGrant(String[] uri, Certificate[] certs, Principal[] pals, Permission[] perm){
super( certs, pals, perm);
int l = uri.length;
- Collection<URI> uris = new ArrayList<URI>(l);
+ Collection<Uri> uris = new ArrayList<Uri>(l);
for ( int i = 0; i < l ; i++ ){
try {
- // REMIND: Do we need to move all normalisation into the URIGrant and
+ // Do we need to move all normalisation into the URIGrant and
// store the normalised and original forms separately? File uri are platform
// dependant and someone may want to make a grant applicable many different platforms.
- uris.add(uri[i] != null ? UriString.normalise(uri[i]) : null);
+ // Uri resolves this issue - fixed 31st Mar 2013
+ uris.add(uri[i] != null ? Uri.parseAndCreate(uri[i]) : null);
} catch (URISyntaxException ex) {
ex.printStackTrace(System.err);
}
@@ -103,7 +105,7 @@ class URIGrant extends CertificateGrant
public boolean implies(ClassLoader cl, Principal[] p){
if ( !implies(p)) return false;
if ( location.isEmpty() ) return true;
- Iterator<URI> it = location.iterator();
+ Iterator<Uri> it = location.iterator();
while (it.hasNext()){
if (it.next() == null) return true;
}
@@ -125,13 +127,13 @@ class URIGrant extends CertificateGrant
if (codeSource == null) return false; // Null CodeSource is not implied.
if (location.isEmpty()) return true; // But CodeSource with null URL is implied, if this location is empty.
int l = location.size();
- URI[] uris = location.toArray(new URI[l]);
+ Uri[] uris = location.toArray(new Uri[l]);
for (int i = 0; i<l ; i++ ){
if (uris[i] == null) return true;
}
URL url = codeSource.getLocation();
if (url == null ) return false;
- URI implied = null;
+ Uri implied = null;
try {
implied = AccessController.doPrivileged(new NormaliseURLAction(url));
} catch (PrivilegedActionException ex) {
@@ -210,7 +212,7 @@ class URIGrant extends CertificateGrant
* @return {@code true} if the argument code source is implied by this
* {@code CodeSource}, otherwise {@code false}.
*/
- final boolean implies(URI grant, URI implied) { // package private for junit
+ final boolean implies(Uri grant, Uri implied) { // package private for junit
//
// Here, javadoc:N refers to the appropriate item in the API spec for
// the CodeSource.implies()
@@ -414,9 +416,9 @@ class URIGrant extends CertificateGrant
@Override
public PermissionGrantBuilder getBuilderTemplate() {
PermissionGrantBuilder pgb = super.getBuilderTemplate();
- Iterator<URI> it = location.iterator();
+ Iterator<Uri> it = location.iterator();
while (it.hasNext()){
- pgb.uri(it.next());
+ pgb.uri(it.next().toString());
}
pgb.context(PermissionGrantBuilder.URI);
return pgb;
@@ -433,7 +435,7 @@ class URIGrant extends CertificateGrant
throw new InvalidObjectException("PermissionGrantBuilder required");
}
- private static class NormaliseURLAction implements PrivilegedExceptionAction<URI> {
+ private static class NormaliseURLAction implements PrivilegedExceptionAction<Uri> {
private final URL codesource;
NormaliseURLAction(URL codebase){
@@ -441,8 +443,8 @@ class URIGrant extends CertificateGrant
}
@Override
- public URI run() throws Exception {
- return PolicyUtils.normalizeURL(codesource);
+ public Uri run() throws Exception {
+ return Uri.urlToUri(codesource);
}
}
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/util/Facade.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/util/Facade.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/util/Facade.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/util/Facade.java Mon Apr 1 07:47:44 2013
@@ -21,7 +21,7 @@ package org.apache.river.api.util;
/**
* Interface definition of the facade pattern.
* @author Peter Firmstone.
- * @since 2.2.0
+ * @since 2.3.0
*/
public interface Facade<T> {
/**
Modified: river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/net/UriString.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/net/UriString.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/net/UriString.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/net/UriString.java Mon Apr 1 07:47:44 2013
@@ -248,8 +248,8 @@ public class UriString {
if (path.endsWith(forwardSlash)) directory = true;
path = new File(path).getAbsolutePath();
if (directory) {
- if (! (path.endsWith(File.pathSeparator))){
- path = path + File.pathSeparator;
+ if (! (path.endsWith(File.separator))){
+ path = path + File.separator;
}
}
return normalisation(filePathToURI(path));
Modified: river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/net/UriTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/net/UriTest.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/net/UriTest.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/net/UriTest.java Mon Apr 1 07:47:44 2013
@@ -38,7 +38,8 @@ public class UriTest extends TestCase {
new Uri(
"http://user%C3%9F%C2%A3info@host:80/a%E2%82%ACpath?qu%C2%A9%C2%AEery#fr%C3%A4%C3%A8g"),
// escaped octets for unicode chars
- new Uri(
+ Uri.escapeAndCreate(
+
"ascheme://user\u00DF\u00A3info@host:0/a\u20ACpath?qu\u00A9\u00AEery#fr\u00E4\u00E8g"),
// unicode chars equivalent to = new
// Uri("ascheme://user\u00df\u00a3info@host:0/a\u0080path?qu\u00a9\u00aeery#fr\u00e4\u00e8g"),
@@ -125,7 +126,7 @@ public class UriTest extends TestCase {
for (int i = 0; i < constructorTests.length; i++) {
try {
- new Uri(constructorTests[i]);
+ Uri.parseAndCreate(constructorTests[i]);
} catch (URISyntaxException e) {
fail("Failed to construct Uri for: " + constructorTests[i]
+ " : " + e);
@@ -174,6 +175,7 @@ public class UriTest extends TestCase {
+ constructorTestsInvalidIndices[i] + ", received: "
+ e.getIndex(),
e.getIndex() == constructorTestsInvalidIndices[i]);
+ e.printStackTrace(System.err);
}
}
@@ -329,8 +331,8 @@ public class UriTest extends TestCase {
"fragment"); // unicode chars in host name
// equivalent to construct1("http", "user", "host\u00dfname", -1,
// "/file", "query", "fragment");
- construct1("http", "user", "host%20name", -1, "/file", "query",
- "fragment"); // escaped octets in host name
+// construct1("http", "user", "host%20name", -1, "/file", "query",
+// "fragment"); // escaped octets in host name
construct1("http", "user", "host name", -1, "/file", "query",
"fragment"); // illegal char in host name
construct1("http", "user", "host]name", -1, "/file", "query",
@@ -486,18 +488,18 @@ public class UriTest extends TestCase {
assertEquals("wrong fragment", "f/r\u00DFag", uri.getFragment());
// equivalent to = assertTrue("wrong fragment",
// uri.getFragment().equals("f/r\u00dfag"));
- assertEquals("wrong SchemeSpecificPart", "///p#a%E2%82%ACth?q^u%25ery",
+ assertEquals("wrong SchemeSpecificPart", "/p#a%E2%82%ACth?q^u%25ery",
uri.getSchemeSpecificPart());
assertEquals("wrong RawSchemeSpecificPart",
- "///p%23a%25E2%2582%25ACth?q%5Eu%2525ery", uri
+ "/p%23a%25E2%2582%25ACth?q%5Eu%2525ery", uri
.getRawSchemeSpecificPart());
assertEquals(
"incorrect toString()",
- "ht12-3+tp:///p%23a%25E2%2582%25ACth?q%5Eu%2525ery#f/r\u00dfag",
+ "ht12-3+tp:/p%23a%25E2%2582%25ACth?q%5Eu%2525ery#f/r%C3%9Fag",
uri.toString());
assertEquals("incorrect toASCIIString()",
- "ht12-3+tp:///p%23a%25E2%2582%25ACth?q%5Eu%2525ery#f/r%C3%9Fag", uri
+ "ht12-3+tp:/p%23a%25E2%2582%25ACth?q%5Eu%2525ery#f/r%C3%9Fag", uri
.toASCIIString());
}
@@ -708,8 +710,8 @@ public class UriTest extends TestCase {
Uri b = new Uri(equalsData[i][0]);
Uri r = new Uri(equalsData[i][1]);
if (b.equals(r) != equalsResults[i]) {
- fail("Error: " + equalsData[i][0] + " == " + equalsData[i][1]
- + "? -> " + b.equals(r) + " expected "
+ fail("Error: " + b.toString() + " == " + r.toString()
+ + " ? -> " + b.equals(r) + " expected "
+ equalsResults[i]);
}
}
@@ -783,19 +785,19 @@ public class UriTest extends TestCase {
assertNull("Authority not null for URI: " + uri, uri.getAuthority());
assertNull("Host not null for Uri " + uri, uri.getHost());
assertEquals("testA, toString() returned incorrect value",
- "file:///tmp/", uri.toString());
+ "file:/tmp/", uri.toString());
uri = new Uri("file", "", "/tmp", "frag");
assertNull("Authority not null for URI: " + uri, uri.getAuthority());
assertNull("Host not null for Uri " + uri, uri.getHost());
assertEquals("testB, toString() returned incorrect value",
- "file:///tmp#frag", uri.toString());
+ "file:/tmp#frag", uri.toString());
uri = new Uri("file", "", "/tmp", "query", "frag");
assertNull("Authority not null for URI: " + uri, uri.getAuthority());
assertNull("Host not null for Uri " + uri, uri.getHost());
assertEquals("test C, toString() returned incorrect value",
- "file:///tmp?query#frag", uri.toString());
+ "file:/tmp?query#frag", uri.toString());
// after normalization the host string info may be lost since the
// uri string is reconstructed
@@ -804,7 +806,7 @@ public class UriTest extends TestCase {
assertNull("Authority not null for URI: " + uri2, uri.getAuthority());
assertNull("Host not null for Uri " + uri2, uri.getHost());
assertEquals("test D, toString() returned incorrect value",
- "file:///tmp/a/../b/c?query#frag", uri.toString());
+ "file:/tmp/b/c?query#frag", uri.toString());
assertEquals("test E, toString() returned incorrect value",
"file:/tmp/b/c?query#frag", uri2.toString());
@@ -966,11 +968,11 @@ public class UriTest extends TestCase {
String[] getRawAuthorityResults = {
"user%60%20info@host",
"user%C3%9F%C2%A3info@host:80",
- "user\u00DF\u00A3info@host:0", // =
+ "user%C3%9F%C2%A3info@host:0", // =
// "user\u00df\u00a3info@host:0",
"user%2560%2520info@host:80",
"user%25C3%259F%25C2%25A3info@host",
- "user\u00DF\u00A3info@host:80", // =
+ "user%C3%9F%C2%A3info@host:80", // =
// "user\u00df\u00a3info@host:80",
"user%60%20info@host:81", "user%25info@host:0", null, null,
null, null, "server.org", "reg:istry", null };
@@ -994,9 +996,9 @@ public class UriTest extends TestCase {
String[] getRawFragmentResults = { "fr%5E%20ag",
"fr%C3%A4%C3%A8g",
- "fr\u00E4\u00E8g", // = "fr\u00e4\u00e8g",
+ "fr%C3%A4%C3%A8g", // = "fr\u00e4\u00e8g",
"fr%255E%2520ag", "fr%25C3%25A4%25C3%25A8g",
- "fr\u00E4\u00E8g", // =
+ "fr%C3%A4%C3%A8g", // =
// "fr\u00e4\u00e8g",
"fr%5E%20ag", "f%25rag", null, "", null, "fragment", null,
null, null };
@@ -1020,9 +1022,9 @@ public class UriTest extends TestCase {
String[] getRawPathResults = { "/a%20path",
"/a%E2%82%ACpath",
- "/a\u20ACpath", // = "/a\u0080path",
+ "/a%E2%82%ACpath", // = "/a\u0080path",
"/a%2520path", "/a%25E2%2582%25ACpath",
- "/a\u20ACpath", // =
+ "/a%E2%82%ACpath", // =
// "/a\u0080path",
"/a%20path", "/a%25path", null, "../adirectory/file.html",
null, "", "", "", "/c:/temp/calculate.pl" };
@@ -1047,10 +1049,10 @@ public class UriTest extends TestCase {
String[] getRawQueryResults = {
"qu%60%20ery",
"qu%C2%A9%C2%AEery",
- "qu\u00A9\u00AEery", // = "qu\u00a9\u00aeery",
+ "qu%C2%A9%C2%AEery", // = "qu\u00a9\u00aeery",
"qu%2560%2520ery",
"qu%25C2%25A9%25C2%25AEery",
- "qu\u00A9\u00AEery", // = "qu\u00a9\u00aeery",
+ "qu%C2%A9%C2%AEery", // = "qu\u00a9\u00aeery",
"qu%60%20ery", "que%25ry", null, null, null, null, null,
"query", "" };
@@ -1075,17 +1077,17 @@ public class UriTest extends TestCase {
String[] getRawSspResults = {
"//user%60%20info@host/a%20path?qu%60%20ery",
"//user%C3%9F%C2%A3info@host:80/a%E2%82%ACpath?qu%C2%A9%C2%AEery",
- "//user\u00DF\u00A3info@host:0/a\u20ACpath?qu\u00A9\u00AEery", // =
+ "//user%C3%9F%C2%A3info@host:0/a%E2%82%ACpath?qu%C2%A9%C2%AEery", // =
// "//user\u00df\u00a3info@host:0/a\u0080path?qu\u00a9\u00aeery"
"//user%2560%2520info@host:80/a%2520path?qu%2560%2520ery",
"//user%25C3%259F%25C2%25A3info@host/a%25E2%2582%25ACpath?qu%25C2%25A9%25C2%25AEery",
- "//user\u00DF\u00A3info@host:80/a\u20ACpath?qu\u00A9\u00AEery", // =
+ "//user%C3%9F%C2%A3info@host:80/a%E2%82%ACpath?qu%C2%A9%C2%AEery", // =
// "//user\u00df\u00a3info@host:80/a\u0080path?qu\u00a9\u00aeery"
"//user%60%20info@host:81/a%20path?qu%60%20ery",
"//user%25info@host:0/a%25path?que%25ry", "user@domain.com",
"../adirectory/file.html", "comp.infosystems.www.servers.unix",
"", "//server.org", "//reg:istry?query",
- "///c:/temp/calculate.pl?" };
+ "/c:/temp/calculate.pl?" };
for (int i = 0; i < uris.length; i++) {
String result = uris[i].getRawSchemeSpecificPart();
@@ -1106,10 +1108,10 @@ public class UriTest extends TestCase {
String[] getRawUserInfoResults = {
"user%60%20info",
"user%C3%9F%C2%A3info",
- "user\u00DF\u00A3info", // = "user\u00df\u00a3info",
+ "user%C3%9F%C2%A3info", // = "user\u00df\u00a3info",
"user%2560%2520info",
"user%25C3%259F%25C2%25A3info",
- "user\u00DF\u00A3info", // = "user\u00df\u00a3info",
+ "user%C3%9F%C2%A3info", // = "user\u00df\u00a3info",
"user%60%20info", "user%25info", null, null, null, null, null,
null, null };
@@ -1165,7 +1167,7 @@ public class UriTest extends TestCase {
"//user%info@host:0/a%path?que%ry", "user@domain.com",
"../adirectory/file.html", "comp.infosystems.www.servers.unix",
"", "//server.org", "//reg:istry?query",
- "///c:/temp/calculate.pl?" };
+ "/c:/temp/calculate.pl?" };
for (int i = 0; i < uris.length; i++) {
String result = uris[i].getSchemeSpecificPart();
@@ -1424,14 +1426,14 @@ public class UriTest extends TestCase {
// unicode char in the hostname = new
// Uri("http://host\u00dfname/")
- new Uri("http://host\u00DFname/"),
+// Uri.parseAndCreate("http://host\u00DFname/"),
- new Uri("http", "//host\u00DFname/", null),
+// new Uri("http", "//host\u00DFname/", null),
// = new Uri("http://host\u00dfname/", null),
// escaped octets in host name
- new Uri("http://host%20name/"),
- new Uri("http", "//host%20name/", null),
+// new Uri("http://host%20name/"),
+// new Uri("http", "//host%20name/", null),
// missing host name, port number
new Uri("http://joe@:80"),
@@ -1446,7 +1448,7 @@ public class UriTest extends TestCase {
new Uri("telnet", "//256.197.221.200", null),
new Uri("telnet://198.256.221.200"),
- new Uri("//te%ae.com"), // misc ..
+// new Uri("//te%ae.com"), // misc ..
new Uri("//:port"), new Uri("//:80"),
// last label has to start with alpha char
@@ -1459,16 +1461,16 @@ public class UriTest extends TestCase {
new Uri("//domain-"),
// illegal char in host name
- new Uri("//doma*in"),
+//// new Uri("//doma^in"),
// host expected
new Uri("http://:80/"), new Uri("http://user@/"),
// ipv6 address not enclosed in "[]"
- new Uri("http://3ffe:2a00:100:7031:22:1:80:89/"),
+// new Uri("http://[3ffe:2a00:100:7031:22:1:80:89]/"),
// expected ipv6 addresses to be enclosed in "[]"
- new Uri("http", "34::56:78", "/path", "query", "fragment"),
+// new Uri("http", "[34::56:78]", "/path", "query", "fragment"),
// expected host
new Uri("http", "user@", "/path", "query", "fragment") };
@@ -1748,7 +1750,7 @@ public class UriTest extends TestCase {
"mailto:user@domain.com", "../adirectory/file.html#",
"news:comp.infosystems.www.servers.unix", "#fragment",
"telnet://server.org", "http://reg:istry?query",
- "file:///c:/temp/calculate.pl?" };
+ "file:/c:/temp/calculate.pl?" };
for (int i = 0; i < uris.length; i++) {
String result = uris[i].toASCIIString();
@@ -1772,7 +1774,7 @@ public class UriTest extends TestCase {
"mailto://user@domain.com", "mailto://user%C3%9F@domain.com", };
for (int i = 0; i < toASCIIStringData.length; i++) {
- Uri test = new Uri(toASCIIStringData[i]);
+ Uri test = Uri.parseAndCreate(toASCIIStringData[i]);
String result = test.toASCIIString();
assertTrue("Error: new Uri(\"" + toASCIIStringData[i]
+ "\").toASCIIString() returned: " + result
@@ -1790,12 +1792,12 @@ public class UriTest extends TestCase {
String[] toStringResults = {
"http://user%60%20info@host/a%20path?qu%60%20ery#fr%5E%20ag",
"http://user%C3%9F%C2%A3info@host:80/a%E2%82%ACpath?qu%C2%A9%C2%AEery#fr%C3%A4%C3%A8g",
- "ascheme://user\u00DF\u00A3info@host:0/a\u20ACpath?qu\u00A9\u00AEery#fr\u00E4\u00E8g",
+ "ascheme://user%C3%9F%C2%A3info@host:0/a%E2%82%ACpath?qu%C2%A9%C2%AEery#fr%C3%A4%C3%A8g",
// =
// "ascheme://user\u00df\u00a3info@host:0/a\u0080path?qu\u00a9\u00aeery#fr\u00e4\u00e8g",
"http://user%2560%2520info@host:80/a%2520path?qu%2560%2520ery#fr%255E%2520ag",
"http://user%25C3%259F%25C2%25A3info@host/a%25E2%2582%25ACpath?qu%25C2%25A9%25C2%25AEery#fr%25C3%25A4%25C3%25A8g",
- "ascheme://user\u00DF\u00A3info@host:80/a\u20ACpath?qu\u00A9\u00AEery#fr\u00E4\u00E8g",
+ "ascheme://user%C3%9F%C2%A3info@host:80/a%E2%82%ACpath?qu%C2%A9%C2%AEery#fr%C3%A4%C3%A8g",
// =
// "ascheme://user\u00df\u00a3info@host:80/a\u0080path?qu\u00a9\u00aeery#fr\u00e4\u00e8g",
"http://user%60%20info@host:81/a%20path?qu%60%20ery#fr%5E%20ag",
@@ -1803,7 +1805,7 @@ public class UriTest extends TestCase {
"mailto:user@domain.com", "../adirectory/file.html#",
"news:comp.infosystems.www.servers.unix", "#fragment",
"telnet://server.org", "http://reg:istry?query",
- "file:///c:/temp/calculate.pl?" };
+ "file:/c:/temp/calculate.pl?" };
for (int i = 0; i < uris.length; i++) {
String result = uris[i].toString();
Modified: river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/ConcurrentPolicyFileTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/ConcurrentPolicyFileTest.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/ConcurrentPolicyFileTest.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/ConcurrentPolicyFileTest.java Mon Apr 1 07:47:44 2013
@@ -120,7 +120,7 @@ public class ConcurrentPolicyFileTest ex
.permissions(new Permission[] { sp1 })
.build();
pgb.reset().context(PermissionGrantBuilder.URI);
- PermissionGrant pe2 = pgb.uri(new URI("http://a.b.c"))
+ PermissionGrant pe2 = pgb.uri("http://a.b.c")
.principals(new Principal[0])
.permissions(new Permission[] { sp2 })
.build();
@@ -168,7 +168,7 @@ public class ConcurrentPolicyFileTest ex
PermissionGrant pe1 = pgb.uri(null)
.permissions(new Permission[] { sp1 })
.build();
- PermissionGrant pe2 = pgb.uri(cs2.getLocation().toURI())
+ PermissionGrant pe2 = pgb.uri(cs2.getLocation().toString())
.principals(new Principal[] { new UnresolvedPrincipal(
UnresolvedPrincipal.WILDCARD, UnresolvedPrincipal.WILDCARD) })
.permissions(new Permission[] { sp2 })
@@ -178,7 +178,7 @@ public class ConcurrentPolicyFileTest ex
FakePrincipal.class.getName(), "qqq") })
.permissions(new Permission[] { sp3 })
.build();
- PermissionGrant pe4 = pgb.uri(cs2.getLocation().toURI())
+ PermissionGrant pe4 = pgb.uri(cs2.getLocation().toString())
.principals(new Principal[] { new UnresolvedPrincipal(
FakePrincipal.class.getName(), "ttt") })
.permissions(new Permission[] { sp4 })
Modified: river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/DefaultPolicyParserTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/DefaultPolicyParserTest.java?rev=1463106&r1=1463105&r2=1463106&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/DefaultPolicyParserTest.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/api/security/DefaultPolicyParserTest.java Mon Apr 1 07:47:44 2013
@@ -111,12 +111,7 @@ public class DefaultPolicyParserTest ext
permissions.add(perm2);
permissions.add(perm3);
PermissionGrantBuilder pgb = PermissionGrantBuilder.newBuilder();
- URI uri = null;
- try {
- uri = new URI("file:/opt/src/river/trunk/lib/group.jar");
- } catch (URISyntaxException ex) {
- System.err.println(ex);
- }
+ String uri = "file:/opt/src/river/trunk/lib/group.jar";
grant = pgb
.uri(uri)
.permissions(permissions.toArray(new Permission[4]))