Author: lgiessmann
Date: Wed Jul 13 07:45:55 2011
New Revision: 609
Log:
gdl-frontend: Widgets: fixed some methods that instatiate GdlDefaultCreatorTopicView from a Gdl Schema topic map
Added:
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
Modified:
branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPanel.java
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/GdlVisibleObject.java
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/ILoadSchemaCallback.java
branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/LoadSchemaCallback.java
branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPanel.java
==============================================================================
--- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPanel.java Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPanel.java Wed Jul 13 07:45:55 2011 (r609)
@@ -37,7 +37,7 @@
// if any value is set in this array list, the requested view is a Default-Creator-Topic-View
private ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate = new ArrayList<Pair<String,TopicIdentifierTypes>>();
// if any value is set in this array list, the requested view is a Default-Editor-Topic-View
- private ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToEdit = new ArrayList<Pair<String,TopicIdentifierTypes>>();
+ private Pair<String, TopicIdentifierTypes> requestedTopicToEdit = null;
// the GWT base for this panel
private AbsolutePanel mainPanel = new AbsolutePanel();
@@ -63,24 +63,24 @@
}
- protected GdlPanel(ArrayList<Pair<String, TopicIdentifierTypes>> topicsToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate) throws ExecutionException{
+ protected GdlPanel(Pair<String, TopicIdentifierTypes> topicToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate) throws ExecutionException{
this();
- if(topicsToEdit != null && topicsToEdit.size() != 0)this.requestedTopicsToEdit = topicsToEdit;
+ if(topicToEdit != null)this.requestedTopicToEdit = topicToEdit;
if(topicToCreate != null && topicToCreate.size() != 0)this.requestedTopicsToCreate = topicToCreate;
- if(this.requestedTopicsToCreate.size() != 0 && this.requestedTopicsToEdit.size() != 0)
- throw new ExecutionException("only one container can be set, i.e. either topics to create or topics to edit");
+ if(this.requestedTopicsToCreate.size() != 0 && this.requestedTopicToEdit != null)
+ throw new ExecutionException("only one container can be set, i.e. either topics to create or a topic to edit");
}
- public GdlPanel(ArrayList<Pair<String, TopicIdentifierTypes>> topicsToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate, int width, int height) throws ExecutionException{
- this(topicsToEdit, topicToCreate);
+ public GdlPanel(Pair<String, TopicIdentifierTypes> topicToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate, int width, int height) throws ExecutionException{
+ this(topicToEdit, topicToCreate);
this.setPixelSize(width, height);
}
- public GdlPanel(ArrayList<Pair<String, TopicIdentifierTypes>> topicsToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate, String width, String height) throws ExecutionException{
- this(topicsToEdit, topicToCreate);
+ public GdlPanel(Pair<String, TopicIdentifierTypes> topicToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> topicToCreate, String width, String height) throws ExecutionException{
+ this(topicToEdit, topicToCreate);
this.setSize(width, height);
}
@@ -168,7 +168,7 @@
if(this.loadSchemaCallback == null){
throw new ExecutionException("No LoadSchemaCallback was set yet");
}
- this.loadSchemaCallback.loadSchema(this, this.requestedTopicsToEdit, this.requestedTopicsToCreate);
+ this.loadSchemaCallback.loadSchema(this, this.requestedTopicToEdit, this.requestedTopicsToCreate);
}catch(Exception e){
for (IOnErrorCallback handler : localOnErrorContainer) {
handler.onError(GdlErrorTypes.LoadError, e);
@@ -258,8 +258,10 @@
// Creates the actual view from the requested topic map
public void createView(){
try{
- //view = GdlInstantiator.instantiateDefaultEditorOrCreatorView(requestedTopicsTo, requestedTopicToCreat, this.requestedSchemaTm);
- //TODO: implement
+ if(this.requestedTopicsToCreate != null && this.requestedTopicsToCreate.size() != 0)
+ this.view = GdlInstantiator.instantiateDefaultCreatorTopicView(this.requestedTopicsToCreate, this.requestedSchemaTm);
+ else if(this.requestedTopicToEdit != null)
+ this.view = GdlInstantiator.instantiateDefaultEditorTopicView(this.requestedTopicToEdit, this.requestedSchemaTm);
mainPanel.add(view);
for (Pair<ClickHandler, String> item : this.buttonCallbacks) {
view.registerButtonCallback(item.getFirst(), item.getSecond());
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 Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlPsis.java Wed Jul 13 07:45:55 2011 (r609)
@@ -252,247 +252,5 @@
public final static String gdlFocus = gdl + "focus";
public final static String gdlActive = gdl + "active";
}
-
-
- // a helper that returns the topic bound to the identifier via a subject identifier
- public static Topic getTopicByPsi(String subjectIdentifier, TopicMap tm){
- if(subjectIdentifier == null || tm == null) return null;
-
- Locator loc = tm.createLocator(subjectIdentifier);
- return tm.getTopicBySubjectIdentifier(loc);
- }
-
-
- // a helper that returns the topic bound to the identifier via a subject locator
- public static Topic getTopicBySl(String subjectLocator, TopicMap tm){
- if(subjectLocator == null || tm == null) return null;
-
- Locator loc = tm.createLocator(subjectLocator);
- return tm.getTopicBySubjectLocator(loc);
- }
-
-
- // a helper that returns the topic bound to the identifier via an item identifier
- public static Topic getTopicByIi(String itemIdentifier, TopicMap tm){
- if(itemIdentifier == null || tm == null) return null;
-
- Locator loc = tm.createLocator(itemIdentifier);
- return (Topic)tm.getConstructByItemIdentifier(loc);
- }
-
-
- // returns a topic that is identified by ref
- public static Topic getTopicByAnyIdentifier(Pair<String, TopicIdentifierTypes> ref, TopicMap tm){
- if(ref.getSecond() == TopicIdentifierTypes.ItemIdentifier){
- return getTopicByIi(ref.getFirst(), tm);
- }else if(ref.getSecond() == TopicIdentifierTypes.SubjectLocator){
- return getTopicBySl(ref.getFirst(), tm);
- }else {
- return getTopicByPsi(ref.getFirst(), tm);
- }
- }
-
-
- // a helper method to return any identifier string of the topic
- public static String getAnyIdOfTopic(Topic topic){
- if(topic.getSubjectIdentifiers().length() != 0){
- return topic.getSubjectIdentifiers().get(0).getReference();
- }else if(topic.getSubjectLocators().length() != 0) {
- return topic.getSubjectLocators().get(0).getReference();
- }if(topic.getItemIdentifiers().length() != 0){
- return topic.getItemIdentifiers().get(0).getReference();
- } 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>();
- TopicMap tm = type.getTopicMap();
-
- for(int i = 0; i != tm.getTopics().length(); ++i){
- if(multipleTypesAllowed){
- if(isInstanceOf(tm.getTopics().get(i), type)) result.add(tm.getTopics().get(i));
- } else {
- if(isInstanceOf(tm.getTopics().get(i), type) && tm.getTopics().get(i).getTypes().length() == 1) result.add(tm.getTopics().get(i));
- }
- }
-
- return result;
- }
-
-
- // returns true if the topic instance if an instance of the topic type
- public static boolean isInstanceOf(Topic instance, Topic type){
- if(instance == null || type == null) return false;
- JsArray<Topic> types = instance.getTypes();
- for(int i = 0; i != types.length(); ++i){
- ArrayList<Topic> superTypes = getAllSuperTypes(types.get(i), null);
- superTypes.add(types.get(i));
- if(superTypes.contains(type)) return true;
- }
-
- return false;
- }
-
-
- // returns an array list with all direct and indirect supertypes of top
- public static ArrayList<Topic> getAllSuperTypes(Topic top, ArrayList<Topic> collectedSupertypes){
- if(top == null) return new ArrayList<Topic>();
-
- 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;
-
- 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 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().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){
- TopicMap tm = instance.getTopicMap();
- Topic type = tm.getTopicBySubjectIdentifier(tm.createLocator(typeSubjectIdentifier));
- return isInstanceOf(instance, type);
- }
-
-
- // returns true if the passed association has exactly the corresponding roles to
- // the array list rolePlayersAndTypes
- public static boolean hasRoles(Association assoc, ArrayList<Pair<Topic, Topic>> rolePlayertypesAndTypes){
- if(assoc == null) return false;
- if(assoc.getRoles().length() == 0 && rolePlayertypesAndTypes == null) return true;
- if(assoc.getRoles().length() != rolePlayertypesAndTypes.size()) return false;
-
- for (Pair<Topic, Topic> pair : rolePlayertypesAndTypes) {
- JsArray<Role> selection = assoc.getRoles(pair.getSecond());
- int i = 0;
- for(; i != selection.length(); ++i){
- if(isInstanceOf(selection.get(i).getPlayer(), pair.getFirst())) break;
- }
-
- if(i == selection.length()) return false;
- }
-
- return true;
- }
-
-
- // returns true if the topics of themes are all equal to the scope of construct
- public static boolean hasThemes(Construct construct, ArrayList<Topic> themes){
- if(construct == null) return false;
-
- ScopedStub scoped = (ScopedStub)construct;
- if(scoped.getScope().length() != 0 && (themes == null || themes.size() == 0)) return false;
- if(scoped.getScope().length() != themes.size()) return false;
-
- for(int i = 0; i != scoped.getScope().length(); ++i){
- if(!themes.contains(scoped.getScope().get(i))) return false;
- }
-
- return true;
- }
-
-
- // returns all topics that are instances if tm-value, which are also bound to this
- // topic via a gdl:tm-binding association
- public static ArrayList<Topic> getTmValues(Topic top){
- ArrayList<Topic> result = new ArrayList<Topic>();
- if(top == null) return result;
- TopicMap tm = top.getTopicMap();
- Topic descriptor = getTopicByPsi(RoleType.gdlDescriptor, tm);
- Topic tmBinding = getTopicByPsi(AssociationType.gdlTmBinding, tm);
- Topic tmValue = getTopicByPsi(TopicType.gdlTmValue, tm);
-
- JsArray<Role> roles = top.getRolesPlayed(descriptor, tmBinding);
- for(int i = 0; i != roles.length(); ++i){
- Association parent = roles.get(i).getParent();
- if(parent.getRoles().length() == 2 && parent.getRoles(descriptor).length() == 1 &&
- isInstanceOf(parent.getRoles(descriptor).get(0).getPlayer(), tmValue))
- result.add(parent.getRoles(descriptor).get(0).getPlayer());
- }
- return result;
- }
-
-
- // returns the associations that are bound to the topic "topic" and have the passed scope and roles
- public static ArrayList<Association> getAssociationsOfTopic(Topic topic, Topic roleType, Topic assocType, ArrayList<Topic> scope, ArrayList<Pair<Topic, Topic>> rolePlayertypesAndTypes){
- ArrayList<Association> result = new ArrayList<Association>();
- if(topic == null || assocType == null || rolePlayertypesAndTypes == null || rolePlayertypesAndTypes.size() == 0) return result;
-
- ArrayList<Association> allPotentialAssocs = new ArrayList<Association>();
- for(int i = 0; i != topic.getRolesPlayed(roleType, assocType).length(); ++i) allPotentialAssocs.add(topic.getRolesPlayed(roleType, assocType).get(i).getParent());
-
- ArrayList<Association> assocsWoScope = new ArrayList<Association>();
- for (Association assoc : allPotentialAssocs) if(hasRoles(assoc, rolePlayertypesAndTypes)) assocsWoScope.add(assoc);
-
- for (Association assoc : assocsWoScope) if(hasThemes(assoc, scope)) result.add(assoc);
-
- return result;
- }
}
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java
==============================================================================
--- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java Wed Jul 13 07:45:55 2011 (r609)
@@ -142,7 +142,7 @@
}
if(unscopedOccs.size() > 1){
- throw new InvalidGdlSchemaException("The topic " + GdlPsis.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to none or one unscoped occurrence of the type " + occurrenceType + ", but is bound " + unscopedOccs.size() + " times to it");
+ 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 {
@@ -170,7 +170,7 @@
}
if(matchedOccurrences.size() > 1){
- throw new InvalidGdlSchemaException("The topic " + GdlPsis.getAnyIdOfTopic(this.tmRepresentative) + "must be bound to none or one occurrence of the type " + occurrenceType + " and the scope " + theme + " but is bound " + matchedOccurrences.size() + " times to it");
+ throw new InvalidGdlSchemaException("The topic " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + "must be bound to none or one occurrence of the type " + occurrenceType + " and the scope " + theme + " but is bound " + matchedOccurrences.size() + " times to it");
} else if(matchedOccurrences.size() == 1){
return matchedOccurrences.get(0);
} else {
@@ -184,7 +184,7 @@
public String getId() throws InvalidGdlSchemaException {
JsArray<Occurrence> idOccs = getOccurrences(GdlPsis.OccurrenceType.gdlId);
if(idOccs.length() != 1){
- throw new InvalidGdlSchemaException("The topic " + GdlPsis.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to exactly one occurrence of the type " + GdlPsis.OccurrenceType.gdlId + ", but is bound " + idOccs.length() + " times to it");
+ throw new InvalidGdlSchemaException("The topic " + TmHelper.getAnyIdOfTopic(this.tmRepresentative) + " must be bound to exactly one occurrence of the type " + GdlPsis.OccurrenceType.gdlId + ", but is bound " + idOccs.length() + " times to it");
} else {
return idOccs.get(0).getValue();
}
Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/TmHelper.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/TmHelper.java Wed Jul 13 07:45:55 2011 (r609)
@@ -0,0 +1,265 @@
+package us.isidor.gdl.anaToMia.Widgets.base;
+
+import java.util.ArrayList;
+
+import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association;
+import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Construct;
+import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Locator;
+import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role;
+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.GdlPsis.AssociationType;
+import us.isidor.gdl.anaToMia.Widgets.base.GdlPsis.RoleType;
+import us.isidor.gdl.anaToMia.Widgets.base.GdlPsis.TMDM;
+import us.isidor.gdl.anaToMia.Widgets.base.GdlPsis.TopicType;
+import us.isidor.gdl.anaToMia.Widgets.environment.Pair;
+import us.isidor.gdl.anaToMia.Widgets.environment.TopicIdentifierTypes;
+
+import com.google.gwt.core.client.JsArray;
+
+public class TmHelper {
+
+
+ // a helper that returns the topic bound to the identifier via a subject identifier
+ public static Topic getTopicByPsi(String subjectIdentifier, TopicMap tm){
+ if(subjectIdentifier == null || tm == null) return null;
+
+ Locator loc = tm.createLocator(subjectIdentifier);
+ return tm.getTopicBySubjectIdentifier(loc);
+ }
+
+
+ // a helper that returns the topic bound to the identifier via a subject locator
+ public static Topic getTopicBySl(String subjectLocator, TopicMap tm){
+ if(subjectLocator == null || tm == null) return null;
+
+ Locator loc = tm.createLocator(subjectLocator);
+ return tm.getTopicBySubjectLocator(loc);
+ }
+
+
+ // a helper that returns the topic bound to the identifier via an item identifier
+ public static Topic getTopicByIi(String itemIdentifier, TopicMap tm){
+ if(itemIdentifier == null || tm == null) return null;
+
+ Locator loc = tm.createLocator(itemIdentifier);
+ return (Topic)tm.getConstructByItemIdentifier(loc);
+ }
+
+
+ // returns a topic that is identified by ref
+ public static Topic getTopicByAnyIdentifier(Pair<String, TopicIdentifierTypes> ref, TopicMap tm){
+ if(ref.getSecond() == TopicIdentifierTypes.ItemIdentifier){
+ return getTopicByIi(ref.getFirst(), tm);
+ }else if(ref.getSecond() == TopicIdentifierTypes.SubjectLocator){
+ return getTopicBySl(ref.getFirst(), tm);
+ }else {
+ return getTopicByPsi(ref.getFirst(), tm);
+ }
+ }
+
+
+ // a helper method to return any identifier string of the topic
+ public static String getAnyIdOfTopic(Topic topic){
+ if(topic.getSubjectIdentifiers().length() != 0){
+ return topic.getSubjectIdentifiers().get(0).getReference();
+ }else if(topic.getSubjectLocators().length() != 0) {
+ return topic.getSubjectLocators().get(0).getReference();
+ }if(topic.getItemIdentifiers().length() != 0){
+ return topic.getItemIdentifiers().get(0).getReference();
+ } 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>();
+ TopicMap tm = type.getTopicMap();
+
+ for(int i = 0; i != tm.getTopics().length(); ++i){
+ if(multipleTypesAllowed){
+ if(isInstanceOf(tm.getTopics().get(i), type)) result.add(tm.getTopics().get(i));
+ } else {
+ if(isInstanceOf(tm.getTopics().get(i), type) && tm.getTopics().get(i).getTypes().length() == 1) result.add(tm.getTopics().get(i));
+ }
+ }
+
+ return result;
+ }
+
+
+ // returns true if the topic instance if an instance of the topic type
+ public static boolean isInstanceOf(Topic instance, Topic type){
+ if(instance == null || type == null) return false;
+
+ JsArray<Topic> types = instance.getTypes();
+ for(int i = 0; i != types.length(); ++i){
+ ArrayList<Topic> superTypes = getAllSuperTypes(types.get(i), null);
+ superTypes.add(types.get(i));
+ if(superTypes.contains(type)) return true;
+ }
+
+ return false;
+ }
+
+
+ // returns an array list with all direct and indirect supertypes of top
+ public static ArrayList<Topic> getAllSuperTypes(Topic top, ArrayList<Topic> collectedSupertypes){
+ if(top == null) return new ArrayList<Topic>();
+
+ 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;
+
+ 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 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().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){
+ TopicMap tm = instance.getTopicMap();
+ Topic type = tm.getTopicBySubjectIdentifier(tm.createLocator(typeSubjectIdentifier));
+ return isInstanceOf(instance, type);
+ }
+
+
+ // returns true if the passed association has exactly the corresponding roles to
+ // the array list rolePlayersAndTypes
+ public static boolean hasRoles(Association assoc, ArrayList<Pair<Topic, Topic>> rolePlayertypesAndTypes){
+ if(assoc == null) return false;
+ if(assoc.getRoles().length() == 0 && rolePlayertypesAndTypes == null) return true;
+ if(assoc.getRoles().length() != rolePlayertypesAndTypes.size()) return false;
+
+ for (Pair<Topic, Topic> pair : rolePlayertypesAndTypes) {
+ JsArray<Role> selection = assoc.getRoles(pair.getSecond());
+ int i = 0;
+ for(; i != selection.length(); ++i){
+ if(isInstanceOf(selection.get(i).getPlayer(), pair.getFirst())) break;
+ }
+
+ if(i == selection.length()) return false;
+ }
+
+ return true;
+ }
+
+
+ // returns true if the topics of themes are all equal to the scope of construct
+ public static boolean hasThemes(Construct construct, ArrayList<Topic> themes){
+ if(construct == null) return false;
+
+ ScopedStub scoped = (ScopedStub)construct;
+ if(scoped.getScope().length() != 0 && (themes == null || themes.size() == 0)) return false;
+ if(scoped.getScope().length() != themes.size()) return false;
+
+ for(int i = 0; i != scoped.getScope().length(); ++i){
+ if(!themes.contains(scoped.getScope().get(i))) return false;
+ }
+
+ return true;
+ }
+
+
+ // returns all topics that are instances if tm-value, which are also bound to this
+ // topic via a gdl:tm-binding association
+ public static ArrayList<Topic> getTmValues(Topic top){
+ ArrayList<Topic> result = new ArrayList<Topic>();
+ if(top == null) return result;
+ TopicMap tm = top.getTopicMap();
+ Topic descriptor = getTopicByPsi(RoleType.gdlDescriptor, tm);
+ Topic tmBinding = getTopicByPsi(AssociationType.gdlTmBinding, tm);
+ Topic tmValue = getTopicByPsi(TopicType.gdlTmValue, tm);
+
+ JsArray<Role> roles = top.getRolesPlayed(descriptor, tmBinding);
+ for(int i = 0; i != roles.length(); ++i){
+ Association parent = roles.get(i).getParent();
+ if(parent.getRoles().length() == 2 && parent.getRoles(descriptor).length() == 1 &&
+ isInstanceOf(parent.getRoles(descriptor).get(0).getPlayer(), tmValue))
+ result.add(parent.getRoles(descriptor).get(0).getPlayer());
+ }
+ return result;
+ }
+
+
+ // returns the associations that are bound to the topic "topic" and have the passed scope and roles
+ public static ArrayList<Association> getAssociationsOfTopic(Topic topic, Topic roleType, Topic assocType, ArrayList<Topic> scope, ArrayList<Pair<Topic, Topic>> rolePlayertypesAndTypes){
+ ArrayList<Association> result = new ArrayList<Association>();
+ if(topic == null || assocType == null || rolePlayertypesAndTypes == null || rolePlayertypesAndTypes.size() == 0) return result;
+
+ ArrayList<Association> allPotentialAssocs = new ArrayList<Association>();
+ for(int i = 0; i != topic.getRolesPlayed(roleType, assocType).length(); ++i) allPotentialAssocs.add(topic.getRolesPlayed(roleType, assocType).get(i).getParent());
+
+ ArrayList<Association> assocsWoScope = new ArrayList<Association>();
+ for (Association assoc : allPotentialAssocs) if(hasRoles(assoc, rolePlayertypesAndTypes)) assocsWoScope.add(assoc);
+
+ for (Association assoc : assocsWoScope) if(hasThemes(assoc, scope)) result.add(assoc);
+
+ return result;
+ }
+}
Added: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.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/Utils.java Wed Jul 13 07:45:55 2011 (r609)
@@ -0,0 +1,20 @@
+package us.isidor.gdl.anaToMia.Widgets.base;
+
+import java.util.ArrayList;
+
+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;
+ if(lft == null || rgt == null) return false;
+ if(lft.size() != rgt.size()) return false;
+
+ for(Object obj : lft) if(!rgt.contains(obj))return false;
+
+ // because of duplicate values the reverse comparison must also be done
+ for(Object obj : rgt) if(!lft.contains(obj))return false;
+
+ return true;
+ }
+}
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 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/GdlInstantiator.java Wed Jul 13 07:45:55 2011 (r609)
@@ -7,6 +7,8 @@
import us.isidor.gdl.anaToMia.Widgets.base.GdlLineBreak;
import us.isidor.gdl.anaToMia.Widgets.base.GdlPsis;
import us.isidor.gdl.anaToMia.Widgets.base.GdlVisibleObject;
+import us.isidor.gdl.anaToMia.Widgets.base.TmHelper;
+import us.isidor.gdl.anaToMia.Widgets.base.Utils;
import us.isidor.gdl.anaToMia.Widgets.button.GdlActionButton;
import us.isidor.gdl.anaToMia.Widgets.button.GdlCheckBox;
import us.isidor.gdl.anaToMia.Widgets.button.GdlCommitButton;
@@ -40,74 +42,175 @@
// returns a java instance of a GdlVisibleObject that corresponds to the
// set topic type of the passed topic instance
public static GdlVisibleObject instantiate(Topic tmRepresentative) throws InvalidGdlSchemaException, ExecutionException{
- if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlLineBreak)){
+ if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlLineBreak)){
return new GdlLineBreak(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlInfo)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlInfo)){
return new GdlInfo(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlTitle)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlTitle)){
return new GdlTitle(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlReference)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlReference)){
return new GdlReference(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlRadioButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlRadioButton)){
return new GdlRadioButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCheckBox)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCheckBox)){
return new GdlCheckBox(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlActionButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlActionButton)){
return new GdlActionButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlValidateButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlValidateButton)){
return new GdlValidateButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCreateButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCreateButton)){
return new GdlCreateButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDeleteButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDeleteButton)){
return new GdlDeleteButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCommitButton)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCommitButton)){
return new GdlCommitButton(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlImage)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlImage)){
return new GdlImage(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlVideo)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlVideo)){
return new GdlVideo(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlAudio)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlAudio)){
return new GdlAudio(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDatePicker)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDatePicker)){
return new GdlDatePicker(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlTimePicker)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlTimePicker)){
return new GdlTimePicker(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDateTimePicker)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDateTimePicker)){
return new GdlDateTimePicker(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlUnit)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlUnit)){
return new GdlUnit(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlText)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlText)){
return new GdlText(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlList)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlList)){
return new GdlList(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlListBox)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlListBox)){
return new GdlListBox(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDefaultCreatorTopicView)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDefaultCreatorTopicView)){
return new GdlDefaultCreatorTopicView(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDefaultEditorTopicView)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlDefaultEditorTopicView)){
return new GdlDefaultEditorTopicView(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlSpecialCreatorTopicView)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlSpecialCreatorTopicView)){
return new GdlSpecialCreatorTopicView(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlSpecialEditorTopicView)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlSpecialEditorTopicView)){
return new GdlSpecialEditorTopicView(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCreatorAssociationview)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlCreatorAssociationview)){
return new GdlCreatorAssociationView(tmRepresentative);
- }else if(GdlPsis.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlEditorAssociationView)){
+ }else if(TmHelper.isInstanceOf(tmRepresentative, GdlPsis.TopicType.gdlEditorAssociationView)){
return new GdlEditorAssociationView(tmRepresentative);
}else{
String values = "";
for(int i = 0; i != tmRepresentative.getTypes().length(); ++i){
if(i != tmRepresentative.getTypes().length() - 1){
- values += GdlPsis.getAnyIdOfTopic(tmRepresentative.getTypes().get(i)) + ", ";
+ values += TmHelper.getAnyIdOfTopic(tmRepresentative.getTypes().get(i)) + ", ";
}else {
- values += GdlPsis.getAnyIdOfTopic(tmRepresentative.getTypes().get(i));
+ values += TmHelper.getAnyIdOfTopic(tmRepresentative.getTypes().get(i));
}
}
- throw new InvalidGdlSchemaException("the topic " + GdlPsis.getAnyIdOfTopic(tmRepresentative) + " is an instance of an unsupported visible topic type or an abstract topic type: " + values);
+ throw new InvalidGdlSchemaException("the topic " + TmHelper.getAnyIdOfTopic(tmRepresentative) + " is an instance of an unsupported visible topic type or an abstract topic type: " + values);
}
}
+
+ // returns a GdlDefaultCreatorTopicView tha corresponds to the passed arguements
+ public static GdlDefaultCreatorTopicView instantiateDefaultCreatorTopicView(ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopics, TopicMap schemaTm) throws InvalidGdlSchemaException, ExecutionException{
+ ArrayList<Topic> views = getViewTopics(requestedTopics, TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultCreatorTopicView, schemaTm), schemaTm);
+
+ if(views.size() != 1){
+ String values = "";
+ for (Pair<String, TopicIdentifierTypes> pair : requestedTopics)
+ 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 fo topics requested (" + values + ") must be bound exactly once to a " + GdlPsis.TopicType.gdlDefaultCreatorTopicView + " but is bound to " + bindings);
+ }
+
+ return new GdlDefaultCreatorTopicView(views.get(0));
+ }
+
+
+ // returns the topics that are bound to the corresponding user topics and corresponds to the
+ // given view super type. Note only topics that are bound to TM-Single-Type-Value and
+ // TM-Multiple-Type-Value are taken into account.
+ public static ArrayList<Topic> getViewTopics(ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopics, Topic viewSupertype, TopicMap schemaTm) throws InvalidGdlSchemaException{
+ if(requestedTopics == null || requestedTopics.size() == 0 || schemaTm == null) return null;
+
+ // request all topics that are passed by the user
+ ArrayList<Topic> requestedTops = new ArrayList<Topic>();
+ for (Pair<String, TopicIdentifierTypes> topId : requestedTopics){
+ Topic top = TmHelper.getTopicByAnyIdentifier(topId, schemaTm);
+ if(top == null) throw new InvalidGdlSchemaException("the topic " + topId.getFirst() + " was not found!");
+ if(!requestedTops.contains(top)) requestedTops.add(top);
+ }
+
+ // get all TM-Values, i.e. TM-Multiple-Type-Value and TM-Single-Type-Value (only if requstedTops.sie() == 1)
+ ArrayList<Topic> tmValues = new ArrayList<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);
+ Topic tmMultipleTypeValue = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlTmMultipleTypeValue, schemaTm);
+ Topic tmSingleTypeValue = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlTmSingleTypeValue, schemaTm);
+ for (Topic requestedTopic : requestedTops) {
+ ArrayList<Topic> allTmValues = TmHelper.getOtherPlayerOfBinaryAssociation(requestedTopic, tmConstruct, tmBinding, null, descriptor);
+ // filter only the valid tm-values for this scenario
+ for (Topic tmValue : allTmValues){
+ if(TmHelper.isInstanceOf(tmValue, tmMultipleTypeValue) || (requestedTops.size() == 1 && TmHelper.isInstanceOf(tmValue, tmSingleTypeValue))){
+ // check all user topics that are associated with the tmValue, i.e. a tmValue is only valid
+ // if exactly those topics are associated to it through a tm-binding association, which are
+ // requested by the user
+ ArrayList<Topic> allInstanceValues = TmHelper.getOtherPlayerOfBinaryAssociation(tmValue, descriptor, tmBinding, null, tmConstruct);
+ if(Utils.compareLists(allInstanceValues, requestedTops) && !tmValues.contains(tmValue)) tmValues.add(tmValue);
+ }
+ }
+ }
+
+ // get all views that are bound to the found tm-values
+ ArrayList<Topic> views = new ArrayList<Topic>();
+ Topic tmValueRoleType = TmHelper.getTopicByPsi(GdlPsis.RoleType.gdlTmValue, schemaTm);
+ Topic topicViewBinding = TmHelper.getTopicByPsi(GdlPsis.AssociationType.gdlTopicViewBinding, schemaTm);
+ for (Topic tmValue : tmValues) {
+ ArrayList<Topic> allViews = TmHelper.getOtherPlayerOfBinaryAssociation(tmValue, tmValueRoleType, topicViewBinding, null, descriptor);
+ // filter for allViews
+ if(viewSupertype == null){
+ for (Topic view : allViews)
+ if(!views.contains(view))views.add(view);
+ } else {
+ for (Topic view : allViews)
+ if(!views.contains(view) && TmHelper.isInstanceOf(view, viewSupertype)) views.add(view);
+ }
+ }
+
+ return views;
+ }
+
+
+
+ public static GdlDefaultEditorTopicView instantiateDefaultEditorTopicView(Pair<String, TopicIdentifierTypes> requestedTopic, TopicMap schemaTm){
+ 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
+
+ // 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
+
+ // 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{
@@ -118,43 +221,43 @@
throw new ExecutionException("only one of topic is allowed to be set as the base topic for a " + GdlPsis.TopicType.gdlView + " but found: " + values);
}
- Topic defaultCreatorTopicView = GdlPsis.getTopicByPsi(GdlPsis.TopicType.gdlDefaultCreatorTopicView, tm);
- Topic defaultEditorTopicView = GdlPsis.getTopicByPsi(GdlPsis.TopicType.gdlDefaultEditorTopicView, tm);
+ 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");
}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));
+ topsToDisplay.add(TmHelper.getTopicByAnyIdentifier(instanceTopic, tm));
}else{
for (Pair<String, TopicIdentifierTypes> pair : typeTopics) {
- topsToDisplay.add(GdlPsis.getTopicByAnyIdentifier(pair, tm));
+ 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 = 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);
+ 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 = GdlPsis.getOtherPlayerOfBinaryAssociation(topic, tmConstruct, tmBinding, null, descriptor);
+ ArrayList<Topic> potentialTmValues = TmHelper.getOtherPlayerOfBinaryAssociation(topic, tmConstruct, tmBinding, null, descriptor);
for (Topic potentialTmValue : potentialTmValues)
- if(GdlPsis.isInstanceOf(potentialTmValue, TmValue)) tmValues.add(potentialTmValue);
+ 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 = GdlPsis.getTopicByPsi(GdlPsis.TMCL.topictype, tm);
+ 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(GdlPsis.hasAssociation(topToDisplay, tmConstruct, tmBinding, value, descriptor) ||
- GdlPsis.getAssociationsOfTopic(value, descriptor, tmBinding, null, roles).size() != topsToDisplay.size()){
+ if(TmHelper.hasAssociation(topToDisplay, tmConstruct, tmBinding, value, descriptor) ||
+ TmHelper.getAssociationsOfTopic(value, descriptor, tmBinding, null, roles).size() != topsToDisplay.size()){
invalidTmValues.add(value);
}
}
@@ -164,17 +267,17 @@
// 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);
+ Topic defaultTopicView = TmHelper.getTopicByPsi(GdlPsis.TopicType.gdlDefaultTopicView, tm);
+ Topic topicViewBinding = TmHelper.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);
+ ArrayList<Topic> views = TmHelper.getOtherPlayerOfBinaryAssociation(validTmValue, tmValue, topicViewBinding, null, descriptor);
+ for (Topic view : views) if(TmHelper.isInstanceOf(view, defaultTopicView)) defaultTopicViews.add(view);
}
// return default-topic-view
if(defaultTopicViews.size() > 2){
String values = "";
- for (Topic topic : topsToDisplay)values += ", " + GdlPsis.getAnyIdOfTopic(topic);
+ 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){
@@ -182,7 +285,7 @@
} 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)){
+ if(TmHelper.isInstanceOf(defaultTopicViews.get(0), GdlPsis.TopicType.gdlDefaultCreatorTopicView)){
creatorView = defaultTopicViews.get(0);
editorView = defaultTopicViews.get(1);
}else {
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/ILoadSchemaCallback.java
==============================================================================
--- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/ILoadSchemaCallback.java Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/environment/ILoadSchemaCallback.java Wed Jul 13 07:45:55 2011 (r609)
@@ -6,5 +6,5 @@
import us.isidor.gdl.anaToMia.Widgets.base.GdlPanel;
public interface ILoadSchemaCallback {
- public void loadSchema(GdlPanel panel, ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate)throws RequestException;
+ public void loadSchema(GdlPanel panel, Pair<String, TopicIdentifierTypes> requestedTopicToEdit, ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate)throws RequestException;
}
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/LoadSchemaCallback.java
==============================================================================
--- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/LoadSchemaCallback.java Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/LoadSchemaCallback.java Wed Jul 13 07:45:55 2011 (r609)
@@ -25,7 +25,7 @@
public class LoadSchemaCallback implements ILoadSchemaCallback{
private final String isidorusUrl = URL.encode(GWT.getModuleBaseURL() + "test.gdl.jtm"); // TODO: replace with the correct URL
private ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate = new ArrayList<Pair<String,TopicIdentifierTypes>>();
- private ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToEdit = new ArrayList<Pair<String,TopicIdentifierTypes>>();
+ private Pair<String, TopicIdentifierTypes> requestedTopicToEdit = null;
private RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, isidorusUrl);
@@ -34,9 +34,9 @@
// this method is invoked as a callback method
@Override
- public void loadSchema(GdlPanel panel, ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToEdit , ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate)throws RequestException {
+ public void loadSchema(GdlPanel panel, Pair<String, TopicIdentifierTypes> requestedTopicToEdit , ArrayList<Pair<String, TopicIdentifierTypes>> requestedTopicsToCreate)throws RequestException {
this.requestedTopicsToCreate = requestedTopicsToCreate;
- this.requestedTopicsToEdit = requestedTopicsToEdit;
+ this.requestedTopicToEdit = requestedTopicToEdit;
requestBuilder.sendRequest(null, new RequestCallbackImpl(panel));
}
@@ -75,7 +75,7 @@
public void onClick(ClickEvent event) {
dialog.hide();
try{
- loadSchema(panel, LoadSchemaCallback.this.requestedTopicsToEdit, LoadSchemaCallback.this.requestedTopicsToCreate);
+ loadSchema(panel, LoadSchemaCallback.this.requestedTopicToEdit, LoadSchemaCallback.this.requestedTopicsToCreate);
}catch(Exception e){
Window.alert("connection to : " + isidorusUrl + " failed: " + e.getMessage());
}
@@ -102,7 +102,7 @@
public void onClick(ClickEvent event) {
dialog.hide();
try{
- loadSchema(panel, LoadSchemaCallback.this.requestedTopicsToEdit, LoadSchemaCallback.this.requestedTopicsToCreate);
+ loadSchema(panel, LoadSchemaCallback.this.requestedTopicToEdit, LoadSchemaCallback.this.requestedTopicsToCreate);
}catch(Exception e){
Window.alert("connection to : " + isidorusUrl + " failed: " + e.getMessage());
}
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java
==============================================================================
--- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java Wed Jul 13 05:38:00 2011 (r608)
+++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlView.java Wed Jul 13 07:45:55 2011 (r609)
@@ -14,6 +14,7 @@
import us.isidor.gdl.anaToMia.Widgets.base.GdlVisibleObject;
import us.isidor.gdl.anaToMia.Widgets.base.IGdlContainer;
import us.isidor.gdl.anaToMia.Widgets.base.IGdlHasValue;
+import us.isidor.gdl.anaToMia.Widgets.base.TmHelper;
import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException;
import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException;
@@ -68,7 +69,7 @@
if(topsWithoutAncestorPosAssoc.size() > 1){
String foundTops = "";
for (Topic topic : topsWithoutAncestorPosAssoc) {
- foundTops += GdlPsis.getAnyIdOfTopic(topic) + ", ";
+ foundTops += TmHelper.getAnyIdOfTopic(topic) + ", ";
}
if(foundTops.length() >= 2)foundTops = foundTops.substring(0, foundTops.length() - 2);
throw new InvalidGdlSchemaException("A " + GdlPsis.TopicType.gdlView + " must have maximal one item that is desiganted to tbe the first item in this view, i.e. there must be zero or one items without being bound to a " + GdlPsis.RoleType.gdlAncestor + " but found: " + foundTops);