package net.sf.microlog.util.properties;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
/**
* A class to handle the properties in a property file (a textfile).
*
* @author Johan Karlsson (johan.karlsson@jayway.se)
* @author Darius Katz
*/
public class PropertyFile implements PropertySource {
private final String fileName;
private static final int DEFAULT_BUFFER_SIZE = 256;
private final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
private final StringBuffer stringBuffer = new StringBuffer(
2 * DEFAULT_BUFFER_SIZE);
/**
* Creates a new instance of PropertyFile
* */
public PropertyFile(String fileName) {
this.fileName = fileName;
}
/**
* Insert the values taken from a property source into the Hashtable. Any
* previous values with the same key should be overridden/overwritten.
*
* @param properties
* the Hashtable in which the properties are stored
*/
public void insertProperties(Hashtable properties) {
// get an InputStream to the property file; is
InputStream is = this.getClass().getResourceAsStream(fileName);
if (is != null) {
System.out.println("Property file for Logger found");
// is used below
} else {
System.out.println("Property file not found");
return;
}
// get a string with the contents of the file; configString
String configString = null;
try {
int readBytes = is.read(buffer);
while (readBytes > 0) {
String string = new String(buffer, 0, readBytes, "UTF-8");
stringBuffer.append(string);
readBytes = is.read(buffer);
}
if (stringBuffer.length() > 0) {
configString = stringBuffer.toString();
// configString is used below
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
try {
is.close();
} catch (IOException e) {
}
}
// parse the string and put keys/values into the properties hashtable
int separatorIndex = configString.indexOf("=");
int currentIndex = 0;
int newLineIndex = 0;
while (separatorIndex > -1) {
String propertyKey = configString.substring(currentIndex,
separatorIndex++);
int newLineIndex1 = configString.indexOf("\r\n", separatorIndex);
int newLineIndex2 = configString.indexOf("\n", separatorIndex);
if (newLineIndex1 == -1) {
newLineIndex1 = newLineIndex2;
}
if (newLineIndex2 == -1) {
newLineIndex2 = newLineIndex1;
}
newLineIndex = newLineIndex1 < newLineIndex2 ? newLineIndex1
: newLineIndex2;
if (newLineIndex != -1) {
String propertyValue = configString.substring(separatorIndex,
newLineIndex);
separatorIndex = newLineIndex + 2;
currentIndex = separatorIndex;
// Put the propertyKey and the propertyValue
// into the properies hashtable
properties.put(propertyKey, propertyValue);
}
separatorIndex = configString.indexOf("=", separatorIndex);
}
}
}