/*******************************************************************************
* Copyright (c) 2008 Pierre-Antoine Grégoire.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pierre-Antoine Grégoire - initial API and implementation
*******************************************************************************/
package org.org.eclipse.dws.core.internal.configuration;
import java.util.Set;
import org.apache.log4j.Logger;
/**
* The Class ConfigurationsResolver.
*/
public class ConfigurationsResolver {
/** The logger. */
private static Logger logger = Logger.getLogger(ConfigurationsResolver.class);
/** The default configuration. */
private final DefaultConfiguration defaultConfiguration;
/** The alternative configurations. */
private final Set<IAlternativeConfiguration> alternativeConfigurations;
/**
* Instantiates a new configurations resolver.
*
* @param defaultConfiguration the default configuration
* @param alternativeConfigurations the alternative configurations
*/
public ConfigurationsResolver(final DefaultConfiguration defaultConfiguration, final Set<IAlternativeConfiguration> alternativeConfigurations) {
super();
this.defaultConfiguration = defaultConfiguration;
this.alternativeConfigurations = alternativeConfigurations;
}
/**
* Resolve property.
*
* @param propertyName the property name
*
* @return the string
*/
public String resolveProperty(String propertyName) {
return resolvePropertyWithMultipleValues(propertyName, null);
}
/**
* Resolve property with multiple values.
*
* @param propertyName the property name
* @param separator the separator
*
* @return the string
*/
public String resolvePropertyWithMultipleValues(String propertyName, String separator) {
String result = "";
ConfigurationProperty defaultProperty = defaultConfiguration.getConfigurationPropertyOrNullIfNotAvailable(propertyName);
logger.debug("# Found one default Property: " + defaultProperty);
result = defaultProperty.getValue();
Integer latestPriority = 0;
if (alternativeConfigurations.size() > 0) {
for (IAlternativeConfiguration alternativeConfiguration : alternativeConfigurations) {
ConfigurationProperty alternativeProperty = alternativeConfiguration.getConfigurationPropertyOrNullIfNotAvailable(propertyName);
if (alternativeProperty != null) {
logger.debug("-> Found one alternative Property in configuration " + alternativeConfiguration.getLabel() + ": " + alternativeProperty);
if (alternativeConfiguration.getBehaviour() == Behaviour.COMPLEMENTS_DEFAULT && separator != null) {
if (latestPriority < alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " property complements this additive property.");
result = result + separator + alternativeProperty.getValue();
}
if (latestPriority == alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " property has same priority (" + latestPriority + ") as the latest evaluated alternative property. SKIPPED.");
}
if (latestPriority > alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " a property of higher priority was chosen.");
}
latestPriority = alternativeConfiguration.getPriority();
}
if (alternativeConfiguration.getBehaviour() == Behaviour.REPLACES_DEFAULT) {
if (latestPriority < alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " property replaces default property.");
result = alternativeProperty.getValue();
}
if (latestPriority == alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " property has same priority (" + latestPriority + ") as the latest evaluated alternative property. SKIPPED.");
}
if (latestPriority > alternativeConfiguration.getPriority()) {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " a property of higher priority was chosen.");
}
}
} else {
logger.debug("\t-> " + alternativeConfiguration.getLabel() + " property is not available.");
}
}
}
logger.info("Configuration property: \t" + propertyName + " = " + result);
return result;
}
}