001    package de.deepamehta.plugins.geomaps.model;
002    
003    import de.deepamehta.core.JSONEnabled;
004    import de.deepamehta.core.RelatedTopic;
005    import de.deepamehta.core.Topic;
006    import de.deepamehta.core.model.TopicModel;
007    import de.deepamehta.core.service.DeepaMehtaService;
008    import de.deepamehta.core.service.ResultList;
009    import de.deepamehta.core.util.DeepaMehtaUtils;
010    
011    import org.codehaus.jettison.json.JSONObject;
012    
013    import java.util.HashMap;
014    import java.util.Iterator;
015    import java.util.Map;
016    import java.util.logging.Logger;
017    
018    
019    
020    /**
021     * A geomap model: a collection of Geo Coordinate topic models.
022     * <p>
023     * Features:
024     * - load from DB (by constructor).
025     * - Serialization to JSON.
026     */
027    public class Geomap implements Iterable<TopicModel>, JSONEnabled {
028    
029        // ---------------------------------------------------------------------------------------------- Instance Variables
030    
031        protected Topic geomapTopic;
032        protected Map<Long, TopicModel> geoCoords = new HashMap();
033    
034        protected DeepaMehtaService dms;
035    
036        private Logger logger = Logger.getLogger(getClass().getName());
037    
038        // ---------------------------------------------------------------------------------------------------- Constructors
039    
040        /**
041         * Loads a topicmap from the DB.
042         */
043        public Geomap(long geomapId, DeepaMehtaService dms) {
044            this.geomapTopic = dms.getTopic(geomapId, true);        // fetchComposite=true
045            this.dms = dms;
046            //
047            logger.info("Loading geomap " + getId());
048            fetchGeoCoordinates();
049        }
050    
051        // -------------------------------------------------------------------------------------------------- Public Methods
052    
053        public long getId() {
054            return geomapTopic.getId();
055        }
056    
057        // ### TODO: needed?
058        public boolean containsTopic(long geoCoordId) {
059            return geoCoords.get(geoCoordId) != null;
060        }
061    
062        // ---
063    
064        @Override
065        public JSONObject toJSON() {
066            try {
067                JSONObject topicmap = new JSONObject();
068                topicmap.put("info", geomapTopic.toJSON());
069                topicmap.put("topics", DeepaMehtaUtils.objectsToJSON(geoCoords.values()));
070                return topicmap;
071            } catch (Exception e) {
072                throw new RuntimeException("Serialization failed (" + this + ")", e);
073            }
074        }
075    
076        @Override
077        public Iterator<TopicModel> iterator() {
078            return geoCoords.values().iterator();
079        }
080    
081        @Override
082        public String toString() {
083            return "geomap " + getId();
084        }
085    
086        // ------------------------------------------------------------------------------------------------- Private Methods
087    
088        private void fetchGeoCoordinates() {
089            for (Topic geoCoord : fetchGeoCoordinates(geomapTopic, true)) {   // fetchComposite=true
090                geoCoords.put(geoCoord.getId(), geoCoord.getModel());
091            }
092        }
093    
094        private ResultList<RelatedTopic> fetchGeoCoordinates(Topic geomapTopic, boolean fetchComposite) {
095            return geomapTopic.getRelatedTopics("dm4.geomaps.geotopic_mapcontext", "dm4.core.default",
096                "dm4.topicmaps.topicmap_topic", "dm4.geomaps.geo_coordinate", fetchComposite, false, 0);
097                // fetchRelatingComposite=false, maxResultSize=0, clientContext=null
098        }
099    }