package de.deepamehta.geomaps.model; import de.deepamehta.core.JSONEnabled; import de.deepamehta.core.RelatedTopic; import de.deepamehta.core.Topic; import de.deepamehta.core.model.TopicModel; import de.deepamehta.core.service.CoreService; import de.deepamehta.core.util.DeepaMehtaUtils; import org.codehaus.jettison.json.JSONObject; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.logging.Logger; /** * A geomap model: a collection of Geo Coordinate topic models. * <p> * Features: * - load from DB (by constructor). * - Serialization to JSON. */ public class Geomap implements Iterable<TopicModel>, JSONEnabled { // ---------------------------------------------------------------------------------------------- Instance Variables protected Topic geomapTopic; protected Map<Long, TopicModel> geoCoords = new HashMap(); protected CoreService dm4; private Logger logger = Logger.getLogger(getClass().getName()); // ---------------------------------------------------------------------------------------------------- Constructors /** * Loads a topicmap from the DB. */ public Geomap(long geomapId, CoreService dm4) { logger.info("Loading geomap " + geomapId); // Note: a Geomap is not a DeepaMehtaObject. So the JerseyResponseFilter's automatic // child topic loading is not applied. We must load the child topics manually here. this.geomapTopic = dm4.getTopic(geomapId).loadChildTopics(); this.dm4 = dm4; // fetchGeoCoordinates(); } // -------------------------------------------------------------------------------------------------- Public Methods public long getId() { return geomapTopic.getId(); } // ### TODO: needed? public boolean containsTopic(long geoCoordId) { return geoCoords.get(geoCoordId) != null; } // --- @Override public JSONObject toJSON() { try { return new JSONObject() .put("info", geomapTopic.toJSON()) .put("topics", DeepaMehtaUtils.toJSONArray(geoCoords.values())); } catch (Exception e) { throw new RuntimeException("Serialization failed (" + this + ")", e); } } @Override public Iterator<TopicModel> iterator() { return geoCoords.values().iterator(); } @Override public String toString() { return "geomap " + getId(); } // ------------------------------------------------------------------------------------------------- Private Methods private void fetchGeoCoordinates() { for (Topic geoCoord : fetchGeoCoordinates(geomapTopic)) { geoCoords.put(geoCoord.getId(), geoCoord.getModel()); } } private List<RelatedTopic> fetchGeoCoordinates(Topic geomapTopic) { return DeepaMehtaUtils.loadChildTopics(geomapTopic.getRelatedTopics("dm4.geomaps.geotopic_mapcontext", "dm4.core.default", "dm4.topicmaps.topicmap_topic", "dm4.geomaps.geo_coordinate")); } }