1:
31: package ;
32:
33: import ;
34: import ;
35:
36:
42: public class CharacterEntityParser
43: {
44:
47: private final Properties entities;
48:
49:
52: private final Properties reverse;
53:
54:
60: public CharacterEntityParser (final Properties characterEntities)
61: {
62: entities = characterEntities;
63: reverse = new Properties();
64: final Enumeration keys = entities.keys();
65: while (keys.hasMoreElements())
66: {
67: final String key = (String) keys.nextElement();
68: final String value = entities.getProperty(key);
69: reverse.setProperty(value, key);
70: }
71: }
72:
73:
79: public static CharacterEntityParser createXMLEntityParser ()
80: {
81: final Properties entities = new Properties();
82: entities.setProperty("amp", "&");
83: entities.setProperty("quot", "\"");
84: entities.setProperty("lt", "<");
85: entities.setProperty("gt", ">");
86: entities.setProperty("apos", "\u0027");
87: return new CharacterEntityParser(entities);
88: }
89:
90:
95: private Properties getEntities ()
96: {
97: return entities;
98: }
99:
100:
105: private Properties getReverse ()
106: {
107: return reverse;
108: }
109:
110:
116: private String lookupCharacter (final String key)
117: {
118: return getEntities().getProperty(key);
119: }
120:
121:
127: private String lookupEntity (final String character)
128: {
129: final String val = getReverse().getProperty(character);
130: if (val == null)
131: {
132: return null;
133: }
134: else
135: {
136: return "&" + val + ";";
137: }
138: }
139:
140:
147: public String encodeEntities (final String value)
148: {
149: final StringBuffer writer = new StringBuffer();
150: for (int i = 0; i < value.length(); i++)
151: {
152: final String character = String.valueOf(value.charAt(i));
153: final String lookup = lookupEntity(character);
154: if (lookup == null)
155: {
156: writer.append(character);
157: }
158: else
159: {
160: writer.append(lookup);
161: }
162: }
163: return writer.toString();
164: }
165:
166:
172: public String decodeEntities (final String value)
173: {
174: int parserIndex = 0;
175: int subStart = value.indexOf("&", parserIndex);
176: if (subStart == -1)
177: {
178: return value;
179: }
180: int subEnd = value.indexOf(";", subStart);
181: if (subEnd == -1)
182: {
183: return value;
184: }
185:
186: final StringBuffer bufValue = new StringBuffer(value.substring(0, subStart));
187: do
188: {
189:
190: if (value.charAt(subStart + 1) == '#')
191: {
192: final int subValue = TextUtilities.parseInt(value.substring(subStart + 2, subEnd), 0);
193: if ((subValue >= 1) && (subValue <= 65536))
194: {
195: final char[] chr = new char[1];
196: chr[0] = (char) subValue;
197: bufValue.append(chr);
198: }
199: else
200: {
201:
202: bufValue.append(value.substring(subStart, subEnd));
203: }
204: }
205: else
206: {
207: final String entity = value.substring(subStart + 1, subEnd);
208: final String replaceString = lookupCharacter(entity);
209: if (replaceString != null)
210: {
211: bufValue.append(decodeEntities(replaceString));
212: }
213: else
214: {
215: bufValue.append("&");
216: bufValue.append(entity);
217: bufValue.append(";");
218: }
219: }
220: parserIndex = subEnd + 1;
221: subStart = value.indexOf("&", parserIndex);
222: if (subStart == -1)
223: {
224: bufValue.append(value.substring(parserIndex));
225: subEnd = -1;
226: }
227: else
228: {
229: subEnd = value.indexOf(";", subStart);
230: if (subEnd == -1)
231: {
232: bufValue.append(value.substring(parserIndex));
233: }
234: else
235: {
236: bufValue.append(value.substring(parserIndex, subStart));
237: }
238: }
239: }
240: while (subStart != -1 && subEnd != -1);
241:
242: return bufValue.toString();
243: }
244: }
245: