2 * alias map with primary & global
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.typical;
10 import java.text.Normalizer;
11 import java.util.HashMap;
15 * プライマリ名 - グローバル名間の対応、
16 * およびUnicode正規化によるゆらぎ表記吸収処理を行う。
18 * @see <a href="http://ja.wikipedia.org/wiki/Unicode正規化">
20 * @see <a href="http://unicode.org/reports/tr15/">
21 * UNICODE NORMALIZATION FORMS </a>
22 * @see java.text.Normalizer
24 class AliasMap<T extends I18nAlias> {
26 private final Map<String, T> primaryAliasMap;
27 private final Map<String, T> globalAliasMap;
35 this.primaryAliasMap = new HashMap<String, T>();
36 this.globalAliasMap = new HashMap<String, T>();
43 * NFKC正規化されたUnicode文字列を返す。
45 * <p>等価な全半角、濁点、丸付き数字などの表現の正規化を目的とする。
48 * <li>「ホ゛ーン9」は「ボーン9」になる
51 * @param name 正規化対象文字列
54 static String normalize(CharSequence name){
56 result = Normalizer.normalize(name, Normalizer.Form.NFKC);
64 * <p>キーとなる名前は、事前にNFKC正規化で
65 * 揺らぎ表記が吸収されたプライマリ名およびグローバル名。
67 * <p>登録キーが衝突した時は後の方が有効となる。
69 * @param alias 別名管理オブジェクト
71 void addAlias(T alias){
78 * 別名管理オブジェクトと正規化プライマリ名を対応づける。
80 * <p>事前にNFKC正規化されたプライマリ名が登録キーとなる。
82 * <p>登録キーが衝突した時は後の方が有効となる。
84 * @param alias 別名管理オブジェクト
86 private void addPrimary(T alias){
87 for(String primaryName : alias.getPrimaryNameList()){
88 String normalized = normalize(primaryName);
89 normalized = normalized.intern();
90 this.primaryAliasMap.put(normalized, alias);
96 * 別名管理オブジェクトと正規化グローバル名を対応づける。
98 * <p>事前にNFKC正規化されたグローバル名が登録キーとなる。
100 * <p>登録キーが衝突した時は後の方が有効となる。
102 * @param alias 別名管理オブジェクト
104 private void addGlobal(T alias){
105 for(String globalName : alias.getGlobalNameList()){
106 String normalized = normalize(globalName);
107 normalized = normalized.intern();
108 this.globalAliasMap.put(normalized, alias);
116 * <p>プライマリ名、グローバル名の順で検索される。
118 * <p>名前は事前にNFKC正規化された後、検索キーとなる。
121 * @return 別名管理オブジェクト。見つからなければnull
123 T getAlias(String name){
125 result = getAliasByPrimary(name);
127 result = getAliasByGlobal(name);
133 * プライマリ名から別名管理オブジェクトを得る。
135 * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
137 * @param primaryName プライマリ名
138 * @return 別名管理オブジェクト。見つからなければnull
140 T getAliasByPrimary(String primaryName){
141 String normalized = normalize(primaryName);
142 T result = this.primaryAliasMap.get(normalized);
147 * グローバル名から別名管理オブジェクトを得る。
149 * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
151 * @param globalName グローバル名
152 * @return 別名管理オブジェクト。見つからなければnull
154 T getAliasByGlobal(String globalName){
155 String normalized = normalize(globalName);
156 T result = this.globalAliasMap.get(normalized);
161 * プライマリ名から代表グローバル名を得る。
163 * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
165 * @param primaryName プライマリ名
166 * @return 代表グローバル名。見つからなければnull
168 String primary2global(String primaryName){
169 T alias = getAliasByPrimary(primaryName);
170 if(alias == null) return null;
171 String globalName = alias.getTopGlobalName();
176 * グローバル名から代表プライマリ名を得る。
178 * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
180 * @param globalName グローバル名
181 * @return 代表プライマリ名。見つからなければnull
183 String global2primary(String globalName){
184 T alias = getAliasByGlobal(globalName);
185 if(alias == null) return null;
186 String primary = alias.getTopPrimaryName();