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}