Author: lgiessmann Date: Thu Jul 14 05:05:36 2011 New Revision: 618
Log: gdl-frontend: Widgets: implemented the class GdlPosition that wraps a topic of the type gdl:Position
Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPosition.java Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/IGdlContainer.java branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java
Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPosition.java ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPosition.java Thu Jul 14 05:05:36 2011 (r618) @@ -0,0 +1,110 @@ +package us.isidor.gdl.anaToMia.Widgets.base; + +import java.util.ArrayList; + +import com.google.gwt.core.client.JsArray; + +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Occurrence; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; +import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; +import us.isidor.gdl.anaToMia.Widgets.value.AutoNumUnitValue; +import us.isidor.gdl.anaToMia.Widgets.value.PositionStyleValue; + + +public class GdlPosition implements GdlDescriptor { + private Topic tmRepresentative = null; + + + @SuppressWarnings("unused") + private GdlPosition(){} + + + public GdlPosition(Topic tmRepresentative){ + this.tmRepresentative = tmRepresentative; + } + + + // a helper method that returns all occurrences of the type bound to the passed PSI + private JsArray<Occurrence> getOccurrences(String occurrenceType){ + TopicMap tm = this.tmRepresentative.getTopicMap(); + Topic occType = tm.getTopicBySubjectIdentifier(tm.createLocator(occurrenceType)); + if(occType == null) return null; + else return tmRepresentative.getOccurrences(occType); + } + + + // a helper method that returns one occurrence of the type bound to the passed PSI. + // If more than one occurrence is available an InvalidGdlSchemaException is thrown. + // If nor occurrence is available the return value is null + private Occurrence getNoneOrOneUnscopedOccurrence(String occurrenceType) throws InvalidGdlSchemaException{ + JsArray<Occurrence> occs = getOccurrences(occurrenceType); + ArrayList<Occurrence> unscopedOccs = new ArrayList<Occurrence>(); + for(int i = 0; i != occs.length(); ++i){ + if(occs.get(i).getScope().length() == 0) unscopedOccs.add(occs.get(i)); + } + + if(unscopedOccs.size() > 1){ + throw new InvalidGdlSchemaException("The topic " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to none or one unscoped occurrence of the type " + occurrenceType + ", but is bound " + unscopedOccs.size() + " times to it"); + } else if(unscopedOccs.size() == 1){ + return unscopedOccs.get(0); + } else { + return null; + } + } + + + @Override + public Topic getTmRepresentative() { + return this.tmRepresentative; + } + + + public AutoNumUnitValue getTop() throws InvalidGdlSchemaException { + Occurrence topOcc = null; + topOcc = getNoneOrOneUnscopedOccurrence(GdlPsis.OccurrenceType.gdlTop); + + if(topOcc == null) return null; + else return new AutoNumUnitValue(topOcc.getValue()); + } + + + public AutoNumUnitValue getRight() throws InvalidGdlSchemaException { + Occurrence rightOcc = null; + rightOcc = getNoneOrOneUnscopedOccurrence(GdlPsis.OccurrenceType.gdlRight); + + if(rightOcc == null) return null; + else return new AutoNumUnitValue(rightOcc.getValue()); + } + + + public AutoNumUnitValue getBottom() throws InvalidGdlSchemaException { + Occurrence bottomOcc = null; + bottomOcc = getNoneOrOneUnscopedOccurrence(GdlPsis.OccurrenceType.gdlBottom); + + if(bottomOcc == null) return null; + else return new AutoNumUnitValue(bottomOcc.getValue()); + } + + + public AutoNumUnitValue getLeft() throws InvalidGdlSchemaException { + Occurrence leftOcc = null; + leftOcc = getNoneOrOneUnscopedOccurrence(GdlPsis.OccurrenceType.gdlLeft); + + if(leftOcc == null) return null; + else return new AutoNumUnitValue(leftOcc.getValue()); + } + + + public PositionStyleValue getPositionStyle()throws InvalidGdlSchemaException { + Occurrence positionStyleOcc = null; + positionStyleOcc = getNoneOrOneUnscopedOccurrence(GdlPsis.OccurrenceType.gdlPositionStyle); + + if(positionStyleOcc == null) return null; + else try{ + return PositionStyleValue.valueOf(positionStyleOcc.getValue().toUpperCase()); + }catch(IllegalArgumentException e){ + throw new InvalidGdlSchemaException("a position style value must be one of static, relative or absolute, but is " + positionStyleOcc.getValue()); + } + } +}
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/IGdlContainer.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/IGdlContainer.java Thu Jul 14 02:42:52 2011 (r617) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/IGdlContainer.java Thu Jul 14 05:05:36 2011 (r618) @@ -1,11 +1,13 @@ package us.isidor.gdl.anaToMia.Widgets.base;
import java.util.ArrayList; + +import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic;
public interface IGdlContainer { - public GdlVisibleObject append(Topic ancestor, Topic current) throws InvalidGdlSchemaException; + public GdlVisibleObject append(Topic ancestor, Topic current) throws InvalidGdlSchemaException, ExecutionException; public ArrayList<Topic> contains() throws InvalidGdlSchemaException; }
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 Thu Jul 14 02:42:52 2011 (r617) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Thu Jul 14 05:05:36 2011 (r618) @@ -378,4 +378,56 @@ return null; } } + + + // returns the topic that represents the position between the ancestor + // and descendant topics + public static Topic getPositionOf(Topic ancestor, Topic descendant) throws InvalidGdlSchemaException { + if(ancestor == null || descendant == null) return null; + + // get all potential valid associations that models a position association + TopicMap tm = ancestor.getTopicMap(); + Topic ancestorRoleType = getTopicByPsi(GdlPsis.RoleType.gdlAncestor, tm); + Topic position = getTopicByPsi(GdlPsis.AssociationType.gdlPosition, tm); + ArrayList<Pair<Topic, Topic>> rolePlayertypesAndTypes = new ArrayList<Pair<Topic,Topic>>(); + Topic descriptor = getTopicByPsi(GdlPsis.RoleType.gdlDescendant, tm); + Topic descendantRoleType = getTopicByPsi(GdlPsis.RoleType.gdlDescendant, tm); + Topic visibleObject = getTopicByPsi(GdlPsis.TopicType.gdlVisibleObject, tm); + rolePlayertypesAndTypes.add(new Pair<Topic, Topic>(position, descriptor)); + rolePlayertypesAndTypes.add(new Pair<Topic, Topic>(visibleObject, descendantRoleType)); + ArrayList<Association> posAssocs = getAssociationsOfTopic(ancestor, ancestorRoleType, position, null, rolePlayertypesAndTypes); + + if(posAssocs.size() != 1){ + String top1 = getAnyIdOfTopic(ancestor); + String top2 = getAnyIdOfTopic(descendant); + String bindings = ""; + for (Association assoc : posAssocs) + if(assoc.getRoles(position).length() != 0) + for(int i = 0; i != assoc.getRoles(position).length(); ++i) + bindings += ", " + getAnyIdOfTopic(assoc.getRoles(position).get(i).getPlayer()); + if(bindings.length() == 0) bindings = "[]"; + else bindings = bindings.substring(2); + throw new InvalidGdlSchemaException("the topics " + top1 + " and " + top2 + " must be bound to exaclty one position topic, but is bound to " + bindings); + }else { + ArrayList<Topic> positions = new ArrayList<Topic>(); + for (Association assoc : posAssocs) { + JsArray<Role> validRoles = assoc.getRoles(position); + for(int i = 0; i != validRoles.length(); ++i) + if(isInstanceOf(validRoles.get(i).getPlayer(), position) && !positions.contains(validRoles.get(i).getPlayer())) positions.add(validRoles.get(i).getPlayer()); + + } + + if(positions.size() != 1){ + String top1 = getAnyIdOfTopic(ancestor); + String top2 = getAnyIdOfTopic(descendant); + String bindings = ""; + for (Topic pos : positions) bindings += ", " + getAnyIdOfTopic(pos); + if(bindings.length() == 0) bindings = "[]"; + else bindings = bindings.substring(2); + throw new InvalidGdlSchemaException("the topics " + top1 + " and " + top2 + " must be bound to exaclty one position topic, but is bound to " + bindings); + }else { + return positions.get(0); + } + } + } }