Author: lgiessmann Date: Mon Aug 22 07:26:37 2011 New Revision: 771
Log: gdl-frontend: Widgets: implemented some helpers to comsume associations by GdlAssociationView instances
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/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/PSIs.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java Mon Aug 22 06:51:31 2011 (r770) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/PSIs.java Mon Aug 22 07:26:37 2011 (r771) @@ -21,7 +21,7 @@ public final static String tmclNameType = tmcl + "name-type"; public final static String tmclOccurrenceType = tmcl + "occurrence-type"; public final static String tmclAssociationType = tmcl + "association-type"; - public final static String tmclRoleType = "tmcl" + "role-type"; + public final static String tmclRoleType = tmcl + "role-type"; public final static String tmclConstraint = tmcl + "constraint"; public final static String tmclConstrained = tmcl + "constrained"; public final static String tmclConstrainedStatement = tmcl + "constrained-statement"; @@ -45,6 +45,7 @@ public final static String tmclItemIdentifierConstraint = tmcl + "item-identifier-constraint"; 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"; }
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 06:51:31 2011 (r770) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TestClass.java Mon Aug 22 07:26:37 2011 (r771) @@ -27,22 +27,22 @@ mainPanel.setBorderWidth(1); mainPanel.setPixelSize(1000, 600); - ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate = new ArrayList<Pair<String,TopicIdentifierTypes>>(); - requestedTopicsToCreate.add(new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/model/types/Hash-Object", TopicIdentifierTypes.SubjectIdentifier)); + //ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate = new ArrayList<Pair<String,TopicIdentifierTypes>>(); + //requestedTopicsToCreate.add(new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/model/types/Hash-Object", TopicIdentifierTypes.SubjectIdentifier)); //requestedTopicsToCreate.add(new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/model/types/Environment", TopicIdentifierTypes.SubjectIdentifier)); //requestedTopicsToCreate.add(new Pair<String, TopicIdentifierTypes>("http://psi.test.org/gdl-test/Poet", TopicIdentifierTypes.SubjectIdentifier)); //requestedTopicsToCreate.add(new Pair<String, TopicIdentifierTypes>("http://psi.test.org/gdl-test/Musician", TopicIdentifierTypes.SubjectIdentifier)); //Pair<String, TopicIdentifierTypes> requestedTopicToEdit = new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/model/types/test-env", TopicIdentifierTypes.SubjectIdentifier); //Pair<String, TopicIdentifierTypes> requestedTopicToEdit = new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/model/types/test-hash", TopicIdentifierTypes.SubjectIdentifier); - //Pair<String, TopicIdentifierTypes> requestedTopicToEdit = new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/test-hash-2", TopicIdentifierTypes.SubjectIdentifier); + Pair<String, TopicIdentifierTypes> requestedTopicToEdit = new Pair<String, TopicIdentifierTypes>("http://textgrid.org/serviceregistry/test-hash-2", TopicIdentifierTypes.SubjectIdentifier); GdlPanel.addClickHandler("unit_1_text_create_button_id", new ClickHandler() { @Override public void onClick(ClickEvent event) { Window.alert("you clicked " + ((Button)event.getSource()).getText()); } }); - gdlPanel = new GdlPanel(null, requestedTopicsToCreate); + gdlPanel = new GdlPanel(requestedTopicToEdit, null); mainPanel.add(gdlPanel); gdlPanel.setTmEngine(new JtmsTmEngine()); gdlPanel.setLoadSchemaCallback(new LoadSchemaCallback());
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 06:51:31 2011 (r770) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Mon Aug 22 07:26:37 2011 (r771) @@ -10,7 +10,6 @@ import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.ScopedStub; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; -import us.isidor.gdl.anaToMia.Widgets.base.PSIs.TMDM; import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; import us.isidor.gdl.anaToMia.Widgets.environment.Pair; @@ -167,9 +166,9 @@ ArrayList<Topic> result = new ArrayList<Topic>(); if(top == null) return result; TopicMap tm = top.getTopicMap(); - Topic subtype = getTopicByPsi(TMDM.subtype, tm); - Topic supertype = getTopicByPsi(TMDM.supertype, tm); - Topic supertypeSubtype = getTopicByPsi(TMDM.supertypeSubtype, tm); + Topic subtype = getTopicByPsi(PSIs.TMDM.subtype, tm); + Topic supertype = getTopicByPsi(PSIs.TMDM.supertype, tm); + Topic supertypeSubtype = getTopicByPsi(PSIs.TMDM.supertypeSubtype, tm); if(subtype == null || supertype == null || supertypeSubtype == null) return result; @@ -633,6 +632,22 @@ }
+ // returns the constrained role-types of the passed constraint + public static Topic getConstraintRolesOfConstraint(Topic topicRoleOrAssociationRoleConstraint) throws InvalidGdlSchemaException { + if(topicRoleOrAssociationRoleConstraint == null) return null; + + TopicMap tm = topicRoleOrAssociationRoleConstraint.getTopicMap(); + Topic constraintRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); + Topic constrainedRoleAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedRole, tm); + Topic constrainedRoleType = getTopicByPsi(PSIs.TMCL.tmclConstrained, tm); + Topic roleType = getTopicByPsi(PSIs.TMCL.tmclRoleType, tm); + ArrayList<Topic> result = getOtherPlayerOfBinaryAssociation(topicRoleOrAssociationRoleConstraint, constraintRoleType, constrainedRoleAssocType, null, roleType, constrainedRoleType); + + if(result.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(topicRoleOrAssociationRoleConstraint) + " must be bound exactly once to a role-type via a " + PSIs.TMCL.tmclConstrainedRole + " association, but is bound: " + result.size()); + else return 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 @@ -649,13 +664,59 @@ ArrayList<Topic> constrainedNameTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, nameType, constrainedRoleType); ArrayList<Topic> constrainedOccurrenceTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, occurrenceType, constrainedRoleType); ArrayList<Topic> constrainedAssociationTypes = getOtherPlayerOfBinaryAssociation(constraintTopic, constraintRoleType, constrainedStatementAssocType, null, associationType, constrainedRoleType); - - ArrayList<Topic> constrainedStatements = Utils.merge(Utils.merge(constrainedNameTypes, constrainedOccurrenceTypes), constrainedAssociationTypes); + ArrayList<Topic> constrainedStatements = Utils.merge(Utils.merge(constrainedNameTypes, constrainedOccurrenceTypes), constrainedAssociationTypes); if(constrainedStatements.size() != 1) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(constraintTopic) + " must be bound exactly once to a statement topic via a " + PSIs.TMCL.tmclConstrainedStatement + " association, but is: " + constrainedStatements.size()); else return constrainedStatements.get(0); } + + // Returns the role-combination-constraints for the passed association-type + public static ArrayList<Topic> getRoleCombinationConstraints(Topic associationType){ + if(associationType == null) return new ArrayList<Topic>(); + + TopicMap tm = associationType.getTopicMap(); + Topic constrainedRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); + Topic constrainedStatementAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedStatement, tm); + Topic constraintRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); + Topic roleCombinationConstraintType = getTopicByPsi(PSIs.TMCL.tmclRoleCombinationConstraint, tm); + return getOtherPlayerOfBinaryAssociation(associationType, constrainedRoleType, constrainedStatementAssocType, null, roleCombinationConstraintType, constraintRoleType); + } + + + // Returns the tmcl:association-role-constraints that are bound to the passed topic, that is + // the Topic Maps representative of an gdl:association-view + public static ArrayList<Topic> getAssociationRoleConstraintsForView(Topic viewRepresentative) throws InvalidGdlSchemaException { + if(viewRepresentative == null) new ArrayList<Topic>(); + + TopicMap tm = viewRepresentative.getTopicMap(); + Topic descriptorRoleType = getTopicByPsi(PSIs.RoleType.gdlDescriptor, tm); + Topic associationViewBindingAssocType = getTopicByPsi(PSIs.AssociationType.gdlAssociationViewBinding, tm); + Topic tmConstructRoleType = getTopicByPsi(PSIs.RoleType.gdlTmConstruct, tm); + Topic associationRoleConstraintType = getTopicByPsi(PSIs.TMCL.tmclAssociationRoleConstraint, tm); + ArrayList<Topic> result = getOtherPlayerOfBinaryAssociation(viewRepresentative, descriptorRoleType, associationViewBindingAssocType, null, associationRoleConstraintType, tmConstructRoleType); + + if(result.size() == 0) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(viewRepresentative) + " must be bound to at least one " + PSIs.TMCL.tmclAssociationRoleConstraint + ", but is unbound"); + else return result; + } + + + // Returns the tmcl:topic-role-constraints that are bound to the passed topic, that is + // the Topic Maps representative of an gdl:association-view + public static ArrayList<Topic> getTopicRoleConstraintsForView(Topic viewRepresentative) throws InvalidGdlSchemaException { + if(viewRepresentative == null) new ArrayList<Topic>(); + + TopicMap tm = viewRepresentative.getTopicMap(); + Topic descriptorRoleType = getTopicByPsi(PSIs.RoleType.gdlDescriptor, tm); + Topic associationViewBindingAssocType = getTopicByPsi(PSIs.AssociationType.gdlAssociationViewBinding, tm); + Topic tmConstructRoleType = getTopicByPsi(PSIs.RoleType.gdlTmConstruct, tm); + Topic topicRoleConstraintType = getTopicByPsi(PSIs.TMCL.tmclTopicRoleConstraint, tm); + ArrayList<Topic> result = getOtherPlayerOfBinaryAssociation(viewRepresentative, descriptorRoleType, associationViewBindingAssocType, null, topicRoleConstraintType, tmConstructRoleType); + + if(result.size() == 0) throw new InvalidGdlSchemaException("the topic " + getAnyIdOfTopic(viewRepresentative) + " must be bound to at least one " + PSIs.TMCL.tmclTopicRoleConstraint + ", but is unbound"); + else return result; + } +
// returns the root constraint of a gdl:Value-Group instance, i.e. a tmcl constraint. // E.g. a value group may be bound to a gdl:Type constraint and this constraint may be bound @@ -914,6 +975,35 @@ } + // Returns all tmcl:topic-role-constraint that the types of this topic + // are bound to + public static ArrayList<Topic> getTopicRoleConstraintsForTopicInstance(Topic topicInstance){ + ArrayList<Topic> result = new ArrayList<Topic>(); + if(topicInstance == null) return result; + + JsArray<Topic> topicTypes = topicInstance.getTypes(); + for(int i = 0; i != topicTypes.length(); ++i){ + ArrayList<Topic> resultForType = getTopicRoleConstraintsForTopicType(topicTypes.get(i)); + result = Utils.merge(result, resultForType); + } + + return result; + } + + + // Returns all tmcl:topic-role-constraints the the passed topic is bound to + public static ArrayList<Topic> getTopicRoleConstraintsForTopicType(Topic topicType){ + if(topicType == null) return new ArrayList<Topic>(); + + TopicMap tm = topicType.getTopicMap(); + Topic constrainedRoleType = getTopicByPsi(PSIs.TMCL.tmclConstrained, tm); + Topic constrainedTopicTypeAssocType = getTopicByPsi(PSIs.TMCL.tmclConstrainedTopicType, tm); + Topic constraintRoleType = getTopicByPsi(PSIs.TMCL.tmclConstraint, tm); + Topic topicRoleConstraintType = getTopicByPsi(PSIs.TMCL.tmclTopicRoleConstraint, tm); + return getOtherPlayerOfBinaryAssociation(topicType, constrainedRoleType, constrainedTopicTypeAssocType, null, topicRoleConstraintType, constraintRoleType); + } + + // return the occurrence of the passed type, if the topic contains more than one such occurrences, // this function throws a InvalidgdlSchemaException public static Occurrence getSingleOccurrence(Topic topic, Topic occurrenceType) throws InvalidGdlSchemaException {
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 06:51:31 2011 (r770) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Mon Aug 22 07:26:37 2011 (r771) @@ -21,6 +21,17 @@ return true; } + + + // returns a list that contains a union of both lists + public static <T> ArrayList<T> union(ArrayList<T> fst, ArrayList<T> snd){ + ArrayList<T> result = new ArrayList<T>(); + if(fst == null || snd == null) return result; + + for (T t : fst) if(snd.contains(t)) result.add(t); + + return result; + }
// returns an ArrayList that is a merged ArrayList of fst and snd
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 06:51:31 2011 (r770) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Mon Aug 22 07:26:37 2011 (r771) @@ -2,40 +2,138 @@
import java.util.ArrayList;
+import com.google.gwt.user.client.Window; + import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; 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;
public abstract class GdlAssociationView extends GdlView { protected ArrayList<Association> associationsToRepresent = null; + private ArrayList<Topic> associationRoleConstraints = new ArrayList<Topic>(); + 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<Topic> roleCombinationConstraints = new ArrayList<Topic>(); + private boolean roleCombinationConstraintsSet = false; +
public GdlAssociationView(Topic tmRepresentative, Topic receivedData) throws InvalidGdlSchemaException, ExecutionException { - super(tmRepresentative, null); - // TODO: set the associationsToRepresent array by using - // the associations the passed topic is a player of - // and the constraints that are bound to this element's - // value-group instance + super(tmRepresentative, receivedData); + Window.alert("constraints: " +this.getRoleTypes().size() + " >> " + (this instanceof GdlEditorAssociationView)); + + if(this instanceof GdlEditorAssociationView) this.associationsToRepresent = this.filterAssociations(); } - // return the association-type that this element is bound to through the - // set association-role- and topic-role- constraints - public Topic getAssociationType() throws InvalidGdlSchemaException { - // TODO: implement - return null; + // Return the association-role-constraints this view is bound to + public ArrayList<Topic> getAssociationRoleConstraints() throws InvalidGdlSchemaException { + if(this.associationRoleconstraintsSet){ + return this.associationRoleConstraints; + } else { + this.associationRoleconstraintsSet = true; + this.associationRoleConstraints = TmHelper.getAssociationRoleConstraintsForView(this.tmRepresentative); + return this.associationRoleConstraints; + } } - public ArrayList<Topic> getAssociationRoleConstraints(){ - // TODO: implement - return null; + // Return the topic-role-constraints this view is bound to + public ArrayList<Topic> getTopicRoleConstraints() throws InvalidGdlSchemaException { + if(this.topicRoleConstraintsSet){ + return this.topicRoleConstraints; + } else { + this.topicRoleConstraintsSet = true; + this.topicRoleConstraints = TmHelper.getTopicRoleConstraintsForView(this.tmRepresentative); + return this.topicRoleConstraints; + } + } + + + // Returns the role-combination-constraints of the association- + // type that is bound to this association-view via the bound + // constraints + public ArrayList<Topic> getRoleCombinationConstraints() throws InvalidGdlSchemaException { + if(this.roleCombinationConstraintsSet){ + return this.roleCombinationConstraints; + } else { + this.roleCombinationConstraintsSet = true; + this.roleCombinationConstraints = TmHelper.getRoleCombinationConstraints(this.getAssociationType()); + return this.roleCombinationConstraints; + } } - public ArrayList<Topic> getTopicRoleConstraints(){ - // TODO: implement + // 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; + } else { + this.roleTypesSet = true; + ArrayList<Topic> roleTypesOfAssociationRoleConstraints = new ArrayList<Topic>(); + for (Topic constraint : this.getAssociationRoleConstraints()){ + Topic top = TmHelper.getConstraintRolesOfConstraint(constraint); + if(!roleTypesOfAssociationRoleConstraints.contains(top)) roleTypesOfAssociationRoleConstraints.add(top); + } + + ArrayList<Topic> roleTypesOfTopicRoleConstraints = new ArrayList<Topic>(); + for (Topic constraint : this.getTopicRoleConstraints()){ + Topic top = TmHelper.getConstraintRolesOfConstraint(constraint); + if(!roleTypesOfTopicRoleConstraints.contains(top)) roleTypesOfTopicRoleConstraints.add(top); + } + + return Utils.union(roleTypesOfAssociationRoleConstraints, roleTypesOfTopicRoleConstraints); + } + } + + + // returns the association type that is valid with respect to the + // topic- and the association-role-constraints that are bound to this view + public Topic getAssociationType() throws InvalidGdlSchemaException { + if(this.associationTypeSet){ + return this.associationType; + } else { + this.associationTypeSet = true; + ArrayList<Topic> assocTypes = new ArrayList<Topic>(); + for (Topic constraint : this.getAssociationRoleConstraints()){ + Topic top = TmHelper.getConstrainedStatement(constraint); + if(!assocTypes.contains(top)) assocTypes.add(top); + } + + for (Topic constraint : this.getTopicRoleConstraints()){ + Topic top = TmHelper.getConstrainedStatement(constraint); + if(!assocTypes.contains(top)) assocTypes.add(top); + } + + if(assocTypes.size() != 1){ + String bindings = "["; + for (Topic topic : assocTypes) + bindings += TmHelper.getAnyIdOfTopic(topic) + ", "; + if(bindings.length() == 1) bindings = "[ ]"; + else bindings = bindings.substring(0, bindings.length() - 2) + "]"; + throw new InvalidGdlSchemaException("the association-view " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to topic-role-constraints and association-rle-constraints that own the same constrained-statement, but found the constrained-statements: " + bindings); + } + + this.associationType = assocTypes.get(0); + return this.associationType; + } + } + + + + public ArrayList<Association> filterAssociations(){ + // TODO: implement => returns an array with associations that + // must be represetned by this association view return null; } }