/*
* Copyright 2010-2013 Ning, Inc.
*
* Ning licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.killbill.billing.util.config;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Properties;
import org.killbill.billing.util.config.catalog.UriAccessor;
import org.skife.config.ConfigSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
public class KillbillConfigSource implements ConfigSource {
private static final Logger logger = LoggerFactory.getLogger(KillbillConfigSource.class);
private static final String PROPERTIES_FILE = "org.killbill.server.properties";
private final Properties properties;
public KillbillConfigSource() {
this.properties = loadPropertiesFromFileOrSystemProperties();
populateDefaultProperties();
}
@VisibleForTesting
public KillbillConfigSource(final String file) throws URISyntaxException, IOException {
this.properties = new Properties();
this.properties.load(UriAccessor.accessUri(this.getClass().getResource(file).toURI()));
populateDefaultProperties();
}
@Override
public String getString(final String propertyName) {
return properties.getProperty(propertyName);
}
private Properties loadPropertiesFromFileOrSystemProperties() {
// Chicken-egg problem. It would be nice to have the property in e.g. KillbillServerConfig,
// but we need to build the ConfigSource first...
final String propertiesFileLocation = System.getProperty(PROPERTIES_FILE);
if (propertiesFileLocation != null) {
try {
// Ignore System Properties if we're loading from a file
final Properties properties = new Properties();
properties.load(UriAccessor.accessUri(propertiesFileLocation));
return properties;
} catch (final IOException e) {
logger.warn("Unable to access properties file, defaulting to system properties", e);
} catch (final URISyntaxException e) {
logger.warn("Unable to access properties file, defaulting to system properties", e);
}
}
return System.getProperties();
}
@VisibleForTesting
protected void populateDefaultProperties() {
final Properties defaultProperties = getDefaultProperties();
for (final String propertyName : defaultProperties.stringPropertyNames()) {
// Let the user override these properties
if (properties.get(propertyName) == null) {
properties.put(propertyName, defaultProperties.get(propertyName));
}
}
final Properties defaultSystemProperties = getDefaultSystemProperties();
for (final String propertyName : defaultSystemProperties.stringPropertyNames()) {
// Let the user override these properties
if (System.getProperty(propertyName) == null) {
System.setProperty(propertyName, defaultSystemProperties.get(propertyName).toString());
}
}
}
@VisibleForTesting
public void setProperty(final String propertyName, final Object propertyValue) {
properties.put(propertyName, propertyValue);
}
@VisibleForTesting
protected Properties getDefaultProperties() {
final Properties properties = new Properties();
properties.put("org.killbill.persistent.bus.external.tableName", "bus_ext_events");
properties.put("org.killbill.persistent.bus.external.historyTableName", "bus_ext_events_history");
return properties;
}
@VisibleForTesting
protected Properties getDefaultSystemProperties() {
final Properties properties = new Properties();
properties.put("user.timezone", "UTC");
properties.put("ANTLR_USE_DIRECT_CLASS_LOADING", "true");
return properties;
}
}