001package de.deepamehta.core.impl;
002
003import de.deepamehta.core.Association;
004import de.deepamehta.core.DeepaMehtaObject;
005import de.deepamehta.core.RelatedAssociation;
006import de.deepamehta.core.RelatedObject;
007import de.deepamehta.core.RelatedTopic;
008import de.deepamehta.core.Role;
009import de.deepamehta.core.Topic;
010import de.deepamehta.core.TopicRole;
011import de.deepamehta.core.model.AssociationModel;
012import de.deepamehta.core.model.RoleModel;
013import de.deepamehta.core.model.TopicRoleModel;
014
015import java.util.List;
016
017import java.util.logging.Logger;
018
019
020
021/**
022 * An association model that is attached to the DB.
023 */
024class AssociationImpl extends DeepaMehtaObjectImpl implements Association {
025
026    // ---------------------------------------------------------------------------------------------- Instance Variables
027
028    private final Logger logger = Logger.getLogger(getClass().getName());
029
030    // ---------------------------------------------------------------------------------------------------- Constructors
031
032    AssociationImpl(AssociationModelImpl model, PersistenceLayer pl) {
033        super(model, pl);
034    }
035
036    // -------------------------------------------------------------------------------------------------- Public Methods
037
038
039
040    // **********************************
041    // *** Association Implementation ***
042    // **********************************
043
044
045
046    @Override
047    public final Role getRole1() {
048        return getModel().getRoleModel1().instantiate(getModel());
049    }
050
051    @Override
052    public final Role getRole2() {
053        return getModel().getRoleModel2().instantiate(getModel());
054    }
055
056    // ---
057
058    @Override
059    public final DeepaMehtaObject getPlayer1() {
060        return getRole1().getPlayer();
061    }
062
063    @Override
064    public final DeepaMehtaObject getPlayer2() {
065        return getRole2().getPlayer();
066    }
067
068    // --- Convenience Methods ---
069
070    @Override
071    public final Role getRole(String roleTypeUri) {
072        return getModel().getRoleModel(roleTypeUri).instantiate(getModel());
073    }
074
075    @Override
076    public final boolean hasSameRoleTypeUris() {
077        return getModel().hasSameRoleTypeUris();
078    }
079
080    @Override
081    public final boolean matches(String roleTypeUri1, long playerId1, String roleTypeUri2, long playerId2) {
082        return getModel().matches(roleTypeUri1, playerId1, roleTypeUri2, playerId2);
083    }
084
085    @Override
086    public final long getOtherPlayerId(long id) {
087        return getModel().getOtherPlayerId(id);
088    }
089
090    // ---
091
092    @Override
093    public final RelatedObject getPlayer(String roleTypeUri) {
094        DeepaMehtaObjectModelImpl object = getModel().getPlayer(roleTypeUri);
095        return object != null ? (RelatedObject) object.instantiate() : null;    // ### TODO: permission check?
096    }
097
098    @Override
099    public final Topic getTopicByType(String topicTypeUri) {
100        TopicModelImpl topic = getModel().getTopicByType(topicTypeUri);
101        return topic != null ? topic.instantiate() : null;                      // ### TODO: permission check?
102    }
103
104    // ---
105
106    // ### TODO: make use of model's getRole()
107    @Override
108    public final Role getRole(RoleModel roleModel) {
109        if (getRole1().getModel().refsSameObject(roleModel)) {
110            return getRole1();
111        } else if (getRole2().getModel().refsSameObject(roleModel)) {
112            return getRole2();
113        }
114        throw new RuntimeException("Role is not part of association (role=" + roleModel + ", association=" + this);
115    }
116
117    @Override
118    public final boolean isPlayer(TopicRoleModel roleModel) {
119        return filterRole(getRole1(), roleModel) != null || filterRole(getRole2(), roleModel) != null;
120    }
121
122    // ---
123
124    @Override
125    public final void update(AssociationModel updateModel) {
126        pl.updateAssociation(getModel(), (AssociationModelImpl) updateModel);
127    }
128
129    @Override
130    public final void delete() {
131        pl.deleteAssociation(getModel());
132    }
133
134    // ---
135
136    @Override
137    public final Association loadChildTopics() {
138        model.loadChildTopics();
139        return this;
140    }
141
142    @Override
143    public final Association loadChildTopics(String assocDefUri) {
144        model.loadChildTopics(assocDefUri);
145        return this;
146    }
147
148    // ---
149
150    // Note: overridden by RelatedAssociationImpl
151    @Override
152    public AssociationModelImpl getModel() {
153        return (AssociationModelImpl) model;
154    }
155
156
157
158    // ***************************************
159    // *** DeepaMehtaObject Implementation ***
160    // ***************************************
161
162
163
164    // === Traversal ===
165
166    // ### TODO: move logic to model
167
168    // --- Topic Retrieval ---
169
170    @Override
171    public final List<RelatedTopic> getRelatedTopics(List assocTypeUris, String myRoleTypeUri, String othersRoleTypeUri,
172                                                                                         String othersTopicTypeUri) {
173        List<RelatedTopicModelImpl> topics = pl.fetchAssociationRelatedTopics(getId(), assocTypeUris, myRoleTypeUri,
174            othersRoleTypeUri, othersTopicTypeUri);
175        return pl.checkReadAccessAndInstantiate(topics);
176    }
177
178    // --- Association Retrieval ---
179
180    @Override
181    public final RelatedAssociation getRelatedAssociation(String assocTypeUri, String myRoleTypeUri,
182                                                    String othersRoleTypeUri, String othersAssocTypeUri) {
183        RelatedAssociationModelImpl assoc = pl.fetchAssociationRelatedAssociation(getId(),
184            assocTypeUri, myRoleTypeUri, othersRoleTypeUri, othersAssocTypeUri);
185        return assoc != null ? pl.<RelatedAssociation>checkReadAccessAndInstantiate(assoc) : null;
186    }
187
188    @Override
189    public final List<RelatedAssociation> getRelatedAssociations(String assocTypeUri, String myRoleTypeUri,
190                                                           String othersRoleTypeUri, String othersAssocTypeUri) {
191        List<RelatedAssociationModelImpl> assocs = pl.fetchAssociationRelatedAssociations(getId(), assocTypeUri,
192            myRoleTypeUri, othersRoleTypeUri, othersAssocTypeUri);
193        return pl.checkReadAccessAndInstantiate(assocs);
194    }
195
196    // ---
197
198    @Override
199    public final Association getAssociation(String assocTypeUri, String myRoleTypeUri, String othersRoleTypeUri,
200                                                                                 long othersTopicId) {
201        AssociationModelImpl assoc = pl.fetchAssociationBetweenTopicAndAssociation(assocTypeUri,
202            othersTopicId, getId(), othersRoleTypeUri, myRoleTypeUri);
203        return assoc != null ? pl.<Association>checkReadAccessAndInstantiate(assoc) : null;
204    }
205
206    @Override
207    public final List<Association> getAssociations() {
208        return pl.checkReadAccessAndInstantiate(pl.fetchAssociationAssociations(getId()));
209    }
210
211
212
213    // ------------------------------------------------------------------------------------------------- Private Methods
214
215    // --- Helper ---
216
217    // ### TODO: move to model
218    private final TopicRole filterRole(Role role, TopicRoleModel roleModel) {
219        return role instanceof TopicRole && role.getRoleTypeUri().equals(roleModel.getRoleTypeUri()) &&
220            role.getPlayerId() == roleModel.getPlayerId() ? (TopicRole) role : null;
221    }
222}