package org.fluentlenium.configuration;
import org.fluentlenium.utils.ReflectionUtils;
import java.lang.reflect.InvocationTargetException;
/**
* Provider of configuration factory.
*/
public final class ConfigurationFactoryProvider {
private static final ConfigurationFactory BOOTSTRAP_FACTORY = new DefaultConfigurationFactory();
private ConfigurationFactoryProvider() {
// Utility class
}
/**
* Provides the configuration factory for a given container, base on configuration of this configuration.
*
* @param container container class
* @return configuration factory
*/
public static ConfigurationFactory getConfigurationFactory(Class<?> container) {
ConfigurationProperties configuration = BOOTSTRAP_FACTORY.newConfiguration(container, new ConfigurationDefaults());
Class<? extends ConfigurationFactory> configurationFactoryClass = configuration.getConfigurationFactory();
if (configurationFactoryClass != null) {
try {
return ReflectionUtils.newInstance(configurationFactoryClass);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new ConfigurationException("Can't initialize ConfigurationFactory " + configurationFactoryClass.getName(),
e);
}
}
return BOOTSTRAP_FACTORY;
}
/**
* Creates a new configuration for a given container, using configuration factory from this provider.
*
* @param container container class
* @return configuration
*/
public static Configuration newConfiguration(Class<?> container) {
ConfigurationFactory configurationFactory = getConfigurationFactory(container);
Configuration configuration = configurationFactory.newConfiguration(container, new ConfigurationDefaults());
if (configuration.getConfigurationDefaults() != null
&& configuration.getConfigurationDefaults() != ConfigurationDefaults.class) {
ConfigurationProperties configurationDefaults;
try {
configurationDefaults = ReflectionUtils.newInstance(configuration.getConfigurationDefaults());
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new ConfigurationException(
"Can't initialize ConfigurationDefaults:" + configuration.getConfigurationDefaults(), e);
}
configuration = configurationFactory.newConfiguration(container, configurationDefaults);
}
return configuration;
}
}