/*
* 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.bolt.impl;
import org.hibernate.HibernateException;
import org.hibernate.ogm.datastore.neo4j.BoltNeo4jDialect;
import org.hibernate.ogm.datastore.neo4j.logging.impl.Log;
import org.hibernate.ogm.datastore.neo4j.logging.impl.LoggerFactory;
import org.hibernate.ogm.datastore.neo4j.remote.bolt.dialect.impl.BoltNeo4jSequenceGenerator;
import org.hibernate.ogm.datastore.neo4j.remote.bolt.transaction.impl.BoltNeo4jTransactionCoordinatorBuilder;
import org.hibernate.ogm.datastore.neo4j.remote.common.impl.RemoteNeo4jConfiguration;
import org.hibernate.ogm.datastore.neo4j.remote.common.impl.RemoteNeo4jDatastoreProvider;
import org.hibernate.ogm.datastore.spi.SchemaDefiner;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.Startable;
import org.hibernate.service.spi.Stoppable;
import org.neo4j.driver.v1.exceptions.ClientException;
/**
* @author Davide D'Alto
*/
public class BoltNeo4jDatastoreProvider extends RemoteNeo4jDatastoreProvider implements Startable, Stoppable, Configurable, ServiceRegistryAwareService {
private static final String BOLT_PROTOCOL = "bolt";
private static final Log log = LoggerFactory.getLogger();
private BoltNeo4jClient client;
private BoltNeo4jSequenceGenerator sequenceGenerator;
public BoltNeo4jDatastoreProvider() {
super( BOLT_PROTOCOL, RemoteNeo4jConfiguration.DEFAULT_BOLT_PORT );
}
@Override
public TransactionCoordinatorBuilder getTransactionCoordinatorBuilder(TransactionCoordinatorBuilder coordinatorBuilder) {
return new BoltNeo4jTransactionCoordinatorBuilder( coordinatorBuilder, this );
}
@Override
public Class<? extends SchemaDefiner> getSchemaDefinerType() {
return BoltNeo4jSchemaDefiner.class;
}
@Override
public void start() {
if ( client == null ) {
try {
this.client = new BoltNeo4jClient( getDatabaseIdentifier(), configuration );
validateConnection( client );
this.sequenceGenerator = new BoltNeo4jSequenceGenerator( client, getSequenceCacheMaxSize() );
}
catch (HibernateException e) {
// Wrap HibernateException in a ServiceException to make the stack trace more friendly
// Otherwise a generic unable to request service is thrown
throw log.unableToStartDatastoreProvider( e );
}
}
}
private void validateConnection(BoltNeo4jClient neo4jClient) {
try {
neo4jClient.validateConnection();
}
catch (ClientException e) {
throw log.connectionFailed( getDatabaseIdentifier().getDatabaseUri(), e.neo4jErrorCode(), e.getMessage() );
}
}
@Override
public void stop() {
try {
if ( client != null ) {
client.close();
}
}
finally {
client = null;
}
}
@Override
public Class<? extends GridDialect> getDefaultDialect() {
return BoltNeo4jDialect.class;
}
public BoltNeo4jSequenceGenerator getSequenceGenerator() {
return sequenceGenerator;
}
public BoltNeo4jClient getClient() {
return client;
}
}