KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > springframework > web > util > HtmlCharacterEntityReferences


1 /*
2  * Copyright 2002-2005 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package org.springframework.web.util;
18
19 import java.io.IOException JavaDoc;
20 import java.io.InputStream JavaDoc;
21 import java.util.Enumeration JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.Map JavaDoc;
24 import java.util.Properties JavaDoc;
25
26 import org.springframework.util.Assert;
27
28 /**
29  * Represents a set of character entity references defined by the
30  * HTML 4.0 standard.
31  *
32  * <p>A complete description of the HTML 4.0 character set can be found
33  * at http://www.w3.org/TR/html4/charset.html.
34  *
35  * @author Juergen Hoeller
36  * @author Martin Kersten
37  * @since 1.2.1
38  */

39 class HtmlCharacterEntityReferences {
40
41     static final char REFERENCE_START = '&';
42
43     static final String JavaDoc DECIMAL_REFERENCE_START = "&#";
44
45     static final String JavaDoc HEX_REFERENCE_START = "&#x";
46
47     static final char REFERENCE_END = ';';
48
49     static final char CHAR_NULL = (char) -1;
50
51
52     private static final String JavaDoc PROPERTIES_FILE = "HtmlCharacterEntityReferences.properties";
53
54
55     private final String JavaDoc[] characterToEntityReferenceMap = new String JavaDoc[3000];
56
57     private final Map JavaDoc entityReferenceToCharacterMap = new HashMap JavaDoc(252);
58
59
60     /**
61      * Returns a new set of character entity references reflecting the HTML 4.0 character set.
62      */

63     public HtmlCharacterEntityReferences() {
64         Properties JavaDoc entityReferences = new Properties JavaDoc();
65
66         // Load refeence definition file.
67
InputStream JavaDoc is = HtmlCharacterEntityReferences.class.getResourceAsStream(PROPERTIES_FILE);
68         if (is == null) {
69             throw new IllegalStateException JavaDoc(
70                     "Cannot find reference definition file [HtmlCharacterEntityReferences.properties] as class path resource");
71         }
72         try {
73             try {
74                 entityReferences.load(is);
75             }
76             finally {
77                 is.close();
78             }
79         }
80         catch (IOException JavaDoc ex) {
81             throw new IllegalStateException JavaDoc(
82                     "Failed to parse reference definition file [HtmlCharacterEntityReferences.properties]: " + ex.getMessage());
83         }
84
85         // Parse reference definition properites.
86
Enumeration JavaDoc keys = entityReferences.propertyNames();
87         while (keys.hasMoreElements()) {
88             String JavaDoc key = (String JavaDoc) keys.nextElement();
89             int referredChar = Integer.parseInt(key);
90             Assert.isTrue((referredChar < 1000 || (referredChar >= 8000 && referredChar < 10000)),
91                     "Invalid reference to special HTML entity: " + referredChar);
92             int index = (referredChar < 1000 ? referredChar : referredChar - 7000);
93             String JavaDoc reference = entityReferences.getProperty(key);
94             this.characterToEntityReferenceMap[index] = REFERENCE_START + reference + REFERENCE_END;
95             this.entityReferenceToCharacterMap.put(reference, new Character JavaDoc((char) referredChar));
96         }
97     }
98
99     /**
100      * Return the number of supported entity references.
101      */

102     public int getSupportedReferenceCount() {
103         return this.entityReferenceToCharacterMap.size();
104     }
105
106     /**
107      * Return true if the given character is mapped to a supported entity reference.
108      */

109     public boolean isMappedToReference(char character) {
110         return (convertToReference(character) != null);
111     }
112
113     /**
114      * Return the reference mapped to the given character or <code>null</code>.
115      */

116     public String JavaDoc convertToReference(char character) {
117         if (character < 1000 || (character >= 8000 && character < 10000)) {
118             int index = (character < 1000 ? character : character - 7000);
119             String JavaDoc entityReference = this.characterToEntityReferenceMap[index];
120             if (entityReference != null) {
121                 return entityReference;
122             }
123         }
124         return null;
125     }
126
127     /**
128      * Return the char mapped to the given entityReference or -1.
129      */

130     public char convertToCharacter(String JavaDoc entityReference) {
131         Character JavaDoc referredCharacter = (Character JavaDoc) this.entityReferenceToCharacterMap.get(entityReference);
132         if (referredCharacter != null) {
133             return referredCharacter.charValue();
134         }
135         return CHAR_NULL;
136     }
137
138 }
139
Popular Tags