Author: lgiessmann Date: Mon Aug 22 10:53:48 2011 New Revision: 773
Log: gdl-frontend: Widgets: implemented filtering for GdlAssociationView, so only associations that are valid to the defined constraints of the GdlAssociationView are represented by this view, currently role-combination-constraints are not examined
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/Utils.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/TmHelper.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Mon Aug 22 09:00:17 2011 (r772) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Mon Aug 22 10:53:48 2011 (r773) @@ -633,7 +633,7 @@
// returns the constrained role-types of the passed constraint - public static Topic getConstraintRolesOfConstraint(Topic topicRoleOrAssociationRoleConstraint) throws InvalidGdlSchemaException { + public static Topic getConstraintRoleOfConstraint(Topic topicRoleOrAssociationRoleConstraint) throws InvalidGdlSchemaException { if(topicRoleOrAssociationRoleConstraint == null) return null; TopicMap tm = topicRoleOrAssociationRoleConstraint.getTopicMap(); @@ -648,6 +648,22 @@ } + // returns the constrained role and player types of the passed constraint + public static Pair<Topic, Topic> getConstraintRoleAndPlayerTypeOfConstraint(Topic topicRoleConstraint) throws InvalidGdlSchemaException { + if(topicRoleConstraint == null) return null; + + TopicMap tm = topicRoleConstraint.getTopicMap(); + 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); + + 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)); + } + + // 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/base/Utils.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Mon Aug 22 09:00:17 2011 (r772) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Mon Aug 22 10:53:48 2011 (r773) @@ -7,7 +7,6 @@ import com.google.gwt.dom.client.Element;
public class Utils { - // returns true if both arrays have the same items public static <T> boolean compareLists(ArrayList<T> lft, ArrayList<T> rgt){ if(lft == null && rgt == null) return true;
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 09:00:17 2011 (r772) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Mon Aug 22 10:53:48 2011 (r773) @@ -2,45 +2,44 @@
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; -import us.isidor.gdl.anaToMia.Widgets.base.PSIs; import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; -import us.isidor.gdl.anaToMia.Widgets.base.Utils; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; +import us.isidor.gdl.anaToMia.Widgets.environment.Pair;
public abstract class GdlAssociationView extends GdlView { protected ArrayList<Association> associationsToRepresent = null; + protected boolean associationsToRepresentSet = false; private ArrayList<Topic> associationRoleConstraints = new ArrayList<Topic>(); - private boolean associationRoleconstraintsSet = false; + private boolean associationRoleConstraintsSet = false; private ArrayList<Topic> topicRoleConstraints = new ArrayList<Topic>(); private boolean topicRoleConstraintsSet = false; private Topic associationType = null; private boolean associationTypeSet = false; - private ArrayList<Topic> roleTypes = new ArrayList<Topic>(); - private boolean roleTypesSet = false; + private ArrayList<Pair<Topic, Topic>> roleAndPlayerTypes = new ArrayList<Pair<Topic, Topic>>(); + private boolean roleAndPlayerTypesSet = false; private ArrayList<Topic> roleCombinationConstraints = new ArrayList<Topic>(); private boolean roleCombinationConstraintsSet = false;
public GdlAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { super(tmRepresentative, receivedData); - Window.alert("constraints: " +this.getRoleTypes().size() + " >> " + (this instanceof GdlEditorAssociationView)); - if(this instanceof GdlEditorAssociationView) this.associationsToRepresent = this.filterAssociations(); } // Return the association-role-constraints this view is bound to public ArrayList<Topic> getAssociationRoleConstraints() throws InvalidGdlSchemaException { - if(this.associationRoleconstraintsSet){ + if(this.associationRoleConstraintsSet){ return this.associationRoleConstraints; } else { - this.associationRoleconstraintsSet = true; + this.associationRoleConstraintsSet = true; this.associationRoleConstraints = TmHelper.getAssociationRoleConstraintsForView(this.tmRepresentative); return this.associationRoleConstraints; } @@ -75,24 +74,30 @@ // returns the role-types that are valid to be used // in associations of the type that is bound to this view - public ArrayList<Topic> getRoleTypes() throws InvalidGdlSchemaException { - if(this.roleTypesSet){ - return this.roleTypes; + public ArrayList<Pair<Topic, Topic>> getRoleAndPlayerTypes() throws InvalidGdlSchemaException { + if(this.roleAndPlayerTypesSet){ + return this.roleAndPlayerTypes; } else { - this.roleTypesSet = true; + this.roleAndPlayerTypesSet = true; ArrayList<Topic> roleTypesOfAssociationRoleConstraints = new ArrayList<Topic>(); for (Topic constraint : this.getAssociationRoleConstraints()){ - Topic top = TmHelper.getConstraintRolesOfConstraint(constraint); + Topic top = TmHelper.getConstraintRoleOfConstraint(constraint); if(!roleTypesOfAssociationRoleConstraints.contains(top)) roleTypesOfAssociationRoleConstraints.add(top); } - ArrayList<Topic> roleTypesOfTopicRoleConstraints = new ArrayList<Topic>(); + ArrayList<Pair<Topic, Topic>> roleTypesOfTopicRoleConstraints = new ArrayList<Pair<Topic, Topic>>(); for (Topic constraint : this.getTopicRoleConstraints()){ - Topic top = TmHelper.getConstraintRolesOfConstraint(constraint); - if(!roleTypesOfTopicRoleConstraints.contains(top)) roleTypesOfTopicRoleConstraints.add(top); + Pair<Topic, Topic> roleAndPlayerType = TmHelper.getConstraintRoleAndPlayerTypeOfConstraint(constraint); + if(!roleTypesOfTopicRoleConstraints.contains(roleAndPlayerType)) roleTypesOfTopicRoleConstraints.add(roleAndPlayerType); + } + + ArrayList<Pair<Topic, Topic>> result = new ArrayList<Pair<Topic,Topic>>(); + for (Pair<Topic, Topic> roleAndPlayerType : roleTypesOfTopicRoleConstraints) { + if(roleTypesOfAssociationRoleConstraints.contains(roleAndPlayerType.getFirst())) result.add(roleAndPlayerType); } - return Utils.union(roleTypesOfAssociationRoleConstraints, roleTypesOfTopicRoleConstraints); + this.roleAndPlayerTypes = result; + return this.roleAndPlayerTypes; } } @@ -130,10 +135,76 @@ } + // returns all associations of the received topicthat have a + // correct type determined by this association-view + private ArrayList<Association> filterAssociationsByType() throws InvalidGdlSchemaException { + ArrayList<Association> allAssociations = new ArrayList<Association>(); + if(this.receivedData != null) + for(int i = 0; i != ((Topic)this.receivedData).getRolesPlayed().length(); ++i) + allAssociations.add(((Topic)this.receivedData).getRolesPlayed().get(i).getParent()); + + // collect only the associations that match the correct association type + ArrayList<Association> filteredAssociationsByType = new ArrayList<Association>(); + for (Association assoc : allAssociations) + if(assoc.getType().equals(this.getAssociationType())) filteredAssociationsByType.add(assoc); + + return filteredAssociationsByType; + } + + + // returns all associations contained in the ArrayList allAssociations + // that have the only permitted role types + private ArrayList<Association> filterAssociationsByRoleAndPlayerTypes(ArrayList<Association> allAssociations) throws InvalidGdlSchemaException { + if(allAssociations == null) return new ArrayList<Association>(); + + ArrayList<Association> filteredAssociationsByAssociationRoleConstraints = new ArrayList<Association>(); + for (Association assoc : allAssociations){ + JsArray<Role> roles = assoc.getRoles(); + int i = 0; + for( ; i != roles.length(); ++i){ + Topic rt = roles.get(i).getType(); + Topic rp = roles.get(i).getPlayer(); + + int j = 0; + for( ; j != this.getRoleAndPlayerTypes().size(); ++j){ + Pair<Topic, Topic> pair = this.getRoleAndPlayerTypes().get(j); + if(pair.getFirst().equals(rt) && TmHelper.isInstanceOf(rp, pair.getSecond())) break; + } + + if(j == this.getRoleAndPlayerTypes().size()) break; + } + + if(i == roles.length())filteredAssociationsByAssociationRoleConstraints.add(assoc); + } + + return filteredAssociationsByAssociationRoleConstraints; + } + - public ArrayList<Association> filterAssociations(){ - // TODO: implement => returns an array with associations that - // must be represetned by this association view + // 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; } + + + // returns an array with associations that + // must be represented by this association view + private ArrayList<Association> filterAssociations() throws InvalidGdlSchemaException { + ArrayList<Association> filteredAssociations = this.filterAssociationsByType(); + filteredAssociations = filterAssociationsByRoleAndPlayerTypes(filteredAssociations); + filteredAssociations = filterAssociationsByRoleCombinations(filteredAssociations); + + this.associationsToRepresent = filteredAssociations; + this.associationsToRepresentSet = true; + return this.associationsToRepresent; + } + + + // Returns the associations that are represented by this associaton-view + public ArrayList<Association> getAssociationsToRepresent() throws InvalidGdlSchemaException { + if(this.associationsToRepresentSet) return this.associationsToRepresent; + else return this.filterAssociations(); + } }