1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.common.text;
25
26 import java.text.CharacterIterator;
27 import java.text.StringCharacterIterator;
28 import java.util.HashMap;
29 import java.util.Map;
30 import net.jcip.annotations.Immutable;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @Immutable
67 public class XmlValueEncoder implements TextEncoder, TextDecoder {
68
69 private static final Map<String, Character> SPECIAL_ENTITIES;
70
71 static {
72 SPECIAL_ENTITIES = new HashMap<String, Character>();
73
74 SPECIAL_ENTITIES.put("quot", '"');
75 SPECIAL_ENTITIES.put("gt", '>');
76 SPECIAL_ENTITIES.put("lt", '<');
77 SPECIAL_ENTITIES.put("amp", '&');
78
79 }
80
81
82
83
84
85
86 public String encode( String text ) {
87 if (text == null) return null;
88 StringBuilder sb = new StringBuilder();
89 CharacterIterator iter = new StringCharacterIterator(text);
90 for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
91 switch (c) {
92 case '&':
93 sb.append("&");
94 break;
95 case '"':
96 sb.append(""");
97 break;
98 case '<':
99 sb.append("<");
100 break;
101 case '>':
102 sb.append(">");
103 break;
104 case '\'':
105 sb.append("'");
106 break;
107 default:
108 sb.append(c);
109 }
110 }
111 return sb.toString();
112 }
113
114
115
116
117
118
119 public String decode( String encodedText ) {
120 if (encodedText == null) return null;
121 StringBuilder sb = new StringBuilder();
122 CharacterIterator iter = new StringCharacterIterator(encodedText);
123 for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
124 if (c == '&') {
125 int index = iter.getIndex();
126
127 do {
128 c = iter.next();
129 } while (c != CharacterIterator.DONE && c != ';');
130
131
132 if (c == ';') {
133 String s = encodedText.substring(index + 1, iter.getIndex());
134
135 if (SPECIAL_ENTITIES.containsKey(s)) {
136 sb.append(SPECIAL_ENTITIES.get(s));
137 continue;
138
139 }
140
141 if (s.length() > 0 && s.charAt(0) == '#') {
142 try {
143 sb.append((char)Short.parseShort(s.substring(1, s.length())));
144 continue;
145 } catch (NumberFormatException nfe) {
146
147 }
148 }
149 }
150
151
152 c = '&';
153 iter.setIndex(index);
154 }
155
156 sb.append(c);
157
158 }
159 return sb.toString();
160 }
161 }