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文字列を返す。
44 * <p>等価な全半角、濁点、丸付き数字などの表現の正規化を目的とする。
47 * <li>「ホ゛ーン9」は「ボーン9」になる
49 * @param name 正規化対象文字列
52 static String normalize(CharSequence name){
54 result = Normalizer.normalize(name, Normalizer.Form.NFKC);
61 * <p>キーとなる名前は、事前にNFKC正規化で
62 * 揺らぎ表記が吸収されたプライマリ名およびグローバル名。
63 * <p>登録キーが衝突した時は後の方が有効となる。
64 * @param alias 別名管理オブジェクト
66 void addAlias(T alias){
73 * 別名管理オブジェクトと正規化プライマリ名を対応づける。
74 * <p>事前にNFKC正規化されたプライマリ名が登録キーとなる。
75 * <p>登録キーが衝突した時は後の方が有効となる。
76 * @param alias 別名管理オブジェクト
78 private void addPrimary(T alias){
79 for(String primaryName : alias.getPrimaryNameList()){
80 String normalized = normalize(primaryName);
81 normalized = normalized.intern();
82 this.primaryAliasMap.put(normalized, alias);
88 * 別名管理オブジェクトと正規化グローバル名を対応づける。
89 * <p>事前にNFKC正規化されたグローバル名が登録キーとなる。
90 * <p>登録キーが衝突した時は後の方が有効となる。
91 * @param alias 別名管理オブジェクト
93 private void addGlobal(T alias){
94 for(String globalName : alias.getGlobalNameList()){
95 String normalized = normalize(globalName);
96 normalized = normalized.intern();
97 this.globalAliasMap.put(normalized, alias);
104 * <p>プライマリ名、グローバル名の順で検索される。
105 * <p>名前は事前にNFKC正規化された後、検索キーとなる。
107 * @return 別名管理オブジェクト。見つからなければnull
109 T getAlias(String name){
111 result = getAliasByPrimary(name);
113 result = getAliasByGlobal(name);
119 * プライマリ名から別名管理オブジェクトを得る。
120 * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
121 * @param primaryName プライマリ名
122 * @return 別名管理オブジェクト。見つからなければnull
124 T getAliasByPrimary(String primaryName){
125 String normalized = normalize(primaryName);
126 T result = this.primaryAliasMap.get(normalized);
131 * グローバル名から別名管理オブジェクトを得る。
132 * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
133 * @param globalName グローバル名
134 * @return 別名管理オブジェクト。見つからなければnull
136 T getAliasByGlobal(String globalName){
137 String normalized = normalize(globalName);
138 T result = this.globalAliasMap.get(normalized);
143 * プライマリ名から代表グローバル名を得る。
144 * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
145 * @param primaryName プライマリ名
146 * @return 代表グローバル名。見つからなければnull
148 String primary2global(String primaryName){
149 T alias = getAliasByPrimary(primaryName);
150 if(alias == null) return null;
151 String globalName = alias.getTopGlobalName();
156 * グローバル名から代表プライマリ名を得る。
157 * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
158 * @param globalName グローバル名
159 * @return 代表プライマリ名。見つからなければnull
161 String global2primary(String globalName){
162 T alias = getAliasByGlobal(globalName);
163 if(alias == null) return null;
164 String primary = alias.getTopPrimaryName();