/*
* 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.utils;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.ogm.cfg.OgmProperties;
import org.hibernate.ogm.datastore.document.options.AssociationStorageType;
import org.hibernate.ogm.datastore.impl.DatastoreProviderType;
import org.hibernate.ogm.datastore.neo4j.Neo4j;
import org.hibernate.ogm.datastore.neo4j.Neo4jProperties;
import org.hibernate.ogm.datastore.neo4j.embedded.impl.EmbeddedNeo4jDatastoreProvider;
import org.hibernate.ogm.datastore.neo4j.remote.bolt.impl.BoltNeo4jDatastoreProvider;
import org.hibernate.ogm.datastore.neo4j.remote.http.impl.HttpNeo4jDatastoreProvider;
import org.hibernate.ogm.datastore.spi.DatastoreConfiguration;
import org.hibernate.ogm.datastore.spi.DatastoreProvider;
import org.hibernate.ogm.dialect.spi.GridDialect;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.model.key.spi.EntityKey;
import org.hibernate.ogm.model.spi.TupleSnapshot;
import org.hibernate.ogm.utils.GridDialectOperationContexts;
import org.hibernate.ogm.utils.GridDialectTestHelper;
import org.hibernate.ogm.utils.TestHelper;
/**
* @author Davide D'Alto <davide@hibernate.org>
*/
public class Neo4jTestHelper implements GridDialectTestHelper {
static {
// Read host, username and password from environment variable
// Maven's surefire plugin set it to the string 'null'
String neo4jHost = System.getenv( "NEO4J_HOSTNAME" );
if ( isNotNull( neo4jHost ) ) {
System.getProperties().setProperty( OgmProperties.HOST, neo4jHost );
}
String neo4jPort = System.getenv( "NEO4J_PORT" );
if ( isNotNull( neo4jPort ) ) {
System.getProperties().setProperty( OgmProperties.PORT, neo4jPort );
}
String neo4jUsername = System.getenv( "NEO4J_USERNAME" );
if ( isNotNull( neo4jUsername ) ) {
System.getProperties().setProperty( OgmProperties.USERNAME, neo4jUsername );
}
String neo4jPassword = System.getenv( "NEO4J_PASSWORD" );
if ( isNotNull( neo4jPassword ) ) {
System.getProperties().setProperty( OgmProperties.PASSWORD, neo4jPassword );
}
}
private static boolean isNotNull(String neo4jHostName) {
return neo4jHostName != null && neo4jHostName.length() > 0 && !"null".equals( neo4jHostName );
}
@Override
public long getNumberOfEntities(Session session) {
DatastoreProvider provider = getDatastoreProvider( session.getSessionFactory() );
return delegate().getNumberOfEntities( session, provider );
}
@Override
public long getNumberOfEntities(SessionFactory sessionFactory) {
DatastoreProvider provider = getDatastoreProvider( sessionFactory );
return delegate().getNumberOfEntities( null, provider );
}
@Override
public long getNumberOfAssociations(Session session) {
DatastoreProvider provider = getDatastoreProvider( session.getSessionFactory() );
return delegate().getNumberOfAssociations( session, provider );
}
@Override
public long getNumberOfAssociations(SessionFactory sessionFactory) {
DatastoreProvider provider = getDatastoreProvider( sessionFactory );
return delegate().getNumberOfAssociations( null, provider );
}
@Override
public Map<String, Object> extractEntityTuple(Session session, EntityKey key) {
Map<String, Object> tuple = new HashMap<String, Object>();
GridDialect dialect = getDialect( session.getSessionFactory() );
TupleContext context = tupleContext( session );
TupleSnapshot snapshot = dialect.getTuple( key, context ).getSnapshot();
for ( String column : snapshot.getColumnNames() ) {
tuple.put( column, snapshot.get( column ) );
}
return tuple;
}
private TupleContext tupleContext(Session session) {
return new GridDialectOperationContexts.TupleContextBuilder().transactionContext( session )
.tupleTypeContext( GridDialectOperationContexts.emptyTupleTypeContext() )
.buildTupleContext();
}
@Override
public boolean backendSupportsTransactions() {
return true;
}
@Override
public void dropSchemaAndDatabase(SessionFactory sessionFactory) {
DatastoreProvider datastoreProvider = getDatastoreProvider( sessionFactory );
delegate().dropDatabase( datastoreProvider );
}
@Override
public Map<String, String> getAdditionalConfigurationProperties() {
return Collections.singletonMap( Neo4jProperties.DATABASE_PATH, EmbeddedNeo4jTestHelperDelegate.dbLocation() );
}
private static DatastoreProvider getDatastoreProvider(SessionFactory sessionFactory) {
DatastoreProvider provider = ( (SessionFactoryImplementor) sessionFactory ).getServiceRegistry().getService( DatastoreProvider.class );
if ( EmbeddedNeo4jDatastoreProvider.class.isInstance( provider ) ) {
return EmbeddedNeo4jDatastoreProvider.class.cast( provider );
}
if ( HttpNeo4jDatastoreProvider.class.isInstance( provider ) ) {
return HttpNeo4jDatastoreProvider.class.cast( provider );
}
if ( BoltNeo4jDatastoreProvider.class.isInstance( provider ) ) {
return BoltNeo4jDatastoreProvider.class.cast( provider );
}
throw new RuntimeException( "Not testing with Neo4jDB, cannot extract underlying provider" );
}
private static GridDialect getDialect(SessionFactory sessionFactory) {
GridDialect dialect = ( (SessionFactoryImplementor) sessionFactory ).getServiceRegistry().getService( GridDialect.class );
return dialect;
}
@Override
public long getNumberOfAssociations(SessionFactory sessionFactory, AssociationStorageType type) {
throw new UnsupportedOperationException( "This datastore does not support different association storage strategies." );
}
@Override
public Class<? extends DatastoreConfiguration<?>> getDatastoreConfigurationType() {
return Neo4j.class;
}
@Override
public GridDialect getGridDialect(DatastoreProvider datastoreProvider) {
return delegate().getDialect( datastoreProvider );
}
public static Neo4jTestHelperDelegate delegate() {
DatastoreProviderType providerType = TestHelper.getCurrentDatastoreProviderType();
switch ( providerType ) {
case NEO4J_EMBEDDED:
return EmbeddedNeo4jTestHelperDelegate.INSTANCE;
case NEO4J_HTTP:
return HttpNeo4jTestHelperDelegate.INSTANCE;
case NEO4J_BOLT:
return BoltNeo4jTestHelperDelegate.INSTANCE;
default:
throw new RuntimeException( "Not testing with Neo4jDB, cannot extract underlying dialect" );
}
}
}