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 }