Author: lgiessmann Date: Tue Jul 12 13:26:22 2011 New Revision: 605
Log: gdl-frontend: Widgets: implemted a mehtod that instantiates the default topic view, i.e. the entry point
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPsis.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/GdlPsis.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPsis.java Tue Jul 12 08:16:49 2011 (r604) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPsis.java Tue Jul 12 13:26:22 2011 (r605) @@ -2,8 +2,6 @@
import java.util.ArrayList; import com.google.gwt.core.client.JsArray; - -import us.isidor.gdl.anaToMia.TopicMaps.TmEngineModel.TmEngine; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Construct; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Locator; @@ -11,13 +9,28 @@ 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.environment.GdlInstantiator; import us.isidor.gdl.anaToMia.Widgets.environment.Pair; import us.isidor.gdl.anaToMia.Widgets.environment.TopicIdentifierTypes;
+ public class GdlPsis { public final static String gdl = "http://psi.isidor.us/gdl/"; + + // some psis of the TMDM + public class TMDM{ + public final static String supertype = "http://psi.topicmaps.org/iso13250/model/supertype"; + public final static String subtype = "http://psi.topicmaps.org/iso13250/model/subtype"; + public final static String supertypeSubtype = "http://psi.topicmaps.org/iso13250/model/supertype-subtype"; + + }
+ + // some psis of the TMCL + public class TMCL { + public final static String topictype = "http://psi.topicmaps.org/tmcl/topic-type"; + } + + // topic types public class TopicType{ public final static String gdlSchema = gdl + "Schema"; @@ -333,26 +346,73 @@ ArrayList<Topic> localCollectedSuperTypes = new ArrayList<Topic>(); if(collectedSupertypes != null) localCollectedSuperTypes = collectedSupertypes; + ArrayList<Topic> direcSupertypes = getDirectSuperTypes(top); + for (Topic topic : localCollectedSuperTypes) direcSupertypes.remove(topic); //avoid duplicates + for (Topic topic : direcSupertypes)localCollectedSuperTypes.add(topic); + + for (Topic topic : direcSupertypes){ + ArrayList<Topic> tmp = getAllSuperTypes(topic, localCollectedSuperTypes); + for (Topic tmpTopic : tmp) localCollectedSuperTypes.add(tmpTopic); + } + return localCollectedSuperTypes; + } + + + // returns the direct supertypes of the passed topic + public static ArrayList<Topic> getDirectSuperTypes(Topic top){ + 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); + + if(subtype == null || supertype == null || supertypeSubtype == null) return result; + JsArray<Role> validRoles = top.getRolesPlayed(subtype, supertypeSubtype); + for(int i = 0; i != validRoles.length(); ++i){ + Association parent = validRoles.get(i).getParent(); + if(parent.getRoles().length() == 2 && parent.getRoles(supertype).length() == 1)result.add(parent.getRoles(supertypeSubtype).get(0).getPlayer()); + } + return result; + } + + + // returns true if a corresponding association exists + public static boolean hasAssociation(Topic thisTopic, Topic thisRoleType, Topic assocType, Topic otherPlayer, Topic otherRoleType){ + if(thisTopic == null || thisRoleType == null || assocType == null || otherPlayer == null || otherRoleType == null) return false; - // TODO: implement - return null; + JsArray<Role> roles = thisTopic.getRolesPlayed(thisRoleType, assocType); + for(int i = 0; i != roles.length(); ++i){ + Association parent = roles.get(i).getParent(); + JsArray<Role> otherRoles = parent.getRoles(otherRoleType); + for(int j = 0; j != otherRoles.length(); ++j) + if(otherRoles.get(j).getPlayer().equals(otherPlayer)) return true; + } + + return false; } - // returns the other player of an assocition with two roles and the correct values - public static ArrayList<Topic> getOtherPlayer(Topic thisTopic, Topic thisRoleType, Topic assocType, ArrayList<Topic> scope, Topic otherRoleType){ + // 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 otherRoleType){ ArrayList<Topic> result = new ArrayList<Topic>(); if(thisTopic == null || thisRoleType == null || assocType == null || otherRoleType == null) return result; JsArray<Role> roles = thisTopic.getRolesPlayed(thisRoleType, assocType); for(int i = 0; i != roles.length(); ++i){ Association parent = roles.get(i).getParent(); - if(parent.getRoles(otherRoleType).length() == 1) result.add(parent.getRoles(otherRoleType).get(0).getPlayer()); + if(parent.getRoles().length() != 2) return result; + if(thisRoleType.equals(otherRoleType) && parent.getRoles(thisTopic).length() == 2){ + if(parent.getRoles(thisRoleType).get(0).getPlayer().equals(thisTopic)) result.add(parent.getRoles(thisRoleType).get(1).getPlayer()); + else result.add(parent.getRoles(thisRoleType).get(0).getPlayer()); + }else if(parent.getRoles(otherRoleType).length() == 1){ + result.add(parent.getRoles(otherRoleType).get(0).getPlayer()); + } } return result; } - + // returns true if the instance topic is an instance of the topic bound to typeSubectIdentifier public static boolean isInstanceOf(Topic instance, String typeSubjectIdentifier){
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 Tue Jul 12 08:16:49 2011 (r604) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Tue Jul 12 13:26:22 2011 (r605) @@ -123,6 +123,7 @@ 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"); }else { + // all topics (types) that have to be displayed by a view ArrayList<Topic> topsToDisplay = new ArrayList<Topic>(); if(instanceTopic != null){ topsToDisplay.add(GdlPsis.getTopicByAnyIdentifier(instanceTopic, tm)); @@ -131,15 +132,69 @@ topsToDisplay.add(GdlPsis.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 = GdlPsis.getTopicByPsi(GdlPsis.RoleType.gdlDescriptor, tm); + Topic tmBinding = GdlPsis.getTopicByPsi(GdlPsis.AssociationType.gdlTmBinding, tm); + Topic tmValue = GdlPsis.getTopicByPsi(GdlPsis.RoleType.gdlTmValue, tm); + Topic TmValue = GdlPsis.getTopicByPsi(GdlPsis.TopicType.gdlTmValue, tm); + Topic tmConstruct = GdlPsis.getTopicByPsi(GdlPsis.RoleType.gdlTmConstruct, tm); + for (Topic topic : topsToDisplay) { + ArrayList<Topic> potentialTmValues = GdlPsis.getOtherPlayerOfBinaryAssociation(topic, tmConstruct, tmBinding, null, descriptor); + for (Topic potentialTmValue : potentialTmValues) + if(GdlPsis.isInstanceOf(potentialTmValue, TmValue)) tmValues.add(potentialTmValue); + } - // TODO: implement - // get tm-values for each topic - // reduce tm-values to instances that are shared by all topics to display - // filter shared tm-values for default-topic-view associations - // return default-topic-view + // get only the tm-value that binds all topics to be displayed to the current view + ArrayList<Topic> invalidTmValues = new ArrayList<Topic>(); + Topic topictype = GdlPsis.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(GdlPsis.hasAssociation(topToDisplay, tmConstruct, tmBinding, value, descriptor) || + GdlPsis.getAssociationsOfTopic(value, descriptor, tmBinding, null, roles).size() != topsToDisplay.size()){ + invalidTmValues.add(value); + } + } + } + for (Topic invalid : invalidTmValues)tmValues.remove(invalid); - return null; + // get all default topic views that are bound to the existent tm-values + ArrayList<Topic> defaultTopicViews = new ArrayList<Topic>(); + Topic defaultTopicView = GdlPsis.getTopicByPsi(GdlPsis.TopicType.gdlDefaultTopicView, tm); + Topic topicViewBinding = GdlPsis.getTopicByPsi(GdlPsis.AssociationType.gdlTopicViewBinding, tm); + for (Topic validTmValue : tmValues) { + ArrayList<Topic> views = GdlPsis.getOtherPlayerOfBinaryAssociation(validTmValue, tmValue, topicViewBinding, null, descriptor); + for (Topic view : views) if(GdlPsis.isInstanceOf(view, defaultTopicView)) defaultTopicViews.add(view); + } + + // return default-topic-view + if(defaultTopicViews.size() > 2){ + String values = ""; + for (Topic topic : topsToDisplay)values += ", " + GdlPsis.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(GdlPsis.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; + } } } }