package com.github.sbugat.ec2tools.service.configuration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalINIConfiguration;
import org.apache.commons.configuration.SubnodeConfiguration;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;
import com.github.sbugat.ec2tools.model.instance.InstanceOrder;
import com.google.common.collect.ImmutableList;
/**
* Configuration loading class.
*
* @author Sylvain Bugat
*
*/
@Singleton
public class ConfigurationService {
/** SLF4J Xlogger. */
private static final XLogger LOG = XLoggerFactory.getXLogger(ConfigurationService.class);
/** Configuration file name. */
public static final String CONFIGURATION_FILE_NAME = "ec2tools.ini";
/** INI file loading configuration. */
@Inject
private HierarchicalINIConfiguration hierarchicalINIConfiguration;
/** Loaded configuration. */
private final Map<String, List<InstanceOrder>> configuredSections = new HashMap<String, List<InstanceOrder>>();
/**
* Load the configuration from the configuration file.
*
* @throws ConfigurationException configuration loading exception
*/
public void loadConfiguration() throws ConfigurationException {
LOG.entry();
configuredSections.clear();
hierarchicalINIConfiguration.clear();
hierarchicalINIConfiguration.load(CONFIGURATION_FILE_NAME);
// Sections loading
for (final String section : hierarchicalINIConfiguration.getSections()) {
LOG.info("Loading section: {}", section);
final List<InstanceOrder> sectionList = new ArrayList<InstanceOrder>();
final SubnodeConfiguration subnodeConfiguration = hierarchicalINIConfiguration.getSection(section);
final Iterator<String> iterator = subnodeConfiguration.getKeys();
while (iterator.hasNext()) {
final String instanceId = iterator.next();
LOG.trace("Loading configuration for instanceId: {} -> order: {}", instanceId, subnodeConfiguration.getString(instanceId));
sectionList.add(new InstanceOrder(instanceId, subnodeConfiguration.getString(instanceId)));
}
configuredSections.put(section, ImmutableList.copyOf(sectionList));
LOG.info("section {} loaded with {} orders", section, sectionList.size());
}
LOG.exit();
}
/**
* Get all loaded sections.
*
* @return all loaded sections.
*/
public Map<String, List<InstanceOrder>> getConfiguredSections() {
return configuredSections;
}
/**
* Get a loaded section if it exists.
*
* @param section section to return
* @return loaded sections or null
*/
public List<InstanceOrder> getConfiguredSections(final String section) {
return configuredSections.get(section);
}
@Override
public String toString() {
final StringBuilder stringBuilder = new StringBuilder();
for (final Entry<String, List<InstanceOrder>> section : configuredSections.entrySet()) {
stringBuilder.append("Section ");
stringBuilder.append(section.getKey());
stringBuilder.append(System.lineSeparator());
if (section.getValue().isEmpty()) {
stringBuilder.append(" EMPTY");
}
else {
for (final InstanceOrder instanceOrder : section.getValue()) {
stringBuilder.append(' ');
stringBuilder.append(instanceOrder);
}
}
stringBuilder.append(System.lineSeparator());
}
return stringBuilder.toString();
}
/**
* Get a string representation of one section.
*
* @param sectionsToExecute section to
* @return the string of the section or empty if the section don't exists
*/
public String toString(final List<String> sectionsToExecute) {
final StringBuilder stringBuilder = new StringBuilder();
for (final Entry<String, List<InstanceOrder>> section : configuredSections.entrySet()) {
if (sectionsToExecute.contains(section.getKey())) {
stringBuilder.append("Section ");
stringBuilder.append(section.getKey());
stringBuilder.append(System.lineSeparator());
if (section.getValue().isEmpty()) {
stringBuilder.append(" EMPTY");
}
else {
for (final InstanceOrder instanceOrder : section.getValue()) {
stringBuilder.append(' ');
stringBuilder.append(instanceOrder);
}
}
stringBuilder.append(System.lineSeparator());
}
}
return stringBuilder.toString();
}
}