OSDN Git Service

ver0.97リリース
[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.CharacterDataPersistent.DocInfo;\r
18 \r
19 /**\r
20  * 埋め込みリソースを生成するためのビルド時のヘルパ.<br>\r
21  * @author seraphy\r
22  */\r
23 public class MakeEmbeddedResource {\r
24 \r
25         public static void main(String[] args) throws Exception {\r
26                 // 出力するデフォルトのファイル名\r
27                 String[] fileNames = {\r
28                                 "resources/schema/character.xml.ser",\r
29                                 "resources/resource_list.txt"\r
30                 };\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          * @param fileName ファィル名\r
46          * @throws Exception 失敗\r
47          */\r
48         public static void createResourceList(String fileName) throws Exception {\r
49                 File outiFile = new File(fileName);\r
50                 ArrayList<String> resourceList = new ArrayList<String>();\r
51 \r
52                 resourceList.add("_HOW_TO_LOCALIZE.txt");\r
53                 \r
54                 File resourceDir = new File("resources");\r
55                 for (String dirName : new String[] {"appinfo", "languages", "menu"}) {\r
56                         File dir = new File(resourceDir, dirName);\r
57                         for (File file : dir.listFiles()) {\r
58                                 if ( !file.isFile()) {\r
59                                         continue;\r
60                                 }\r
61                                 String resourceName = dirName + "/" + file.getName();\r
62                                 resourceList.add(resourceName);\r
63                         }\r
64                 }\r
65                 \r
66                 String br = "\r\n";\r
67                 FileOutputStream fos = new FileOutputStream(outiFile);\r
68                 try {\r
69                         Writer wr = new OutputStreamWriter(fos, Charset.forName("UTF-8"));\r
70                         try {\r
71                                 wr.write("# localized resources" + br);\r
72                                 for (String resource : resourceList) {\r
73                                         wr.write(resource + br);\r
74                                 }\r
75                                 \r
76                         } finally {\r
77                                 wr.close();\r
78                         }\r
79                 } finally {\r
80                         fos.close();\r
81                 }\r
82                 System.out.println("make embedded resource : succeeded. file=" + outiFile);\r
83         }\r
84 \r
85         /**\r
86          * デフォルトのキャラクター定義の事前シリアライズバージョン作成\r
87          * @param fileName ファィル名\r
88          * @throws Exception 失敗\r
89          */\r
90         public static void createDefaultCharacterSer(String fileName) throws Exception {\r
91                 File outiFile = new File(fileName);\r
92                 \r
93                 // 読み込む言語データ(ENは標準)\r
94                 Locale[] locales = new Locale[] {\r
95                                 Locale.ENGLISH, // デフォルト\r
96                                 Locale.JAPANESE, // 日本語固有、(現状、2つしか定義さてれいない)\r
97                 };\r
98 \r
99                 // 各言語ごとのデフォルトキャラクターデータを読み込む\r
100                 HashMap<String, CharacterData> characterDataMap = new HashMap<String, CharacterData>();\r
101                 for (Locale locale : locales) {\r
102                         String lang = locale.getLanguage();\r
103                         if (characterDataMap.containsKey(lang)) {\r
104                                 continue; // すでに読み込み済みなのでスキップする.\r
105                         }\r
106                         CharacterData cd = loadDefaultCharacterData(locale);\r
107                         characterDataMap.put(lang, cd);\r
108                 }\r
109 \r
110                 // シリアライズする.\r
111                 FileOutputStream fos = new FileOutputStream(outiFile);\r
112                 try {\r
113                         ObjectOutputStream oos = new ObjectOutputStream(fos);\r
114                         try {\r
115                                 oos.writeObject(characterDataMap);\r
116                         } finally {\r
117                                 oos.close();\r
118                         }\r
119                 } finally {\r
120                         fos.close();\r
121                 }\r
122                 System.out.println("make embedded resource : succeeded. file=" + outiFile);\r
123         }\r
124         \r
125         protected static CharacterData loadDefaultCharacterData(Locale locale) throws Exception {\r
126                 // 埋め込みリソースからデフォルトキャラクターデータを構築する.\r
127                 CharacterData cd;\r
128                 URL defaultCharacter = getEmbeddedResourceURL(CharacterDataPersistent.DEFAULT_CHARACTER_XML);\r
129                 InputStream is = defaultCharacter.openStream();\r
130                 try {\r
131                         DocInfo docInfo = new DocInfo();\r
132                         docInfo.setFirstElementName("character");\r
133                         docInfo.setNamespace(CharacterDataPersistent.NS);\r
134                         docInfo.setVersion("1.0");\r
135                         \r
136                         CharacterDataPersistent persist = CharacterDataPersistent.getInstance();\r
137                         cd = persist.loadCharacterDataFromXML(is, null, docInfo, locale);\r
138 \r
139                 } finally {\r
140                         is.close();\r
141                 }\r
142                 return cd;\r
143         }\r
144 \r
145         protected static URL getEmbeddedResourceURL(String schemaName) {\r
146                 return CharacterDataPersistent.class.getResource(schemaName);\r
147         }\r
148         \r
149 }\r