package com.constellio.data.utils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.io.IOUtils;
public class PropertyFileUtils {
public static Map<String, String> loadKeyValues(File propertyFiles) {
Properties properties = loadPropertyFiles(propertyFiles);
return loadPropertiesInAMap(properties);
}
public static void writeMap(File indexProperties, Map<String, String> map) {
Properties properties = new Properties();
properties.putAll(map);
try (FileWriter fw = new FileWriter(indexProperties)){
properties.store(fw, null);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static Map<String, String> loadPropertiesInAMap(Properties properties) {
Map<String, String> configs = new HashMap<>();
for (String name : properties.stringPropertyNames()) {
configs.put(name, properties.getProperty(name));
}
return configs;
}
private static Properties loadPropertyFiles(File propertyFiles) {
Properties properties = new Properties();
Reader reader = null;
try {
reader = new FileReader(propertyFiles);
properties.load(reader);
} catch (IOException e) {
throw new PropertyFileUtilsRuntimeException("Problem reading file '" + propertyFiles.getAbsolutePath() + "'", e);
} finally {
IOUtils.closeQuietly(reader);
}
return properties;
}
public static void store(Properties properties, OutputStream out)
throws IOException {
store0(properties, new BufferedWriter(new OutputStreamWriter(out, "8859_1")), true);
}
public static void store(Properties properties, File file)
throws IOException {
FileOutputStream out = new FileOutputStream(file);
store0(properties, new BufferedWriter(new OutputStreamWriter(out, "8859_1")), true);
}
private static void store0(Properties properties, BufferedWriter bw, boolean escUnicode)
throws IOException {
bw.newLine();
synchronized (PropertyFileUtils.class) {
for (Enumeration e = properties.keys(); e.hasMoreElements(); ) {
String key = (String) e.nextElement();
String val = (String) properties.get(key);
key = saveConvert(key, true, escUnicode);
/* No need to escape embedded and trailing spaces for value, hence
* pass false to flag.
*/
val = saveConvert(val, false, escUnicode);
bw.write(key + "=" + val);
bw.newLine();
}
}
bw.flush();
}
/*
* Converts unicodes to encoded \uxxxx and escapes
* special characters with a preceding slash
*/
private static 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);
// Handle common case first, selecting largest block that
// avoids the specials below
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;
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 '=': // Fall through
case ':': // Fall through
case '#': // Fall through
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();
}
/**
* Convert a nibble to a hex character
* @param nibble the nibble to convert.
*/
private static char toHex(int nibble) {
return hexDigit[(nibble & 0xF)];
}
/** A table of hex digits */
private static final char[] hexDigit = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
}