001    package de.deepamehta.core.impl;
002    
003    import de.deepamehta.core.Topic;
004    import de.deepamehta.core.ViewConfiguration;
005    import de.deepamehta.core.model.RoleModel;
006    import de.deepamehta.core.model.TopicModel;
007    import de.deepamehta.core.model.ViewConfigurationModel;
008    
009    import java.util.HashMap;
010    import java.util.Map;
011    
012    
013    
014    /**
015     * A view configuration that is attached to the {@link DeepaMehtaService}.
016     */
017    class 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    }