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 final RoleModel configurable;
022        private final ViewConfigurationModel model;
023        private final EmbeddedService dms;
024    
025        private Map<String, Topic> configTopics = new HashMap();    // attached object cache
026    
027        // ---------------------------------------------------------------------------------------------------- Constructors
028    
029        AttachedViewConfiguration(RoleModel configurable, ViewConfigurationModel model, EmbeddedService dms) {
030            this.configurable = configurable;
031            this.model = model;
032            this.dms = dms;
033            initConfigTopics();
034        }
035    
036        // -------------------------------------------------------------------------------------------------- Public Methods
037    
038        // === ViewConfiguration Implementation ===
039    
040        @Override
041        public Iterable<Topic> getConfigTopics() {
042            return configTopics.values();
043        }
044    
045        @Override
046        public void addSetting(String configTypeUri, String settingUri, Object value) {
047            // update memory
048            TopicModel createdTopicModel = model.addSetting(configTypeUri, settingUri, value);
049            // update DB
050            if (createdTopicModel != null) {
051                // attached object cache
052                addConfigTopic(createdTopicModel);
053                // Note: a new created view config topic model needs an ID (required for setting up access control).
054                // So, the storage layer must operate on that very topic model (instead of creating another one).
055                dms.typeStorage.storeViewConfigTopic(configurable, createdTopicModel);
056            } else {
057                dms.typeStorage.storeViewConfigSetting(configurable, configTypeUri, settingUri, value);
058            }
059        }
060    
061        @Override
062        public void updateConfigTopic(TopicModel configTopic) {
063            model.updateConfigTopic(configTopic);
064        }
065    
066        // ---
067    
068        @Override
069        public ViewConfigurationModel getModel() {
070            return model;
071        }
072    
073        // ------------------------------------------------------------------------------------------------- Private Methods
074    
075        private void initConfigTopics() {
076            for (TopicModel configTopic : model.getConfigTopics()) {
077                addConfigTopic(configTopic);
078            }
079        }
080    
081        private void addConfigTopic(TopicModel configTopic) {
082                configTopics.put(configTopic.getTypeUri(), new AttachedTopic(configTopic, dms));
083        }
084    }