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    class TopicIterable implements Iterable<Topic> {
015    
016        private Iterator<Topic> topics;
017    
018        TopicIterable(EmbeddedService dms) {
019            this.topics = new TopicIterator(dms);
020        }
021    
022        @Override
023        public Iterator<Topic> iterator() {
024            return topics;
025        }
026    }
027    
028    class AssociationIterable implements Iterable<Association> {
029    
030        private Iterator<Association> assocs;
031    
032        AssociationIterable(EmbeddedService dms) {
033            this.assocs = new AssociationIterator(dms);
034        }
035    
036        @Override
037        public Iterator<Association> iterator() {
038            return assocs;
039        }
040    }
041    
042    
043    
044    // ===
045    
046    
047    
048    class TopicIterator extends ObjectIterator<Topic, TopicModel> {
049    
050        TopicIterator(EmbeddedService dms) {
051            super(dms);
052        }
053    
054        @Override
055        Iterator<TopicModel> fetchObjects() {
056            return dms.storageDecorator.fetchAllTopics();
057        }
058    
059        @Override
060        Topic instantiateObject(TopicModel model) {
061            return dms.instantiateTopic(model, false);          // fetchComnposite=false
062        }
063    }
064    
065    
066    
067    class AssociationIterator extends ObjectIterator<Association, AssociationModel> {
068    
069        AssociationIterator(EmbeddedService dms) {
070            super(dms);
071        }
072    
073        @Override
074        Iterator<AssociationModel> fetchObjects() {
075            return dms.storageDecorator.fetchAllAssociations();
076        }
077    
078        @Override
079        Association instantiateObject(AssociationModel model) {
080            return dms.instantiateAssociation(model, false);    // fetchComnposite=false
081        }
082    }
083    
084    
085    
086    abstract class ObjectIterator<E extends DeepaMehtaObject, M extends DeepaMehtaObjectModel> implements Iterator<E> {
087    
088        // ---------------------------------------------------------------------------------------------- Instance Variables
089    
090        protected EmbeddedService dms;
091        private Iterator<M> objects;
092    
093        // ---------------------------------------------------------------------------------------------------- Constructors
094    
095        ObjectIterator(EmbeddedService dms) {
096            this.dms = dms;
097            this.objects = fetchObjects();
098        }
099    
100        // -------------------------------------------------------------------------------------------------- Public Methods
101    
102        @Override
103        public boolean hasNext() {
104            return objects.hasNext();
105        }
106    
107        @Override
108        public E next() {
109            return instantiateObject(objects.next());
110        }
111    
112        @Override
113        public void remove() {
114            objects.remove();
115        }
116    
117        // ----------------------------------------------------------------------------------------- Package Private Methods
118    
119        abstract Iterator<M> fetchObjects();
120    
121        abstract E instantiateObject(M model);
122    }