1 16 17 package org.springframework.web.util; 18 19 import java.io.IOException ; 20 import java.io.InputStream ; 21 import java.util.Enumeration ; 22 import java.util.HashMap ; 23 import java.util.Map ; 24 import java.util.Properties ; 25 26 import org.springframework.util.Assert; 27 28 39 class HtmlCharacterEntityReferences { 40 41 static final char REFERENCE_START = '&'; 42 43 static final String DECIMAL_REFERENCE_START = "&#"; 44 45 static final String 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 PROPERTIES_FILE = "HtmlCharacterEntityReferences.properties"; 53 54 55 private final String [] characterToEntityReferenceMap = new String [3000]; 56 57 private final Map entityReferenceToCharacterMap = new HashMap (252); 58 59 60 63 public HtmlCharacterEntityReferences() { 64 Properties entityReferences = new Properties (); 65 66 InputStream is = HtmlCharacterEntityReferences.class.getResourceAsStream(PROPERTIES_FILE); 68 if (is == null) { 69 throw new IllegalStateException ( 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 ex) { 81 throw new IllegalStateException ( 82 "Failed to parse reference definition file [HtmlCharacterEntityReferences.properties]: " + ex.getMessage()); 83 } 84 85 Enumeration keys = entityReferences.propertyNames(); 87 while (keys.hasMoreElements()) { 88 String key = (String ) 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 reference = entityReferences.getProperty(key); 94 this.characterToEntityReferenceMap[index] = REFERENCE_START + reference + REFERENCE_END; 95 this.entityReferenceToCharacterMap.put(reference, new Character ((char) referredChar)); 96 } 97 } 98 99 102 public int getSupportedReferenceCount() { 103 return this.entityReferenceToCharacterMap.size(); 104 } 105 106 109 public boolean isMappedToReference(char character) { 110 return (convertToReference(character) != null); 111 } 112 113 116 public String convertToReference(char character) { 117 if (character < 1000 || (character >= 8000 && character < 10000)) { 118 int index = (character < 1000 ? character : character - 7000); 119 String entityReference = this.characterToEntityReferenceMap[index]; 120 if (entityReference != null) { 121 return entityReference; 122 } 123 } 124 return null; 125 } 126 127 130 public char convertToCharacter(String entityReference) { 131 Character referredCharacter = (Character ) this.entityReferenceToCharacterMap.get(entityReference); 132 if (referredCharacter != null) { 133 return referredCharacter.charValue(); 134 } 135 return CHAR_NULL; 136 } 137 138 } 139 | Popular Tags |