001 package de.deepamehta.storage.neo4j;
002
003 import de.deepamehta.core.model.AssociationModel;
004 import de.deepamehta.core.model.DeepaMehtaObjectModel;
005 import de.deepamehta.core.model.TopicModel;
006
007 import org.neo4j.graphdb.Node;
008 import org.neo4j.tooling.GlobalGraphOperations;
009
010 import java.util.Iterator;
011 import java.util.NoSuchElementException;
012
013
014
015 class TopicModelIterator extends ModelIterator<TopicModel> {
016
017 TopicModelIterator(Neo4jStorage storage) {
018 super(storage, NodeType.TOPIC);
019 }
020
021 @Override
022 TopicModel buildModel(Node node) {
023 return storage.buildTopic(node);
024 }
025 }
026
027
028
029 class AssociationModelIterator extends ModelIterator<AssociationModel> {
030
031 AssociationModelIterator(Neo4jStorage storage) {
032 super(storage, NodeType.ASSOC);
033 }
034
035 @Override
036 AssociationModel buildModel(Node node) {
037 return storage.buildAssociation(node);
038 }
039 }
040
041
042
043 abstract class ModelIterator<E extends DeepaMehtaObjectModel> implements Iterator<E> {
044
045 // ---------------------------------------------------------------------------------------------- Instance Variables
046
047 protected Neo4jStorage storage;
048
049 private NodeType nodeType;
050 private Iterator<Node> nodes;
051 private Node nextNode;
052
053 // ---------------------------------------------------------------------------------------------------- Constructors
054
055 ModelIterator(Neo4jStorage storage, NodeType nodeType) {
056 this.storage = storage;
057 this.nodeType = nodeType;
058 this.nodes = GlobalGraphOperations.at(storage.neo4j).getAllNodes().iterator();
059 }
060
061 // -------------------------------------------------------------------------------------------------- Public Methods
062
063 @Override
064 public boolean hasNext() {
065 nextNode = fetchNextNode();
066 return nextNode != null;
067 }
068
069 @Override
070 public E next() {
071 if (nextNode == null) {
072 throw new NoSuchElementException("there is no next node");
073 }
074 //
075 return buildModel(nextNode);
076 }
077
078 @Override
079 public void remove() {
080 throw new UnsupportedOperationException("removal is not supported");
081 }
082
083 // ----------------------------------------------------------------------------------------- Package Private Methods
084
085 abstract E buildModel(Node node);
086
087 // ------------------------------------------------------------------------------------------------- Private Methods
088
089 private Node fetchNextNode() {
090 while (nodes.hasNext()) {
091 Node node = nodes.next();
092 if (nodeType.isTypeOf(node)) {
093 return node;
094 }
095 }
096 return null;
097 }
098 }