001package de.deepamehta.core.model;
002
003import org.codehaus.jettison.json.JSONObject;
004import org.codehaus.jettison.json.JSONArray;
005
006import java.util.ArrayList;
007import java.util.HashMap;
008import java.util.List;
009import java.util.Map;
010import java.util.logging.Logger;
011
012
013
014/**
015 * @author <a href="mailto:jri@deepamehta.de">Jörg Richter</a>
016 */
017public class ViewConfigurationModel {
018
019    // ---------------------------------------------------------------------------------------------- Instance Variables
020
021    /**
022     * Key: config topic type URI
023     */
024    private Map<String, TopicModel> viewConfig = new HashMap();
025
026    // ---------------------------------------------------------------------------------------------------- Constructors
027
028    public ViewConfigurationModel() {
029    }
030
031    public ViewConfigurationModel(List<TopicModel> configTopics) {
032        for (TopicModel topic : configTopics) {
033            addConfigTopic(topic);
034        }
035    }
036
037    /**
038     * @param   configurable    A topic type, an association type, or an association definition.
039     *                          ### FIXME: the sole JSONArray should be passed
040     */
041    public ViewConfigurationModel(JSONObject configurable) {
042        try {
043            JSONArray topics = configurable.optJSONArray("view_config_topics");
044            if (topics != null) {
045                for (int i = 0; i < topics.length(); i++) {
046                    addConfigTopic(new TopicModel(topics.getJSONObject(i)));
047                }
048            }
049        } catch (Exception e) {
050            throw new RuntimeException("Parsing ViewConfigurationModel failed (JSONObject=" + configurable + ")", e);
051        }
052    }
053
054    // -------------------------------------------------------------------------------------------------- Public Methods
055
056    public Iterable<TopicModel> getConfigTopics() {
057        return viewConfig.values();
058    }
059
060    public void addConfigTopic(TopicModel configTopic) {
061        String configTypeUri = configTopic.getTypeUri();
062        // error check
063        if (getConfigTopic(configTypeUri) != null) {
064            throw new RuntimeException("There is already a view configuration topic of type \"" + configTypeUri + "\"");
065        }
066        //
067        viewConfig.put(configTypeUri, configTopic);
068    }
069
070    public void updateConfigTopic(TopicModel configTopic) {
071        String configTypeUri = configTopic.getTypeUri();
072        TopicModel confTopic = getConfigTopic(configTypeUri);
073        // error check
074        if (confTopic == null) {
075            throw new RuntimeException("There is no view configuration topic of type \"" + configTypeUri + "\"");
076        }
077        //
078        confTopic.set(configTopic);
079    }
080
081    // ---
082
083    /**
084     * FIXME: to be dropped.
085     * <p>
086     * Read out a view configuration setting.
087     * <p>
088     * Compare to client-side counterpart: function get_view_config() in webclient.js
089     *
090     * @param   configTypeUri   The type URI of the configuration topic, e.g. "dm4.webclient.view_config"
091     * @param   settingUri      The setting URI, e.g. "dm4.webclient.icon"
092     *
093     * @return  The setting value, or <code>null</code> if there is no such setting
094     */
095    public Object getSetting(String configTypeUri, String settingUri) {
096        TopicModel configTopic = getConfigTopic(configTypeUri);
097        if (configTopic == null) {
098            return null;
099        }
100        ChildTopicsModel childTopics = configTopic.getChildTopicsModel();
101        return childTopics.has(settingUri) ? childTopics.getObject(settingUri) : null;
102    }
103
104    // ---
105
106    // ### FIXME: drop parameter, implement JSONEnabled
107    public void toJSON(JSONObject configurable) {
108        try {
109            List viewConfigTopics = new ArrayList();
110            for (TopicModel configTopic : getConfigTopics()) {
111                viewConfigTopics.add(configTopic.toJSON());
112            }
113            configurable.put("view_config_topics", viewConfigTopics);
114        } catch (Exception e) {
115            throw new RuntimeException("Serialization failed (" + this + ")", e);
116        }
117    }
118
119    @Override
120    public String toString() {
121        return "view configuration " + viewConfig;
122    }
123
124    // ------------------------------------------------------------------------------------------------- Private Methods
125
126    private TopicModel getConfigTopic(String configTypeUri) {
127        return viewConfig.get(configTypeUri);
128    }
129}