001    package de.deepamehta.core.impl;
002    
003    import de.deepamehta.core.AssociationDefinition;
004    import de.deepamehta.core.ViewConfiguration;
005    import de.deepamehta.core.model.AssociationDefinitionModel;
006    import de.deepamehta.core.model.RoleModel;
007    import de.deepamehta.core.model.TopicModel;
008    import de.deepamehta.core.service.ClientState;
009    import de.deepamehta.core.service.Directives;
010    
011    import java.util.logging.Logger;
012    
013    
014    
015    /**
016     * An association definition that is attached to the {@link DeepaMehtaService}.
017     */
018    class AttachedAssociationDefinition extends AttachedAssociation implements AssociationDefinition {
019    
020        // ---------------------------------------------------------------------------------------------- Instance Variables
021    
022        private AttachedViewConfiguration viewConfig;   // attached object cache
023    
024        private Logger logger = Logger.getLogger(getClass().getName());
025    
026        // ---------------------------------------------------------------------------------------------------- Constructors
027    
028        AttachedAssociationDefinition(AssociationDefinitionModel model, EmbeddedService dms) {
029            super(model, dms);
030            initViewConfig();
031        }
032    
033        // -------------------------------------------------------------------------------------------------- Public Methods
034    
035    
036    
037        // ********************************************
038        // *** AssociationDefinition Implementation ***
039        // ********************************************
040    
041    
042    
043        @Override
044        public String getInstanceLevelAssocTypeUri() {
045            return getModel().getInstanceLevelAssocTypeUri();
046        }
047    
048        @Override
049        public String getParentTypeUri() {
050            return getModel().getParentTypeUri();
051        }
052    
053        @Override
054        public String getChildTypeUri() {
055            return getModel().getChildTypeUri();
056        }
057    
058        @Override
059        public String getParentCardinalityUri() {
060            return getModel().getParentCardinalityUri();
061        }
062    
063        @Override
064        public String getChildCardinalityUri() {
065            return getModel().getChildCardinalityUri();
066        }
067    
068        @Override
069        public ViewConfiguration getViewConfig() {
070            return viewConfig;
071        }
072    
073        // ---
074    
075        @Override
076        public AssociationDefinitionModel getModel() {
077            return (AssociationDefinitionModel) super.getModel();
078        }
079    
080        // ---
081    
082        @Override
083        public void setParentCardinalityUri(String parentCardinalityUri, ClientState clientState, Directives directives) {
084            // update memory
085            getModel().setParentCardinalityUri(parentCardinalityUri);
086            // update DB
087            dms.typeStorage.storeParentCardinalityUri(getId(), parentCardinalityUri);
088        }
089    
090        @Override
091        public void setChildCardinalityUri(String childCardinalityUri, ClientState clientState, Directives directives) {
092            // update memory
093            getModel().setChildCardinalityUri(childCardinalityUri);
094            // update DB
095            dms.typeStorage.storeChildCardinalityUri(getId(), childCardinalityUri);
096        }
097    
098    
099    
100        // === Updating ===
101    
102        @Override
103        public void update(AssociationDefinitionModel newModel, ClientState clientState, Directives directives) {
104            // assoc type
105            updateAssocTypeUri(newModel, clientState, directives);
106            // cardinality
107            updateParentCardinality(newModel.getParentCardinalityUri(), clientState, directives);
108            updateChildCardinality(newModel.getChildCardinalityUri(), clientState, directives);
109        }
110    
111        // ------------------------------------------------------------------------------------------------- Private Methods
112    
113    
114    
115        // === Update ===
116    
117        private void updateAssocTypeUri(AssociationDefinitionModel newModel, ClientState clientState,
118                                                                             Directives directives) {
119            String newTypeUri = newModel.getTypeUri();
120            // abort if no update is requested
121            if (newTypeUri == null) {
122                return;
123            }
124            //
125            String typeUri = getTypeUri();
126            if (!typeUri.equals(newTypeUri)) {
127                super.update(newModel, clientState, directives);
128            }
129        }
130    
131        // ---
132    
133        private void updateParentCardinality(String newParentCardinalityUri, ClientState clientState,
134                                                                             Directives directives) {
135            // abort if no update is requested
136            if (newParentCardinalityUri == null) {
137                return;
138            }
139            //
140            String parentCardinalityUri = getParentCardinalityUri();
141            if (!parentCardinalityUri.equals(newParentCardinalityUri)) {
142                logger.info("### Changing parent cardinality URI from \"" + parentCardinalityUri + "\" -> \"" +
143                    newParentCardinalityUri + "\"");
144                setParentCardinalityUri(newParentCardinalityUri, clientState, directives);
145            }
146        }
147    
148        private void updateChildCardinality(String newChildCardinalityUri, ClientState clientState,
149                                                                           Directives directives) {
150            // abort if no update is requested
151            if (newChildCardinalityUri == null) {
152                return;
153            }
154            //
155            String childCardinalityUri = getChildCardinalityUri();
156            if (!childCardinalityUri.equals(newChildCardinalityUri)) {
157                logger.info("### Changing child cardinality URI from \"" + childCardinalityUri + "\" -> \"" +
158                    newChildCardinalityUri + "\"");
159                setChildCardinalityUri(newChildCardinalityUri, clientState, directives);
160            }
161        }
162    
163    
164    
165        // === Attached Object Cache ===
166    
167        private void initViewConfig() {
168            RoleModel configurable = dms.typeStorage.createConfigurableAssocDef(getId());   // ### ID is uninitialized
169            this.viewConfig = new AttachedViewConfiguration(configurable, getModel().getViewConfigModel(), dms);
170        }
171    }