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            if (newTypeUri == null) {
121                return;
122            }
123            //
124            String typeUri = getTypeUri();
125            if (!typeUri.equals(newTypeUri)) {
126                super.update(newModel, clientState, directives);
127            }
128        }
129    
130        // ---
131    
132        private void updateParentCardinality(String newParentCardinalityUri, ClientState clientState,
133                                                                             Directives directives) {
134            if (newParentCardinalityUri == null) {
135                return;
136            }
137            //
138            String parentCardinalityUri = getParentCardinalityUri();
139            if (!parentCardinalityUri.equals(newParentCardinalityUri)) {
140                logger.info("### Changing parent cardinality URI from \"" + parentCardinalityUri + "\" -> \"" +
141                    newParentCardinalityUri + "\"");
142                setParentCardinalityUri(newParentCardinalityUri, clientState, directives);
143            }
144        }
145    
146        private void updateChildCardinality(String newChildCardinalityUri, ClientState clientState,
147                                                                           Directives directives) {
148            if (newChildCardinalityUri == null) {
149                return;
150            }
151            //
152            String childCardinalityUri = getChildCardinalityUri();
153            if (!childCardinalityUri.equals(newChildCardinalityUri)) {
154                logger.info("### Changing child cardinality URI from \"" + childCardinalityUri + "\" -> \"" +
155                    newChildCardinalityUri + "\"");
156                setChildCardinalityUri(newChildCardinalityUri, clientState, directives);
157            }
158        }
159    
160    
161    
162        // === Attached Object Cache ===
163    
164        private void initViewConfig() {
165            RoleModel configurable = dms.typeStorage.createConfigurableAssocDef(getId());   // ### ID is uninitialized
166            this.viewConfig = new AttachedViewConfiguration(configurable, getModel().getViewConfigModel(), dms);
167        }
168    }