X-Git-Url: http://git.osdn.net/view?p=mikutoga%2FTogaGem.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fjp%2Fsfjp%2Fmikutoga%2Ftypical%2FI18nAlias.java;h=5942a412b25cea8242d08dee6f8e89bda63d3907;hp=e6e8c29fc22ae58055dc5f9ca5566e7dd371b946;hb=ed542b5a7123483f5abaa08d326cb42b32e4b465;hpb=e26fa0ddb4ae9368e17880190aec31792b343a83 diff --git a/src/main/java/jp/sfjp/mikutoga/typical/I18nAlias.java b/src/main/java/jp/sfjp/mikutoga/typical/I18nAlias.java index e6e8c29..5942a41 100644 --- a/src/main/java/jp/sfjp/mikutoga/typical/I18nAlias.java +++ b/src/main/java/jp/sfjp/mikutoga/typical/I18nAlias.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -23,13 +24,17 @@ import org.xml.sax.SAXException; /** * 国際化&別名管理オブジェクトの実装基板。 + * *

別名管理オブジェクトは、 * 各々のリストの先頭が代表名となる、 * プライマリ名の不変リストとグローバル名の不変リストを持つ。 + * *

国産モデルではプライマリ名に日本語名が収められることが多い。 * プライマリ名は必ず一つ以上なければならない。 + * *

国産モデルではグローバル名に英語名が収められることが多いが、 * プライマリ名と同一の日本語名が収められている場合も多い。 + * *

別名管理オブジェクトは、 * インスタンス間での順序を定義するためのオーダー番号を持つ。 */ @@ -39,6 +44,15 @@ class I18nAlias { public static final Comparator ORDER_COMPARATOR = new OrderComparator(); + private static final String F_DISALLOW_DOCTYPE_DECL = + "http://apache.org/xml/features/disallow-doctype-decl"; + private static final String F_EXTERNAL_GENERAL_ENTITIES = + "http://xml.org/sax/features/external-general-entities"; + private static final String F_EXTERNAL_PARAMETER_ENTITIES = + "http://xml.org/sax/features/external-parameter-entities"; + private static final String F_LOAD_EXTERNAL_DTD = + "http://apache.org/xml/features/nonvalidating/load-external-dtd"; + private int orderNo; @@ -51,8 +65,10 @@ class I18nAlias { /** * コンストラクタ。 + * *

各初期数が0以下の場合は、 * 状況に応じて伸長する連結リストが用意される。 + * * @param primaryNum プライマリ名初期数。 * @param globalNum グローバル名初期数。 */ @@ -60,15 +76,15 @@ class I18nAlias { super(); if(primaryNum <= 0){ - this.primaryNameList = new LinkedList(); + this.primaryNameList = new LinkedList<>(); }else{ - this.primaryNameList = new ArrayList(primaryNum); + this.primaryNameList = new ArrayList<>(primaryNum); } if(globalNum <= 0){ - this.globalNameList = new LinkedList(); + this.globalNameList = new LinkedList<>(); }else{ - this.globalNameList = new ArrayList(globalNum); + this.globalNameList = new ArrayList<>(globalNum); } this.umodPrimaryNameList = @@ -81,6 +97,7 @@ class I18nAlias { /** * コンストラクタ。 + * *

プライマリ名、グローバル名共、 * 状況に応じて伸長する連結リストが用意される。 */ @@ -103,6 +120,20 @@ class I18nAlias { DocumentBuilderFactory factory; factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + factory.setFeature(F_EXTERNAL_GENERAL_ENTITIES, false); + factory.setFeature(F_EXTERNAL_PARAMETER_ENTITIES, false); + factory.setFeature(F_LOAD_EXTERNAL_DTD, false); + + // unsafe but we use DOCTYPE + factory.setFeature(F_DISALLOW_DOCTYPE_DECL, false); + + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + + factory.setXIncludeAware(false); + factory.setExpandEntityReferences(false); + DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(is); @@ -131,7 +162,9 @@ class I18nAlias { /** * プライマリ名の代表をひとつ返す。 + * *

必ず存在しなければならない。 + * * @return 最初のプライマリ名 */ public String getTopPrimaryName(){