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.Map;
015    import java.util.logging.Logger;
016    
017    
018    
019    /**
020     * A geomap model: a collection of Geo Coordinate topics.
021     * <p>
022     * Features:
023     * - load from DB (by constructor).
024     * - Serialization to JSON.
025     */
026    public class Geomap implements JSONEnabled {
027    
028        // ---------------------------------------------------------------------------------------------- Instance Variables
029    
030        protected Topic geomapTopic;
031        protected Map<Long, TopicModel> topics = new HashMap();
032    
033        protected DeepaMehtaService dms;
034    
035        private Logger logger = Logger.getLogger(getClass().getName());
036    
037        // ---------------------------------------------------------------------------------------------------- Constructors
038    
039        /**
040         * Loads a topicmap from the DB.
041         */
042        public Geomap(long geomapId, DeepaMehtaService dms) {
043            this.geomapTopic = dms.getTopic(geomapId, true);        // fetchComposite=true
044            this.dms = dms;
045            //
046            logger.info("Loading geomap " + getId());
047            loadTopics();
048        }
049    
050        // -------------------------------------------------------------------------------------------------- Public Methods
051    
052        public long getId() {
053            return geomapTopic.getId();
054        }
055    
056        // ---
057    
058        public static ResultList<RelatedTopic> fetchGeomapTopics(long geomapId, DeepaMehtaService dms) {
059            Topic geomapTopic = dms.getTopic(geomapId, false);      // fetchComposite=false
060            return fetchGeomapTopics(geomapTopic, false);           // fetchComposite=false
061        }
062    
063        public boolean containsTopic(long topicId) {
064            return topics.get(topicId) != null;
065        }
066    
067        // ---
068    
069        @Override
070        public JSONObject toJSON() {
071            try {
072                JSONObject topicmap = new JSONObject();
073                topicmap.put("info", geomapTopic.toJSON());
074                topicmap.put("topics", DeepaMehtaUtils.objectsToJSON(topics.values()));
075                return topicmap;
076            } catch (Exception e) {
077                throw new RuntimeException("Serialization failed (" + this + ")", e);
078            }
079        }
080    
081        @Override
082        public String toString() {
083            return "geomap " + getId();
084        }
085    
086        // ------------------------------------------------------------------------------------------------- Private Methods
087    
088        private void loadTopics() {
089            ResultList<RelatedTopic> mapTopics = fetchGeomapTopics(geomapTopic, true);     // fetchComposite=true
090            for (RelatedTopic mapTopic : mapTopics) {
091                addTopic(mapTopic.getModel());
092            }
093        }
094    
095        private static ResultList<RelatedTopic> fetchGeomapTopics(Topic geomapTopic, boolean fetchComposite) {
096            return geomapTopic.getRelatedTopics("dm4.geomaps.geotopic_mapcontext", "dm4.core.default",
097                "dm4.topicmaps.topicmap_topic", "dm4.geomaps.geo_coordinate", fetchComposite, false, 0);
098                // fetchRelatingComposite=false, maxResultSize=0, clientContext=null
099        }
100    
101        private void addTopic(TopicModel topic) {
102            topics.put(topic.getId(), topic);
103        }
104    }