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