package org.ovirt.engine.core.notifier.utils; import java.io.File; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.notifier.NotificationServiceException; /** * The <code>NotificationConfigurator</class> reads and stores properties from a configuration file.<br> * It provides simple properties querying for timer interval properties types, e.g. {@link #getTimerInterval(String)} */ public class NotificationConfigurator { private static final String DEFAULT_CONF_FILE_LOCATION = "/etc/engine/notifier/notifier.conf"; private static final LogCompat log = LogFactoryCompat.getLog(NotificationConfigurator.class); private Map<String, String> prop = null; /** * Creates a {@code NotificationConfigurator} by evaluating properties values from a given file. * @param confFile * a path to the configuration file * @throws NotificationServiceException */ public NotificationConfigurator(String confFile) throws NotificationServiceException { setConfigurationFile(confFile); } /** * Set local configuration file for the notification service override the default configuration file * @param localConfFile * the path of the alternate configuration file * @throws NotificationServiceException */ private void setConfigurationFile(String localConfFile) throws NotificationServiceException { String confFileLocation; if (StringUtils.isNotEmpty(localConfFile)) { confFileLocation = localConfFile; log.info("Starting event notification service with configuration file: " + confFileLocation); } else { confFileLocation = DEFAULT_CONF_FILE_LOCATION; log.info("Starting event notification service with default configuration file: " + confFileLocation); } File file = new File(confFileLocation); if (!file.canRead()) { throw new NotificationServiceException("Configuration file does not exist or missing permissions: " + file.getAbsoluteFile()); } prop = NotificationProperties.readPropertiesFile(confFileLocation); } /** * Returns properties which read from file. * * @return */ public Map<String, String> getProperties() { return prop; } /** * Gets a value for timer interval by a given property name * @param intervalPropertyName * an interval property key * @param defaultInterval * a default interval value * @return an interval * @throws NotificationServiceException */ public long getTimerInterval(String intervalPropertyName, long defaultInterval) throws NotificationServiceException { long interval; if (!prop.containsKey(intervalPropertyName)) { interval = defaultInterval; log.info(String.format("%s property is missing, using default %d.", intervalPropertyName, defaultInterval)); } else { try { interval = extractNumericProperty(prop.get(intervalPropertyName)); } catch (NumberFormatException e) { throw new NotificationServiceException("Invalid format for property: " + intervalPropertyName, e); } } return interval; } /** * Extract a positive numeric property out of a property value * @param intervalProp property value * @return a numeric value represents the property * @throws NotificationServiceException */ static public int extractNumericProperty(String intervalProp) throws NumberFormatException { int interval = Integer.valueOf(intervalProp); if (interval <= 0) { throw new NumberFormatException(String.format("[%s] value should be a positive number", intervalProp)); } return interval; } }