PropertyFile escapification bugfix
[org.ibex.core.git] / src / org / ibex / js / PropertyFile.java
1 // Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] 
2 package org.ibex.js; 
3
4 import org.ibex.util.*; 
5 import java.util.*;
6 import java.io.*;
7
8 /** A JS interface to a Java '.properties' file; very crude */
9 public class PropertyFile extends JS {
10
11     private final Properties p = new Properties();
12     private final Hash cache = new Hash(10, 3);
13     private File f;
14
15     private class Minion extends JS {
16         private final String prefix;
17         Minion(String prefix) { this.prefix = prefix; }
18         public Number coerceToNumber()  { return N(coerceToString()); }
19         public Boolean coerceToBoolean() { return B(coerceToString().equals("true")); }
20         public String coerceToString()  { return (String)p.get(prefix.substring(0, prefix.length() - 1)); }
21         public Enumeration keys() throws JSExn { throw new JSExn("PropertyFile.keys() not supported"); }
22         public Object get(Object key) throws JSExn {
23             Object ret = p.get(prefix + escape(toString(key)));
24             if (ret != null) return ret;
25             return new Minion(prefix + escape(toString(key)) + ".");
26         }
27         public void put(Object key, Object val) throws JSExn {
28             try {
29                 p.put(prefix + "." + escape(toString(key)), toString(val));
30                 File fnew = new File(f.getName() + ".new");
31                 FileOutputStream fo = new FileOutputStream(fnew);
32                 p.save(fo, "");
33                 fo.close();
34                 fnew.renameTo(f);
35                 f = fnew;
36             } catch (IOException e) { throw new JSExn(e); }
37         }
38     }
39
40     public static String escape(String s) {
41         return s.replaceAll("\\\\", "\\\\\\\\").replaceAll(".", "\\\\.").replaceAll("=","\\\\="); }
42     public PropertyFile(File f) throws IOException { this.f = f; this.p.load(new FileInputStream(f)); }
43     public void put(Object key, Object val) throws JSExn { new Minion("").put(key, val); }
44     public Enumeration keys() throws JSExn { return new Minion("").keys(); }
45     public Object get(Object key) throws JSExn {
46         Object ret = p.get(toString(key));
47         if (ret != null) return ret;
48         return new Minion(escape(toString(key)));
49     }
50 }