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 getInstanceLevelAssocTypeUri() {
043            return getModel().getInstanceLevelAssocTypeUri();
044        }
045    
046        @Override
047        public String getParentTypeUri() {
048            return getModel().getParentTypeUri();
049        }
050    
051        @Override
052        public String getChildTypeUri() {
053            return getModel().getChildTypeUri();
054        }
055    
056        @Override
057        public String getParentCardinalityUri() {
058            return getModel().getParentCardinalityUri();
059        }
060    
061        @Override
062        public String getChildCardinalityUri() {
063            return getModel().getChildCardinalityUri();
064        }
065    
066        @Override
067        public ViewConfiguration getViewConfig() {
068            return viewConfig;
069        }
070    
071        // ---
072    
073        @Override
074        public AssociationDefinitionModel getModel() {
075            return (AssociationDefinitionModel) super.getModel();
076        }
077    
078        // ---
079    
080        @Override
081        public void setParentCardinalityUri(String parentCardinalityUri) {
082            // update memory
083            getModel().setParentCardinalityUri(parentCardinalityUri);
084            // update DB
085            dms.typeStorage.storeParentCardinalityUri(getId(), parentCardinalityUri);
086        }
087    
088        @Override
089        public void setChildCardinalityUri(String childCardinalityUri) {
090            // update memory
091            getModel().setChildCardinalityUri(childCardinalityUri);
092            // update DB
093            dms.typeStorage.storeChildCardinalityUri(getId(), childCardinalityUri);
094        }
095    
096    
097    
098        // === Updating ===
099    
100        @Override
101        public void update(AssociationDefinitionModel newModel) {
102            // assoc type
103            updateAssocTypeUri(newModel);
104            // cardinality
105            updateParentCardinality(newModel.getParentCardinalityUri());
106            updateChildCardinality(newModel.getChildCardinalityUri());
107        }
108    
109        // ------------------------------------------------------------------------------------------------- Private Methods
110    
111    
112    
113        // === Update ===
114    
115        private void updateAssocTypeUri(AssociationDefinitionModel newModel) {
116            String newTypeUri = newModel.getTypeUri();
117            // abort if no update is requested
118            if (newTypeUri == null) {
119                return;
120            }
121            //
122            String typeUri = getTypeUri();
123            if (!typeUri.equals(newTypeUri)) {
124                super.update(newModel);
125            }
126        }
127    
128        // ---
129    
130        private void updateParentCardinality(String newParentCardinalityUri) {
131            // abort if no update is requested
132            if (newParentCardinalityUri == null) {
133                return;
134            }
135            //
136            String parentCardinalityUri = getParentCardinalityUri();
137            if (!parentCardinalityUri.equals(newParentCardinalityUri)) {
138                logger.info("### Changing parent cardinality URI from \"" + parentCardinalityUri + "\" -> \"" +
139                    newParentCardinalityUri + "\"");
140                setParentCardinalityUri(newParentCardinalityUri);
141            }
142        }
143    
144        private void updateChildCardinality(String newChildCardinalityUri) {
145            // abort if no update is requested
146            if (newChildCardinalityUri == null) {
147                return;
148            }
149            //
150            String childCardinalityUri = getChildCardinalityUri();
151            if (!childCardinalityUri.equals(newChildCardinalityUri)) {
152                logger.info("### Changing child cardinality URI from \"" + childCardinalityUri + "\" -> \"" +
153                    newChildCardinalityUri + "\"");
154                setChildCardinalityUri(newChildCardinalityUri);
155            }
156        }
157    
158    
159    
160        // === Attached Object Cache ===
161    
162        private void initViewConfig() {
163            RoleModel configurable = dms.typeStorage.createConfigurableAssocDef(getId());   // ### ID is uninitialized
164            this.viewConfig = new AttachedViewConfiguration(configurable, getModel().getViewConfigModel(), dms);
165        }
166    }