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 }