001    package de.kiezatlas;
002    
003    import de.deepamehta.core.JSONEnabled;
004    import de.deepamehta.core.Topic;
005    import de.deepamehta.core.RelatedTopic;
006    import de.deepamehta.core.util.DeepaMehtaUtils;
007    
008    import org.codehaus.jettison.json.JSONArray;
009    import org.codehaus.jettison.json.JSONObject;
010    
011    import java.util.List;
012    
013    
014    
015    /**
016     * A collection of Geo Objects as returned by the Kiezatlas service (a data transfer object).
017     * The Geo Objects are grouped by category, then grouped by criteria.
018     */
019    public class GroupedGeoObjects implements JSONEnabled {
020    
021        // ---------------------------------------------------------------------------------------------- Instance Variables
022    
023        private JSONObject json = new JSONObject();
024        private JSONArray criteriaResult = new JSONArray();
025        private JSONArray categoriesResult;
026        private long currentCriteriaId;
027    
028        // ---------------------------------------------------------------------------------------------------- Constructors
029    
030        GroupedGeoObjects(long clock) {
031            try {
032                json.put("items", criteriaResult);
033                json.put("clock", clock);
034            } catch (Exception e) {
035                throw new RuntimeException("Constructing a GroupedGeoObjects failed", e);
036            }
037        }
038    
039        // -------------------------------------------------------------------------------------------------- Public Methods
040    
041        void add(Topic criteria, Topic category, List<RelatedTopic> geoObjects) {
042            try {
043                // start new criteria
044                if (criteria.getId() != currentCriteriaId) {
045                    categoriesResult = new JSONArray();
046                    criteriaResult.put(new JSONObject()
047                        .put("criteria", criteria.toJSON())
048                        .put("categories", categoriesResult)
049                    );
050                    currentCriteriaId = criteria.getId();
051                }
052                //
053                categoriesResult.put(new JSONObject()
054                    .put("category", category.toJSON())
055                    .put("geo_objects", DeepaMehtaUtils.objectsToJSON(geoObjects))
056                );
057            } catch (Exception e) {
058                throw new RuntimeException("Adding items to a GroupedGeoObjects failed", e);
059            }
060        }
061    
062        @Override
063        public JSONObject toJSON() {
064            return json;
065        }
066    }