OSDN Git Service

f6b558dc591c45870c8b6aa34a3554a6397aa26b
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / typical / I18nAlias.java
1 /*
2  * internationalization name alias
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.typical;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.Comparator;
15 import java.util.LinkedList;
16 import java.util.List;
17 import javax.xml.parsers.DocumentBuilder;
18 import javax.xml.parsers.DocumentBuilderFactory;
19 import javax.xml.parsers.ParserConfigurationException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.Element;
22 import org.xml.sax.SAXException;
23
24 /**
25  * 国際化&別名管理オブジェクトの実装基板。
26  *
27  * <p>別名管理オブジェクトは、
28  * 各々のリストの先頭が代表名となる、
29  * プライマリ名の不変リストとグローバル名の不変リストを持つ。
30  *
31  * <p>国産モデルではプライマリ名に日本語名が収められることが多い。
32  * プライマリ名は必ず一つ以上なければならない。
33  *
34  * <p>国産モデルではグローバル名に英語名が収められることが多いが、
35  * プライマリ名と同一の日本語名が収められている場合も多い。
36  *
37  * <p>別名管理オブジェクトは、
38  * インスタンス間での順序を定義するためのオーダー番号を持つ。
39  */
40 class I18nAlias {
41
42     /** オーダ番号によるコンパレータ。 */
43     public static final Comparator<I18nAlias> ORDER_COMPARATOR =
44             new OrderComparator();
45
46
47     private int orderNo;
48
49     private final List<String> primaryNameList;
50     private final List<String> globalNameList;
51
52     private final List<String> umodPrimaryNameList;
53     private final List<String> umodGlobalNameList;
54
55
56     /**
57      * コンストラクタ。
58      *
59      * <p>各初期数が0以下の場合は、
60      * 状況に応じて伸長する連結リストが用意される。
61      *
62      * @param primaryNum プライマリ名初期数。
63      * @param globalNum グローバル名初期数。
64      */
65     protected I18nAlias(int primaryNum, int globalNum){
66         super();
67
68         if(primaryNum <= 0){
69             this.primaryNameList = new LinkedList<String>();
70         }else{
71             this.primaryNameList = new ArrayList<String>(primaryNum);
72         }
73
74         if(globalNum <= 0){
75             this.globalNameList  = new LinkedList<String>();
76         }else{
77             this.globalNameList  = new ArrayList<String>(globalNum);
78         }
79
80         this.umodPrimaryNameList =
81                 Collections.unmodifiableList(this.primaryNameList);
82         this.umodGlobalNameList =
83                 Collections.unmodifiableList(this.globalNameList);
84
85         return;
86     }
87
88     /**
89      * コンストラクタ。
90      *
91      * <p>プライマリ名、グローバル名共、
92      * 状況に応じて伸長する連結リストが用意される。
93      */
94     protected I18nAlias(){
95         this(0, 0);
96         return;
97     }
98
99
100     /**
101      * XMLドキュメントをロードする。
102      * @param is 入力
103      * @return 最上位要素
104      * @throws ParserConfigurationException XMLの構成が変
105      * @throws SAXException XMLの内容が変
106      * @throws IOException 入力エラー
107      */
108     protected static Element loadXml(InputStream is)
109             throws ParserConfigurationException, SAXException, IOException {
110         DocumentBuilderFactory factory;
111         factory = DocumentBuilderFactory.newInstance();
112
113         DocumentBuilder builder = factory.newDocumentBuilder();
114         Document doc = builder.parse(is);
115
116         Element top = doc.getDocumentElement();
117
118         return top;
119     }
120
121
122     /**
123      * オーダー番号を返す。
124      * @return オーダー番号
125      */
126     protected int getOrderNo(){
127         return this.orderNo;
128     }
129
130     /**
131      * オーダー番号を設定する。
132      * @param orderNo オーダー番号
133      */
134     protected void setOrderNo(int orderNo){
135         this.orderNo = orderNo;
136         return;
137     }
138
139     /**
140      * プライマリ名の代表をひとつ返す。
141      *
142      * <p>必ず存在しなければならない。
143      *
144      * @return 最初のプライマリ名
145      */
146     public String getTopPrimaryName(){
147         String result = this.primaryNameList.get(0);
148         return result;
149     }
150
151     /**
152      * グローバル名の代表をひとつ返す。
153      * @return 最初のグローバル名。ひとつもなければnull
154      */
155     public String getTopGlobalName(){
156         if(this.globalNameList.isEmpty()) return null;
157
158         String result = this.globalNameList.get(0);
159
160         return result;
161     }
162
163     /**
164      * プライマリ名の全別名リストを返す。
165      * @return 全別名リスト。(不可変)
166      */
167     public List<String> getPrimaryNameList(){
168         return this.umodPrimaryNameList;
169     }
170
171     /**
172      * プライマリ名を追加。
173      * @param primaryName プライマリ名
174      */
175     protected void addPrimaryName(String primaryName){
176         this.primaryNameList.add(primaryName);
177         return;
178     }
179
180     /**
181      * グローバル名の全別名リストを返す。
182      * @return 全別名リスト。(不可変)
183      */
184     public List<String> getGlobalNameList(){
185         return this.umodGlobalNameList;
186     }
187
188     /**
189      * グローバル名を追加。
190      * @param globalName グローバル名
191      */
192     protected void addGlobalName(String globalName){
193         this.globalNameList.add(globalName);
194         return;
195     }
196
197     /**
198      * オーダ番号によるコンパレータ。
199      */
200     @SuppressWarnings("serial")
201     private static class OrderComparator
202             implements Comparator<I18nAlias> {
203
204         /**
205          * コンストラクタ。
206          */
207         OrderComparator(){
208             super();
209             return;
210         }
211
212         /**
213          * オーダ番号を順序づける。
214          * @param o1 {@inheritDoc}
215          * @param o2 {@inheritDoc}
216          * @return {@inheritDoc}
217          */
218         @Override
219         public int compare(I18nAlias o1, I18nAlias o2){
220             int result = o1.getOrderNo() - o2.getOrderNo();
221             return result;
222         }
223
224     }
225
226 }