001    package de.deepamehta.core.impl;
002    
003    import de.deepamehta.core.Association;
004    import de.deepamehta.core.DeepaMehtaObject;
005    import de.deepamehta.core.Topic;
006    import de.deepamehta.core.model.AssociationModel;
007    import de.deepamehta.core.model.DeepaMehtaObjectModel;
008    import de.deepamehta.core.model.TopicModel;
009    
010    import java.util.Iterator;
011    
012    
013    
014    /**
015     * An iterable over all topics stored in the DB.
016     */
017    class TopicIterable implements Iterable<Topic> {
018    
019        private Iterator<Topic> topics;
020    
021        TopicIterable(EmbeddedService dms) {
022            this.topics = new TopicIterator(dms);
023        }
024    
025        @Override
026        public Iterator<Topic> iterator() {
027            return topics;
028        }
029    }
030    
031    /**
032     * An iterable over all associations stored in the DB.
033     */
034    class AssociationIterable implements Iterable<Association> {
035    
036        private Iterator<Association> assocs;
037    
038        AssociationIterable(EmbeddedService dms) {
039            this.assocs = new AssociationIterator(dms);
040        }
041    
042        @Override
043        public Iterator<Association> iterator() {
044            return assocs;
045        }
046    }
047    
048    
049    
050    // ===
051    
052    
053    
054    class TopicIterator extends ObjectIterator<Topic, TopicModel> {
055    
056        TopicIterator(EmbeddedService dms) {
057            super(dms);
058        }
059    
060        @Override
061        Iterator<TopicModel> fetchObjects() {
062            return dms.storageDecorator.fetchAllTopics();
063        }
064    
065        @Override
066        Topic instantiateObject(TopicModel model) {
067            return dms.instantiateTopic(model);
068        }
069    }
070    
071    
072    
073    class AssociationIterator extends ObjectIterator<Association, AssociationModel> {
074    
075        AssociationIterator(EmbeddedService dms) {
076            super(dms);
077        }
078    
079        @Override
080        Iterator<AssociationModel> fetchObjects() {
081            return dms.storageDecorator.fetchAllAssociations();
082        }
083    
084        @Override
085        Association instantiateObject(AssociationModel model) {
086            return dms.instantiateAssociation(model);
087        }
088    }
089    
090    
091    
092    abstract class ObjectIterator<O extends DeepaMehtaObject, M extends DeepaMehtaObjectModel> implements Iterator<O> {
093    
094        // ---------------------------------------------------------------------------------------------- Instance Variables
095    
096        protected EmbeddedService dms;
097        private Iterator<M> objects;
098    
099        // ---------------------------------------------------------------------------------------------------- Constructors
100    
101        ObjectIterator(EmbeddedService dms) {
102            this.dms = dms;
103            this.objects = fetchObjects();
104        }
105    
106        // -------------------------------------------------------------------------------------------------- Public Methods
107    
108        @Override
109        public boolean hasNext() {
110            return objects.hasNext();
111        }
112    
113        @Override
114        public O next() {
115            return instantiateObject(objects.next());
116        }
117    
118        @Override
119        public void remove() {
120            objects.remove();
121        }
122    
123        // ----------------------------------------------------------------------------------------- Package Private Methods
124    
125        abstract Iterator<M> fetchObjects();
126    
127        abstract O instantiateObject(M model);
128    }