2 * internationalization name alias
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sfjp.mikutoga.typical;
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.XMLConstants;
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 * 国際化&別名管理オブジェクトの実装基板。
30 * プライマリ名の不変リストとグローバル名の不変リストを持つ。
32 * <p>国産モデルではプライマリ名に日本語名が収められることが多い。
33 * プライマリ名は必ず一つ以上なければならない。
35 * <p>国産モデルではグローバル名に英語名が収められることが多いが、
36 * プライマリ名と同一の日本語名が収められている場合も多い。
39 * インスタンス間での順序を定義するためのオーダー番号を持つ。
43 /** オーダ番号によるコンパレータ。 */
44 public static final Comparator<I18nAlias> ORDER_COMPARATOR =
45 new OrderComparator();
47 private static final String F_DISALLOW_DOCTYPE_DECL =
48 "http://apache.org/xml/features/disallow-doctype-decl";
49 private static final String F_EXTERNAL_GENERAL_ENTITIES =
50 "http://xml.org/sax/features/external-general-entities";
51 private static final String F_EXTERNAL_PARAMETER_ENTITIES =
52 "http://xml.org/sax/features/external-parameter-entities";
53 private static final String F_LOAD_EXTERNAL_DTD =
54 "http://apache.org/xml/features/nonvalidating/load-external-dtd";
59 private final List<String> primaryNameList;
60 private final List<String> globalNameList;
62 private final List<String> umodPrimaryNameList;
63 private final List<String> umodGlobalNameList;
70 * 状況に応じて伸長する連結リストが用意される。
72 * @param primaryNum プライマリ名初期数。
73 * @param globalNum グローバル名初期数。
75 protected I18nAlias(int primaryNum, int globalNum){
79 this.primaryNameList = new LinkedList<>();
81 this.primaryNameList = new ArrayList<>(primaryNum);
85 this.globalNameList = new LinkedList<>();
87 this.globalNameList = new ArrayList<>(globalNum);
90 this.umodPrimaryNameList =
91 Collections.unmodifiableList(this.primaryNameList);
92 this.umodGlobalNameList =
93 Collections.unmodifiableList(this.globalNameList);
102 * 状況に応じて伸長する連結リストが用意される。
104 protected I18nAlias(){
114 * @throws ParserConfigurationException XMLの構成が変
115 * @throws SAXException XMLの内容が変
116 * @throws IOException 入力エラー
118 protected static Element loadXml(InputStream is)
119 throws ParserConfigurationException, SAXException, IOException {
120 DocumentBuilderFactory factory;
121 factory = DocumentBuilderFactory.newInstance();
123 factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
124 factory.setFeature(F_EXTERNAL_GENERAL_ENTITIES, false);
125 factory.setFeature(F_EXTERNAL_PARAMETER_ENTITIES, false);
126 factory.setFeature(F_LOAD_EXTERNAL_DTD, false);
128 // unsafe but we use DOCTYPE
129 factory.setFeature(F_DISALLOW_DOCTYPE_DECL, false);
131 factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
132 factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
134 factory.setXIncludeAware(false);
135 factory.setExpandEntityReferences(false);
137 DocumentBuilder builder = factory.newDocumentBuilder();
138 Document doc = builder.parse(is);
140 Element top = doc.getDocumentElement();
150 protected int getOrderNo(){
156 * @param orderNo オーダー番号
158 protected void setOrderNo(int orderNo){
159 this.orderNo = orderNo;
170 public String getTopPrimaryName(){
171 String result = this.primaryNameList.get(0);
177 * @return 最初のグローバル名。ひとつもなければnull
179 public String getTopGlobalName(){
180 if(this.globalNameList.isEmpty()) return null;
182 String result = this.globalNameList.get(0);
189 * @return 全別名リスト。(不可変)
191 public List<String> getPrimaryNameList(){
192 return this.umodPrimaryNameList;
197 * @param primaryName プライマリ名
199 protected void addPrimaryName(String primaryName){
200 this.primaryNameList.add(primaryName);
206 * @return 全別名リスト。(不可変)
208 public List<String> getGlobalNameList(){
209 return this.umodGlobalNameList;
214 * @param globalName グローバル名
216 protected void addGlobalName(String globalName){
217 this.globalNameList.add(globalName);
224 @SuppressWarnings("serial")
225 private static class OrderComparator
226 implements Comparator<I18nAlias> {
238 * @param o1 {@inheritDoc}
239 * @param o2 {@inheritDoc}
240 * @return {@inheritDoc}
243 public int compare(I18nAlias o1, I18nAlias o2){
244 int result = o1.getOrderNo() - o2.getOrderNo();