OSDN Git Service

bd33ba74dc5e28aa37237beefc5d2cb2d7fc1837
[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      * <p>等価な全半角、濁点、丸付き数字などの表現の正規化を目的とする。
45      * <ul>
46      * <li>「ボーン」は「ボーン」になる
47      * <li>「ホ゛ーン9」は「ボーン9」になる
48      * </ul>
49      * @param name 正規化対象文字列
50      * @return 正規化済み文字列
51      */
52     static String normalize(CharSequence name){
53         String result;
54         result = Normalizer.normalize(name, Normalizer.Form.NFKC);
55         return result;
56     }
57
58
59     /**
60      * 別名管理オブジェクトを登録。
61      * <p>キーとなる名前は、事前にNFKC正規化で
62      * 揺らぎ表記が吸収されたプライマリ名およびグローバル名。
63      * <p>登録キーが衝突した時は後の方が有効となる。
64      * @param alias 別名管理オブジェクト
65      */
66     void addAlias(T alias){
67         addPrimary(alias);
68         addGlobal(alias);
69         return;
70     }
71
72     /**
73      * 別名管理オブジェクトと正規化プライマリ名を対応づける。
74      * <p>事前にNFKC正規化されたプライマリ名が登録キーとなる。
75      * <p>登録キーが衝突した時は後の方が有効となる。
76      * @param alias 別名管理オブジェクト
77      */
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);
83         }
84         return;
85     }
86
87     /**
88      * 別名管理オブジェクトと正規化グローバル名を対応づける。
89      * <p>事前にNFKC正規化されたグローバル名が登録キーとなる。
90      * <p>登録キーが衝突した時は後の方が有効となる。
91      * @param alias 別名管理オブジェクト
92      */
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);
98         }
99         return;
100     }
101
102     /**
103      * 名前から別名管理オブジェクトを得る。
104      * <p>プライマリ名、グローバル名の順で検索される。
105      * <p>名前は事前にNFKC正規化された後、検索キーとなる。
106      * @param name 名前
107      * @return 別名管理オブジェクト。見つからなければnull
108      */
109     T getAlias(String name){
110         T result;
111         result = getAliasByPrimary(name);
112         if(result == null){
113             result = getAliasByGlobal(name);
114         }
115         return result;
116     }
117
118     /**
119      * プライマリ名から別名管理オブジェクトを得る。
120      * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
121      * @param primaryName プライマリ名
122      * @return 別名管理オブジェクト。見つからなければnull
123      */
124     T getAliasByPrimary(String primaryName){
125         String normalized = normalize(primaryName);
126         T result = this.primaryAliasMap.get(normalized);
127         return result;
128     }
129
130     /**
131      * グローバル名から別名管理オブジェクトを得る。
132      * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
133      * @param globalName グローバル名
134      * @return 別名管理オブジェクト。見つからなければnull
135      */
136     T getAliasByGlobal(String globalName){
137         String normalized = normalize(globalName);
138         T result = this.globalAliasMap.get(normalized);
139         return result;
140     }
141
142     /**
143      * プライマリ名から代表グローバル名を得る。
144      * <p>プライマリ名は事前にNFKC正規化された後、検索キーとなる。
145      * @param primaryName プライマリ名
146      * @return 代表グローバル名。見つからなければnull
147      */
148     String primary2global(String primaryName){
149         T alias = getAliasByPrimary(primaryName);
150         if(alias == null) return null;
151         String globalName = alias.getTopGlobalName();
152         return globalName;
153     }
154
155     /**
156      * グローバル名から代表プライマリ名を得る。
157      * <p>グローバル名は事前にNFKC正規化された後、検索キーとなる。
158      * @param globalName グローバル名
159      * @return 代表プライマリ名。見つからなければnull
160      */
161      String global2primary(String globalName){
162         T alias = getAliasByGlobal(globalName);
163         if(alias == null) return null;
164         String primary = alias.getTopPrimaryName();
165         return primary;
166     }
167
168 }