1 package charactermanaj.util;
\r
3 import java.io.BufferedReader;
\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
17 import charactermanaj.Main;
\r
23 public class SetupLocalization extends ResourceLoader {
\r
25 private final Logger logger = Logger.getLogger(getClass().getName());
\r
27 public static final String DIRNAME_RESOURCES = "resources";
\r
29 public static final String CATALOG_NAME = "/resource_list.txt";
\r
31 private File baseDir;
\r
34 * アプリケーションデータ用ディレクトリを指定して構築する.
\r
35 * @param baseDir データディレクトリ
\r
37 public SetupLocalization(File baseDir) {
\r
38 if (baseDir == null || !baseDir.isDirectory()) {
\r
39 throw new IllegalArgumentException();
\r
41 this.baseDir = baseDir;
\r
46 * クラスパス上の一覧を取得する汎用的な方法はないため、カタログファイルを使用する.<br>
\r
47 * {@link #CATALOG_NAME}で示されるリソース上のファイルにリソース一覧が記録されているものとする.<br>
\r
48 * @return リソース一覧(言語関連リソースのみ)
\r
49 * @throws IOException 失敗
\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
56 BufferedReader rd = new BufferedReader(new InputStreamReader(is));
\r
59 while ((line = rd.readLine()) != null) {
\r
61 if (line.startsWith("#")) {
\r
64 resources.add(line);
\r
73 logger.log(Level.FINE, "resource list: " +resources);
\r
78 * リソースをファイルにコピーする.<br>
\r
81 * @throws IOException
\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
92 URLConnection conn = fromURL.openConnection();
\r
93 conn.setDoInput(true);
\r
94 InputStream is = conn.getInputStream();
\r
96 long lastModified = conn.getLastModified();
\r
97 OutputStream os = new FileOutputStream(toFile);
\r
99 byte[] buf = new byte[4096];
\r
101 int rd = is.read(buf);
\r
105 os.write(buf, 0, rd);
\r
110 toFile.setLastModified(lastModified);
\r
118 * @return リソースディレクトリ
\r
120 public File getResourceDir() {
\r
121 return new File(baseDir, DIRNAME_RESOURCES);
\r
125 * ローカルシステム上のアプリケーションデータディレクトリに言語リソースをコピーする.
\r
126 * @throws IOException 失敗
\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
134 File toFile = new File(toDir, resourceName).getCanonicalFile();
\r
135 copyResource(url, toFile);
\r
138 logger.log(Level.WARNING, "missing resource: " + resourceName);
\r