OSDN Git Service

9e1dfa91932bbb86ea79b3de28b2ed6b8e44a573
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / typical / AliasMap.java
1 /*
2  * alias map with primary & global
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.typical;
9
10 import java.text.Normalizer;
11 import java.util.HashMap;
12 import java.util.Map;
13
14 /**
15  * プライマリ名 - グローバル名間の対応、
16  * およびUnicode正規化によるゆらぎ表記吸収処理を行う。
17  * @param <T> 別名管理クラス
18  * @see <a href="http://ja.wikipedia.org/wiki/Unicode正規化">
19  * Unicode正規化 </a>
20  * @see <a href="http://unicode.org/reports/tr15/">
21  * UNICODE NORMALIZATION FORMS </a>
22  * @see java.text.Normalizer
23  */
24 class AliasMap<T extends I18nAlias> {
25
26     private final Map<String, T> primaryAliasMap;
27     private final Map<String, T> globalAliasMap;
28
29     /**
30      * コンストラクタ。
31      */
32     AliasMap(){
33         super();
34
35         this.primaryAliasMap = new HashMap<String, T>();
36         this.globalAliasMap  = new HashMap<String, T>();
37
38         return;
39     }
40
41
42     /**
43      * NFKC正規化されたUnicode文字列を返す。
44      *
45      * <p>等価な全半角、濁点、丸付き数字などの表現の正規化を目的とする。
46      * <ul>
47      * <li>「ボーン」は「ボーン」になる
48      * <li>「ホ゛ーン9」は「ボーン9」になる
49      * </ul>
50      *
51      * @param name 正規化対象文字列
52      * @return 正規化済み文字列
53      */
54     static String normalize(CharSequence name){
55         String result;
56         result = Normalizer.normalize(name, Normalizer.Form.NFKC);
57         return result;
58     }
59
60
61     /**
62      * 別名管理オブジェクトを登録。
63      *
64      * <p>キーとなる名前は、事前にNFKC正規化で
65      * 揺らぎ表記が吸収されたプライマリ名およびグローバル名。
66      *
67      * <p>登録キーが衝突した時は後の方が有効となる。
68      *
69      * @param alias 別名管理オブジェクト
70      */
71     void addAlias(T alias){
72         addPrimary(alias);
73         addGlobal(alias);
74         return;
75     }
76
77     /**
78      * 別名管理オブジェクトと正規化プライマリ名を対応づける。
79      *
80      * <p>事前にNFKC正規化されたプライマリ名が登録キーとなる。
81      *
82      * <p>登録キーが衝突した時は後の方が有効となる。
83      *
84      * @param alias 別名管理オブジェクト
85      */
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);
91         }
92         return;
93     }
94
95     /**
96      * 別名管理オブジェクトと正規化グローバル名を対応づける。
97      *
98      * <p>事前にNFKC正規化されたグローバル名が登録キーとなる。
99      *
100      * <p>登録キーが衝突した時は後の方が有効となる。
101      *
102      * @param alias 別名管理オブジェクト
103      */
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);
109         }
110         return;
111     }
112
113     /**
114      * 名前から別名管理オブジェクトを得る。
115      *
116      * <p>プライマリ名、グローバル名の順で検索される。
117      *
118      * <p>名前は事前にNFKC正規化された後、検索キーとなる。
119      *
120      * @param name 名前
121      * @return 別名管理オブジェクト。見つからなければnull
122      */
123     T getAlias(String name){
124         T result;
125         result = getAliasByPrimary(name);
126         if(result == null){
127             result = getAliasByGlobal(name);
128         }
129         return result;
130     }
131
132     /**
133      * プライマリ名から別名管理オブジェクトを得る。
134      *
135      * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
136      *
137      * @param primaryName プライマリ名
138      * @return 別名管理オブジェクト。見つからなければnull
139      */
140     T getAliasByPrimary(String primaryName){
141         String normalized = normalize(primaryName);
142         T result = this.primaryAliasMap.get(normalized);
143         return result;
144     }
145
146     /**
147      * グローバル名から別名管理オブジェクトを得る。
148      *
149      * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
150      *
151      * @param globalName グローバル名
152      * @return 別名管理オブジェクト。見つからなければnull
153      */
154     T getAliasByGlobal(String globalName){
155         String normalized = normalize(globalName);
156         T result = this.globalAliasMap.get(normalized);
157         return result;
158     }
159
160     /**
161      * プライマリ名から代表グローバル名を得る。
162      *
163      * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
164      *
165      * @param primaryName プライマリ名
166      * @return 代表グローバル名。見つからなければnull
167      */
168     String primary2global(String primaryName){
169         T alias = getAliasByPrimary(primaryName);
170         if(alias == null) return null;
171         String globalName = alias.getTopGlobalName();
172         return globalName;
173     }
174
175     /**
176      * グローバル名から代表プライマリ名を得る。
177      *
178      * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
179      *
180      * @param globalName グローバル名
181      * @return 代表プライマリ名。見つからなければnull
182      */
183     String global2primary(String globalName){
184         T alias = getAliasByGlobal(globalName);
185         if(alias == null) return null;
186         String primary = alias.getTopPrimaryName();
187         return primary;
188     }
189
190 }