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 }