2 * internationalization name alias
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.typical;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.text.Normalizer;
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.LinkedList;
17 import java.util.List;
18 import javax.xml.parsers.DocumentBuilder;
19 import javax.xml.parsers.DocumentBuilderFactory;
20 import javax.xml.parsers.ParserConfigurationException;
21 import org.w3c.dom.Document;
22 import org.w3c.dom.Element;
23 import org.xml.sax.SAXException;
26 * 国際化&別名管理オブジェクトの実装基板。
27 * <p>国産モデルではプライマリ名に日本語名が収められることが多い。
28 * プライマリ名は必ず一つ以上なければならない。
29 * <p>国産モデルではグローバル名に英語名が収められることが多いが、
30 * プライマリ名と同一の日本語名が収められている場合も多い。
34 /** オーダ番号によるコンパレータ。 */
35 public static final Comparator<I18nAlias> ORDER_COMPARATOR =
36 new OrderComparator();
41 private final List<String> primaryList;
42 private final List<String> globalList;
44 private final List<String> umodPrimaryList;
45 private final List<String> umodGlobalList;
51 * 状況に応じて伸長する連結リストが用意される。
52 * @param primaryNo プライマリ名初期数。
53 * @param globalNo グローバル名初期数。
55 protected I18nAlias(int primaryNo, int globalNo){
59 this.primaryList = new LinkedList<String>();
61 this.primaryList = new ArrayList<String>(primaryNo);
65 this.globalList = new LinkedList<String>();
67 this.globalList = new ArrayList<String>(globalNo);
70 this.umodPrimaryList =
71 Collections.unmodifiableList(this.primaryList);
73 Collections.unmodifiableList(this.globalList);
81 * 状況に応じて伸長する連結リストが用意される。
83 protected I18nAlias(){
93 * @throws ParserConfigurationException XMLの構成が変
94 * @throws SAXException XMLの内容が変
95 * @throws IOException 入力エラー
97 protected static Element loadXml(InputStream is)
98 throws ParserConfigurationException, SAXException, IOException {
99 DocumentBuilderFactory factory;
100 factory = DocumentBuilderFactory.newInstance();
101 factory.setNamespaceAware(true);
103 DocumentBuilder builder = factory.newDocumentBuilder();
104 Document doc = builder.parse(is);
106 Element top = doc.getDocumentElement();
114 * <li>「ボーン」は「ボーン」になる
115 * <li>「ホ゛ーン9」は「ボーン9」になる
120 protected static String normalize(CharSequence name){
122 result = Normalizer.normalize(name, Normalizer.Form.NFKC);
131 protected int getOrderNo(){
139 protected void setOrderNo(int orderNo){
140 this.orderNo = orderNo;
148 public String getTopPrimaryName(){
149 String result = this.primaryList.get(0);
155 * @return 最初のグローバル名。ひとつもなければnull
157 public String getTopGlobalName(){
159 if(this.globalList.isEmpty()) result = null;
160 else result = this.globalList.get(0);
165 * プライマリ名の全エイリアス文字列リストを返す。
166 * @return 全プライマリ名リスト。(不可変)
168 public List<String> getPrimaryList(){
169 return this.umodPrimaryList;
176 protected void addPrimaryName(String name){
177 this.primaryList.add(name);
182 * グローバル名の全エイリアス文字列リストを返す。
183 * @return 全グローバル名リスト。(不可変)
185 public List<String> getGlobalList(){
186 return this.umodGlobalList;
193 protected void addGlobalName(String name){
194 this.globalList.add(name);
201 @SuppressWarnings("serial")
202 private static class OrderComparator
203 implements Comparator<I18nAlias> {
215 * @param o1 {@inheritDoc}
216 * @param o2 {@inheritDoc}
217 * @return {@inheritDoc}
220 public int compare(I18nAlias o1, I18nAlias o2){
221 int result = o1.getOrderNo() - o2.getOrderNo();