package play.utils; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; /** * like Properties, but with: * encoding * generic * type helper */ public class Properties extends HashMap<String, String> { private static final long serialVersionUID = 1L; public Properties() { } public synchronized void load(InputStream is) throws IOException { load(is, "utf-8"); } public synchronized void load(InputStream is, String encoding) throws IOException { if (is == null) { throw new NullPointerException("Can't read from null stream"); } BufferedReader rd = new BufferedReader(new InputStreamReader(is, encoding)); while (true) { String tmp = rd.readLine(); if (tmp == null) { break; } tmp = tmp.trim(); if (tmp.startsWith("#")) { continue; } if (!tmp.contains("=")) { put(tmp, ""); continue; } String[] kv = tmp.split("=", 2); if (kv.length == 2) { put(kv[0], kv[1]); } else { put(kv[0], ""); } } rd.close(); } public String get(String key, String defaultValue) { if (containsKey(key)) { return get(key); } else { return defaultValue; } } public synchronized void store(OutputStream out) throws IOException { store(out, "utf-8"); } public synchronized void store(OutputStream out, String encoding) throws IOException { if (out == null) { throw new NullPointerException("Can't store to null stream"); } BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(out, encoding)); for (String key : keySet()) { if (key.length() > 0) { wr.write(key + "=" + get(key) + System.getProperties().getProperty("line.separator")); } } wr.flush(); wr.close(); } public boolean getBoolean(String key) throws IllegalArgumentException { String s = get(key); if (s == null || "".equals(s)) { throw new IllegalArgumentException("Setting must be an boolean (values:true/false/yes/no/on/off) : " + key); } s = s.trim().toLowerCase(); return "true".equals(s) || "on".equals(s) || "yes".equals(s); } public boolean getBoolean(String key, boolean defval) { String s = get(key); if (s == null || "".equals(s)) { return defval; } s = s.trim().toLowerCase(); return "true".equals(s) || "on".equals(s) || "yes".equals(s); } public Object getClassInstance(String key) throws IllegalArgumentException { String s = get(key); if (s == null || "".equals(s)) { throw new IllegalArgumentException("Setting " + key + " must be a valid classname : " + key); } try { return Class.forName(s).newInstance(); } catch (ClassNotFoundException nfe) { throw new IllegalArgumentException(s + ": invalid class name for key " + key, nfe); } catch (InstantiationException e) { throw new IllegalArgumentException(s + ": class could not be reflected " + s, e); } catch (IllegalAccessException e) { throw new IllegalArgumentException(s + ": class could not be reflected " + s, e); } } public Object getClassInstance(String key, Object defaultinstance) throws IllegalArgumentException { return (containsKey(key) ? getClassInstance(key) : defaultinstance); } public double getDouble(String key) throws IllegalArgumentException { String s = get(key); try { return Double.parseDouble(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an double value :" + key); } } public double getDouble(String key, long defval) throws IllegalArgumentException { String s = get(key); if (s == null) { return defval; } try { return Double.parseDouble(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an double value :" + key); } } public void setDouble(String key, double val) { put(key, Double.toString(val)); } public float getFloat(String key) throws IllegalArgumentException { String s = get(key); try { return Float.parseFloat(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an float value :" + key); } } public float getFloat(String key, float defval) throws IllegalArgumentException { String s = get(key); if (s == null) { return defval; } try { return Float.parseFloat(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an float value :" + key); } } public void setFloat(String key, float val) { put(key, Float.toString(val)); } public int getInt(String key) throws IllegalArgumentException { String s = get(key); try { return Integer.parseInt(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an integer value :" + key); } } public int getInt(String key, int defval) throws IllegalArgumentException { String s = get(key); if (s == null) { return defval; } try { return Integer.parseInt(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an integer value :" + key); } } public void setInt(String key, int val) { put(key, Integer.toString(val)); } public long getLong(String key) throws IllegalArgumentException { String s = get(key); try { return Long.parseLong(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an long value :" + key); } } public long getLong(String key, long defval) throws IllegalArgumentException { String s = get(key); if (s == null) { return defval; } try { return Long.parseLong(s); } catch (NumberFormatException e) { throw new IllegalArgumentException("Property must be an long value :" + key); } } public void setLong(String key, long val) { put(key, Long.toString(val)); } public URL getURL(String key) throws IllegalArgumentException { try { return new URL(get(key)); } catch (MalformedURLException e) { throw new IllegalArgumentException("Property " + key + " must be a valid URL (" + get(key) + ")"); } } }