OSDN Git Service

22da0f02edea4bc1c9f7385501b86d5d887720aa
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / util / SetupLocalization.java
1 package charactermanaj.util;\r
2 \r
3 import java.io.BufferedReader;\r
4 import java.io.File;\r
5 import java.io.FileOutputStream;\r
6 import java.io.IOException;\r
7 import java.io.InputStream;\r
8 import java.io.InputStreamReader;\r
9 import java.io.OutputStream;\r
10 import java.net.URL;\r
11 import java.net.URLConnection;\r
12 import java.util.ArrayList;\r
13 import java.util.Collection;\r
14 import java.util.logging.Level;\r
15 import java.util.logging.Logger;\r
16 \r
17 import charactermanaj.Main;\r
18 \r
19 /**\r
20  * 言語リソースを管理する.\r
21  * @author seraphy\r
22  */\r
23 public class SetupLocalization extends ResourceLoader {\r
24         \r
25         private final Logger logger = Logger.getLogger(getClass().getName());\r
26         \r
27         public static final String DIRNAME_RESOURCES = "resources";\r
28         \r
29         public static final String CATALOG_NAME = "/resource_list.txt";\r
30         \r
31         private File baseDir;\r
32         \r
33         /**\r
34          * アプリケーションデータ用ディレクトリを指定して構築する.\r
35          * @param baseDir データディレクトリ\r
36          */\r
37         public SetupLocalization(File baseDir) {\r
38                 if (baseDir == null || !baseDir.isDirectory()) {\r
39                         throw new IllegalArgumentException();\r
40                 }\r
41                 this.baseDir = baseDir;\r
42         }\r
43         \r
44         /**\r
45          * リソース一覧を取得する.<br>\r
46          * クラスパス上の一覧を取得する汎用的な方法はないため、カタログファイルを使用する.<br>\r
47          * {@link #CATALOG_NAME}で示されるリソース上のファイルにリソース一覧が記録されているものとする.<br>\r
48          * @return リソース一覧(言語関連リソースのみ)\r
49          * @throws IOException 失敗\r
50          */\r
51         protected Collection<String> getResourceList() throws IOException {\r
52                 ArrayList<String> resources = new ArrayList<String>();\r
53                 URL listURL = Main.class.getResource(CATALOG_NAME);\r
54                 InputStream is = listURL.openStream();\r
55                 try {\r
56                         BufferedReader rd = new BufferedReader(new InputStreamReader(is));\r
57                         try {\r
58                                 String line;\r
59                                 while ((line = rd.readLine()) != null) {\r
60                                         line = line.trim();\r
61                                         if (line.startsWith("#")) {\r
62                                                 continue;\r
63                                         }\r
64                                         resources.add(line);\r
65                                 }\r
66                                 \r
67                         } finally {\r
68                                 rd.close();\r
69                         }\r
70                 } finally {\r
71                         is.close();\r
72                 }\r
73                 logger.log(Level.FINE, "resource list: " +resources);\r
74                 return resources;\r
75         }\r
76         \r
77         /**\r
78          * リソースをファイルにコピーする.<br>\r
79          * @param fromURL\r
80          * @param toFile\r
81          * @throws IOException\r
82          */\r
83         protected void copyResource(URL fromURL, File toFile) throws IOException {\r
84                 logger.log(Level.INFO, "copy resource '" + fromURL + "' to '" + toFile + "'");\r
85                 File dir = toFile.getParentFile();\r
86                 if ( !dir.exists()) {\r
87                         if ( !dir.mkdirs()) {\r
88                                 throw new IOException("can't create directory. " + dir);\r
89                         }\r
90                 }\r
91 \r
92                 URLConnection conn = fromURL.openConnection();\r
93                 conn.setDoInput(true);\r
94                 InputStream is = conn.getInputStream();\r
95                 try {\r
96                         long lastModified = conn.getLastModified();\r
97                         OutputStream os = new FileOutputStream(toFile);\r
98                         try {\r
99                                 byte[] buf = new byte[4096];\r
100                                 for (;;) {\r
101                                         int rd = is.read(buf);\r
102                                         if (rd <= 0) {\r
103                                                 break;\r
104                                         }\r
105                                         os.write(buf, 0, rd);\r
106                                 }\r
107                         } finally {\r
108                                 os.close();\r
109                         }\r
110                         toFile.setLastModified(lastModified);\r
111                 } finally {\r
112                         is.close();\r
113                 }\r
114         }\r
115         \r
116         /**\r
117          * リソースディレクトリを返す.\r
118          * @return リソースディレクトリ\r
119          */\r
120         public File getResourceDir() {\r
121                 return new File(baseDir, DIRNAME_RESOURCES);\r
122         }\r
123         \r
124         /**\r
125          * ローカルシステム上のアプリケーションデータディレクトリに言語リソースをコピーする.\r
126          * @throws IOException 失敗\r
127          */\r
128         public void setupToLocal() throws IOException {\r
129                 File toDir = getResourceDir();\r
130                 ClassLoader cl = getDefaultClassLoader();\r
131                 for (String resourceName : getResourceList()) {\r
132                         URL url = cl.getResource(resourceName);\r
133                         if (url != null) {\r
134                                 File toFile = new File(toDir, resourceName).getCanonicalFile();\r
135                                 copyResource(url, toFile);\r
136 \r
137                         } else {\r
138                                 logger.log(Level.WARNING, "missing resource: " + resourceName);\r
139                         }\r
140                 }\r
141         }\r
142 }\r