Author: lgiessmann Date: Mon Aug 22 13:52:07 2011 New Revision: 774
Log: gdl-frontend: Widgets: finalised the filtering of consuming user data in GdlAssociationView
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TestClass.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java Mon Aug 22 10:53:48 2011 (r773) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java Mon Aug 22 13:52:07 2011 (r774) @@ -46,6 +46,8 @@ public final static String tmclConstrainedTopicType = tmcl + "constrained-topic-type"; public final static String tmclConstrainedRole = tmcl + "constrained-role"; public final static String tmclRoleCombinationConstraint = tmcl + "role-combination-constraint"; + public final static String tmclOtherConstrainedTopicType = tmcl + "other-constrained-topic-type"; + public final static String tmclOtherConstrainedRole = tmcl + "other-constrained-role"; }
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TestClass.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TestClass.java Mon Aug 22 10:53:48 2011 (r773) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TestClass.java Mon Aug 22 13:52:07 2011 (r774) @@ -1,7 +1,6 @@ package us.isidor.gdl.anaToMia.Widgets.base;
-import java.util.ArrayList;
import us.isidor.gdl.anaToMia.TmEngine.jtmsBasedEngine.JtmsTmEngine; import us.isidor.gdl.anaToMia.Widgets.environment.Pair;
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Mon Aug 22 10:53:48 2011 (r773) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Mon Aug 22 13:52:07 2011 (r774) @@ -656,14 +656,42 @@ Topic constraintRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); Topic constrainedTopicTypeAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedTopicType, tm); Topic constrainedRoleType = getTopicByPsi(PSIs.TMCL.tmclConstrained, tm); - Topic topicType = getTopicByPsi(PSIs.TMCL.tmclTopictype, tm); - ArrayList<Topic> result = getOtherPlayerOfBinaryAssociation(topicRoleConstraint, constraintRoleType, constrainedTopicTypeAssocType, null, topicType, constrainedRoleType); + ArrayList<Topic> result = getOtherPlayerOfBinaryAssociation(topicRoleConstraint, constraintRoleType, constrainedTopicTypeAssocType, null, constrainedRoleType); if(result.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(topicRoleConstraint) + " must be bound exactly once to a topic-type via a " + PSIs.TMCL.tmclConstrainedTopicType + " association, but is bound: " + result.size()); else return new Pair<Topic, Topic>(getConstraintRoleOfConstraint(topicRoleConstraint), result.get(0)); } + // return a pair that contains again two pair instances, whereas each pair + // represents a role type and a role player. The outer pair represents a valid + // combination of roles of a role-combination-constraint. + public static Pair<Pair<Topic, Topic>, Pair<Topic, Topic>> getRoleCombinationsOfConstraint(Topic roleCombinationconstraint) throws InvalidGdlSchemaException { + if(roleCombinationconstraint == null) return null; + + TopicMap tm = roleCombinationconstraint.getTopicMap(); + Topic constraintRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); + Topic constrainedRoleAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedRole, tm); + Topic constrainedRoleType = getTopicByPsi(PSIs.TMCL.tmclConstrained, tm); + ArrayList<Topic> roleTypes = getOtherPlayerOfBinaryAssociation(roleCombinationconstraint, constraintRoleType, constrainedRoleAssocType, null, constrainedRoleType); + if(roleTypes.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(roleCombinationconstraint) + " must be bound exactly once to a role-type via a " + PSIs.TMCL.tmclConstrainedRole + ", but is: " + roleTypes.size()); + Topic constrainedTopicTypeAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedTopicType, tm); + ArrayList<Topic> playerTypes = getOtherPlayerOfBinaryAssociation(roleCombinationconstraint, constraintRoleType, constrainedTopicTypeAssocType, null, constrainedRoleType); + if(playerTypes.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(roleCombinationconstraint) + " must be bound exactly once to a topic-type via a " + PSIs.TMCL.tmclConstrainedTopicType + ", but is: " + playerTypes.size()); + + Topic otherConstrainedRoleAssocType = getTopicByPsi(PSIs.TMCL.tmclOtherConstrainedRole, tm); + ArrayList<Topic> otherRoleTypes = getOtherPlayerOfBinaryAssociation(roleCombinationconstraint, constraintRoleType, otherConstrainedRoleAssocType, null, constrainedRoleType); + if(otherRoleTypes.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(roleCombinationconstraint) + " must be bound exactly once to an other-role-type via a " + PSIs.TMCL.tmclOtherConstrainedRole + ", but is: " + otherRoleTypes.size()); + Topic otherConstrainedTopicTypeRoleType = getTopicByPsi(PSIs.TMCL.tmclOtherConstrainedTopicType, tm); + ArrayList<Topic> otherPlayerType = getOtherPlayerOfBinaryAssociation(roleCombinationconstraint, constraintRoleType, otherConstrainedTopicTypeRoleType, null, constrainedRoleType); + if(otherPlayerType.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(roleCombinationconstraint) + " must be bound exactly once to an other-topic-type via a " + PSIs.TMCL.tmclOtherConstrainedTopicType + ", but is: " + otherPlayerType.size()); + + Pair<Topic, Topic> firstRole = new Pair<Topic, Topic>(roleTypes.get(0), playerTypes.get(0)); + Pair<Topic, Topic> secondRole = new Pair<Topic, Topic>(otherRoleTypes.get(0), otherPlayerType.get(0)); + return new Pair<Pair<Topic,Topic>, Pair<Topic,Topic>>(firstRole, secondRole); + } + + // returns the topic that plays the role of tmcl:constrained in an association // of the type tmcl:constrained-statement that is bound to the passed topic // constrinatTopic that plays the role of tmcl:constraint
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Mon Aug 22 10:53:48 2011 (r773) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Mon Aug 22 13:52:07 2011 (r774) @@ -3,7 +3,6 @@ import java.util.ArrayList;
import com.google.gwt.core.client.JsArray; -import com.google.gwt.user.client.Window; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; @@ -26,6 +25,8 @@ private boolean roleAndPlayerTypesSet = false; private ArrayList<Topic> roleCombinationConstraints = new ArrayList<Topic>(); private boolean roleCombinationConstraintsSet = false; + private ArrayList<Pair<Pair<Topic, Topic>, Pair<Topic, Topic>>> validRoleCombinations = new ArrayList<Pair<Pair<Topic,Topic>,Pair<Topic,Topic>>>(); + private boolean validRoleCombinationsSet = false;
public GdlAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { @@ -181,11 +182,45 @@ }
- // returns all associations contained in the ArrayList allAssociations - // that are valid to the role-combination-constraints that belongs to this view - private ArrayList<Association> filterAssociationsByRoleCombinations(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { - // TODO: implement - return null; + // throws an InvalidGdlSchemaException if passed one association does not satisfy + // any defined role-combination-constraint + private void checkAssociationsByRoleCombinations(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { + if(this.getRoleCombinationConstraints().size() == 0) return; + + for (Association assoc : allAssociations) { + JsArray<Role> roles = assoc.getRoles(); + if(roles.length() != 2) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); + Role fstRole = roles.get(0); + Role sndRole = roles.get(1); + + int i = 0; + for ( ; i != this.getValidRoleCombinations().size(); ++i) { + Pair<Topic, Topic> fstCombi = this.getValidRoleCombinations().get(i).getFirst(); + Pair<Topic, Topic> sndCombi = this.getValidRoleCombinations().get(i).getSecond(); + + if(fstRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), fstCombi.getSecond()) && sndRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), sndCombi.getSecond())) break; + if(sndRole.getType().equals(fstCombi.getFirst()) && TmHelper.isInstanceOf(sndRole.getPlayer(), fstCombi.getSecond()) && fstRole.getType().equals(sndCombi.getFirst()) && TmHelper.isInstanceOf(fstRole.getPlayer(), sndCombi.getSecond())) break; + } + + if(i == this.getValidRoleCombinations().size()) throw new InvalidGdlSchemaException("the association " + assoc + " violates the defined role-combination-constrains"); + } + } + + + // Returns all valid role-player combinations for this association-view + public ArrayList<Pair<Pair<Topic, Topic>, Pair<Topic, Topic>>> getValidRoleCombinations() throws InvalidGdlSchemaException { + if(this.validRoleCombinationsSet){ + return this.validRoleCombinations; + } else { + this.validRoleCombinationsSet = true; + ArrayList<Pair<Pair<Topic, Topic>, Pair<Topic, Topic>>> roleCombinations = new ArrayList<Pair<Pair<Topic,Topic>,Pair<Topic,Topic>>>(); + for (Topic constraint : this.getRoleCombinationConstraints()) { + Pair<Pair<Topic, Topic>, Pair<Topic, Topic>> combination = TmHelper.getRoleCombinationsOfConstraint(constraint); + if(!roleCombinations.contains(combination)) roleCombinations.add(combination); + } + this.validRoleCombinations = roleCombinations; + return this.validRoleCombinations; + } } @@ -193,9 +228,8 @@ // must be represented by this association view private ArrayList<Association> filterAssociations() throws InvalidGdlSchemaException { ArrayList<Association> filteredAssociations = this.filterAssociationsByType(); - filteredAssociations = filterAssociationsByRoleAndPlayerTypes(filteredAssociations); - filteredAssociations = filterAssociationsByRoleCombinations(filteredAssociations); - + filteredAssociations = this.filterAssociationsByRoleAndPlayerTypes(filteredAssociations); + this.checkAssociationsByRoleCombinations(filteredAssociations); this.associationsToRepresent = filteredAssociations; this.associationsToRepresentSet = true; return this.associationsToRepresent; @@ -204,7 +238,7 @@ // Returns the associations that are represented by this associaton-view public ArrayList<Association> getAssociationsToRepresent() throws InvalidGdlSchemaException { - if(this.associationsToRepresentSet) return this.associationsToRepresent; + if(this.associationsToRepresentSet) return this.associationsToRepresent; else return this.filterAssociations(); } }