• R/O
  • SSH
  • HTTPS

charactermanaj: コミット


コミットメタ情報

リビジョン87 (tree)
日時2013-11-26 02:44:02
作者seraphy

ログメッセージ

テンプレートは管理ファイルに記載なくともフォルダにあるxmlも取り込むように追加

変更サマリ

差分

--- trunk/src/charactermanaj/model/io/CharacterDataDefaultProvider.java (revision 86)
+++ trunk/src/charactermanaj/model/io/CharacterDataDefaultProvider.java (revision 87)
@@ -1,13 +1,12 @@
11 package charactermanaj.model.io;
22
3-import java.io.BufferedInputStream;
43 import java.io.BufferedOutputStream;
54 import java.io.File;
6-import java.io.FileInputStream;
75 import java.io.FileNotFoundException;
86 import java.io.FileOutputStream;
97 import java.io.IOException;
108 import java.io.InputStream;
9+import java.net.URI;
1110 import java.net.URL;
1211 import java.sql.Timestamp;
1312 import java.util.EnumSet;
@@ -22,6 +21,7 @@
2221 import charactermanaj.util.ConfigurationDirUtilities;
2322 import charactermanaj.util.LocalizedResourcePropertyLoader;
2423 import charactermanaj.util.ResourceLoader;
24+import charactermanaj.util.ResourceNames;
2525 import charactermanaj.util.SetupLocalization;
2626
2727 /**
@@ -104,6 +104,30 @@
104104 }
105105
106106 /**
107+ * テンプレートリストの定義プロパティを読み込む.<br>
108+ * neutral引数がfalseの場合は現在のロケールを優先する.<br>
109+ * 引数がtrueの場合は読み込み順を逆転させ、言語中立を優先する.<br>
110+ *
111+ * @param neutral
112+ * 言語中立を優先する場合
113+ * @return テンプレートリストのプロパティ
114+ */
115+ private Properties getTemplateListProperties(boolean neutral) {
116+ // テンプレートリソースは実行中に増減する可能性があるため、
117+ // 共有キャッシュには入れない.
118+ LocalizedResourcePropertyLoader loader = new LocalizedResourcePropertyLoader(
119+ null);
120+ String name = DEFAULT_CHARACTER_PREFIX + TEMPLATE_LIST_XML;
121+ ResourceNames resNames = LocalizedResourcePropertyLoader
122+ .getResourceNames(name, null);
123+ if (neutral) {
124+ // 言語中立を優先する場合は、プロパティの重ね順を逆転させて言語中立で最後に上書きする.
125+ resNames = resNames.reverse();
126+ }
127+ return loader.getLocalizedProperties(name);
128+ }
129+
130+ /**
107131 * キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ.<br>
108132 * 表示順序でアクセス可能.<br>
109133 *
@@ -110,14 +134,11 @@
110134 * @return 順序付マップ
111135 */
112136 public Map<String, String> getCharacterDataTemplates() {
113- // テンプレートリソースは実行中に増減する可能性があるため、
114- // 共有キャッシュには入れない.
115- LocalizedResourcePropertyLoader propLoader = new LocalizedResourcePropertyLoader(
116- null);
117- Properties props = propLoader.getLocalizedProperties("template/"
118- + TEMPLATE_LIST_XML);
137+ // キャラクターデータのxmlファイル名をキーとし、表示名を値とするマップ
138+ final LinkedHashMap<String, String> templateNameMap = new LinkedHashMap<String, String>();
119139
120- LinkedHashMap<String, String> results = new LinkedHashMap<String, String>();
140+ // テンプレートの定義プロパティのロード
141+ Properties props = getTemplateListProperties(false);
121142
122143 // 順序優先
123144 String strOrders = props.getProperty("displayOrder");
@@ -129,7 +150,7 @@
129150 String resKey = DEFAULT_CHARACTER_PREFIX + key;
130151 if (getResource(resKey) != null) {
131152 // 現存するテンプレートのみ登録
132- results.put(key, val);
153+ templateNameMap.put(key, val);
133154 }
134155 }
135156 }
@@ -144,12 +165,55 @@
144165 String resKey = DEFAULT_CHARACTER_PREFIX + key;
145166 if (getResource(resKey) != null) {
146167 // 現存するテンプレートのみ登録
147- results.put(key, val);
168+ templateNameMap.put(key, val);
148169 }
149170 }
150171 }
151172
152- return results;
173+ // フォルダにある未登録のxmlファイルもテンプレート一覧に加える
174+ // (ただし、テンプレートリストプロパティを除く)
175+ try {
176+ File templDir = getTemplateDir(false);
177+ if (templDir.isDirectory()) {
178+ File[] files = templDir.listFiles(new java.io.FileFilter() {
179+ public boolean accept(File pathname) {
180+ String name = pathname.getName();
181+ if (templateNameMap.containsKey(name)) {
182+ // すでに登録済みなのでスキップする.
183+ return false;
184+ }
185+ if (name.startsWith(TEMPLATE_LIST_XML)) {
186+ // テンプレートリストプロパティファイルは除外する.
187+ return false;
188+ }
189+ return pathname.isFile() && name.endsWith(".xml");
190+ }
191+ });
192+ CharacterDataPersistent persist = CharacterDataPersistent
193+ .getInstance();
194+ if (files != null) {
195+ for (File file : files) {
196+ try {
197+ URI docBase = file.toURI();
198+ CharacterData cd = persist.loadProfile(docBase);
199+ if (cd != null && cd.isValid()) {
200+ String name = file.getName();
201+ templateNameMap.put(name, cd.getName());
202+ }
203+ } catch (IOException ex) {
204+ logger.log(Level.WARNING,
205+ "failed to read templatedir." + file, ex);
206+ }
207+ }
208+ }
209+ }
210+
211+ } catch (IOException ex) {
212+ // ディレクトリの一覧取得に失敗しても無視する.
213+ logger.log(Level.FINE, "failed to read templatedir.", ex);
214+ }
215+
216+ return templateNameMap;
153217 }
154218
155219 /**
@@ -272,25 +336,14 @@
272336 bos.close();
273337 }
274338
275- // 現在のテンプレート一覧のファイルリソースの読み込み
276- // (言語中立のリソースのみ)
277- Properties neutralProps = new Properties();
278- File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml");
279- if (neutralPropsFile.exists()) {
280- BufferedInputStream bis = new BufferedInputStream(
281- new FileInputStream(neutralPropsFile));
282- try {
283- neutralProps.loadFromXML(bis);
339+ // テンプレートの定義プロパティのロード(言語中立を優先)
340+ Properties neutralProps = getTemplateListProperties(true);
284341
285- } finally {
286- bis.close();
287- }
288- }
289-
290342 // テンプレート一覧の更新
291343 neutralProps.put(name, localizedName);
292344
293345 // テンプレート一覧の保存
346+ File neutralPropsFile = new File(templDir, TEMPLATE_LIST_XML + ".xml");
294347 BufferedOutputStream fos = new BufferedOutputStream(
295348 new FileOutputStream(neutralPropsFile));
296349 try {
--- trunk/src/charactermanaj/util/ResourceNames.java (revision 86)
+++ trunk/src/charactermanaj/util/ResourceNames.java (revision 87)
@@ -12,7 +12,7 @@
1212
1313 private final String[] resourceNames;
1414
15- ResourceNames(String[] resourceNames) {
15+ public ResourceNames(String[] resourceNames) {
1616 if (resourceNames == null) {
1717 throw new IllegalArgumentException();
1818 }
@@ -19,6 +19,20 @@
1919 this.resourceNames = resourceNames;
2020 }
2121
22+ /**
23+ * 順次を逆転させた新しいインスタンスを返す
24+ *
25+ * @return 順序を逆転させたインスタンス
26+ */
27+ public ResourceNames reverse() {
28+ int len = resourceNames.length;
29+ String[] tmp = new String[len];
30+ for (int idx = 0; idx < len; idx++) {
31+ tmp[len - idx - 1] = resourceNames[idx];
32+ }
33+ return new ResourceNames(tmp);
34+ }
35+
2236 @Override
2337 public int hashCode() {
2438 return Arrays.hashCode(resourceNames);
旧リポジトリブラウザで表示