/* * 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.http.impl; import org.hibernate.HibernateException; import org.hibernate.ogm.datastore.neo4j.HttpNeo4jDialect; 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.common.impl.RemoteNeo4jConfiguration; import org.hibernate.ogm.datastore.neo4j.remote.common.impl.RemoteNeo4jDatabaseIdentifier; import org.hibernate.ogm.datastore.neo4j.remote.common.impl.RemoteNeo4jDatastoreProvider; import org.hibernate.ogm.datastore.neo4j.remote.http.dialect.impl.HttpNeo4jSequenceGenerator; import org.hibernate.ogm.datastore.neo4j.remote.http.transaction.impl.HttpNeo4jTransactionCoordinatorBuilder; 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; /** * @author Davide D'Alto */ public class HttpNeo4jDatastoreProvider extends RemoteNeo4jDatastoreProvider implements Startable, Stoppable, Configurable, ServiceRegistryAwareService { private static final Log logger = LoggerFactory.getLogger(); private static final String HTTP_PROTOCOL = "http"; private HttpNeo4jClient remoteNeo4j; private HttpNeo4jSequenceGenerator sequenceGenerator; public HttpNeo4jDatastoreProvider() { super( HTTP_PROTOCOL, RemoteNeo4jConfiguration.DEFAULT_HTTP_PORT ); } @Override public void stop() { if ( remoteNeo4j != null ) { remoteNeo4j.close(); remoteNeo4j = null; } } @Override public void start() { if ( remoteNeo4j == null ) { try { remoteNeo4j = createNeo4jClient( getDatabaseIdentifier(), configuration ); remoteNeo4j.validateConnection(); sequenceGenerator = new HttpNeo4jSequenceGenerator( remoteNeo4j, 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 logger.unableToStartDatastoreProvider( e ); } } } /** * Creates the {@link HttpNeo4jClient} that it is going to be used to connect to a remote Neo4j server. * <p> * I've created a separate method to allow plugging different implementation if needed. * * @param databaseIdentifier the connection properties to identify a database * @param configuration all the configuration properties * @return a client that can access a Neo4j server */ public HttpNeo4jClient createNeo4jClient(RemoteNeo4jDatabaseIdentifier databaseIdentifier, RemoteNeo4jConfiguration configuration) { return new HttpNeo4jClient( databaseIdentifier, configuration ); } public HttpNeo4jClient getClient() { return remoteNeo4j; } @Override public Class<? extends GridDialect> getDefaultDialect() { return HttpNeo4jDialect.class; } @Override public Class<? extends SchemaDefiner> getSchemaDefinerType() { return HttpNeo4jSchemaDefiner.class; } public HttpNeo4jSequenceGenerator getSequenceGenerator() { return sequenceGenerator; } @Override public TransactionCoordinatorBuilder getTransactionCoordinatorBuilder(TransactionCoordinatorBuilder coordinatorBuilder) { return new HttpNeo4jTransactionCoordinatorBuilder( coordinatorBuilder, this ); } }