package com.tinkerpop.blueprints.impls.neo4j2;
import com.tinkerpop.blueprints.Vertex;
import org.hamcrest.core.Is;
import org.hamcrest.core.IsNull;
import org.junit.Test;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.event.KernelEventHandler;
import org.neo4j.graphdb.event.TransactionEventHandler;
import org.neo4j.test.TestGraphDatabaseFactory;
import org.neo4j.graphdb.index.IndexManager;
import org.neo4j.graphdb.schema.Schema;
import org.neo4j.graphdb.traversal.BidirectionalTraversalDescription;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.GraphDatabaseAPI;
import org.neo4j.kernel.impl.store.StoreId;
import java.util.Map;
import static org.junit.Assert.assertThat;
public class Neo4j2GraphUsingANonInternalAbstractGraphClassFail {
private class LazyLoadedGraphDatabase implements GraphDatabaseService {
private GraphDatabaseService lazy;
public GraphDatabaseService getLazy() {
if (lazy == null) {
lazy = new TestGraphDatabaseFactory().newImpermanentDatabase();
}
return lazy;
}
/**
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#createNode()
*/
public Node createNode() {
return getLazy().createNode();
}
/**
* @param id
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#getNodeById(long)
*/
public Node getNodeById(long id) {
return getLazy().getNodeById(id);
}
/**
* @param id
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#getRelationshipById(long)
*/
public Relationship getRelationshipById(long id) {
return getLazy().getRelationshipById(id);
}
/**
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#getAllNodes()
* @deprecated
*/
public Iterable<Node> getAllNodes() {
return getLazy().getAllNodes();
}
@Override
public ResourceIterator<Node> findNodes(Label label, String s, Object o) {
return getLazy().findNodes(label, s, o);
}
@Override
public Node findNode(Label label, String s, Object o) {
return getLazy().findNode(label, s, o);
}
@Override
public ResourceIterator<Node> findNodes(Label label) {
return getLazy().findNodes(label);
}
/**
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#getRelationshipTypes()
* @deprecated
*/
public Iterable<RelationshipType> getRelationshipTypes() {
return getLazy().getRelationshipTypes();
}
/**
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#shutdown()
*/
public void shutdown() {
getLazy().shutdown();
}
/**
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#beginTx()
*/
public Transaction beginTx() {
return getLazy().beginTx();
}
@Override
public Result execute(String s) throws QueryExecutionException {
return getLazy().execute(s);
}
@Override
public Result execute(String s, Map<String, Object> map) throws QueryExecutionException {
return getLazy().execute(s, map);
}
/**
* @param handler
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#registerTransactionEventHandler(org.neo4j.graphdb.event.TransactionEventHandler)
*/
public <T> TransactionEventHandler<T> registerTransactionEventHandler(TransactionEventHandler<T> handler) {
return getLazy().registerTransactionEventHandler(handler);
}
/**
* @param handler
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#unregisterTransactionEventHandler(org.neo4j.graphdb.event.TransactionEventHandler)
*/
public <T> TransactionEventHandler<T> unregisterTransactionEventHandler(TransactionEventHandler<T> handler) {
return getLazy().unregisterTransactionEventHandler(handler);
}
/**
* @param handler
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#registerKernelEventHandler(org.neo4j.graphdb.event.KernelEventHandler)
*/
public KernelEventHandler registerKernelEventHandler(KernelEventHandler handler) {
return getLazy().registerKernelEventHandler(handler);
}
/**
* @param handler
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#unregisterKernelEventHandler(org.neo4j.graphdb.event.KernelEventHandler)
*/
public KernelEventHandler unregisterKernelEventHandler(KernelEventHandler handler) {
return getLazy().unregisterKernelEventHandler(handler);
}
/**
* @return
* @category delegate
* @see org.neo4j.graphdb.GraphDatabaseService#index()
*/
public IndexManager index() {
return getLazy().index();
}
@Override
public Node createNode(Label... labels) {
return getLazy().createNode(labels);
}
@Override
public ResourceIterable<Node> findNodesByLabelAndProperty(Label label, String key, Object value) {
return getLazy().findNodesByLabelAndProperty(label,key,value);
}
@Override
public boolean isAvailable(long timeout) {
return getLazy().isAvailable(timeout);
}
@Override
public Schema schema() {
return getLazy().schema();
}
@Override
public TraversalDescription traversalDescription() {
return getLazy().traversalDescription();
}
@Override
public BidirectionalTraversalDescription bidirectionalTraversalDescription() {
return getLazy().bidirectionalTraversalDescription();
}
}
private class LazyLoadableGraphAPI extends LazyLoadedGraphDatabase implements GraphDatabaseAPI {
@Override
public DependencyResolver getDependencyResolver() {
return ((GraphDatabaseAPI) getLazy()).getDependencyResolver();
}
@Override
@Deprecated
public String getStoreDir() {
return ((GraphDatabaseAPI) getLazy()).getStoreDir();
}
@Override
@Deprecated
public StoreId storeId() {
return ((GraphDatabaseAPI) getLazy()).storeId();
}
@Override
public ResourceIterator<Node> findNodes(Label label, String s, Object o) {
return ((GraphDatabaseAPI) getLazy()).findNodes(label, s, o);
}
@Override
public Node findNode(Label label, String s, Object o) {
return getLazy().findNode(label, s, o);
}
@Override
public ResourceIterator<Node> findNodes(Label label) {
return ((GraphDatabaseAPI) getLazy()).findNodes(label);
}
@Override
public Result execute(String s) throws QueryExecutionException {
return getLazy().execute(s);
}
@Override
public Result execute(String s, Map<String, Object> map) throws QueryExecutionException {
return getLazy().execute(s, map);
}
}
/**
* in this test, our class is a graph database service, but not an InternalAbstractGraphDatabase instance.As a consequence, {@link Neo4j2Graph#getInternalIndexKeys}
* won't load any index, with an additional {@link ClassCastException}
*/
@Test
public void loadingANeo4jGraphFromAnyGraphDatabaseClassShouldWork() throws ClassCastException {
Neo4j2Graph tested = new Neo4j2Graph(new LazyLoadedGraphDatabase());
assertThat(tested, IsNull.notNullValue());
// this one isn't a GraphDatabaseAPI. As a consequence, the indexing features are disgraded.
assertThat(tested.getIndices().iterator().hasNext(), Is.is(false));
}
/**
* in this test, our class is a graph database service, but not an InternalAbstractGraphDatabase instance.As a consequence, {@link Neo4j2Graph#getInternalIndexKeys}
* won't load any index, with an additional {@link ClassCastException}
*/
@Test
public void loadingANeo4jGraphFromAnyGraphAPIClassShouldWork() throws ClassCastException {
String METHOD_NAME = "#loadingANeo4jGraphFromAnyGraphAPIClassShouldWork";
Neo4j2Graph tested = new Neo4j2Graph(new LazyLoadableGraphAPI());
assertThat(tested, IsNull.notNullValue());
// at startup there is no index
assertThat(tested.getIndices().iterator().hasNext(), Is.is(false));
// now create an index
tested.createIndex(METHOD_NAME, Vertex.class);
// and now this index exist
assertThat(tested.getIndices().iterator().hasNext(), Is.is(true));
}
}