OSDN Git Service

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