OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / ResourceManager.java
1 package jp.sfjp.armadillo;
2
3 import java.io.*;
4 import java.text.*;
5 import java.util.*;
6 import java.util.concurrent.*;
7
8 /**
9  * ResourceManager provides a function like a ResourceBundle used UTF-8 instead Unicode escapes.
10  */
11 public final class ResourceManager {
12
13     public static final ResourceManager Default = ResourceManager.getInstance(ResourceManager0.class);
14
15     private final List<Map<String, String>> list;
16
17     private ResourceManager(List<Map<String, String>> list) {
18         this.list = list;
19     }
20
21     /**
22      * Creates an instance.
23      * @param o
24      * It used as a bundle name.
25      * If String, it will use as a bundle name directly.
26      * Else if Package, it will use its package name + "messages".
27      * Otherwise, it will use as its FQCN.
28      * @return
29      */
30     public static ResourceManager getInstance(Object o) {
31         Locale loc = Locale.getDefault();
32         String[] suffixes = {"_" + loc, "_" + loc.getLanguage(), ""};
33         List<Map<String, String>> a = new ArrayList<Map<String, String>>();
34         for (final String name : getResourceNames(o))
35             for (final String suffix : suffixes) {
36                 final String key = name + suffix;
37                 Map<String, String> m = ResourceManager0.map.get(key);
38                 if (m == null) {
39                     m = loadResource(key, "u8p", "utf-8");
40                     if (m == null)
41                         continue;
42                     ResourceManager0.map.putIfAbsent(key, m);
43                 }
44                 a.add(m);
45             }
46         return new ResourceManager(a);
47     }
48
49     private static Set<String> getResourceNames(Object o) {
50         Set<String> set = new LinkedHashSet<String>();
51         String cn = null;
52         String pn = null;
53         if (o instanceof String)
54             cn = (String)o;
55         else if (o instanceof Package)
56             pn = ((Package)o).getName();
57         else if (o != null) {
58             final Class<?> c = (o instanceof Class) ? (Class<?>)o : o.getClass();
59             cn = c.getName();
60             pn = c.getPackage().getName();
61         }
62         if (cn != null)
63             set.add(cn);
64         if (pn != null)
65             set.add(pn + ".messages");
66         set.add(ResourceManager0.getPackageName() + ".messages");
67         return set;
68     }
69
70     private static Map<String, String> loadResource(String name, String extension, String encname) {
71         final String path = "/" + name.replace('.', '/') + '.' + extension;
72         InputStream is = ResourceManager0.getResourceAsStream(path);
73         if (is == null)
74             return null;
75         List<String> lines = new ArrayList<String>();
76         Scanner r = new Scanner(is, encname);
77         try {
78             StringBuilder buffer = new StringBuilder();
79             while (r.hasNextLine()) {
80                 final String s = r.nextLine();
81                 if (s.matches("^\\s*#.*"))
82                     continue;
83                 buffer.append(s.replace("\\t", "\t").replace("\\n", "\n").replace("\\=", "="));
84                 if (s.endsWith("\\")) {
85                     buffer.setLength(buffer.length() - 1);
86                     continue;
87                 }
88                 lines.add(buffer.toString());
89                 buffer.setLength(0);
90             }
91             if (buffer.length() > 0)
92                 lines.add(buffer.toString());
93         } finally {
94             r.close();
95         }
96         Map<String, String> m = new HashMap<String, String>();
97         for (final String s : lines)
98             if (s.contains("=")) {
99                 String[] a = s.split("=", 2);
100                 m.put(a[0].trim(), a[1].trim().replaceFirst("\\\\$", " ").replace("\\ ", " "));
101             }
102             else
103                 m.put(s.trim(), "");
104         return m;
105     }
106
107     /**
108      * @param path resource's path
109      * @param defaultValue defalut value if a resource not found
110      * @return
111      */
112     public String read(String path, String defaultValue) {
113         InputStream in = ResourceManager0.getResourceAsStream(path);
114         if (in == null)
115             return defaultValue;
116         StringBuilder buffer = new StringBuilder();
117         Scanner r = new Scanner(in);
118         try {
119             if (r.hasNextLine())
120                 buffer.append(r.nextLine());
121             while (r.hasNextLine()) {
122                 buffer.append(String.format("%n"));
123                 buffer.append(r.nextLine());
124             }
125         } finally {
126             r.close();
127         }
128         return buffer.toString();
129     }
130
131     private String s(String key) {
132         for (final Map<String, String> m : this.list) {
133             final String s = m.get(key);
134             if (s != null)
135                 return s;
136         }
137         return "";
138     }
139
140     /**
141      * Returns true if this resource contains a value specified by key.
142      * @param key
143      * @return
144      */
145     public boolean containsKey(String key) {
146         for (final Map<String, String> m : this.list)
147             if (m.containsKey(key))
148                 return true;
149         return false;
150     }
151
152     /**
153      * Returns the value specified by key as a String.
154      * @param key
155      * @param args
156      * @return
157      */
158     public String get(String key, Object... args) {
159         final String s = s(key);
160         return (s.length() == 0) ? key : MessageFormat.format(s(key), args);
161     }
162
163     /**
164      * Returns the value specified by key as a boolean.
165      * @param key
166      * @return
167      */
168     public boolean isTrue(String key) {
169         return s(key).matches("(?i)true|on|yes");
170     }
171
172     /**
173      * Returns the (initial char) value specified by key as a char.
174      * @param key
175      * @return
176      */
177     public char getChar(String key) {
178         final String s = s(key);
179         return (s.length() == 0) ? ' ' : s.charAt(0);
180     }
181
182     /**
183      * Returns the value specified by key as a int.
184      * @param key
185      * @return
186      */
187     public int getInt(String key) {
188         return getInt(key, 0);
189     }
190
191     /**
192      * Returns the value specified by key as a int.
193      * @param key
194      * @param defaultValue
195      * @return
196      */
197     public int getInt(String key, int defaultValue) {
198         final String s = s(key);
199         try {
200             return Integer.parseInt(s);
201         } catch (NumberFormatException ex) {
202             // ignore
203         }
204         return defaultValue;
205     }
206
207 }
208
209 class ResourceManager0 {
210
211     static final ConcurrentHashMap<String, Map<String, String>> map = new ConcurrentHashMap<String, Map<String, String>>();
212
213     static String getPackageName() {
214         return ResourceManager0.class.getPackage().getName();
215     }
216
217     static InputStream getResourceAsStream(String path) {
218         return ResourceManager0.class.getResourceAsStream(path);
219     }
220
221 }