From 4d11a7cd3d880da907b056368678bea6f0f20dbd Mon Sep 17 00:00:00 2001 From: seraphy Date: Mon, 25 Nov 2013 17:44:02 +0000 Subject: [PATCH] =?utf8?q?=E3=83=86=E3=83=B3=E3=83=97=E3=83=AC=E3=83=BC?= =?utf8?q?=E3=83=88=E3=81=AF=E7=AE=A1=E7=90=86=E3=83=95=E3=82=A1=E3=82=A4?= =?utf8?q?=E3=83=AB=E3=81=AB=E8=A8=98=E8=BC=89=E3=81=AA=E3=81=8F=E3=81=A8?= =?utf8?q?=E3=82=82=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=81=AB=E3=81=82?= =?utf8?q?=E3=82=8Bxml=E3=82=82=E5=8F=96=E3=82=8A=E8=BE=BC=E3=82=80?= =?utf8?q?=E3=82=88=E3=81=86=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.sourceforge.jp/svnroot/charactermanaj/trunk@87 5b6e9025-a2e8-4882-b233-f889982098c5 --- .../model/io/CharacterDataDefaultProvider.java | 105 ++++++++++++++++----- src/charactermanaj/util/ResourceNames.java | 16 +++- 2 files changed, 94 insertions(+), 27 deletions(-) diff --git a/src/charactermanaj/model/io/CharacterDataDefaultProvider.java b/src/charactermanaj/model/io/CharacterDataDefaultProvider.java index 1585335..84c794c 100644 --- a/src/charactermanaj/model/io/CharacterDataDefaultProvider.java +++ b/src/charactermanaj/model/io/CharacterDataDefaultProvider.java @@ -1,13 +1,12 @@ package charactermanaj.model.io; -import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.net.URL; import java.sql.Timestamp; import java.util.EnumSet; @@ -22,6 +21,7 @@ import charactermanaj.model.CharacterData; import charactermanaj.util.ConfigurationDirUtilities; import charactermanaj.util.LocalizedResourcePropertyLoader; import charactermanaj.util.ResourceLoader; +import charactermanaj.util.ResourceNames; import charactermanaj.util.SetupLocalization; /** @@ -104,20 +104,41 @@ public class CharacterDataDefaultProvider { } /** + * テンプレートリストの定義プロパティを読み込む.
+ * neutral引数がfalseの場合は現在のロケールを優先する.
+ * 引数がtrueの場合は読み込み順を逆転させ、言語中立を優先する.
+ * + * @param neutral + * 言語中立を優先する場合 + * @return テンプレートリストのプロパティ + */ + private Properties getTemplateListProperties(boolean neutral) { + // テンプレートリソースは実行中に増減する可能性があるため、 + // 共有キャッシュには入れない. + LocalizedResourcePropertyLoader loader = new LocalizedResourcePropertyLoader( + null); + String name = DEFAULT_CHARACTER_PREFIX + TEMPLATE_LIST_XML; + ResourceNames resNames = LocalizedResourcePropertyLoader + .getResourceNames(name, null); + if (neutral) { + // 言語中立を優先する場合は、プロパティの重ね順を逆転させて言語中立で最後に上書きする. + resNames = resNames.reverse(); + } + return loader.getLocalizedProperties(name); + } + + /** * キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ.
* 表示順序でアクセス可能.
* * @return 順序付マップ */ public Map getCharacterDataTemplates() { - // テンプレートリソースは実行中に増減する可能性があるため、 - // 共有キャッシュには入れない. - LocalizedResourcePropertyLoader propLoader = new LocalizedResourcePropertyLoader( - null); - Properties props = propLoader.getLocalizedProperties("template/" - + TEMPLATE_LIST_XML); + // キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ + final LinkedHashMap templateNameMap = new LinkedHashMap(); - LinkedHashMap results = new LinkedHashMap(); + // テンプレートの定義プロパティのロード + Properties props = getTemplateListProperties(false); // 順序優先 String strOrders = props.getProperty("displayOrder"); @@ -129,7 +150,7 @@ public class CharacterDataDefaultProvider { String resKey = DEFAULT_CHARACTER_PREFIX + key; if (getResource(resKey) != null) { // 現存するテンプレートのみ登録 - results.put(key, val); + templateNameMap.put(key, val); } } } @@ -144,12 +165,55 @@ public class CharacterDataDefaultProvider { String resKey = DEFAULT_CHARACTER_PREFIX + key; if (getResource(resKey) != null) { // 現存するテンプレートのみ登録 - results.put(key, val); + templateNameMap.put(key, val); + } + } + } + + // フォルダにある未登録のxmlファイルもテンプレート一覧に加える + // (ただし、テンプレートリストプロパティを除く) + try { + File templDir = getTemplateDir(false); + if (templDir.isDirectory()) { + File[] files = templDir.listFiles(new java.io.FileFilter() { + public boolean accept(File pathname) { + String name = pathname.getName(); + if (templateNameMap.containsKey(name)) { + // すでに登録済みなのでスキップする. + return false; + } + if (name.startsWith(TEMPLATE_LIST_XML)) { + // テンプレートリストプロパティファイルは除外する. + return false; + } + return pathname.isFile() && name.endsWith(".xml"); + } + }); + CharacterDataPersistent persist = CharacterDataPersistent + .getInstance(); + if (files != null) { + for (File file : files) { + try { + URI docBase = file.toURI(); + CharacterData cd = persist.loadProfile(docBase); + if (cd != null && cd.isValid()) { + String name = file.getName(); + templateNameMap.put(name, cd.getName()); + } + } catch (IOException ex) { + logger.log(Level.WARNING, + "failed to read templatedir." + file, ex); + } + } } } + + } catch (IOException ex) { + // ディレクトリの一覧取得に失敗しても無視する. + logger.log(Level.FINE, "failed to read templatedir.", ex); } - return results; + return templateNameMap; } /** @@ -272,25 +336,14 @@ public class CharacterDataDefaultProvider { bos.close(); } - // 現在のテンプレート一覧のファイルリソースの読み込み - // (言語中立のリソースのみ) - Properties neutralProps = new Properties(); - File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml"); - if (neutralPropsFile.exists()) { - BufferedInputStream bis = new BufferedInputStream( - new FileInputStream(neutralPropsFile)); - try { - neutralProps.loadFromXML(bis); - - } finally { - bis.close(); - } - } + // テンプレートの定義プロパティのロード(言語中立を優先) + Properties neutralProps = getTemplateListProperties(true); // テンプレート一覧の更新 neutralProps.put(name, localizedName); // テンプレート一覧の保存 + File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml"); BufferedOutputStream fos = new BufferedOutputStream( new FileOutputStream(neutralPropsFile)); try { diff --git a/src/charactermanaj/util/ResourceNames.java b/src/charactermanaj/util/ResourceNames.java index 5557872..3c89acc 100644 --- a/src/charactermanaj/util/ResourceNames.java +++ b/src/charactermanaj/util/ResourceNames.java @@ -12,13 +12,27 @@ public class ResourceNames extends AbstractList { private final String[] resourceNames; - ResourceNames(String[] resourceNames) { + public ResourceNames(String[] resourceNames) { if (resourceNames == null) { throw new IllegalArgumentException(); } this.resourceNames = resourceNames; } + /** + * 順次を逆転させた新しいインスタンスを返す + * + * @return 順序を逆転させたインスタンス + */ + public ResourceNames reverse() { + int len = resourceNames.length; + String[] tmp = new String[len]; + for (int idx = 0; idx < len; idx++) { + tmp[len - idx - 1] = resourceNames[idx]; + } + return new ResourceNames(tmp); + } + @Override public int hashCode() { return Arrays.hashCode(resourceNames); -- 2.11.0