package org.springframework.roo.addon.tailor.service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.ReferenceStrategy;
import org.apache.felix.scr.annotations.Service;
import org.springframework.roo.addon.tailor.config.TailorConfiguration;
import org.springframework.roo.addon.tailor.config.TailorConfigurationFactory;
import org.springframework.roo.support.logging.HandlerUtils;
import org.springframework.roo.support.util.CollectionUtils;
/**
* Default implementation of {@link ConfigurationLocator}
*
* @author Birgitta Boeckeler
* @since 1.2.0
*/
@Component
@Service
@Reference(name = "config", strategy = ReferenceStrategy.EVENT, policy = ReferencePolicy.DYNAMIC,
referenceInterface = TailorConfigurationFactory.class,
cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE)
public class DefaultConfigurationLocator implements ConfigurationLocator {
private static final Logger LOGGER = HandlerUtils.getLogger(DefaultConfigurationLocator.class);
/**
* Name of currently activated configuration
*/
private String activatedTailorConfigName = null;
/**
* Map of all available configurations - dynamically bound by Felix on
* startup
*/
private final Map<String, TailorConfiguration> configurations =
new LinkedHashMap<String, TailorConfiguration>();
public TailorConfiguration getActiveTailorConfiguration() {
return configurations.get(activatedTailorConfigName);
}
public Map<String, TailorConfiguration> getAvailableConfigurations() {
return configurations;
}
public void setActiveTailorConfiguration(final String name) {
if (name == null) {
activatedTailorConfigName = null;
LOGGER.info("Tailor deactivated");
return;
}
if (configurations.get(name) != null) {
activatedTailorConfigName = name;
} else {
LOGGER.severe("Couldn't activate tailor configuration '" + name + "', not available.");
}
}
protected void bindConfig(final TailorConfigurationFactory factory) {
final List<TailorConfiguration> configs = factory.createTailorConfiguration();
if (CollectionUtils.isEmpty(configs)) {
return;
}
for (final TailorConfiguration config : configs) {
if (configurations.get(config.getName()) != null) {
LOGGER.warning("TailorConfiguration duplicate '" + config.getName()
+ "', not binding again: " + config.toString());
}
if (config.isActive()) {
activatedTailorConfigName = config.getName();
}
configurations.put(config.getName(), config);
}
}
protected void unbindConfig(final TailorConfigurationFactory factory) {
// TODO It's a little unelegant to call "create" method here again, but
// we need the name...
final List<TailorConfiguration> configs = factory.createTailorConfiguration();
if (CollectionUtils.isEmpty(configs)) {
return;
}
for (final TailorConfiguration config : configs) {
configurations.remove(config.getName());
}
}
}