/*
* Created on 13/ott/2011
* Copyright 2011 by Andrea Vacondio (andrea.vacondio@gmail.com).
*
* This file is part of the Sejda source code
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sejda.core.context;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.sejda.core.Sejda;
import org.sejda.model.exception.ConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides a stream where the xml configuration can be read.
* <p>
* <ul>
* <li>An xml configuration file path can be provided using the system property <b>sejda.config.file</b>. If provided it searches for the in the classpath and in the filesystem.
* </li>
* <li>If the system property <b>sejda.config.file</b> is NOT provided it searches for the standard configuration file named<b> sejda.xml </b></li>
* </ul>
* </p>
*
* @author Andrea Vacondio
*
*/
class XmlConfigurationStreamProvider implements ConfigurationStreamProvider {
private static final Logger LOG = LoggerFactory.getLogger(XmlConfigurationStreamProvider.class);
private static final String USER_CONFIG_FILE_NAME = "sejda.xml";
private static final String DEFAULT_CONFIG_FILE_NAME = "sejda.default.xml";
@Override
public InputStream getConfigurationStream() throws ConfigurationException {
InputStream configurationStream = getConfiguration();
if (configurationStream == null) {
throw new ConfigurationException("Unable to find xml configuration file.");
}
return configurationStream;
}
private InputStream getConfiguration() throws ConfigurationException {
String userConfigFileName = System.getProperty(Sejda.USER_CONFIG_FILE_PROPERTY_NAME);
if (isNotBlank(userConfigFileName)) {
return getCustomConfigurationStream(userConfigFileName);
}
return getDefaultConfigurationStream();
}
private InputStream getCustomConfigurationStream(String userConfigFileName) throws ConfigurationException {
LOG.trace("Loading Sejda configuration form {}", userConfigFileName);
InputStream retVal = ClassLoader.getSystemResourceAsStream(userConfigFileName);
if (retVal == null) {
try {
LOG.trace("Searching Sejda configuration on filesystem");
return new FileInputStream(userConfigFileName);
} catch (FileNotFoundException e) {
throw new ConfigurationException(
String.format("Unable to access the provided configuration file [%s]", userConfigFileName), e);
}
}
return retVal;
}
private InputStream getDefaultConfigurationStream() {
LOG.trace("Loading Sejda configuration form {}", USER_CONFIG_FILE_NAME);
InputStream result = Thread.currentThread().getContextClassLoader().getResourceAsStream(USER_CONFIG_FILE_NAME);
if (result == null) {
LOG.trace("Couldn't find {}, loading Sejda configuration form default {}", USER_CONFIG_FILE_NAME,
DEFAULT_CONFIG_FILE_NAME);
result = Thread.currentThread().getContextClassLoader().getResourceAsStream(DEFAULT_CONFIG_FILE_NAME);
}
return result;
}
}