001package de.deepamehta.core.impl;
002
003import de.deepamehta.core.AssociationDefinition;
004import de.deepamehta.core.ViewConfiguration;
005import de.deepamehta.core.model.AssociationDefinitionModel;
006import de.deepamehta.core.model.RoleModel;
007import de.deepamehta.core.model.TopicModel;
008
009import java.util.logging.Logger;
010
011
012
013/**
014 * An association definition that is attached to the {@link DeepaMehtaService}.
015 */
016class 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}