[AAF-23] Initial code import
[aaf/inno.git] / rosetta / src / main / java / com / att / rosetta / XmlEscape.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aai\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * Copyright © 2017 Amdocs\r
7  * * ===========================================================================\r
8  * * Licensed under the Apache License, Version 2.0 (the "License");\r
9  * * you may not use this file except in compliance with the License.\r
10  * * You may obtain a copy of the License at\r
11  * * \r
12  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
13  * * \r
14  *  * Unless required by applicable law or agreed to in writing, software\r
15  * * distributed under the License is distributed on an "AS IS" BASIS,\r
16  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17  * * See the License for the specific language governing permissions and\r
18  * * limitations under the License.\r
19  * * ============LICENSE_END====================================================\r
20  * *\r
21  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
22  * *\r
23  ******************************************************************************/\r
24 package com.att.rosetta;\r
25 \r
26 import java.io.IOException;\r
27 import java.io.Reader;\r
28 import java.util.Map.Entry;\r
29 import java.util.TreeMap;\r
30 \r
31 public class XmlEscape {\r
32         private XmlEscape() {}\r
33         \r
34         private static final TreeMap<String,Integer> charMap; // see initialization at end\r
35         private static final TreeMap<Integer,String> intMap; // see initialization at end\r
36 \r
37         public static void xmlEscape(StringBuilder sb, Reader r) throws ParseException {\r
38                 try {\r
39                         int c;\r
40                         StringBuilder esc = new StringBuilder();\r
41                         for(int cnt = 0;cnt<9 /*max*/; ++cnt) {\r
42                                 if((c=r.read())<0)throw new ParseException("Invalid Data: Unfinished Escape Sequence");\r
43                                 if(c!=';') { \r
44                                         esc.append((char)c);\r
45                                 } else { // evaluate\r
46                                         Integer i = charMap.get(esc.toString());\r
47                                         if(i==null) {\r
48                                                 // leave in nasty XML format for now.\r
49                                                 sb.append('&');\r
50                                                 sb.append(esc);\r
51                                                 sb.append(';');\r
52                                         } else {\r
53                                                 sb.append((char)i.intValue());\r
54                                         }\r
55                                         break;\r
56                                 }\r
57                         }\r
58                         \r
59                         \r
60                 } catch (IOException e) {\r
61                         throw new ParseException(e);\r
62                 }\r
63         }\r
64         \r
65         public static void xmlEscape(StringBuilder sb, int chr) {\r
66                 sb.append('&');\r
67                 sb.append(intMap.get(chr));\r
68                 sb.append(';');\r
69         }\r
70         \r
71         public static String convert(StringBuilder insb) {\r
72                 int idx, ch;\r
73                 StringBuilder sb=null;\r
74                 for(idx=0;idx<insb.length();++idx) {\r
75                         ch = insb.charAt(idx);\r
76                         if(ch>=160 || ch==34 || ch==38 || ch==39 || ch==60 || ch==62) {\r
77                                 sb = new StringBuilder();\r
78                                 sb.append(insb,0,idx);\r
79                                 break;\r
80                         }\r
81                 }\r
82                 \r
83                 if(sb==null)return insb.toString();\r
84                         \r
85                 for(int i=idx;i<insb.length();++i) {\r
86                         ch = insb.charAt(i);\r
87                         if(ch<160) {\r
88                                 switch(ch) {\r
89                                         case 34: sb.append("&quot;"); break;\r
90                                         case 38: sb.append("&amp;"); break;\r
91                                         case 39: sb.append("&apos;"); break;\r
92                                         case 60: sb.append("&lt;"); break;\r
93                                         case 62: sb.append("&gt;"); break;\r
94                                         default:\r
95                                                 sb.append((char)ch);\r
96                                 }\r
97                         } else { // use map\r
98                                 String s = intMap.get(ch);\r
99                                 if(s==null)sb.append((char)ch);\r
100                                 else {\r
101                                         sb.append('&');\r
102                                         sb.append(s);\r
103                                         sb.append(';');\r
104                                 }\r
105                         }\r
106                 }\r
107                 return sb.toString();\r
108         }\r
109 \r
110         static {\r
111                 charMap = new TreeMap<String, Integer>();\r
112                 intMap = new TreeMap<Integer,String>();\r
113                 charMap.put("quot", 34);\r
114                 charMap.put("amp",38);\r
115                 charMap.put("apos",39);\r
116                 charMap.put("lt",60);\r
117                 charMap.put("gt",62);\r
118                 charMap.put("nbsp",160);\r
119                 charMap.put("iexcl",161);\r
120                 charMap.put("cent",162);\r
121                 charMap.put("pound",163);\r
122                 charMap.put("curren",164);\r
123                 charMap.put("yen",165);\r
124                 charMap.put("brvbar",166);\r
125                 charMap.put("sect",167);\r
126                 charMap.put("uml",168);\r
127                 charMap.put("copy",169);\r
128                 charMap.put("ordf",170);\r
129                 charMap.put("laquo",171);\r
130                 charMap.put("not",172);\r
131                 charMap.put("shy",173);\r
132                 charMap.put("reg",174);\r
133                 charMap.put("macr",175);\r
134                 charMap.put("deg",176);\r
135                 charMap.put("plusmn",177);\r
136                 charMap.put("sup2",178);\r
137                 charMap.put("sup3",179);\r
138                 charMap.put("acute",180);\r
139                 charMap.put("micro",181);\r
140                 charMap.put("para",182);\r
141                 charMap.put("middot",183);\r
142                 charMap.put("cedil",184);\r
143                 charMap.put("sup1",185);\r
144                 charMap.put("ordm",186);\r
145                 charMap.put("raquo",187);\r
146                 charMap.put("frac14",188);\r
147                 charMap.put("frac12",189);\r
148                 charMap.put("frac34",190);\r
149                 charMap.put("iquest",191);\r
150                 charMap.put("Agrave",192);\r
151                 charMap.put("Aacute",193);\r
152                 charMap.put("Acirc",194);\r
153                 charMap.put("Atilde",195);\r
154                 charMap.put("Auml",196);\r
155                 charMap.put("Aring",197);\r
156                 charMap.put("AElig",198);\r
157                 charMap.put("Ccedil",199);\r
158                 charMap.put("Egrave",200);\r
159                 charMap.put("Eacute",201);\r
160                 charMap.put("Ecirc",202);\r
161                 charMap.put("Euml",203);\r
162                 charMap.put("Igrave",204);\r
163                 charMap.put("Iacute",205);\r
164                 charMap.put("Icirc",206);\r
165                 charMap.put("Iuml",207);\r
166                 charMap.put("ETH",208);\r
167                 charMap.put("Ntilde",209);\r
168                 charMap.put("Ograve",210);\r
169                 charMap.put("Oacute",211);\r
170                 charMap.put("Ocirc",212);\r
171                 charMap.put("Otilde",213);\r
172                 charMap.put("Ouml",214);\r
173                 charMap.put("times",215);\r
174                 charMap.put("Oslash",216);\r
175                 charMap.put("Ugrave",217);\r
176                 charMap.put("Uacute",218);\r
177                 charMap.put("Ucirc",219);\r
178                 charMap.put("Uuml",220);\r
179                 charMap.put("Yacute",221);\r
180                 charMap.put("THORN",222);\r
181                 charMap.put("szlig",223);\r
182                 charMap.put("agrave",224);\r
183                 charMap.put("aacute",225);\r
184                 charMap.put("acirc",226);\r
185                 charMap.put("atilde",227);\r
186                 charMap.put("auml",228);\r
187                 charMap.put("aring",229);\r
188                 charMap.put("aelig",230);\r
189                 charMap.put("ccedil",231);\r
190                 charMap.put("egrave",232);\r
191                 charMap.put("eacute",233);\r
192                 charMap.put("ecirc",234);\r
193                 charMap.put("euml",235);\r
194                 charMap.put("igrave",236);\r
195                 charMap.put("iacute",237);\r
196                 charMap.put("icirc",238);\r
197                 charMap.put("iuml",239);\r
198                 charMap.put("eth",240);\r
199                 charMap.put("ntilde",241);\r
200                 charMap.put("ograve",242);\r
201                 charMap.put("oacute",243);\r
202                 charMap.put("ocirc",244);\r
203                 charMap.put("otilde",245);\r
204                 charMap.put("ouml",246);\r
205                 charMap.put("divide",247);\r
206                 charMap.put("oslash",248);\r
207                 charMap.put("ugrave",249);\r
208                 charMap.put("uacute",250);\r
209                 charMap.put("ucirc",251);\r
210                 charMap.put("uuml",252);\r
211                 charMap.put("yacute",253);\r
212                 charMap.put("thorn",254);\r
213                 charMap.put("yuml",255);\r
214                 charMap.put("OElig",338);\r
215                 charMap.put("oelig",339);\r
216                 charMap.put("Scaron",352);\r
217                 charMap.put("scaron",353);\r
218                 charMap.put("Yuml",376);\r
219                 charMap.put("fnof",402);\r
220                 charMap.put("circ",710);\r
221                 charMap.put("tilde",732);\r
222                 charMap.put("Alpha",913);\r
223                 charMap.put("Beta",914);\r
224                 charMap.put("Gamma",915);\r
225                 charMap.put("Delta",916);\r
226                 charMap.put("Epsilon",917);\r
227                 charMap.put("Zeta",918);\r
228                 charMap.put("Eta",919);\r
229                 charMap.put("Theta",920);\r
230                 charMap.put("Iota",921);\r
231                 charMap.put("Kappa",922);\r
232                 charMap.put("Lambda",923);\r
233                 charMap.put("Mu",924);\r
234                 charMap.put("Nu",925);\r
235                 charMap.put("Xi",926);\r
236                 charMap.put("Omicron",927);\r
237                 charMap.put("Pi",928);\r
238                 charMap.put("Rho",929);\r
239                 charMap.put("Sigma",931);\r
240                 charMap.put("Tau",932);\r
241                 charMap.put("Upsilon",933);\r
242                 charMap.put("Phi",934);\r
243                 charMap.put("Chi",935);\r
244                 charMap.put("Psi",936);\r
245                 charMap.put("Omega",937);\r
246                 charMap.put("alpha",945);\r
247                 charMap.put("beta",946);\r
248                 charMap.put("gamma",947);\r
249                 charMap.put("delta",948);\r
250                 charMap.put("epsilon",949);\r
251                 charMap.put("zeta",950);\r
252                 charMap.put("eta",951);\r
253                 charMap.put("theta",952);\r
254                 charMap.put("iota",953);\r
255                 charMap.put("kappa",954);\r
256                 charMap.put("lambda",955);\r
257                 charMap.put("mu",956);\r
258                 charMap.put("nu",957);\r
259                 charMap.put("xi",958);\r
260                 charMap.put("omicron",959);\r
261                 charMap.put("pi",960);\r
262                 charMap.put("rho",961);\r
263                 charMap.put("sigmaf",962);\r
264                 charMap.put("sigma",963);\r
265                 charMap.put("tau",964);\r
266                 charMap.put("upsilon",965);\r
267                 charMap.put("phi",966);\r
268                 charMap.put("chi",967);\r
269                 charMap.put("psi",968);\r
270                 charMap.put("omega",969);\r
271                 charMap.put("thetasym",977);\r
272                 charMap.put("upsih",978);\r
273                 charMap.put("piv",982);\r
274                 charMap.put("ensp",8194);\r
275                 charMap.put("emsp",8195);\r
276                 charMap.put("thinsp",8201);\r
277                 charMap.put("zwnj",8204);\r
278                 charMap.put("zwj",8205);\r
279                 charMap.put("lrm",8206);\r
280                 charMap.put("rlm",8207);\r
281                 charMap.put("ndash",8211);\r
282                 charMap.put("mdash",8212);\r
283                 charMap.put("lsquo",8216);\r
284                 charMap.put("rsquo",8217);\r
285                 charMap.put("sbquo",8218);\r
286                 charMap.put("ldquo",8220);\r
287                 charMap.put("rdquo",8221);\r
288                 charMap.put("bdquo",8222);\r
289                 charMap.put("dagger",8224);\r
290                 charMap.put("Dagger",8225);\r
291                 charMap.put("bull",8226);\r
292                 charMap.put("hellip",8230);\r
293                 charMap.put("permil",8240);\r
294                 charMap.put("prime",8242);\r
295                 charMap.put("Prime",8243);\r
296                 charMap.put("lsaquo",8249);\r
297                 charMap.put("rsaquo",8250);\r
298                 charMap.put("oline",8254);\r
299                 charMap.put("frasl",8260);\r
300                 charMap.put("euro",8364);\r
301                 charMap.put("image",8465);\r
302                 charMap.put("weierp",8472);\r
303                 charMap.put("real",8476);\r
304                 charMap.put("trade",8482);\r
305                 charMap.put("alefsym",8501);\r
306                 charMap.put("larr",8592);\r
307                 charMap.put("uarr",8593);\r
308                 charMap.put("rarr",8594);\r
309                 charMap.put("darr",8595);\r
310                 charMap.put("harr",8596);\r
311                 charMap.put("crarr",8629);\r
312                 charMap.put("lArr",8656);\r
313                 charMap.put("uArr",8657);\r
314                 charMap.put("rArr",8658);\r
315                 charMap.put("dArr",8659);\r
316                 charMap.put("hArr",8660);\r
317                 charMap.put("forall",8704);\r
318                 charMap.put("part",8706);\r
319                 charMap.put("exist",8707);\r
320                 charMap.put("empty",8709);\r
321                 charMap.put("nabla",8711);\r
322                 charMap.put("isin",8712);\r
323                 charMap.put("notin",8713);\r
324                 charMap.put("ni",8715);\r
325                 charMap.put("prod",8719);\r
326                 charMap.put("sum",8721);\r
327                 charMap.put("minus",8722);\r
328                 charMap.put("lowast",8727);\r
329                 charMap.put("radic",8730);\r
330                 charMap.put("prop",8733);\r
331                 charMap.put("infin",8734);\r
332                 charMap.put("ang",8736);\r
333                 charMap.put("and",8743);\r
334                 charMap.put("or",8744);\r
335                 charMap.put("cap",8745);\r
336                 charMap.put("cup",8746);\r
337                 charMap.put("int",8747);\r
338                 charMap.put("there4",8756);\r
339                 charMap.put("sim",8764);\r
340                 charMap.put("cong",8773);\r
341                 charMap.put("asymp",8776);\r
342                 charMap.put("ne",8800);\r
343                 charMap.put("equiv",8801);\r
344                 charMap.put("le",8804);\r
345                 charMap.put("ge",8805);\r
346                 charMap.put("sub",8834);\r
347                 charMap.put("sup",8835);\r
348                 charMap.put("nsub",8836);\r
349                 charMap.put("sube",8838);\r
350                 charMap.put("supe",8839);\r
351                 charMap.put("oplus",8853);\r
352                 charMap.put("otimes",8855);\r
353                 charMap.put("perp",8869);\r
354                 charMap.put("sdot",8901);\r
355                 charMap.put("lceil",8968);\r
356                 charMap.put("rceil",8969);\r
357                 charMap.put("lfloor",8970);\r
358                 charMap.put("rfloor",8971);\r
359                 charMap.put("lang",9001);\r
360                 charMap.put("rang",9002);\r
361                 charMap.put("loz",9674);\r
362                 charMap.put("spades",9824);\r
363                 charMap.put("clubs",9827);\r
364                 charMap.put("hearts",9829);\r
365                 charMap.put("diams",9830);\r
366                 \r
367                 for( Entry<String, Integer> es: charMap.entrySet()) {\r
368                         if(es.getValue()>=160); // save small space... note that no longer has amp, etc.\r
369                         intMap.put(es.getValue(), es.getKey());\r
370                 }\r
371         }\r
372 \r
373 }\r