/* ====================================================================
*
* Copyright (C) 2007 - 2015 GeoSolutions S.A.S.
* http://www.geo-solutions.it
*
* GPLv3 + Classpath exception
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.
*
* ====================================================================
*
* This software consists of voluntary contributions made by developers
* of GeoSolutions. For more information on GeoSolutions, please see
* <http://www.geo-solutions.it/>.
*
*/
package it.geosolutions.geostore.services.rest.auditing;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
final class AuditingConfiguration {
private static final Logger LOGGER = Logger.getLogger(AuditingConfiguration.class);
static final String CONFIGURATION_PATH = "GEOSTORE_AUDITING_CONF";
static final String AUDIT_ENABLE = "auditing.enable";
static final String TEMPLATES_DIRECTORY = "auditing.templates.directory";
static final String OUTPUT_DIRECTORY = "auditing.output.directory";
static final String TEMPLATES_VERSION = "auditing.templates.version";
static final String MAX_RESQUEST_PER_FILE = "auditing.max.requests.per.file";
static final String OUTPUT_FILES_EXTENSION = "auditing.output.files.extension";
private final File configurationFile;
private final long configurationFileChecksum;
private final boolean auditEnable;
private final String templatesDirectory;
private final String outputDirectory;
private final int templatesVersion;
private final int maxRequestPerFile;
private final String outputFilesExtension;
AuditingConfiguration() {
this(null, 0l);
}
AuditingConfiguration(File configurationFile, long configurationFileChecksum) {
if (configurationFile == null) {
this.configurationFile = findConfigurationFile();
this.configurationFileChecksum = checksum(this.configurationFile);
} else {
this.configurationFile = configurationFile;
this.configurationFileChecksum = configurationFileChecksum;
}
Properties properties = readProperties();
auditEnable = Boolean.parseBoolean(getProperty(properties, AUDIT_ENABLE));
templatesDirectory = getProperty(properties, TEMPLATES_DIRECTORY);
outputDirectory = getProperty(properties, OUTPUT_DIRECTORY);
templatesVersion = Integer.parseInt(getProperty(properties, TEMPLATES_VERSION));
maxRequestPerFile = Integer.parseInt(getProperty(properties, MAX_RESQUEST_PER_FILE));
outputFilesExtension = getProperty(properties, OUTPUT_FILES_EXTENSION);
}
static boolean configurationExists() {
return findConfigurationFile() != null;
}
boolean isAuditEnable() {
return auditEnable;
}
String getTemplatesDirectory() {
return templatesDirectory;
}
String getOutputDirectory() {
return outputDirectory;
}
int getTemplatesVersion() {
return templatesVersion;
}
int getMaxRequestPerFile() {
return maxRequestPerFile;
}
String getOutputFilesExtension() {
return outputFilesExtension;
}
AuditingConfiguration checkForNewConfiguration() {
File candidateConfigurationFile = findConfigurationFile();
long candidateConfigurationFileChecksum = checksum(candidateConfigurationFile);
if (configurationFile.compareTo(candidateConfigurationFile) != 0
|| configurationFileChecksum != candidateConfigurationFileChecksum) {
return new AuditingConfiguration(candidateConfigurationFile, candidateConfigurationFileChecksum);
}
return null;
}
private long checksum(File file) {
try {
return FileUtils.checksumCRC32(file);
} catch (Exception exception) {
throw new AuditingException(exception, "Error computing checksum of file '%s'.", file.getPath());
}
}
private static File findConfigurationFile() {
String configurationFilePath = System.getProperty(CONFIGURATION_PATH);
if (configurationFilePath == null) {
configurationFilePath = System.getenv(CONFIGURATION_PATH);
}
if (configurationFilePath == null) {
LOGGER.warn("Could not found configuration path property.");
return null;
}
File configurationFile = new File(configurationFilePath);
if (!configurationFile.exists()) {
throw new AuditingException("Configuration file '%s' does not exists.", configurationFile.getPath());
}
return configurationFile;
}
private Properties readProperties() {
try {
FileInputStream input = new FileInputStream(configurationFile);
Properties properties = new Properties();
properties.load(input);
input.close();
return properties;
} catch (Exception exception) {
throw new AuditingException(exception, "Error reading properties from configuration file '%s'.",
configurationFile.getPath());
}
}
private static String getProperty(Properties properties, String propertyName) {
String propertyValue = properties.getProperty(propertyName);
if (propertyValue == null) {
throw new AuditingException("Missing configuration property '%s'.", propertyName);
}
return propertyValue;
}
}