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
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
}\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
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
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
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