Author: lgiessmann Date: Wed Jul 13 08:18:43 2011 New Revision: 610
Log: gdl-frontend: Widgets: fixed some methods that instatiate GdlDefaultEditorTopicView from a Gdl Schema topic map
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/environment/GdlInstantiator.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 Wed Jul 13 07:45:55 2011 (r609) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.java Wed Jul 13 08:18:43 2011 (r610) @@ -74,6 +74,21 @@ } + // a helper method to return an identifier string and a TopicIdentifierTypes instance + // of the topic contained in a Pair object + public static Pair<String, TopicIdentifierTypes> getAnyIdenditfierOfTopic(Topic topic){ + if(topic.getSubjectIdentifiers().length() != 0){ + return new Pair<String, TopicIdentifierTypes>(topic.getSubjectIdentifiers().get(0).getReference(), TopicIdentifierTypes.SubjectIdentifier); + }else if(topic.getSubjectLocators().length() != 0) { + return new Pair<String, TopicIdentifierTypes>(topic.getSubjectLocators().get(0).getReference(), TopicIdentifierTypes.SubjectLocator); + }if(topic.getItemIdentifiers().length() != 0){ + return new Pair<String, TopicIdentifierTypes>(topic.getItemIdentifiers().get(0).getReference(), TopicIdentifierTypes.ItemIdentifier); + } else { + return null; + } + } + + // returns all instances of the topic type public static ArrayList<Topic> getInstanceOf(Topic type, boolean multipleTypesAllowed){ ArrayList<Topic> result = new ArrayList<Topic>(); @@ -179,6 +194,18 @@ } return result; } + + + // returns the other player of an association with two roles and the correct values + public static ArrayList<Topic> getOtherPlayerOfBinaryAssociation(Topic thisTopic, Topic thisRoleType, Topic assocType, ArrayList<Topic> scope, Topic otherPlayerType, Topic otherRoleType){ + ArrayList<Topic> allPlayers = getOtherPlayerOfBinaryAssociation(thisTopic, thisRoleType, assocType, scope, otherRoleType); + if(otherRoleType == null) return allPlayers; + + ArrayList<Topic> result = new ArrayList<Topic>(); + for (Topic player : allPlayers) if(isInstanceOf(player, otherPlayerType)) result.add(player); + + return result; + }
// returns true if the instance topic is an instance of the topic bound to typeSubectIdentifier
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Wed Jul 13 07:45:55 2011 (r609) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Wed Jul 13 08:18:43 2011 (r610) @@ -32,7 +32,6 @@ import us.isidor.gdl.anaToMia.Widgets.view.GdlCreatorAssociationView; import us.isidor.gdl.anaToMia.Widgets.view.GdlDefaultCreatorTopicView; import us.isidor.gdl.anaToMia.Widgets.view.GdlDefaultEditorTopicView; -import us.isidor.gdl.anaToMia.Widgets.view.GdlDefaultTopicView; import us.isidor.gdl.anaToMia.Widgets.view.GdlEditorAssociationView; import us.isidor.gdl.anaToMia.Widgets.view.GdlSpecialCreatorTopicView; import us.isidor.gdl.anaToMia.Widgets.view.GdlSpecialEditorTopicView; @@ -123,7 +122,7 @@ for (Topic top : views) bindings += ", " + TmHelper.getAnyIdOfTopic(top); bindings = bindings.substring(2); - throw new InvalidGdlSchemaException("the combination fo topics requested (" + values + ") must be bound exactly once to a " + GdlPsis.TopicType.gdlDefaultCreatorTopicView + " but is bound to " + bindings); + throw new InvalidGdlSchemaException("the combination of topics requested (" + values + ") must be bound exactly once to a " + GdlPsis.TopicType.gdlDefaultCreatorTopicView + " but is bound to " + bindings); } return new GdlDefaultCreatorTopicView(views.get(0)); @@ -186,118 +185,59 @@ - public static GdlDefaultEditorTopicView instantiateDefaultEditorTopicView(Pair<String, TopicIdentifierTypes> requestedTopic, TopicMap schemaTm){ + public static GdlDefaultEditorTopicView instantiateDefaultEditorTopicView(Pair<String, TopicIdentifierTypes> requestedTopic, TopicMap schemaTm) throws InvalidGdlSchemaException, ExecutionException{ if(requestedTopic == null || schemaTm == null) return null; - // TODO: search for a direct TM-Instance-Value binding if no one is found, search the types and call GdlDefaultCreatorTopicView + // request the topic that is passed by the user + Topic requestedTop = TmHelper.getTopicByAnyIdentifier(requestedTopic, schemaTm); + if(requestedTop == null) throw new InvalidGdlSchemaException("the topic " + requestedTopic.getFirst() + " was not found!"); - // 1. get the requested topic - // 2. get types of requested topic - // 3. get tm-values that are assiciated with exalty those topics that are requested => assert the tm-value type - // 4. search for a tm-instance-value binding - // 5. search the a default-creator-topic-view bound to the found tm-values - // 6. return the view or throw an error if no view or more than one view was found - + // get all tm-instance-value topics bound to the requested topic + Topic tmConstruct = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlTmConstruct, schemaTm); + Topic tmBinding = TmHelper.getTopicByPsi(GdlPsis.AssociationType.gdlTmBinding, schemaTm); + Topic descriptor = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlDescriptor, schemaTm); + ArrayList<Topic> tmInstanceValues = TmHelper.getOtherPlayerOfBinaryAssociation(requestedTop, tmConstruct, tmBinding, null, descriptor); - // TODO: implement - return null; - } - - - - - - - - - // returns a DefaultTopicView instance that represents the entry point of this topic map for one of - // instanceTopic of typeTopics, i.e. one of the must be null or empty - public static GdlDefaultTopicView instantiateDefaultEditorOrCreatorView(Pair<String, TopicIdentifierTypes> instanceTopic, ArrayList<Pair<String, TopicIdentifierTypes>> typeTopics, TopicMap tm) throws InvalidGdlSchemaException, ExecutionException{ - if(tm == null) return null; - if(instanceTopic != null && (typeTopics != null && typeTopics.size() != 0)){ - String values = instanceTopic.getFirst(); - for (Pair<String, TopicIdentifierTypes> pair : typeTopics) if(values.length() != 0)values += ", " + pair.getFirst(); - throw new ExecutionException("only one of topic is allowed to be set as the base topic for a " + GdlPsis.TopicType.gdlView + " but found: " + values); + // get all views bound to the found tm-instance-values + Topic defaultEditorTopicView = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultEditorTopicView, schemaTm); + Topic tmValue = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlTmValue, schemaTm); + Topic topicViewBinding = TmHelper.getTopicByPsi(GdlPsis.AssociationType.gdlTopicViewBinding, schemaTm); + ArrayList<Topic> views = new ArrayList<Topic>(); + for (Topic tmInstanceValue : tmInstanceValues) { + ArrayList<Topic> tmpViews = TmHelper.getOtherPlayerOfBinaryAssociation(tmInstanceValue, tmValue, topicViewBinding, null, defaultEditorTopicView, descriptor); + for (Topic tmpView : tmpViews) if(!views.contains(tmpView))views.add(tmpView); } - Topic defaultCreatorTopicView = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultCreatorTopicView, tm); - Topic defaultEditorTopicView = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultEditorTopicView, tm); - if(defaultCreatorTopicView == null && defaultEditorTopicView == null){ - throw new InvalidGdlSchemaException("the requested GDL schema does not have an entry point defined, either an instance of " + GdlPsis.TopicType.gdlDefaultCreatorTopicView + " or " + GdlPsis.TopicType.gdlDefaultEditorTopicView + " is necessary"); + if(views.size() == 1){ + return new GdlDefaultEditorTopicView(views.get(0)); + }else if(views.size() > 1){ + String bindings = ""; + for (Topic top : views) + bindings += ", " + TmHelper.getAnyIdOfTopic(top); + bindings = bindings.substring(2); + throw new InvalidGdlSchemaException("the topic " + requestedTopic.getFirst() + " requested for editing must be bound to exaclty one " + GdlPsis.TopicType.gdlDefaultEditorTopicView + ", but is bound to " + bindings); }else { - // all topics (types) that have to be displayed by a view - ArrayList<Topic> topsToDisplay = new ArrayList<Topic>(); - if(instanceTopic != null){ - topsToDisplay.add(TmHelper.getTopicByAnyIdentifier(instanceTopic, tm)); - }else{ - for (Pair<String, TopicIdentifierTypes> pair : typeTopics) { - topsToDisplay.add(TmHelper.getTopicByAnyIdentifier(pair, tm)); - } - } - - // get the TM-Value instance that is bound to the topic (type) and the view instance - ArrayList<Topic> tmValues = new ArrayList<Topic>(); - Topic descriptor = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlDescriptor, tm); - Topic tmBinding = TmHelper.getTopicByPsi(GdlPsis.AssociationType.gdlTmBinding, tm); - Topic tmValue = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlTmValue, tm); - Topic TmValue = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlTmValue, tm); - Topic tmConstruct = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlTmConstruct, tm); - for (Topic topic : topsToDisplay) { - ArrayList<Topic> potentialTmValues = TmHelper.getOtherPlayerOfBinaryAssociation(topic, tmConstruct, tmBinding, null, descriptor); - for (Topic potentialTmValue : potentialTmValues) - if(TmHelper.isInstanceOf(potentialTmValue, TmValue)) tmValues.add(potentialTmValue); - } - - // get only the tm-value that binds all topics to be displayed to the current view - ArrayList<Topic> invalidTmValues = new ArrayList<Topic>(); - Topic topictype = TmHelper.getTopicByPsi(GdlPsis.TMCL.topictype, tm); - for (Topic value : tmValues) { - for (Topic topToDisplay : topsToDisplay) { - ArrayList<Pair<Topic, Topic>> roles = new ArrayList<Pair<Topic,Topic>>(); - roles.add(new Pair<Topic, Topic>(topictype, tmConstruct)); - if(TmHelper.hasAssociation(topToDisplay, tmConstruct, tmBinding, value, descriptor) || - TmHelper.getAssociationsOfTopic(value, descriptor, tmBinding, null, roles).size() != topsToDisplay.size()){ - invalidTmValues.add(value); - } - } - } - for (Topic invalid : invalidTmValues)tmValues.remove(invalid); - - // get all default topic views that are bound to the existent tm-values - ArrayList<Topic> defaultTopicViews = new ArrayList<Topic>(); - Topic defaultTopicView = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultTopicView, tm); - Topic topicViewBinding = TmHelper.getTopicByPsi(GdlPsis.AssociationType.gdlTopicViewBinding, tm); - for (Topic validTmValue : tmValues) { - ArrayList<Topic> views = TmHelper.getOtherPlayerOfBinaryAssociation(validTmValue, tmValue, topicViewBinding, null, descriptor); - for (Topic view : views) if(TmHelper.isInstanceOf(view, defaultTopicView)) defaultTopicViews.add(view); - } + ArrayList<Pair<String, TopicIdentifierTypes>> typesOfRequestedTopic = new ArrayList<Pair<String,TopicIdentifierTypes>>(); + for(int i = 0; i != requestedTop.getTypes().length(); ++i) + typesOfRequestedTopic.add(TmHelper.getAnyIdenditfierOfTopic(requestedTop.getTypes().get(i))); + + views = getViewTopics(typesOfRequestedTopic, defaultEditorTopicView, schemaTm); - // return default-topic-view - if(defaultTopicViews.size() > 2){ + if(views.size() != 1){ String values = ""; - for (Topic topic : topsToDisplay)values += ", " + TmHelper.getAnyIdOfTopic(topic); - if(values.length() >= 2) values = values.substring(2); - throw new InvalidGdlSchemaException("only one default editor or creator topic view can be bound to a topic, but found " + values); - } else if(defaultTopicViews.size() == 1){ - return (GdlDefaultTopicView)instantiate(defaultTopicViews.get(0)); - } else if(defaultTopicViews.size() == 2){ // one creator and one editor view - Topic creatorView = null; - Topic editorView = null; - if(TmHelper.isInstanceOf(defaultTopicViews.get(0), GdlPsis.TopicType.gdlDefaultCreatorTopicView)){ - creatorView = defaultTopicViews.get(0); - editorView = defaultTopicViews.get(1); - }else { - creatorView = defaultTopicViews.get(1); - editorView = defaultTopicViews.get(0); - } - - if(instanceTopic != null)return new GdlDefaultEditorTopicView(editorView); - else return new GdlDefaultCreatorTopicView(creatorView); - } else { - return null; + for (Pair<String, TopicIdentifierTypes> pair : typesOfRequestedTopic) + values += ", " + pair.getFirst(); + values = values.substring(2); + String bindings = ""; + for (Topic top : views) + bindings += ", " + TmHelper.getAnyIdOfTopic(top); + bindings = bindings.substring(2); + throw new InvalidGdlSchemaException("the combination of topic types (" + values + ") for the requested topic " + requestedTopic.getFirst() + " must be bound exactly once to a " + GdlPsis.TopicType.gdlDefaultEditorTopicView + " but is bound to " + bindings); } + + return new GdlDefaultEditorTopicView(views.get(0)); } } }