/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.options.navigation.source.impl;
import java.util.Collections;
import java.util.Map;
import org.hibernate.ogm.options.container.impl.OptionsContainer;
import org.hibernate.ogm.options.spi.Option;
import org.hibernate.ogm.options.spi.UniqueOption;
import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader;
import org.hibernate.ogm.util.impl.Log;
import org.hibernate.ogm.util.impl.LoggerFactory;
/**
* A {@link OptionValueSource} which provides access to options configured using a property in {@code persistence.xml}
* or similar. Such options will be provided on the global configuration level. Only unique options are supported.
*
* @author Gunnar Morling
*/
public class ConfigurationOptionValueSource implements OptionValueSource {
private final ConfigurationBasedOptionContainer globalOptions;
public ConfigurationOptionValueSource(ConfigurationPropertyReader reader) {
this.globalOptions = new ConfigurationBasedOptionContainer( reader );
}
@Override
public OptionsContainer getGlobalOptions() {
return globalOptions;
}
@Override
public OptionsContainer getEntityOptions(Class<?> entityType) {
return OptionsContainer.EMPTY;
}
@Override
public OptionsContainer getPropertyOptions(Class<?> entityType, String propertyName) {
return OptionsContainer.EMPTY;
}
/**
* An {@link OptionsContainer} which provides access to unique options configured using a property.
*
* @author Gunnar Morling
*/
private static class ConfigurationBasedOptionContainer implements OptionsContainer {
private static final Log log = LoggerFactory.make();
private final ConfigurationPropertyReader propertyReader;
public ConfigurationBasedOptionContainer(ConfigurationPropertyReader propertyReader) {
this.propertyReader = propertyReader;
}
@Override
public <I, V> V get(Class<? extends Option<I, V>> optionType, I identifier) {
return null;
}
@Override
public <V> V getUnique(Class<? extends UniqueOption<V>> optionType) {
try {
return optionType.newInstance().getDefaultValue( propertyReader );
}
catch (Exception e) {
throw log.unableToInstantiateType( optionType, e );
}
}
@Override
public <I, V, T extends Option<I, V>> Map<I, V> getAll(Class<T> optionType) {
try {
T option = optionType.newInstance();
V value = option.getDefaultValue( propertyReader );
return value != null ? Collections.<I, V>singletonMap( option.getOptionIdentifier(), value ) : Collections.<I, V>emptyMap();
}
catch (Exception e) {
throw log.unableToInstantiateType( optionType, e );
}
}
}
}