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    }