/*
* 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.neo4j.remote.common.impl;
import java.util.Map;
import org.hibernate.ogm.cfg.spi.Hosts;
import org.hibernate.ogm.datastore.neo4j.Neo4jProperties;
import org.hibernate.ogm.datastore.neo4j.logging.impl.Log;
import org.hibernate.ogm.datastore.neo4j.logging.impl.LoggerFactory;
import org.hibernate.ogm.datastore.neo4j.query.parsing.impl.Neo4jBasedQueryParserService;
import org.hibernate.ogm.datastore.spi.BaseDatastoreProvider;
import org.hibernate.ogm.query.spi.QueryParserService;
import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.Startable;
import org.hibernate.service.spi.Stoppable;
/**
* @author Davide D'Alto
*/
public abstract class RemoteNeo4jDatastoreProvider extends BaseDatastoreProvider implements Startable, Stoppable, Configurable, ServiceRegistryAwareService {
private static final Log logger = LoggerFactory.getLogger();
private static final int DEFAULT_SEQUENCE_QUERY_CACHE_MAX_SIZE = 128;
protected RemoteNeo4jConfiguration configuration;
private final int defaultPort;
private final String protocol;
private Integer sequenceCacheMaxSize;
protected RemoteNeo4jDatastoreProvider( String protocol, int defaultPort ) {
this.protocol = protocol;
this.defaultPort = defaultPort;
}
public abstract Object getSequenceGenerator();
@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
}
@Override
public Class<? extends QueryParserService> getDefaultQueryParserServiceType() {
return Neo4jBasedQueryParserService.class;
}
@Override
public void configure(Map configurationValues) {
configuration = new RemoteNeo4jConfiguration( new ConfigurationPropertyReader( configurationValues ), defaultPort );
sequenceCacheMaxSize = new ConfigurationPropertyReader( configurationValues )
.property( Neo4jProperties.SEQUENCE_QUERY_CACHE_MAX_SIZE, int.class )
.withDefault( DEFAULT_SEQUENCE_QUERY_CACHE_MAX_SIZE )
.getValue();
}
@Override
public boolean allowsTransactionEmulation() {
// Remote Neo4j supports transaction so we don't need to emulate them
return false;
}
protected RemoteNeo4jDatabaseIdentifier getDatabaseIdentifier() {
if ( !configuration.getHosts().isSingleHost() ) {
logger.doesNotSupportMultipleHosts( configuration.getHosts().toString() );
}
Hosts.HostAndPort hostAndPort = configuration.getHosts().getFirst();
try {
return new RemoteNeo4jDatabaseIdentifier( protocol, configuration );
}
catch (Exception e) {
throw logger.malformedDataBaseUrl( e, hostAndPort.getHost(), hostAndPort.getPort(), configuration.getDatabaseName() );
}
}
public Integer getSequenceCacheMaxSize() {
return sequenceCacheMaxSize;
}
}