package pt.utl.ist.scripts.runOnce.resourceProperties; import java.io.BufferedWriter; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeSet; public class ResourcePropertiesUtil { protected final static String PT_PROPERTIES_SUFFIX = "_pt.properties"; protected final static String EN_PROPERTIES_SUFFIX = "_en.properties"; protected final static String XLS_SUFFIX = ".xls"; protected final static FilenameFilter PT_FILTER = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(PT_PROPERTIES_SUFFIX); } }; protected final static FilenameFilter EN_FILTER = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(EN_PROPERTIES_SUFFIX); } }; protected final static FilenameFilter XLS_FILTER = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(XLS_SUFFIX); } }; protected final static String KEY_HEADER = "KEY"; protected final static String PT_HEADER = "PT"; protected final static String EN_HEADER = "EN"; private final static Map charsToReplace = new HashMap(); static { charsToReplace.put("«", "«"); charsToReplace.put("»", "»"); charsToReplace.put("<", "<"); charsToReplace.put(">", ">"); charsToReplace.put("º", "º"); charsToReplace.put("ª", "ª"); charsToReplace.put("á", "á"); charsToReplace.put("Á", "Á"); charsToReplace.put("à", "à"); charsToReplace.put("À", "À"); charsToReplace.put("ã", "ã"); charsToReplace.put("Ã", "Ã"); charsToReplace.put("â", "â"); charsToReplace.put("Â", "Â"); charsToReplace.put("ç", "ç"); charsToReplace.put("Ç", "Ç"); charsToReplace.put("é", "é"); charsToReplace.put("É", "É"); charsToReplace.put("ê", "ê"); charsToReplace.put("Ê", "Ê"); charsToReplace.put("ó", "ó"); charsToReplace.put("Ó", "Ó"); charsToReplace.put("õ", "õ"); charsToReplace.put("Õ", "Õ"); charsToReplace.put("í", "í"); charsToReplace.put("Í", "Í"); charsToReplace.put("ú", "ú"); charsToReplace.put("Ú", "Ú"); } protected static Map getCharsToReplace() { return charsToReplace; } protected static class SortedPropertiesWithoutComments extends Properties { private static final long serialVersionUID = 1L; @Override public Set keySet() { return Collections.unmodifiableSet(new TreeSet(super.keySet())); } @Override public synchronized Enumeration keys() { return Collections.enumeration(new TreeSet(super.keySet())); } // Most of this code was copied and adapted from java.util.Properties public void store(OutputStream out) throws IOException { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, "8859_1")); //Removed comments and date from the beginning of the properties file /*if (comments != null) { writeComments(bw, comments); } bw.write("#" + new Date().toString()); bw.newLine();*/ synchronized (this) { for (Enumeration e = keys(); e.hasMoreElements();) { String key = (String) e.nextElement(); String val = (String) get(key); //Do not escape unicode chars key = saveConvert(key, true, false); val = saveConvert(val, false, false); //Added spaces surrounding the equals sign bw.write(key + " = " + val); bw.newLine(); } } bw.flush(); } private String saveConvert(String theString, boolean escapeSpace, boolean escapeUnicode) { int len = theString.length(); int bufLen = len * 2; if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } StringBuffer outBuffer = new StringBuffer(bufLen); for (int x = 0; x < len; x++) { char aChar = theString.charAt(x); if ((aChar > 61) && (aChar < 127)) { if (aChar == '\\') { outBuffer.append('\\'); outBuffer.append('\\'); continue; } outBuffer.append(aChar); continue; } switch (aChar) { case ' ': if (x == 0 || escapeSpace) { outBuffer.append('\\'); } outBuffer.append(' '); break; //Do not escape these chars /*case '\t': outBuffer.append('\\'); outBuffer.append('t'); break;*/ case '\n': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; /*case '=': case ':': case '#': case '!': outBuffer.append('\\'); outBuffer.append(aChar); break;*/ default: if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 0xF)); outBuffer.append(toHex((aChar >> 8) & 0xF)); outBuffer.append(toHex((aChar >> 4) & 0xF)); outBuffer.append(toHex(aChar & 0xF)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; } private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; } }