/* * Created on 01/mag/2010 * * Copyright 2010 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 java.util.Map; import java.util.Map.Entry; import org.sejda.core.Sejda; import org.sejda.core.notification.strategy.NotificationStrategy; import org.sejda.model.exception.ConfigurationException; import org.sejda.model.exception.SejdaRuntimeException; import org.sejda.model.parameter.base.TaskParameters; import org.sejda.model.task.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Global configuration singleton. * <p> * A user can submit a configuration including a file named "sejda.xml" in the classpath or using the system property sejda.config.file where the value of the property is the name * of the configuration file available in the classpath. If Both are specified then system property has precedence. * </p> * * @author Andrea Vacondio * */ final class GlobalConfiguration { private static final Logger LOG = LoggerFactory.getLogger(GlobalConfiguration.class); private Class<? extends NotificationStrategy> notificationStrategy; private TasksRegistry tasksRegistry; private boolean validation; private boolean ignoreXmlConfiguration; private GlobalConfiguration() { LOG.info("Configuring Sejda {}", Sejda.VERSION); initialize(); if (LOG.isDebugEnabled()) { logConfiguredTasks(); } } private void logConfiguredTasks() { LOG.trace("Configured tasks:"); for (@SuppressWarnings("rawtypes") Entry<Class<? extends TaskParameters>, Class<? extends Task>> entry : tasksRegistry.getTasks().entrySet()) { LOG.trace(String.format("%s executed by -> %s", entry.getKey(), entry.getValue())); } } @SuppressWarnings("rawtypes") private void initialize() { tasksRegistry = new DefaultTasksRegistry(); ConfigurationStrategy configStrategy; try { configStrategy = XmlConfigurationStrategy.newInstance(new XmlConfigurationStreamProvider()); } catch (ConfigurationException e) { throw new SejdaRuntimeException("Unable to complete Sejda configuration ", e); } notificationStrategy = configStrategy.getNotificationStrategy(); LOG.trace("Notification strategy: {}", notificationStrategy); validation = configStrategy.isValidation(); LOG.trace("Validation: {}", validation); ignoreXmlConfiguration = configStrategy.isIgnoreXmlConfiguration(); LOG.trace("Validation, ignore xml configuration: {}", ignoreXmlConfiguration); Map<Class<? extends TaskParameters>, Class<? extends Task>> userTasks = configStrategy.getTasksMap(); for (Entry<Class<? extends TaskParameters>, Class<? extends Task>> entry : userTasks.entrySet()) { tasksRegistry.addTask(entry.getKey(), entry.getValue()); } } /** * @return the global configuration instance * @throws SejdaRuntimeException * if an error occur during the configuration loading */ static GlobalConfiguration getInstance() { return GlobalConfigurationHolder.CONFIGURATION; } /** * @return the configured {@link NotificationStrategy} */ Class<? extends NotificationStrategy> getNotificationStrategy() { return notificationStrategy; } TasksRegistry getTasksRegistry() { return tasksRegistry; } /** * @return true if validation should be performed or false if incoming parameters instances are already validate externally. */ boolean isValidation() { return validation; } /** * @return true if the validator should ignore <i>META-INF/validation.xml</i>. */ boolean isIgnoreXmlConfiguration() { return ignoreXmlConfiguration; } /** * Lazy initialization holder class idiom (Joshua Bloch, Effective Java second edition, item 71). * * @author Andrea Vacondio * */ private static final class GlobalConfigurationHolder { private GlobalConfigurationHolder() { // hide constructor } static final GlobalConfiguration CONFIGURATION = new GlobalConfiguration(); } }