001package de.deepamehta.core.impl;
002
003import de.deepamehta.core.Topic;
004import de.deepamehta.core.ViewConfiguration;
005import de.deepamehta.core.model.RoleModel;
006import de.deepamehta.core.model.TopicModel;
007import de.deepamehta.core.model.ViewConfigurationModel;
008
009import java.util.HashMap;
010import java.util.Map;
011
012
013
014/**
015 * A view configuration that is attached to the {@link DeepaMehtaService}.
016 */
017class AttachedViewConfiguration implements ViewConfiguration {
018
019    // ---------------------------------------------------------------------------------------------- Instance Variables
020
021    private Map<String, Topic> configTopics = new HashMap();    // attached object cache
022
023    private final ViewConfigurationModel model;                 // underlying model
024    private final RoleModel configurable;
025
026    private final EmbeddedService dms;
027
028    // ---------------------------------------------------------------------------------------------------- Constructors
029
030    AttachedViewConfiguration(RoleModel configurable, ViewConfigurationModel model, EmbeddedService dms) {
031        this.configurable = configurable;
032        this.model = model;
033        this.dms = dms;
034        initConfigTopics();
035    }
036
037    // -------------------------------------------------------------------------------------------------- Public Methods
038
039    // === ViewConfiguration Implementation ===
040
041    @Override
042    public Iterable<Topic> getConfigTopics() {
043        return configTopics.values();
044    }
045
046    @Override
047    public void addSetting(String configTypeUri, String settingUri, Object value) {
048        Topic configTopic = getConfigTopic(configTypeUri);
049        if (configTopic == null) {
050            // update DB
051            configTopic = dms.typeStorage.storeViewConfigTopic(configurable, new TopicModel(configTypeUri));
052            // update memory
053            model.addConfigTopic(configTopic.getModel());
054            // update attached object cache
055            addConfigTopic(configTopic);
056        }
057        configTopic.getChildTopics().set(settingUri, value);
058    }
059
060    @Override
061    public void updateConfigTopic(TopicModel configTopic) {
062        model.updateConfigTopic(configTopic);
063    }
064
065    // ---
066
067    @Override
068    public ViewConfigurationModel getModel() {
069        return model;
070    }
071
072    // ------------------------------------------------------------------------------------------------- Private Methods
073
074    private void initConfigTopics() {
075        for (TopicModel configTopic : model.getConfigTopics()) {
076            addConfigTopic(new AttachedTopic(configTopic, dms));
077        }
078    }
079
080    // ---
081
082    private Topic getConfigTopic(String configTypeUri) {
083        return configTopics.get(configTypeUri);
084    }
085
086    private void addConfigTopic(Topic configTopic) {
087        configTopics.put(configTopic.getTypeUri(), configTopic);
088    }
089}