OSDN Git Service

キャラクターデータのXMLの読み書き部を分離独立させた。
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / util / MakeEmbeddedResource.java
1 package charactermanaj.model.util;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileOutputStream;\r
5 import java.io.InputStream;\r
6 import java.io.ObjectOutputStream;\r
7 import java.io.OutputStreamWriter;\r
8 import java.io.Writer;\r
9 import java.net.URL;\r
10 import java.nio.charset.Charset;\r
11 import java.util.ArrayList;\r
12 import java.util.HashMap;\r
13 import java.util.Locale;\r
14 \r
15 import charactermanaj.model.CharacterData;\r
16 import charactermanaj.model.io.CharacterDataPersistent;\r
17 import charactermanaj.model.io.CharacterDataXMLReader;\r
18 \r
19 /**\r
20  * 埋め込みリソースを生成するためのビルド時のヘルパ.<br>\r
21  * \r
22  * @author seraphy\r
23  */\r
24 public class MakeEmbeddedResource {\r
25 \r
26         public static void main(String[] args) throws Exception {\r
27                 // 出力するデフォルトのファイル名\r
28                 String[] fileNames = {\r
29                                 "resources/schema/character.xml.ser",\r
30                                 "resources/resource_list.txt"};\r
31                 // 引数があれば、そちらを優先\r
32                 for (int idx = 0; idx < Math.min(args.length, fileNames.length); idx++) {\r
33                         fileNames[idx] = args[idx];\r
34                 }\r
35 \r
36                 // デフォルトのキャラクター定義の事前シリアライズバージョン作成\r
37                 createDefaultCharacterSer(fileNames[0]);\r
38 \r
39                 // 展開対象リソースファイル名の出力\r
40                 createResourceList(fileNames[1]);\r
41         }\r
42 \r
43         /**\r
44          * 展開対象リソースファイル名の出力\r
45          * \r
46          * @param fileName\r
47          *            ファィル名\r
48          * @throws Exception\r
49          *             失敗\r
50          */\r
51         public static void createResourceList(String fileName) throws Exception {\r
52                 File outiFile = new File(fileName);\r
53                 ArrayList<String> resourceList = new ArrayList<String>();\r
54 \r
55                 resourceList.add("_HOW_TO_LOCALIZE.txt");\r
56 \r
57                 File resourceDir = new File("resources");\r
58                 for (String dirName : new String[]{"appinfo", "languages", "menu"}) {\r
59                         File dir = new File(resourceDir, dirName);\r
60                         for (File file : dir.listFiles()) {\r
61                                 if (!file.isFile()) {\r
62                                         continue;\r
63                                 }\r
64                                 String resourceName = dirName + "/" + file.getName();\r
65                                 resourceList.add(resourceName);\r
66                         }\r
67                 }\r
68 \r
69                 String br = "\r\n";\r
70                 FileOutputStream fos = new FileOutputStream(outiFile);\r
71                 try {\r
72                         Writer wr = new OutputStreamWriter(fos, Charset.forName("UTF-8"));\r
73                         try {\r
74                                 wr.write("# localized resources" + br);\r
75                                 for (String resource : resourceList) {\r
76                                         wr.write(resource + br);\r
77                                 }\r
78 \r
79                         } finally {\r
80                                 wr.close();\r
81                         }\r
82                 } finally {\r
83                         fos.close();\r
84                 }\r
85                 System.out.println("make embedded resource : succeeded. file="\r
86                                 + outiFile);\r
87         }\r
88 \r
89         /**\r
90          * デフォルトのキャラクター定義の事前シリアライズバージョン作成\r
91          * \r
92          * @param fileName\r
93          *            ファィル名\r
94          * @throws Exception\r
95          *             失敗\r
96          */\r
97         public static void createDefaultCharacterSer(String fileName)\r
98                         throws Exception {\r
99                 File outiFile = new File(fileName);\r
100 \r
101                 // 読み込む言語データ(ENは標準)\r
102                 Locale[] locales = new Locale[]{Locale.ENGLISH, // デフォルト\r
103                                 Locale.JAPANESE, // 日本語固有、(現状、2つしか定義さてれいない)\r
104                 };\r
105 \r
106                 // 各言語ごとのデフォルトキャラクターデータを読み込む\r
107                 HashMap<String, CharacterData> characterDataMap = new HashMap<String, CharacterData>();\r
108                 for (Locale locale : locales) {\r
109                         String lang = locale.getLanguage();\r
110                         if (characterDataMap.containsKey(lang)) {\r
111                                 continue; // すでに読み込み済みなのでスキップする.\r
112                         }\r
113                         CharacterData cd = loadDefaultCharacterData(locale);\r
114                         characterDataMap.put(lang, cd);\r
115                 }\r
116 \r
117                 // シリアライズする.\r
118                 FileOutputStream fos = new FileOutputStream(outiFile);\r
119                 try {\r
120                         ObjectOutputStream oos = new ObjectOutputStream(fos);\r
121                         try {\r
122                                 oos.writeObject(characterDataMap);\r
123                         } finally {\r
124                                 oos.close();\r
125                         }\r
126                 } finally {\r
127                         fos.close();\r
128                 }\r
129                 System.out.println("make embedded resource : succeeded. file="\r
130                                 + outiFile);\r
131         }\r
132 \r
133         protected static CharacterData loadDefaultCharacterData(Locale locale)\r
134                         throws Exception {\r
135                 // 埋め込みリソースからデフォルトキャラクターデータを構築する.\r
136                 CharacterData cd;\r
137                 URL defaultCharacter = getEmbeddedResourceURL(CharacterDataPersistent.DEFAULT_CHARACTER_XML);\r
138                 InputStream is = defaultCharacter.openStream();\r
139                 try {\r
140                         CharacterDataXMLReader xmlReader = new CharacterDataXMLReader();\r
141                         cd = xmlReader.loadCharacterDataFromXML(is, null, locale);\r
142 \r
143                 } finally {\r
144                         is.close();\r
145                 }\r
146                 return cd;\r
147         }\r
148 \r
149         protected static URL getEmbeddedResourceURL(String schemaName) {\r
150                 return CharacterDataPersistent.class.getResource(schemaName);\r
151         }\r
152 \r
153 }\r