/* * 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.embedded.impl; import java.util.Map; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.ogm.datastore.neo4j.EmbeddedNeo4jDialect; import org.hibernate.ogm.datastore.neo4j.Neo4jProperties; import org.hibernate.ogm.datastore.neo4j.embedded.dialect.impl.EmbeddedNeo4jSequenceGenerator; import org.hibernate.ogm.datastore.neo4j.embedded.transaction.impl.EmbeddedNeo4jTransactionCoordinatorBuilder; 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.neo4j.spi.GraphDatabaseServiceFactory; import org.hibernate.ogm.datastore.spi.BaseDatastoreProvider; import org.hibernate.ogm.datastore.spi.SchemaDefiner; import org.hibernate.ogm.dialect.spi.GridDialect; import org.hibernate.ogm.query.spi.QueryParserService; import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader; import org.hibernate.resource.transaction.TransactionCoordinatorBuilder; 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; import org.neo4j.graphdb.GraphDatabaseService; /** * Provides access to the Neo4j system. * * @author Davide D'Alto */ public class EmbeddedNeo4jDatastoreProvider extends BaseDatastoreProvider implements Startable, Stoppable, Configurable, ServiceRegistryAwareService { private static final int DEFAULT_SEQUENCE_QUERY_CACHE_MAX_SIZE = 128; private static Log LOG = LoggerFactory.getLogger(); private GraphDatabaseService neo4jDb; private GraphDatabaseServiceFactory graphDbFactory; private ServiceRegistryImplementor registry; private EmbeddedNeo4jSequenceGenerator sequenceGenerator; private Integer sequenceCacheMaxSize; @Override public void injectServices(ServiceRegistryImplementor serviceRegistry) { this.registry = serviceRegistry; } @Override public Class<? extends QueryParserService> getDefaultQueryParserServiceType() { return Neo4jBasedQueryParserService.class; } @Override public void configure(Map cfg) { graphDbFactory = new EmbeddedNeo4jGraphDatabaseServiceFactoryProvider().load( cfg, registry.getService( ClassLoaderService.class ) ); sequenceCacheMaxSize = new ConfigurationPropertyReader( cfg ) .property( Neo4jProperties.SEQUENCE_QUERY_CACHE_MAX_SIZE, int.class ) .withDefault( DEFAULT_SEQUENCE_QUERY_CACHE_MAX_SIZE ) .getValue(); } @Override public void stop() { neo4jDb.shutdown(); } @Override public void start() { try { this.neo4jDb = graphDbFactory.create(); this.sequenceGenerator = new EmbeddedNeo4jSequenceGenerator( neo4jDb, sequenceCacheMaxSize ); this.graphDbFactory = null; this.sequenceCacheMaxSize = null; } catch (Exception e) { throw LOG.unableToStartDatastoreProvider( e ); } } @Override public Class<? extends GridDialect> getDefaultDialect() { return EmbeddedNeo4jDialect.class; } public GraphDatabaseService getDatabase() { return neo4jDb; } public EmbeddedNeo4jSequenceGenerator getSequenceGenerator() { return this.sequenceGenerator; } @Override public Class<? extends SchemaDefiner> getSchemaDefinerType() { return EmbeddedNeo4jSchemaDefiner.class; } @Override public TransactionCoordinatorBuilder getTransactionCoordinatorBuilder(TransactionCoordinatorBuilder coordinatorBuilder) { return new EmbeddedNeo4jTransactionCoordinatorBuilder( coordinatorBuilder, this ); } }