package com.niklim.clicktrace.model.dao; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import com.niklim.clicktrace.Files; public class PropertiesStore { Map<String, String> map = new HashMap<String, String>(); File file; public PropertiesStore(File file) throws IOException { this.file = file; load(); } public PropertiesStore() { } public void setFile(File f) { file = f; } public void setProperty(String propName, String value) { map.put(propName, value); } public String getProperty(String propName) { return map.get(propName); } public void save() throws IOException { StringBuilder b = new StringBuilder(); for (Entry<String, String> entry : map.entrySet()) { b.append(entry.getKey()).append(" = ").append(escape(entry.getValue())).append("\n"); } Files.save(file, b.toString()); } private String escape(String value) { StringBuffer b = new StringBuffer(); for (Character c : value.toCharArray()) { if (c == '\\') { b.append("\\\\"); } else if (c == '\n') { b.append("\\n"); } else if (c == '\r') { b.append("\\r"); } else if (c == '\t') { b.append("\\t"); } else b.append(c); } return b.toString(); } public void load() throws IOException { if (file == null) { throw new RuntimeException("File was not set."); } String content = Files.load(file); map = new HashMap<String, String>(); for (String line : content.split("\n")) { if (line.trim().isEmpty()) { continue; } int splitIndex = line.indexOf("="); String propName = line.substring(0, splitIndex).trim(); String value = unescape(line.substring(splitIndex + 1).trim()); map.put(propName, value); } } private String unescape(String value) { if (value.length() < 2) { return value; } char[] chars = value.toCharArray(); StringBuffer b = new StringBuffer(); int i; for (i = 0; i < chars.length - 1; i++) { if (chars[i] == '\\' && chars[i + 1] == '\\') { b.append('\\'); i++; } else if (chars[i] == '\\' && chars[i + 1] == 'n') { b.append('\n'); i++; } else if (chars[i] == '\\' && chars[i + 1] == 'r') { b.append('\r'); i++; } else if (chars[i] == '\\' && chars[i + 1] == 't') { b.append('\t'); i++; } else { b.append(chars[i]); } } if (i < chars.length) { b.append(chars[i]); } return b.toString(); } public void clearProperty(String propName) { map.remove(propName); } }