package com.buschmais.xo.neo4j.embedded.impl.datastore;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import org.neo4j.graphdb.GraphDatabaseService;
import com.buschmais.xo.api.XOException;
import com.buschmais.xo.neo4j.api.TypedNeo4jRepository;
import com.buschmais.xo.neo4j.api.annotation.Cypher;
import com.buschmais.xo.neo4j.embedded.impl.converter.EmbeddedParameterConverter;
import com.buschmais.xo.neo4j.embedded.impl.converter.EmbeddedValueConverter;
import com.buschmais.xo.neo4j.embedded.impl.model.EmbeddedLabel;
import com.buschmais.xo.neo4j.embedded.impl.model.EmbeddedNode;
import com.buschmais.xo.neo4j.embedded.impl.model.EmbeddedRelationship;
import com.buschmais.xo.neo4j.embedded.impl.model.EmbeddedRelationshipType;
import com.buschmais.xo.neo4j.spi.helper.Converter;
import com.buschmais.xo.neo4j.spi.metadata.NodeMetadata;
import com.buschmais.xo.neo4j.spi.metadata.PropertyMetadata;
import com.buschmais.xo.neo4j.spi.metadata.RelationshipMetadata;
import com.buschmais.xo.spi.datastore.DatastoreEntityManager;
import com.buschmais.xo.spi.datastore.DatastoreQuery;
import com.buschmais.xo.spi.datastore.DatastoreRelationManager;
import com.buschmais.xo.spi.datastore.DatastoreTransaction;
import com.buschmais.xo.spi.reflection.ClassHelper;
import com.buschmais.xo.spi.session.XOSession;
public class EmbeddedNeo4jDatastoreSession implements com.buschmais.xo.neo4j.embedded.api.EmbeddedNeo4jDatastoreSession {
private final GraphDatabaseService graphDatabaseService;
private final DatastoreTransaction datastoreTransaction;
private final Neo4jEntityManager entityManager;
private final Neo4jRelationManager relationManager;
private final Converter parameterConverter;
private final Converter valueConverter;
public EmbeddedNeo4jDatastoreSession(GraphDatabaseService graphDatabaseService) {
this.graphDatabaseService = graphDatabaseService;
this.entityManager = new Neo4jEntityManager(graphDatabaseService);
this.relationManager = new Neo4jRelationManager(graphDatabaseService);
this.parameterConverter = new Converter(Arrays.asList(new EmbeddedParameterConverter()));
this.valueConverter = new Converter(Arrays.asList(new EmbeddedValueConverter()));
datastoreTransaction = new EmbeddedNeo4jDatastoreTransaction(graphDatabaseService);
}
@Override
public DatastoreTransaction getDatastoreTransaction() {
return datastoreTransaction;
}
@Override
public DatastoreEntityManager<Long, EmbeddedNode, NodeMetadata<EmbeddedLabel>, EmbeddedLabel, PropertyMetadata> getDatastoreEntityManager() {
return entityManager;
}
@Override
public DatastoreRelationManager<EmbeddedNode, Long, EmbeddedRelationship, RelationshipMetadata<EmbeddedRelationshipType>, EmbeddedRelationshipType, PropertyMetadata> getDatastoreRelationManager() {
return relationManager;
}
@Override
public Class<? extends Annotation> getDefaultQueryLanguage() {
return Cypher.class;
}
public GraphDatabaseService getGraphDatabaseService() {
return graphDatabaseService;
}
@Override
public <QL extends Annotation> DatastoreQuery<QL> createQuery(Class<QL> queryLanguage) {
if (Cypher.class.equals(queryLanguage)) {
return (DatastoreQuery<QL>) new EmbeddedNeo4jCypherQuery(this);
}
throw new XOException("Unsupported query language: " + queryLanguage.getName());
}
@Override
public <R> R createRepository(XOSession xoSession, Class<R> type) {
if (TypedNeo4jRepository.class.isAssignableFrom(type)) {
Class<?> typeParameter = ClassHelper.getTypeParameter(TypedNeo4jRepository.class, type);
if (typeParameter == null) {
throw new XOException("Cannot determine type parameter for " + type.getName());
}
return (R) new EmbeddedTypedNeoj4Repository<>(typeParameter, graphDatabaseService, xoSession);
}
return (R) new EmbeddedNeo4jRepository(graphDatabaseService, xoSession);
}
@Override
public void close() {
}
@Override
public Object convertParameter(Object value) {
return parameterConverter.convert(value);
}
@Override
public Object convertValue(Object value) {
return valueConverter.convert(value);
}
}