]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/stringprep/NFS4StringPrep.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / stringprep / NFS4StringPrep.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2003-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6 */\r
7 package com.ibm.icu.dev.test.stringprep;\r
8 \r
9 import java.io.IOException;\r
10 import java.io.InputStream;\r
11 import java.io.UnsupportedEncodingException;\r
12 import java.util.MissingResourceException;\r
13 \r
14 import com.ibm.icu.text.StringPrep;\r
15 import com.ibm.icu.text.StringPrepParseException;\r
16 import com.ibm.icu.text.UCharacterIterator;\r
17 \r
18 /**\r
19  * @author ram\r
20  *\r
21  * This is a dumb implementation of NFS4 profiles. It is a direct port of\r
22  * C code, does not use Object Oriented principles. Quick and Dirty implementation\r
23  * for testing.\r
24  */\r
25 public final class NFS4StringPrep {\r
26 \r
27     private StringPrep nfscss = null;\r
28     private StringPrep nfscsi = null;\r
29     private StringPrep nfscis = null;\r
30     private StringPrep nfsmxp = null;\r
31     private StringPrep nfsmxs = null;\r
32     //singleton instance\r
33     private static final NFS4StringPrep prep = new NFS4StringPrep();\r
34     \r
35 \r
36     private  NFS4StringPrep (){\r
37         ClassLoader loader = NFS4StringPrep.class.getClassLoader();\r
38         try{\r
39             InputStream  nfscsiFile = loader.getResourceAsStream("com/ibm/icu/dev/data/testdata/nfscsi.spp");\r
40             nfscsi = new StringPrep(nfscsiFile);\r
41             nfscsiFile.close();\r
42             \r
43             InputStream  nfscssFile = loader.getResourceAsStream("com/ibm/icu/dev/data/testdata/nfscss.spp");\r
44             nfscss = new StringPrep(nfscssFile);\r
45             nfscssFile.close();\r
46             \r
47             InputStream  nfscisFile = loader.getResourceAsStream("com/ibm/icu/dev/data/testdata/nfscis.spp");\r
48             nfscis = new StringPrep(nfscisFile);\r
49             nfscisFile.close();\r
50             \r
51             InputStream  nfsmxpFile = loader.getResourceAsStream("com/ibm/icu/dev/data/testdata/nfsmxp.spp");\r
52             nfsmxp = new StringPrep(nfsmxpFile);\r
53             nfsmxpFile.close();\r
54             \r
55             InputStream  nfsmxsFile = loader.getResourceAsStream("com/ibm/icu/dev/data/testdata/nfsmxs.spp");\r
56             nfsmxs = new StringPrep(nfsmxsFile);\r
57             nfsmxsFile.close();\r
58         }catch(IOException e){\r
59             throw new MissingResourceException(e.toString(),"","");\r
60         }\r
61     }\r
62     \r
63     private static byte[] prepare(byte[] src, StringPrep strprep)\r
64                 throws StringPrepParseException, UnsupportedEncodingException{\r
65         String s = new String(src, "UTF-8");\r
66         UCharacterIterator iter =  UCharacterIterator.getInstance(s);\r
67         StringBuffer out = strprep.prepare(iter,StringPrep.DEFAULT);\r
68         return out.toString().getBytes("UTF-8");\r
69     }\r
70     \r
71     public static byte[] cs_prepare(byte[] src, boolean isCaseSensitive)\r
72                          throws StringPrepParseException, UnsupportedEncodingException{\r
73         if(isCaseSensitive == true ){\r
74             return prepare(src, prep.nfscss);\r
75         }else{\r
76             return prepare(src, prep.nfscsi);\r
77         }\r
78     }\r
79     \r
80     public static byte[] cis_prepare(byte[] src)\r
81                          throws IOException, StringPrepParseException, UnsupportedEncodingException{\r
82         return prepare(src, prep.nfscis);\r
83     }  \r
84     \r
85     /* sorted array for binary search*/\r
86     private static final String[] special_prefixes={\r
87         "ANONYMOUS",    \r
88         "AUTHENTICATED",\r
89         "BATCH", \r
90         "DIALUP", \r
91         "EVERYONE", \r
92         "GROUP",\r
93         "INTERACTIVE",  \r
94         "NETWORK", \r
95         "OWNER",\r
96     };\r
97 \r
98 \r
99     /* binary search the sorted array */\r
100     private static final int findStringIndex(String[] sortedArr,String target){\r
101 \r
102         int left, middle, right,rc;\r
103 \r
104         left =0;\r
105         right= sortedArr.length-1;\r
106 \r
107         while(left <= right){\r
108             middle = (left+right)/2;\r
109             rc= sortedArr[middle].compareTo(target);\r
110         \r
111             if(rc<0){\r
112                 left = middle+1;\r
113             }else if(rc >0){\r
114                 right = middle -1;\r
115             }else{\r
116                 return middle;\r
117             }\r
118         }\r
119         return -1;\r
120     }\r
121     private static final char AT_SIGN = '@';\r
122     \r
123     public static byte[] mixed_prepare(byte[] src)\r
124                          throws IOException, StringPrepParseException, UnsupportedEncodingException{\r
125         String s = new String(src, "UTF-8");\r
126         int index = s.indexOf(AT_SIGN);\r
127         StringBuffer out = new StringBuffer();\r
128 \r
129         if(index > -1){\r
130             /* special prefixes must not be followed by suffixes! */\r
131             String prefixString = s.substring(0,index);\r
132             int i= findStringIndex(special_prefixes, prefixString);\r
133             String suffixString = s.substring(index+1, s.length());\r
134             if(i>-1 && !suffixString.equals("")){\r
135                 throw new StringPrepParseException("Suffix following a special index", StringPrepParseException.INVALID_CHAR_FOUND);\r
136             }\r
137             UCharacterIterator prefix = UCharacterIterator.getInstance(prefixString);\r
138             UCharacterIterator suffix = UCharacterIterator.getInstance(suffixString);\r
139             out.append(prep.nfsmxp.prepare(prefix,StringPrep.DEFAULT));\r
140             out.append(AT_SIGN); // add the delimiter\r
141             out.append(prep.nfsmxs.prepare(suffix, StringPrep.DEFAULT));\r
142         }else{\r
143             UCharacterIterator iter = UCharacterIterator.getInstance(s);\r
144             out.append(prep.nfsmxp.prepare(iter,StringPrep.DEFAULT));\r
145             \r
146         }\r
147        return out.toString().getBytes("UTF-8");\r
148     }\r
149     \r
150 }\r