package hu.sch.util.config;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Basic implementation of Configuration internface.
*
* This is the one which is used throughout the application.
*
* @author aldaris
* @author tomi
*/
@ApplicationScoped
class ConfigurationImpl implements Configuration {
private static final String DEFAULT_AVATAR_SIZE = "400";
private static final String DEFAULT_THUMBNAIL_SIZE = "150";
private static final Logger logger = LoggerFactory.getLogger(ConfigurationImpl.class);
private static final String PROPERTY_NAME = "application.resource.dir";
private static final String ENVIRONMENT = "environment";
private static final String APPLICATION_FOLDER = "korok";
private static final String CONFIG_FILE = "config.properties";
private static final String AVATAR_UPLOAD_PATH = "image.upload.path";
private static final String AVATAR_MAX_SIZE = "image.upload.max";
private static final String THUMBNAIL_SIZE = "image.upload.thumbnail";
private static final String DOMAIN = "domain";
private static final String INTERNAL_API_SECRET = "api.secret";
private static final String SKIP_REQUEST_SIGNATURE = "skip.signature.check";
private final Properties properties = new Properties();
private String baseDir;
private Environment environment = null;
@PostConstruct
public void initialize() {
baseDir = getBaseDir();
loadPropertiesFromFile();
loadEnvironment();
verify();
}
@Override
public Environment getEnvironment() {
return environment;
}
@Override
public String getDevEmail() {
return properties.getProperty("devMail");
}
@Override
public String getDomain() {
return properties.getProperty(DOMAIN);
}
@Override
public ImageUploadConfig getImageUploadConfig() {
String path = properties.getProperty(AVATAR_UPLOAD_PATH);
int size = Integer.parseInt(properties.getProperty(AVATAR_MAX_SIZE, DEFAULT_AVATAR_SIZE));
int thumbnail = Integer.parseInt(properties.getProperty(THUMBNAIL_SIZE, DEFAULT_THUMBNAIL_SIZE));
return new ImageUploadConfig(path, size, thumbnail);
}
@Override
public String getInternalApiSecret() {
return properties.getProperty(INTERNAL_API_SECRET);
}
@Override
public boolean skipRequestSignature() {
// it is only applicable during DEVELOPMENT
if (getEnvironment() != Environment.DEVELOPMENT) {
return false;
}
// use system property first (this way we can set it during runtime via jboss-cli)
String skipRequestSig = System.getProperty(SKIP_REQUEST_SIGNATURE);
if (skipRequestSig != null) {
return Boolean.parseBoolean(skipRequestSig);
}
// fallback to property in the config files
skipRequestSig = properties.getProperty(SKIP_REQUEST_SIGNATURE, "false");
return Boolean.parseBoolean(skipRequestSig);
}
private void loadEnvironment() {
// try environment system property first, then the properties file
String env = System.getProperty(ENVIRONMENT);
if (StringUtils.isBlank(env)) {
env = properties.getProperty(ENVIRONMENT, "DEVELOPMENT");
}
try {
environment = Environment.valueOf(env);
} catch (IllegalArgumentException ex) {
System.err.println("Illegal environment value. Fallbacking to DEVELOPMENT.");
environment = Environment.DEVELOPMENT;
}
logger.warn("The application is running in {} mode!", environment.toString());
}
private String getBaseDir() throws IllegalArgumentException {
String dir = System.getProperty(PROPERTY_NAME);
if (dir == null) {
throw new IllegalArgumentException(
"System property '" + PROPERTY_NAME + "' isn't set! Can't initialize application!");
}
if (!dir.endsWith("/")) {
dir += "/";
}
return dir;
}
private void loadPropertiesFromFile() throws IllegalArgumentException {
try (FileInputStream fis =
new FileInputStream(new File(baseDir + APPLICATION_FOLDER + "/" + CONFIG_FILE))) {
properties.load(fis);
logger.debug(properties.toString());
} catch (Exception ex) {
throw new IllegalArgumentException("Error while loading properties file!", ex);
}
}
// verifies the configuration that it only contains legal values
private void verify() {
// TODO: github/#109
}
}