OSDN Git Service

テンプレートは管理ファイルに記載なくともフォルダにあるxmlも取り込むように追加
authorseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Mon, 25 Nov 2013 17:44:02 +0000 (17:44 +0000)
committerseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Mon, 25 Nov 2013 17:44:02 +0000 (17:44 +0000)
git-svn-id: https://svn.sourceforge.jp/svnroot/charactermanaj/trunk@87 5b6e9025-a2e8-4882-b233-f889982098c5

src/charactermanaj/model/io/CharacterDataDefaultProvider.java
src/charactermanaj/util/ResourceNames.java

index 1585335..84c794c 100644 (file)
@@ -1,13 +1,12 @@
 package charactermanaj.model.io;\r
 \r
-import java.io.BufferedInputStream;\r
 import java.io.BufferedOutputStream;\r
 import java.io.File;\r
-import java.io.FileInputStream;\r
 import java.io.FileNotFoundException;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
+import java.net.URI;\r
 import java.net.URL;\r
 import java.sql.Timestamp;\r
 import java.util.EnumSet;\r
@@ -22,6 +21,7 @@ import charactermanaj.model.CharacterData;
 import charactermanaj.util.ConfigurationDirUtilities;\r
 import charactermanaj.util.LocalizedResourcePropertyLoader;\r
 import charactermanaj.util.ResourceLoader;\r
+import charactermanaj.util.ResourceNames;\r
 import charactermanaj.util.SetupLocalization;\r
 \r
 /**\r
@@ -104,20 +104,41 @@ public class CharacterDataDefaultProvider {
        }\r
 \r
        /**\r
+        * テンプレートリストの定義プロパティを読み込む.<br>\r
+        * neutral引数がfalseの場合は現在のロケールを優先する.<br>\r
+        * 引数がtrueの場合は読み込み順を逆転させ、言語中立を優先する.<br>\r
+        * \r
+        * @param neutral\r
+        *            言語中立を優先する場合\r
+        * @return テンプレートリストのプロパティ\r
+        */\r
+       private Properties getTemplateListProperties(boolean neutral) {\r
+               // テンプレートリソースは実行中に増減する可能性があるため、\r
+               // 共有キャッシュには入れない.\r
+               LocalizedResourcePropertyLoader loader = new LocalizedResourcePropertyLoader(\r
+                               null);\r
+               String name = DEFAULT_CHARACTER_PREFIX + TEMPLATE_LIST_XML;\r
+               ResourceNames resNames = LocalizedResourcePropertyLoader\r
+                               .getResourceNames(name, null);\r
+               if (neutral) {\r
+                       // 言語中立を優先する場合は、プロパティの重ね順を逆転させて言語中立で最後に上書きする.\r
+                       resNames = resNames.reverse();\r
+               }\r
+               return loader.getLocalizedProperties(name);\r
+       }\r
+\r
+       /**\r
         * キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ.<br>\r
         * 表示順序でアクセス可能.<br>\r
         * \r
         * @return 順序付マップ\r
         */\r
        public Map<String, String> getCharacterDataTemplates() {\r
-               // テンプレートリソースは実行中に増減する可能性があるため、\r
-               // 共有キャッシュには入れない.\r
-               LocalizedResourcePropertyLoader propLoader = new LocalizedResourcePropertyLoader(\r
-                               null);\r
-               Properties props = propLoader.getLocalizedProperties("template/"\r
-                               + TEMPLATE_LIST_XML);\r
+               // キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ\r
+               final LinkedHashMap<String, String> templateNameMap = new LinkedHashMap<String, String>();\r
 \r
-               LinkedHashMap<String, String> results = new LinkedHashMap<String, String>();\r
+               // テンプレートの定義プロパティのロード\r
+               Properties props = getTemplateListProperties(false);\r
 \r
                // 順序優先\r
                String strOrders = props.getProperty("displayOrder");\r
@@ -129,7 +150,7 @@ public class CharacterDataDefaultProvider {
                                        String resKey = DEFAULT_CHARACTER_PREFIX + key;\r
                                        if (getResource(resKey) != null) {\r
                                                // 現存するテンプレートのみ登録\r
-                                               results.put(key, val);\r
+                                               templateNameMap.put(key, val);\r
                                        }\r
                                }\r
                        }\r
