/*
* 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.datastore.impl;
import java.util.Arrays;
import java.util.Map;
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.ogm.cfg.OgmProperties;
import org.hibernate.ogm.datastore.spi.DatastoreProvider;
import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader;
import org.hibernate.ogm.util.configurationreader.spi.ShortNameResolver;
import org.hibernate.ogm.util.impl.Log;
import org.hibernate.ogm.util.impl.LoggerFactory;
import org.hibernate.service.spi.ServiceRegistryImplementor;
/**
* Loads the appropriate {@link DatastoreProvider}. Driven by the {@link OgmProperties#DATASTORE_PROVIDER} property.
*
* @author Emmanuel Bernard <emmanuel@hibernate.org>
* @author Davide D'Alto <davide@hibernate.org>
*/
public final class DatastoreProviderInitiator implements StandardServiceInitiator<DatastoreProvider> {
public static final DatastoreProviderInitiator INSTANCE = new DatastoreProviderInitiator();
private static final Log log = LoggerFactory.make();
private static final String DEFAULT_DATASTORE_PROVIDER = "infinispan_embedded";
@Override
public Class<DatastoreProvider> getServiceInitiated() {
return DatastoreProvider.class;
}
@Override
public DatastoreProvider initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
ConfigurationPropertyReader propertyReader = new ConfigurationPropertyReader( configurationValues, registry.getService( ClassLoaderService.class ) );
DatastoreProvider datastoreProvider = propertyReader.property( OgmProperties.DATASTORE_PROVIDER, DatastoreProvider.class )
.instantiate()
.withDefaultImplementation( DEFAULT_DATASTORE_PROVIDER )
.withShortNameResolver( DatastoreProviderShortNameResolver.INSTANCE )
.getValue();
log.useDatastoreProvider( datastoreProvider.getClass() );
return datastoreProvider;
}
private static class DatastoreProviderShortNameResolver implements ShortNameResolver {
private static final DatastoreProviderShortNameResolver INSTANCE = new DatastoreProviderShortNameResolver();
@Override
public boolean isShortName(String name) {
boolean isShortName = DatastoreProviderType.isShortName( name );
if ( !isShortName ) {
// There is the legitimate case of the provider FQN name given; As we encourage the usage of the short
// names though, chances are much higher that a misspelled short name has been given; Let's thus raise a
// warning, as long as the provided name does not look like a FQN (i.e. have two dots)
if ( name != null && name.indexOf( '.' ) == name.lastIndexOf( '.' ) ) {
// we know that there is at least two dots so the name looks like com.acme.SomeClass
// we check for null because we are good people
String validProviderNames = Arrays.toString( DatastoreProviderType.values() );
log.noValidDatastoreProviderShortName( name, validProviderNames.substring( 1, validProviderNames.length() - 1 ) );
}
}
return isShortName;
}
@Override
public String resolve(String shortName) {
return DatastoreProviderType.byShortName( shortName ).getDatastoreProviderClassName();
}
}
}