/* ===========================================================
* TradeManager : An application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.core.properties;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Represents the applications configuration. This class is intended to be a bit
* of a hack. I.e it wraps the apps property file, and provides a place to map
* the keys in the file to constants.
*
* @author Simon Allen
*/
public class ConfigProperties {
private final static Logger _log = LoggerFactory.getLogger(ConfigProperties.class);
public final static String MANDATORY_PROPERTY = "mandatory_property";
private static String _filename = null;
// This is loaded as a system resource from the current core package
private final static String ENVIRONMENT_VARIABLE_SYSTEM_PROPERTY_FILE = "config.properties";;
private final static String DEFAULT_PROPERTY_FILE = "config.properties";
private final static String ENVIRONMENT_VARIABLE_PROPERTY_FILE = "log4j.configuration";
private Properties m_properties = null;
private static ConfigProperties m_theConfig = new ConfigProperties();
/**
* Returns a string for a key.
*
* @param key
* String
* @return String
* @throws IOException
*/
public static String getPropAsString(String key) throws IOException {
return m_theConfig.retrieveProperty(key);
}
/**
* Method getDeploymentPropertyFileName.
*
* @return String
*/
public static String getDeploymentPropertyFileName() {
try {
if (null == _filename) {
_filename = System.getProperty(ENVIRONMENT_VARIABLE_PROPERTY_FILE, DEFAULT_PROPERTY_FILE);
_filename = _filename.replaceFirst("file:", "");
File file = new File(_filename);
_filename = file.toString();
}
} catch (Throwable e) {
// do nothing as we are an applet !!!
}
return _filename;
}
/**
* Method getDeploymentProperties.
*
* @param context
* Object
* @param fileName
* String
* @return Properties
* @throws IOException
*/
public static Properties getDeploymentProperties(Object context, String fileName) throws IOException {
return m_theConfig.getProperties(context, fileName);
}
/**
* Method loadDeploymentProperties.
*
* @param context
* Object
* @param fileName
* String
* @throws IOException
*/
public static void loadDeploymentProperties(Object context, String fileName) throws IOException {
m_theConfig.getProperties(context, fileName);
}
/**
* Method getSystemPropertyFileName.
*
* @return String
*/
public static String getSystemPropertyFileName() {
return ENVIRONMENT_VARIABLE_SYSTEM_PROPERTY_FILE;
}
/**
* Returns an int for a key. If the number is malformed, then it return 0.
*
* @param key
* String
* @return int
* @throws IOException
*/
public static int getPropAsInt(String key) throws IOException {
return Integer.parseInt(m_theConfig.retrieveProperty(key));
}
/**
* Returns an boolean for a key. If the number is malformed, then it return
* false.
*
* @param key
* String
* @return boolean
* @throws IOException
*/
public static boolean getPropAsBoolean(String key) throws IOException {
return Boolean.valueOf(m_theConfig.retrieveProperty(key));
}
/**
* Method getPropAsEnumeration.
*
* @param keyRoot
* String
* @return Enumeration<String>
* @throws IOException
*/
public static Enumeration<String> getPropAsEnumeration(String keyRoot) throws IOException {
Vector<String> resVec = null;
int iNumEntries = getPropAsInt(keyRoot + "_NumOfItems");
StringBuffer key = new StringBuffer(keyRoot);
int keyLen = keyRoot.length();
resVec = new Vector<String>(iNumEntries);
for (int iCount = 1; iCount < (iNumEntries + 1); iCount++) {
String val = getPropAsString(key.append("_" + iCount).toString());
key.setLength(keyLen); // reset key
if (null != val) {
resVec.addElement(val);
}
}
return resVec.elements();
}
/**
* Method getPropertiesAsArrayOfProperties.
*
* @param keyRoot
* String
* @param keyNames
* Dictionary<?,?>
* @return Properties[]
* @throws IOException
*/
public static Properties[] getPropertiesAsArrayOfProperties(String keyRoot, Dictionary<?, ?> keyNames)
throws IOException {
int iNumItems = getPropAsInt(keyRoot + "_NumOfItems");
Properties[] propArray = new Properties[iNumItems];
for (int iCount = 1; iCount <= iNumItems; iCount++) {
propArray[iCount - 1] = getSetOfProperties(keyRoot + "_" + iCount, keyNames);
}
return propArray;
}
/**
* Method getProperties. read configuration properties
*
* @param context
* Object
* @param fileName
* String
* @return Properties
* @throws IOException
*/
private Properties getProperties(Object context, String fileName) throws IOException {
Properties systemProperties = new Properties();
loadPropertiesAsResource(m_theConfig, getSystemPropertyFileName(), systemProperties);
loadPropertiesAsResource(context, fileName, systemProperties);
Properties deploymentProperties = new Properties(systemProperties);
loadPropertiesAsFile(getDeploymentPropertyFileName(), deploymentProperties);
m_properties = deploymentProperties;
return deploymentProperties;
}
/**
* Method getSetOfProperties.
*
* @param keyRoot
* String
* @param keyNames
* Dictionary<?,?>
* @return Properties
* @throws IOException
*/
private static Properties getSetOfProperties(String keyRoot, Dictionary<?, ?> keyNames) throws IOException {
Enumeration<?> enumKey = keyNames.keys();
Properties result = new Properties();
while (enumKey.hasMoreElements()) {
String key;
String value;
key = (String) enumKey.nextElement();
boolean mandatory = MANDATORY_PROPERTY.equals(keyNames.get(key));
if (mandatory) {
value = getPropAsString(keyRoot + "_" + key);
} else {
try {
value = getPropAsString(keyRoot + "_" + key);
} catch (Exception e) {
value = null;
}
}
if (value != null) {
result.put(key, value);
}
}
return (result);
}
/**
* Method getCommaSeparatedStrings.
*
* @param key
* String
* @return Enumeration<?>
* @throws IOException
*/
public static Enumeration<?> getCommaSeparatedStrings(String key) throws IOException {
String list = getPropAsString(key);
StringTokenizer t = new StringTokenizer(list, ",");
return t;
}
/**
* Method retrieveProperty. read configuration properties
*
* @param key
* String
* @return String
* @throws IOException
*/
private String retrieveProperty(String key) throws IOException {
String ret = null;
if (null == m_properties) {
Properties systemProperties = new Properties();
loadPropertiesAsResource(m_theConfig, getSystemPropertyFileName(), systemProperties);
Properties deploymentProperties = new Properties(systemProperties);
loadPropertiesAsFile(getDeploymentPropertyFileName(), deploymentProperties);
m_properties = deploymentProperties;
}
ret = m_properties.getProperty(key);
if (null == ret) {
throw new PropertyNotFoundException("The property \"" + key + "\" was not found in the property file \""
+ getDeploymentPropertyFileName() + "\". \n Check the file is in the applications root dir.");
}
return ret;
}
/**
* Method getPropertyAfterEnvSubstitution.
*
* @param key
* String
* @return String
* @throws IOException
*/
public static String getPropertyAfterEnvSubstitution(String key) throws IOException {
String strRet = null;
strRet = m_theConfig.retrieveProperty(key);
// put env variables in the dictionary
Dictionary<?, ?> toSubstitute = System.getProperties();
TemplateParser tp = new TemplateParser(strRet, toSubstitute);
String parsedVal = tp.parseTemplate();
return parsedVal;
}
/**
* Method readFileAsString.
*
* @param filePath
* String
* @param loader
* ClassLoader
* @return String
* @throws java.io.IOException
*/
public static String readFileAsString(String filePath, ClassLoader loader) throws java.io.IOException {
StringBuffer fileData = new StringBuffer(1000);
InputStream inputStream = loader.getResourceAsStream(filePath);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(inputStreamReader);
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
/**
* Method loadPropertiesAsResource.
*
* @param context
* Object
* @param filename
* String
* @param properties
* Properties
* @throws IOException
*/
private void loadPropertiesAsResource(Object context, String filename, Properties properties) throws IOException {
InputStream unbuffered;
if (null == filename) {
throw new PropertyFileNotFoundException("No property file name found"
+ " please check your command line parameters e.g. " + "-Dconfig.properties=/filename.properties ");
} else {
unbuffered = context.getClass().getResourceAsStream(filename);
}
if (unbuffered == null) {
throw new PropertyFileNotFoundException("Check " + "to see if the property file \"" + filename
+ "\" is installed and available in the class path.");
} else {
InputStream in = new BufferedInputStream(unbuffered);
properties.load(in);
in.close();
unbuffered.close();
}
}
/**
* Method loadPropertiesAsFile.
*
* @param filename
* String
* @param properties
* Properties
* @throws IOException
*/
private void loadPropertiesAsFile(String filename, Properties properties) throws IOException {
if (null != filename) {
File propertyFile = new File(filename);
String propertyFilePath = propertyFile.getAbsolutePath();
if (propertyFile.exists()) {
FileInputStream is = new FileInputStream(propertyFile);
properties.load(is);
is.close();
} else {
_log.debug("The property file " + propertyFilePath + " does not exist -- using defaults");
}
} else {
_log.debug("The property file does not exist -- using defaults");
}
}
/**
* Method reNumberDecodesInPropertiesFile.
*
* @param propertyFileLocation
* String
*/
public static void reNumberDecodesInPropertiesFile(String propertyFileLocation) {
FileInputStream fileInputStream = null;
Scanner scanString = null;
try {
/*
* Location of the properties file. Copy the source one to this Dir.
*/
File file = new File(propertyFileLocation);
/*
* The name of the Decodes to be renumbered. Copy the output BELOW
* into the properties file and remember to set the _NumOfItems to
* the last value. EACH new item should be number one greater that
* the current total.
*/
final String codeName = "CODE_DECODE";
/*
* lookupServiceProvideName current either PropertyFile or DBTable
*/
final String lookupServiceProvideName = "PropertyFile";
fileInputStream = new FileInputStream(file.getAbsoluteFile());
scanString = new Scanner(fileInputStream);
Pattern pattern = Pattern.compile("_\\d*=");
scanString.useDelimiter(pattern);
int count = 0;
String newText = new String();
String token = null;
String delimiter = null;
String oldDelimiter = null;
while (scanString.hasNext()) {
token = scanString.next();
delimiter = scanString.findInLine(pattern);
if (null != token && token.contains(codeName)) {
if (null != delimiter) {
if (null != token && !token.endsWith(lookupServiceProvideName)) {
if (!delimiter.equals(oldDelimiter)) {
count++;
}
newText = newText + token + "_" + count + "=";
} else {
newText = newText + token + delimiter;
}
oldDelimiter = delimiter;
}
}
}
newText = newText + token;
_log.error("" + newText);
} catch (Exception ex) {
_log.error("Error paring file: " + ex.getMessage(), ex);
} finally {
try {
if (null != scanString)
scanString.close();
if (null != fileInputStream)
fileInputStream.close();
} catch (IOException e) {
_log.error("Error closing input stream: " + e.getMessage(), e);
}
}
}
/**
* Method main.
*
* @param args
* String[]
*/
public static void main(String[] args) {
String propertyFileLocation = "C:\\Temp\\trade.properties";
ConfigProperties.reNumberDecodesInPropertiesFile(propertyFileLocation);
}
}