@@ -144,12 +165,55 @@ public class CharacterDataDefaultProvider {
                                String resKey = DEFAULT_CHARACTER_PREFIX + key;\r
                                if (getResource(resKey) != null) {\r
                                        // 現存するテンプレートのみ登録\r
-                                       results.put(key, val);\r
+                                       templateNameMap.put(key, val);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // フォルダにある未登録のxmlファイルもテンプレート一覧に加える\r
+               // (ただし、テンプレートリストプロパティを除く)\r
+               try {\r
+                       File templDir = getTemplateDir(false);\r
+                       if (templDir.isDirectory()) {\r
+                               File[] files = templDir.listFiles(new java.io.FileFilter() {\r
+                                       public boolean accept(File pathname) {\r
+                                               String name = pathname.getName();\r
+                                               if (templateNameMap.containsKey(name)) {\r
+                                                       // すでに登録済みなのでスキップする.\r
+                                                       return false;\r
+                                               }\r
+                                               if (name.startsWith(TEMPLATE_LIST_XML)) {\r
+                                                       // テンプレートリストプロパティファイルは除外する.\r
+                                                       return false;\r
+                                               }\r
+                                               return pathname.isFile() && name.endsWith(".xml");\r
+                                       }\r
+                               });\r
+                               CharacterDataPersistent persist = CharacterDataPersistent\r
+                                               .getInstance();\r
+                               if (files != null) {\r
+                                       for (File file : files) {\r
+                                               try {\r
+                                                       URI docBase = file.toURI();\r
+                                                       CharacterData cd = persist.loadProfile(docBase);\r
+                                                       if (cd != null && cd.isValid()) {\r
+                                                               String name = file.getName();\r
+                                                               templateNameMap.put(name, cd.getName());\r
+                                                       }\r
+                                               } catch (IOException ex) {\r
+                                                       logger.log(Level.WARNING,\r
+                                                                       "failed to read templatedir." + file, ex);\r
+                                               }\r
+                                       }\r
                                }\r
                        }\r
+\r
+               } catch (IOException ex) {\r
+                       // ディレクトリの一覧取得に失敗しても無視する.\r
+                       logger.log(Level.FINE, "failed to read templatedir.", ex);\r
                }\r
 \r
-               return results;\r
+               return templateNameMap;\r
        }\r
 \r
        /**\r
@@ -272,25 +336,14 @@ public class CharacterDataDefaultProvider {
                        bos.close();\r
                }\r
 \r
-               // 現在のテンプレート一覧のファイルリソースの読み込み\r
-               // (言語中立のリソースのみ)\r
-               Properties neutralProps = new Properties();\r
-               File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml");\r
-               if (neutralPropsFile.exists()) {\r
-                       BufferedInputStream bis = new BufferedInputStream(\r
-                                       new FileInputStream(neutralPropsFile));\r
-                       try {\r
-                               neutralProps.loadFromXML(bis);\r
-\r
-                       } finally {\r
-                               bis.close();\r
-                       }\r
-               }\r
+               // テンプレートの定義プロパティのロード(言語中立を優先)\r
+               Properties neutralProps = getTemplateListProperties(true);\r
 \r
                // テンプレート一覧の更新\r
                neutralProps.put(name, localizedName);\r
 \r
                // テンプレート一覧の保存\r
+               File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml");\r
                BufferedOutputStream fos = new BufferedOutputStream(\r
                                new FileOutputStream(neutralPropsFile));\r
                try {\r
index 5557872..3c89acc 100644 (file)
@@ -12,13 +12,27 @@ public class ResourceNames extends AbstractList<String> {
        \r
        private final String[] resourceNames;\r
        \r
-       ResourceNames(String[] resourceNames) {\r
+       public ResourceNames(String[] resourceNames) {\r
                if (resourceNames == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.resourceNames = resourceNames;\r
        }\r
        \r
+       /**\r
+        * 順次を逆転させた新しいインスタンスを返す\r
+        * \r
+        * @return 順序を逆転させたインスタンス\r
+        */\r
+       public ResourceNames reverse() {\r
+               int len = resourceNames.length;\r
+               String[] tmp = new String[len];\r
+               for (int idx = 0; idx < len; idx++) {\r
+                       tmp[len - idx - 1] = resourceNames[idx];\r
+               }\r
+               return new ResourceNames(tmp);\r
+       }\r
+\r
        @Override\r
        public int hashCode() {\r
                return Arrays.hashCode(resourceNames);\r