[isidorus-cvs] r33 - in trunk: docs src/ajax/javascripts src/json src/unit_tests
Lukas Giessmann
lgiessmann at common-lisp.net
Fri Jun 5 10:43:03 UTC 2009
Author: lgiessmann
Date: Fri Jun 5 06:42:59 2009
New Revision: 33
Log:
client ajax: added the basic handling for roleplayer-constraints and associationrole-constraints
Modified:
trunk/docs/xtm_json.txt
trunk/src/ajax/javascripts/datamodel.js
trunk/src/ajax/javascripts/tmcl_tools.js
trunk/src/json/json_tmcl.lisp
trunk/src/unit_tests/poems.xtm
Modified: trunk/docs/xtm_json.txt
==============================================================================
--- trunk/docs/xtm_json.txt (original)
+++ trunk/docs/xtm_json.txt Fri Jun 5 06:42:59 2009
@@ -341,7 +341,7 @@
//+-----------------------------------------------------------------------------
{
"players" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "topic-2-psi-1", "..."], <...> ]
- "roleTypes" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "subtype-psi-1", "..." ], <...> ],
+ "roleType" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "subtype-psi-1", "..." ], <...> ],
"cardMin" : "unsigned integer in string representation",
"cardMax" : "unsigned integer in string representation or the string MAX_INT"
}
@@ -356,10 +356,10 @@
//+ The values cardMin and cardMax defines the cardinality of otherRoleType.
//+-----------------------------------------------------------------------------
{
- "playerType" : [ "topic-psi-1", "topic-psi-2", "..." ],
- "roleType" : [ "topic-psi-1", "topic-psi-2", "..." ],
- "otherRoleType" : [ "topic-psi-1", "topic-psi-2", "..." ],
- "otherPlayerType" : [ "topic-psi-1", "topic-psi-2", "..." ],
+ "players" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "topic-2-psi-1", "..."], <...> ] ],
+ "roleType" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "subtype-psi-1", "..." ], <...> ],
+ "otherPlayers" : [ "topic-psi-1", "topic-psi-2", "..." ], [ "topic-2-psi-1", "..."], <...> ] ],
+ "otherRoleType" : [ "topic-psi-1", "topic-psi-2", "..." ], [ "subtype-psi-1", "..." ], <...> ],
"cardMin" : "unsigned integer in string representation",
"cardMax" : "unsigned integer in string representation or the string MAX_INT"
}
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Fri Jun 5 06:42:59 2009
@@ -1276,11 +1276,12 @@
// --- representation of a role element.
-var RoleC = Class.create(ContainerC, {"initialize" : function($super, itemIdentities, roleTypes, rolePlayers, owner, min, max){
+var RoleC = Class.create(ContainerC, {"initialize" : function($super, itemIdentities, roleTypes, rolePlayers, owner, removeFunction, addFunction){
$super();
if(!owner.__frames__) owner.__frames__ = new Array();
if(!roleTypes || roleTypes.length === 0) throw "From RoleC(): roleTypes must be set!";
- if(!rolePlayers || rolePlayers.length === 0) throw "From RoleC(): rolePalyers must be set";
+ if(!rolePlayers || rolePlayers.length === 0) throw "From RoleC(): rolePlayers must be set";
+ if(!removeFunction || !addFunction) throw "From RoleC(): removeFunction and addFunction must be set!";
owner.__frames__.push(this);
this.__frame__.writeAttribute({"class" : CLASSES.roleFrame()});
this.__table__ = new Element("table", {"class" : CLASSES.roleFrame()});
@@ -1291,16 +1292,25 @@
try{
// --- control row + itemIdentity
makeControlRow(this, 3, itemIdentities); // make control row have to be changed to a separate control row for roles
- checkRemoveAddButtons(owner, 1, max);
- setRemoveAddHandler(this, owner, 1, max, function(){
- return new RoleC(null, roleTypes, rolePlayers, owner, min, max);
- });
+ checkRemoveAddButtons(owner, 1, -1);
+ setRemoveAddHandler(this, owner, 1, -1, function(){ /*do nothing*/ });
+ // --- resets the add and remove handlers
+ var cTd = this.__table__.select("tr." + CLASSES.itemIdentityFrame())[0].select("td." + CLASSES.controlColumn())[0].select("span." + CLASSES.clickable());
+ var removeButton = cTd[1];
+ var addButton = cTd[2];
+ removeButton.show();
+ addButton.show();
+ removeButton.stopObserving();
+ addButton.stopObserving();
+ removeButton.observe("click", removeFunction);
+ addButton.observe("click", addFunction);
// --- type
var types = this.__roleTypes__.flatten();
this.__type__ = new Object();
var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
this.__table__.insert({"bottom" : tr});
+ // TODO: implement a onTypeChangeHandler
// --- player
var players = this.__rolePlayers__.flatten();
@@ -1312,6 +1322,67 @@
alert("From RoleC(): " + err);
}
},
+ "addPlayer" : function(player){
+ if(!player || player.length === 0) return;
+ var selected = this.__player__.__frames__[0].getContent();
+ var select = this.__player__.__frames__[0].getFrame().select("select")[0];
+ select.update("");
+ if(this.__rolePlayers__){
+ var j = 0;
+ for(var i = 0; i !== player.length; ++i){
+ j = 0;
+ for( ; j !== this.__rolePlayers__.length; ++j){
+ if(this.__rolePlayers__[j].indexOf(player[i]) !== -1) break;
+ }
+ if(j !== this.__rolePlayers__.length){
+ this.__rolePlayers__[j] = player;
+ alert("test");
+ break;
+ }
+ }
+ if(j === this.__rolePlayers__.length)this.__rolePlayers__.push(player);
+ }
+ else {
+ this.__rolePlayers__ = new Array(player);
+ }
+ for(var i = 0; i !== this.__rolePlayers__.length; ++i){
+ for(var j = 0; j !== this.__rolePlayers__[i].length; ++j){
+ var opt = new Element("option", {"value" : this.__rolePlayers__[i][j]}).update(this.__rolePlayers__[i][j]);
+ if(this.__rolePlayers__[i][j] !== selected){
+ select.insert({"bottom" : opt});
+ }
+ else {
+ select.insert({"top" : opt});
+ }
+ }
+ }
+ },
+ "removePlayer" : function(player){
+ if(!player || player.length === 0 || !this.__rolePlayers__ || this.__rolePlayers__.length === 0) return;
+ var selected = this.__player__.__frames__[0].getContent();
+ var select = this.__player__.__frames__[0].getFrame().select("select")[0];
+ select.update("");
+ var j = 0;
+ for(var i = 0; i !== player.length; ++i){
+ j = 0;
+ for( ; j !== this.__rolePlayers__.length; ++j){
+ if(this.__rolePlayers__[j].indexOf(player[i]) !== -1) break;
+ }
+ if(j !== this.__rolePlayers__.length) break;
+ }
+ this.__rolePlayers__ = this.__rolePlayers__.slice(0, j).concat(this.__rolePlayers__.slice(j + 1, this.__rolePlayers__.length));
+ for(var i = 0; i !== this.__rolePlayers__.length; ++i){
+ for(var j = 0; j !== this.__rolePlayers__[i].length; ++j){
+ var opt = new Element("option", {"value" : this.__rolePlayers__[i][j]}).update(this.__rolePlayers__[i][j]);
+ if(this.__rolePlayers__[i][j] !== selected){
+ select.insert({"bottom" : opt});
+ }
+ else {
+ select.insert({"top" : opt});
+ }
+ }
+ }
+ },
"getType" : function(){
return this.__type__.__frames__[0].getContent();
},
@@ -1345,32 +1416,170 @@
// --- contains all roles of an association
-var RoleContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, roleConstraints, playerConstraints, otherRoleConstraints){
+var RoleContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints){
$super();
this.__frame__.writeAttribute({"class" : CLASSES.roleContainer()});
- this.__container__ = new Object();
+ this.__arContainer__ = new Object();
+ this.__orContainer__ = new Object();
+
+ /*
+
+ *associationrole-constraints: A association role constraint defines how many and of what type the roles in associations of given a type must be.
+ *min: card-min indicating the minimum number of times the role can appear in the association
+ *max: card-max indicating the maximum number of times the role can appear in the association
+ *roleplayer-constraints: A role player constraint defines a way to constrain the type of allowed role players of a given role with a given type
+ in an association of a given type.
+ *min: card-min indicating the minimum number of times a topic can play the role with the given type in the given
+ association of the given type
+ *max: card-max indicating the maximum number of times a topic can play the role with the given type in the given
+ association of the given type
+ *otherrole-constraints: A other role constraint defines a way to constrain the allowed type of role player given the existence of another role
+ player type in an association.
+ *min: card-min indicating the minimum number of times the other role can occur
+ *max: card-max indicating the maximum number of times the other role can occur
+
+
+algorithmus:
+OK *alle rollen aus associationroleconstraints erstellen in einem __arContainer__
+OK *überprüfen, ob die kardinalitäten der roleplayer mit den kardinalitäten der associationrole übereinstimmen
+OK *card-min rp < card-min ar -> fehler
+OK *card-max rp > card-max ar -> fehler
+OK *card-min rp > card-max ar -> fehler
+OK *card-max rp < card-min ar -> fehler
+OK *zu allen gefundenen roles vorhandene roleplayer-constraints suchen
+OK *alle roleplayer sammeln und an eine leere option anhängen, anschließend in RoleC anhängen
+*__orContainer__ für otherrole-constraints initialisieren
+*handler hinzufügen
+ */
+
try{
- if((!contents || contents.length === 0) && roleConstraints && playerConstraints){
- for(var i = 0; playerConstraints && i !== playerConstraints.length; ++i){
- //new RoleC(new Array("itemIdentity " + i), playerConstraints[i].roleTypes, playerConstraints[i].players, this.__container__, 1, 4);
- //this.__error__.insert({"before" : this.__container__.__frames__[i].getFrame()});
- }
+ if((!contents || contents.length === 0) && associationRoleConstraints){
+ this.resetValues(associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints);
}
else {
// TODO: check already existing contents and order them to the corresponding fields
}
-
-
-
}
catch(err){
alert("From RoleContainerC(): " + err);
}
},
- "resetValues" : function(roleConstraints, playerConstraints, otherRoleConstraints){
+ "resetValues" : function(associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints){
+ this.__associationRoleConstraints__ = associationRoleConstraints;
+ this.__rolePlayerConstraints__ = rolePlayerConstraints;
+ this.__otherRoleConstraints__ = otherRoleConstraints;
+
+ try{
+ for(var i = 0; this.__arContainer__.__frames__ && i !== this.__arContainer__.__frames__.length; ++i){
+ this.__arContainer__.__frames__[i].remove();
+ }
+ this.__arContainer__ = new Object();
+ }
+ catch(err){
+ this.__arContainer__ = new Object();
+ }
+ try{
+ for(var i = 0; this.__orContainer__.__frames__ && i !== this.__orContainer__.__frames__.length; ++i){
+ this.__orContainer__.__frames__[i].remove();
+ }
+ this.__orContainer__ = new Object();
+ }
+ catch(err){
+ this.__orContainer__ = new Object();
+ }
+
+
+ // --- creates all roles from existing associationroleconstraints and roleplayerConstraints
+ // TODO: insert existing contents to the corresponding constraints
+ for(var i = 0; this.__associationRoleConstraints__ && i !== this.__associationRoleConstraints__.length; ++i){
+ var arc = this.__associationRoleConstraints__[i];
+ var foundRpcs = getRolePlayerConstraintsForRole(arc.roleType, this.__rolePlayerConstraints__);
+ this.__makeRolesFromARC__(arc, foundRpcs);
+ }
+ },
+ "__makeRolesFromARC__" : function(associationRoleConstraint, rolePlayerConstraints){
+ if(!associationRoleConstraint || !rolePlayerConstraints || rolePlayerConstraints.length === 0) return;
+ checkCardinalitiesARC_RPC(associationRoleConstraint, rolePlayerConstraints);
+
+ // --- creates all roles with all needed players
+ var rolesCreated = 0;
+ var allAvailablePlayers = extractPlayersOfConstraints(rolePlayerConstraints);
+ var roleType = associationRoleConstraint.roleType;
+ var roleMin = associationRoleConstraint.cardMin;
+ for(var i = 0; i !== rolePlayerConstraints.length; ++i){
+ var playerMin = rolePlayerConstraints[i].cardMin;
+ var currentAvailablePlayers = rolePlayerConstraints[i].players;
+ var cleanedPlayers = cleanPlayers(allAvailablePlayers, currentAvailablePlayers);
+ for(var j = playerMin; j < currentAvailablePlayers.length; ++j){
+ cleanedPlayers.push(currentAvailablePlayers[j]);
+ }
+ if(currentAvailablePlayers.length < playerMin) throw "From __makeRolesFromARC__(): not enough players(=" + currentAvailablePlayers.length + ") to reach card-min(=" + playerMin + ") of roletype\"" + roleType.flatten()[0] + "\"!";
+ for(var j = 0; j !== playerMin; ++j){
+ var removeFunction = function(event){ alert("removeFunction"); };
+ var addFunction = function(event){ alert("addFunction"); };
+ var selectedPlayer = currentAvailablePlayers[j];
+ var _players = cleanedPlayers;
+ _players.unshift(selectedPlayer);
+ var role = new RoleC(null, roleType, _players, this.__arContainer__, removeFunction, addFunction);
+ this.__setRoleChangePlayerHandler__(role);
+ this.__error__.insert({"before" : role.getFrame()});
+ ++rolesCreated;
+ }
+ }
+
+ // --- creates all further needed roles with players that owns a card-max > existing players
+ while(rolesCreated < roleMin){
+ var currentlyCreated = 0;
+ for(var i= 0; i !== rolePlayerConstraints.length; ++i){
+ // existing roles --> all roles that owns a player which is selected of those listed in the roleplayer-constraint
+ var existingRoles = this.getExistingRoles(roleType, rolePlayerConstraints[i].players, this.__arContainer__.__frames__);
+ var availablePlayers = rolePlayerConstraints[i].players;
+ if(existingRoles.length < rolePlayerConstraints[i].cardMax && availablePlayers.length > existingRoles.length){
+ var currentAvailablePlayers = rolePlayerConstraints[i].players;
+ var cleanedPlayers = cleanPlayers(allAvailablePlayers, currentAvailablePlayers);
+
+ // --- adds players that are not selected yet
+ for(var j = 0; j !== currentAvailablePlayers.length; ++j){
+ if(this.getExistingRoles(roleType, currentAvailablePlayers[j], this.__arContainer__.__frames__).length === 0){
+ cleanedPlayers.push(currentAvailablePlayers[j]);
+ }
+ }
+
+ // --- removes the player which will be seleted by the new created role of all other select-elements
+ for(var j = 0; j !== this.__arContainer__.__frames__.length; ++j){
+ this.__arContainer__.__frames__[j].removePlayer(cleanedPlayers[0]);
+ }
+
+ var role = new RoleC(null, roleType, cleanedPlayers, this.__arContainer__, removeFunction, addFunction);
+ this.__setRoleChangePlayerHandler__(role);
+ this.__error__.insert({"before" : role.getFrame()});
+ ++rolesCreated;
+ ++currentlyCreated;
+ }
+ }
+ if(currentlyCreated === 0) throw "Not enough players to create all needed roles of the type \"" + roleType.flatten()[0] + "\"!";
+ }
+ },
+ "__makeRolesFromORC__" : function(roleType, player){
+
+ },
+ "getExistingRoles" : function(roleType, players, roles){
+ var rolesFound = new Array();
+ if(!roles || roles.length === 0) return rolesFound;
- // TODO: implement
+ var allTypes = roleType && roleType.length !== 0 ? roleType.flatten() : new Array();
+ var allPlayers = players && players.length !== 0 ? players.flatten() : new Array();
+ for(var i = 0; i !== roles.length; ++i){
+ if(allTypes.indexOf(roles[i].getType()) !== -1 && allPlayers.indexOf(roles[i].getPlayer()) !== -1) rolesFound.push(roles[i]);
+ }
+
+ return rolesFound;
+ },
+ "__setRoleChangePlayerHandler__" : function(role){
+ var select = role.__table__.select("tr." + CLASSES.playerFrame())[0].select("td." + CLASSES.content())[0].select("select")[0];
+ select.observe("change", function(event){ alert("changed!"); });
+
},
"getContent" : function(){
// TODO: implement
@@ -1380,9 +1589,6 @@
},
"isValid" : function(){
// TODO: implement
- },
- "isUsed" : function(){
- // TODO: implement
}});
Modified: trunk/src/ajax/javascripts/tmcl_tools.js
==============================================================================
--- trunk/src/ajax/javascripts/tmcl_tools.js (original)
+++ trunk/src/ajax/javascripts/tmcl_tools.js Fri Jun 5 06:42:59 2009
@@ -63,4 +63,140 @@
if(foundContents < min || foundContents > max) return false;
}
return true;
+}
+
+
+// --- Returns an array of rolePlayerConstraints belonging to the given type in roleType.
+// --- roleType is of the form [["psi-1", "psi-2", "..."], ["sub-psi-1", "..."], <...>]
+function getRolePlayerConstraintsForRole(roleType, rolePlayerConstraints){
+ if(!roleType || roleType.length === 0 || !rolePlayerConstraints || rolePlayerConstraints.length === 0) return new Array();
+
+ var foundConstraints = new Array();
+ var allRoleTypes = roleType.flatten();
+ for(var i = 0; i !== rolePlayerConstraints.length; ++i){
+ var allCRoleTypes = rolePlayerConstraints[i].roleType.flatten();
+ for(var j = 0; j !== allRoleTypes.length; ++j){
+ if(allCRoleTypes.indexOf(allRoleTypes[j]) !== -1){
+ foundConstraints.push(rolePlayerConstraints[i]);
+ break;
+ }
+ }
+ }
+ return foundConstraints;
+}
+
+
+// --- Returns an array of otherRoleConstraints belonging to the given roleType and players.
+// --- roleType is of the form [["psi-1", "psi-2", "..."], ["sub-psi-1", "..."], <...>]
+// --- players is of the form [["t1-psi-1", "t1-psi-2", "..."], ["t2-psi-1", "..."], <...>]
+function getOtherRoleConstraintsForRole(roleType, players, otherRoleConstraints){
+ if(!roleType || roleType.length === 0 || !players || players.length === 0 || !otherRoleConstraints || otherRoleConstraints.length === 0) return new Array();
+
+ var foundConstraints = new Array();
+ var allRoleTypes = roleType.flatten();
+ var allPlayers = players.flatten();
+ for(var i = 0; i !== otherRoleConstraints.length; ++i){
+ var roleTypeMatches = false;
+ var allCRoleTypes = otherRoleConstraints[i].roleType.flatten();
+ for(var j = 0; j !== allPlayers.length; ++j){
+ if(allCRoleTypes.indexOf(allRoleTypes[j]) !== -1){
+ var allCPlayers = otherRoleConstraints[i].players.flatten();
+ for(var k = 0; k !== allPlayers.length; ++k){
+ if(allCPlayers.indexOf(allPlayers[k]) !== -1){
+ foundConstraints.push(otherRoleConstraints[i]);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return foundConstraints;
+}
+
+
+// --- Returns the sum of all cardMin values of all rolePlayerConstraints.
+function getRolePlayerMinForRole(anyRoleConstraints){
+ if(!anyRoleConstraints || anyRoleConstraints === 0) return 0;
+ var min = 0;
+ for(var i = 0; i !== anyRoleConstraints.length; ++i){
+ min += parseInt(anyRoleConstraints[i].cardMin);
+ }
+ return min;
+}
+
+
+// --- Returns the sum of all cardMax values of all rolePlayerConstraints.
+function getRolePlayerMaxForRole(anyRoleConstraints){
+ if(!anyRoleConstraints || anyRoleConstraints === 0) return 0;
+ var max = 0;
+ for(var i = 0; i !== anyRoleConstraints.length; ++i){
+ if(anyRoleConstraints[i].cardMax === "MAX_INT") return "*";
+ else max += parseInt(anyRoleConstraints[i].cardMax);
+ }
+ return max;
+}
+
+
+// --- checks the cardinalities of all rolePlayerconstraints depending on a
+// --- given associationRoleConstraint
+function checkCardinalitiesARC_RPC(associationRoleConstraint, rolePlayerConstraints){
+ if(!associationRoleConstraint) throw "From checkCardinalitiesARC(): associationRoleConstraint is not set!";
+ if(!rolePlayerConstraints || rolePlayerConstraints.length === 0) throw "From checkCardinalitiesARC(): rolePlayerConstraints is not set!";
+ var arMin = parseInt(associationRoleConstraint.cardMin);
+ var arMax = associationRoleConstraint.cardMax === "MAX_INT" ? "*" : parseInt(associationRoleConstraint.cardMax);
+ var rpcs = getRolePlayerConstraintsForRole(associationRoleConstraint.roleType, rolePlayerConstraints);
+ var rpMin = getRolePlayerMinForRole(rpcs);
+ var rpMax = getRolePlayerMaxForRole(rpcs);
+ var type = associationRoleConstraint.roleType.flatten()[0];
+
+ if(rpMax !== "*" && rpMax < arMin) throw "Not enough players available for roletype \"" + type + "\" (rpMax=" + rpMax + ", arMin=" + arMin + ")";
+ if(arMax !== "*" && rpMin > arMax) throw "Too much players for the roletype \"" + type + "\" (rpMin=" + rpMin + ", arMax=" + arMax + ")";
+ /*
+ if(rpMin < arMin) throw "sum of card-min(=" + rpMin + ") of all roleplayer-constraints < card-min(=" + arMin + ") of associationrole-constraint for the role \"" + type + "\"! not enough players";
+ if(arMax !== "*" && (rpMax === "*" || rpMax > arMax)) throw "sum of card-max(=" + rpMax + ") of all roleplayer-constraints > card-max(=" + arMax + ") of associationrole-constraint for the role \"" + type + "\"! too much players"
+ if(arMax !== "*" && rpMin > arMax) throw "sum of card-min(=" + rpMin + ") of all roleplayer-constraints > card-max(=" + arMax + ") of associationrole-constraint for the role \"" + type + "\"! too much players";
+ if(rpMax !== "*" && rpMax < arMin) throw "sum of card-max(=" + rpMax + ") of all roleplayer-constraints > card-min(=" + arMin + ") of associationrole-constraint for the role \"" + type + "\"! not enough players";
+ */
+}
+
+
+// --- Returns all listed players of a constraint of the type
+// --- roleplayer-constraint or otherrole-constraint and returns them
+// --- as an array.
+function extractPlayersOfConstraints(anyConstraints){
+ var players = new Array();
+ if(!anyConstraints || anyConstraints.length === 0) return players;
+
+ for(var i = 0; i !== anyConstraints.length; ++i){
+ for(var j = 0; j !== anyConstraints[i].players.length; ++j){
+ players.push(anyConstraints[i].players[j])
+ }
+ }
+
+ return players;
+}
+
+
+// --- Returns an array of players where the players from playersToClean will
+// --- be deleted from allPlayers.
+function cleanPlayers(allPlayers, playersToClean){
+ var cleanedPlayers = new Array();
+ if(!allPlayers) return cleanedPlayers;
+ if(!playersToClean) return allPlayers;
+
+ for(var i = 0; i !== allPlayers.length; ++i){
+ var toDel = false;
+ for(var j = 0; j !== allPlayers[i].length; ++j){
+ for(var k = 0; k !== playersToClean.length; ++k){
+ if(playersToClean[k].indexOf(allPlayers[i][j]) !== -1){
+ toDel = true;
+ break;
+ }
+ }
+ if(toDel === true) break;
+ }
+ if(toDel === false) cleanedPlayers.push(allPlayers[i]);
+ }
+ return cleanedPlayers;
}
\ No newline at end of file
Modified: trunk/src/json/json_tmcl.lisp
==============================================================================
--- trunk/src/json/json_tmcl.lisp (original)
+++ trunk/src/json/json_tmcl.lisp Fri Jun 5 06:42:59 2009
@@ -192,7 +192,7 @@
(topics-to-json-list
(list-instances (getf involved-topic-tupple :player) topictype topictype-constraint))))
(json-role
- (concatenate 'string "\"roleTypes\":"
+ (concatenate 'string "\"roleType\":"
(topics-to-json-list
(getf (list-subtypes (getf involved-topic-tupple :role) roletype roletype-constraint) :subtypes))))
(json-otherplayer
@@ -291,7 +291,7 @@
(topics-to-json-list
(list-instances (getf role-player-tupple :player) topictype topictype-constraint))))
(json-role
- (concatenate 'string "\"roleTypes\":"
+ (concatenate 'string "\"roleType\":"
(topics-to-json-list
(getf (list-subtypes (getf role-player-tupple :role) roletype roletype-constraint) :subtypes))))
(card-min
Modified: trunk/src/unit_tests/poems.xtm
==============================================================================
--- trunk/src/unit_tests/poems.xtm (original)
+++ trunk/src/unit_tests/poems.xtm Fri Jun 5 06:42:59 2009
@@ -1,5 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<tm:topicMap version="2.0" xmlns:tm="http://www.topicmaps.org/xtm/">
+ <!-- test: defines some scopse constraints for associations of the type "born-in" -->
+ <tm:topic id="scoped-born-in-constraint-1">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-born-in-constraint-1"/>
+ <tm:instanceOf><tm:topicRef href="#associationtypescope-constraint"/></tm:instanceOf>
+ <tm:occurrence>
+ <tm:type><tm:topicRef href="#card-min"/></tm:type>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
+ </tm:occurrence>
+ <tm:occurrence>
+ <tm:type><tm:topicRef href="#card-max"/></tm:type>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">2</tm:resourceData>
+ </tm:occurrence>
+ </tm:topic>
+
+ <tm:association>
+ <tm:type><tm:topicRef href="#applies-to"/></tm:type>
+ <tm:role>
+ <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
+ <tm:topicRef href="#scoped-born-in-constraint-1"/>
+ </tm:role>
+ <tm:role>
+ <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
+ <tm:topicRef href="#written-by"/>
+ </tm:role>
+ </tm:association>
+
+ <tm:association>
+ <tm:type><tm:topicRef href="#applies-to"/></tm:type>
+ <tm:role>
+ <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
+ <tm:topicRef href="#scoped-born-in-constraint-1"/>
+ </tm:role>
+ <tm:role>
+ <tm:type><tm:topicRef href="#scopetype-role"/></tm:type>
+ <tm:topicRef href="#en"/>
+ </tm:role>
+ </tm:association>
+
+ <tm:association>
+ <tm:type><tm:topicRef href="#applies-to"/></tm:type>
+ <tm:role>
+ <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
+ <tm:topicRef href="#scoped-born-in-constraint-1"/>
+ </tm:role>
+ <tm:role>
+ <tm:type><tm:topicRef href="#scopetype-role"/></tm:type>
+ <tm:topicRef href="#de"/>
+ </tm:role>
+ </tm:association>
+ <!-- end test -->
+
+
<!-- ===================================================================== -->
<!-- === TMCL meta-model topics ========================================== -->
<!-- ===================================================================== -->
@@ -1566,6 +1618,46 @@
</tm:role>
</tm:association>
+
+ <!-- a subtype of poem-content with another datatype as the original type -->
+ <tm:topic id="sub-poem-content">
+ <tm:subjectIdentifier href="http://some.where/base-psis/sub-poem-content"/>
+ </tm:topic>
+
+ <tm:association>
+ <tm:type><tm:topicRef href="#supertype-subtype"/></tm:type>
+ <tm:role>
+ <tm:type><tm:topicRef href="#subtype"/></tm:type>
+ <tm:topicRef href="#sub-poem-content"/>
+ </tm:role>
+ <tm:role>
+ <tm:type><tm:topicRef href="#supertype"/></tm:type>
+ <tm:topicRef href="#poem-content"/>
+ </tm:role>
+ </tm:association>
+
+ <tm:topic id="sub-poem-content-occurrence-datatype-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/sub-poem-content-occurrence-datatype-constraint"/>
+ <tm:instanceOf><tm:topicRef href="#occurrencedatatype-constraint"/></tm:instanceOf>
+ <tm:occurrence>
+ <tm:type><tm:topicRef href="#datatype"/></tm:type>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string">http://www.w3.org/2001/XMLSchema#float</tm:resourceData>
+ </tm:occurrence>
+ </tm:topic>
+
+ <tm:association>
+ <tm:type><tm:topicRef href="#applies-to"/></tm:type>
+ <tm:role>
+ <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
+ <tm:topicRef href="#sub-poem-content-occurrence-datatype-constraint"/>
+ </tm:role>
+ <tm:role>
+ <tm:type><tm:topicRef href="#occurrencetype-role"/></tm:type>
+ <tm:topicRef href="#sub-poem-content"/>
+ </tm:role>
+ </tm:association>
+
+
<!-- the poem-content-occurrence can only appear once per topictype,
so all topic with this occurrence type must have different
occurrence-values -->
@@ -1732,10 +1824,10 @@
of type author and another role of type written which owns a player of
type poem -->
- <!-- the writer role has to appear exactly once in an association of type
+ <!-- the written role has to appear exactly once in an association of type
written-by -->
- <tm:topic id="written-by-writer-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/written-by-writer-role-constraint"/>
+ <tm:topic id="written-role-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/written-role-constraint"/>
<tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type><tm:topicRef href="#card-min"/></tm:type>
@@ -1751,7 +1843,7 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-writer-role-constraint"/>
+ <tm:topicRef href="#written-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
@@ -1763,17 +1855,17 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-writer-role-constraint"/>
+ <tm:topicRef href="#written-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
+ <tm:topicRef href="#written"/>
</tm:role>
</tm:association>
- <!-- the writer role owns a player of the type author -->
- <tm:topic id="written-by-writer-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/written-by-writer-role-player-constraint"/>
+ <!-- the written role owns a player of the type poem -->
+ <tm:topic id="written-role-player-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/written-role-player-constraint"/>
<tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type><tm:topicRef href="#card-min"/></tm:type>
@@ -1789,11 +1881,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-writer-role-player-constraint"/>
+ <tm:topicRef href="#written-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#author"/>
+ <tm:topicRef href="#poem"/>
</tm:role>
</tm:association>
@@ -1801,7 +1893,7 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-writer-role-player-constraint"/>
+ <tm:topicRef href="#written-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
@@ -1813,26 +1905,32 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-writer-role-player-constraint"/>
+ <tm:topicRef href="#written-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
+ <tm:topicRef href="#written"/>
</tm:role>
</tm:association>
- <!-- the written role has to appear exactly once in an association of type
- written-by -->
- <tm:topic id="written-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/written-role-constraint"/>
- <tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
+ <!-- otherrole-constraint:
+ If there is a role of the type written with a player of the type poem
+ there must be another role of the type writer with a player of the
+ type author. -->
+ <tm:topic id="written-by-otherrole-constraint-for-written">
+ <tm:subjectIdentifier href="http://some.where/contraint-psis/written-by-otherrole-constraint-for-written"/>
+ <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
<tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
+ <tm:type>
+ <tm:topicRef href="#card-min"/>
+ </tm:type>
<tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
</tm:occurrence>
<tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
+ <tm:type>
+ <tm:topicRef href="#card-max"/>
+ </tm:type>
<tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
</tm:occurrence>
</tm:topic>
@@ -1841,7 +1939,7 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-role-constraint"/>
+ <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
@@ -1853,7 +1951,7 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-role-constraint"/>
+ <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
@@ -1861,25 +1959,11 @@
</tm:role>
</tm:association>
- <!-- the written role owns a player of the type poem -->
- <tm:topic id="written-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/written-role-player-constraint"/>
- <tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
<tm:association>
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-role-player-constraint"/>
+ <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#topictype-role"/></tm:type>
@@ -1891,11 +1975,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-role-player-constraint"/>
+ <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
</tm:role>
<tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#written-by"/>
+ <tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
+ <tm:topicRef href="#writer"/>
</tm:role>
</tm:association>
@@ -1903,38 +1987,29 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-role-player-constraint"/>
+ <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
</tm:role>
<tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#written"/>
+ <tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
+ <tm:topicRef href="#author"/>
</tm:role>
</tm:association>
+ <!-- born-in associations have to have one role of the type writer with a
+ player of the type author. The other role is of type place with the
+ player of the type region. -->
+ <!-- place associationrole-constraint -->
- <!-- otherrole-constraint:
- If there is a role of the type written with a player of the type poem
- there must be another role of the type writer with a player of the
- type author.
- In contrast if there is a role of the type writer with a player of the
- type author there must be a role of the type written with a player of
- the type poem.
- So for this case there are two otherrole-constraints which handle this
- both cases. -->
-
- <tm:topic id="written-by-otherrole-constraint-for-writer">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/written-by-otherrole-constraint-for-writer"/>
- <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
+ <!-- writer associationrole-constraint -->
+ <tm:topic id="born-in-writer-role-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-writer-role-constraint"/>
+ <tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
<tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-min"/>
- </tm:type>
+ <tm:type><tm:topicRef href="#card-min"/></tm:type>
<tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
</tm:occurrence>
<tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-max"/>
- </tm:type>
+ <tm:type><tm:topicRef href="#card-max"/></tm:type>
<tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
</tm:occurrence>
</tm:topic>
@@ -1943,11 +2018,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-writer"/>
+ <tm:topicRef href="#born-in-writer-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#written-by"/>
+ <tm:topicRef href="#born-in"/>
</tm:role>
</tm:association>
@@ -1955,7 +2030,7 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-writer"/>
+ <tm:topicRef href="#born-in-writer-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
@@ -1963,11 +2038,25 @@
</tm:role>
</tm:association>
+ <!-- place-role roleplayer-constraint -->
+ <tm:topic id="born-in-writer-role-player-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-writer-role-player-constraint"/>
+ <tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
+ <tm:occurrence>
+ <tm:type><tm:topicRef href="#card-min"/></tm:type>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
+ </tm:occurrence>
+ <tm:occurrence>
+ <tm:type><tm:topicRef href="#card-max"/></tm:type>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
+ </tm:occurrence>
+ </tm:topic>
+
<tm:association>
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-writer"/>
+ <tm:topicRef href="#born-in-writer-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#topictype-role"/></tm:type>
@@ -1979,11 +2068,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-writer"/>
+ <tm:topicRef href="#born-in-writer-role-player-constraint"/>
</tm:role>
<tm:role>
- <tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
- <tm:topicRef href="#written"/>
+ <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
+ <tm:topicRef href="#born-in"/>
</tm:role>
</tm:association>
@@ -1991,16 +2080,20 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-writer"/>
+ <tm:topicRef href="#born-in-writer-role-player-constraint"/>
</tm:role>
<tm:role>
- <tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
- <tm:topicRef href="#poem"/>
+ <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
+ <tm:topicRef href="#writer"/>
</tm:role>
</tm:association>
- <tm:topic id="written-by-otherrole-constraint-for-written">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/written-by-otherrole-constraint-for-written"/>
+ <!-- otherplayer-constraints:
+ A "born-in" association must have exactly one writer-role with a
+ player of the type author and one place-role with a player of the
+ type city. -->
+ <tm:topic id="born-in-otherrole-constraint-for-writer">
+ <tm:subjectIdentifier href="http://some.where/contraint-psis/born-in-otherrole-constraint-for-writer"/>
<tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type>
@@ -2020,11 +2113,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
+ <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#written-by"/>
+ <tm:topicRef href="#born-in"/>
</tm:role>
</tm:association>
@@ -2032,11 +2125,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
+ <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#written"/>
+ <tm:topicRef href="#writer"/>
</tm:role>
</tm:association>
@@ -2044,11 +2137,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
+ <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#poem"/>
+ <tm:topicRef href="#author"/>
</tm:role>
</tm:association>
@@ -2056,11 +2149,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
+ <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
+ <tm:topicRef href="#place"/>
</tm:role>
</tm:association>
@@ -2068,20 +2161,21 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#written-by-otherrole-constraint-for-written"/>
+ <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
- <tm:topicRef href="#author"/>
+ <tm:topicRef href="#region"/>
</tm:role>
</tm:association>
- <!-- born-in associations have to have one role of the type writer with a
- player of the type author. The other role is of type place with the
- player of the type city. -->
+
+ <!-- located-in associations have to have one role of the type container with
+ a player of the type country. The other role is of type containee with
+ a player of the type city. -->
<!-- place associationrole-constraint -->
- <tm:topic id="born-in-place-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-place-role-constraint"/>
+ <tm:topic id="located-in-container-role-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-container-role-constraint"/>
<tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type><tm:topicRef href="#card-min"/></tm:type>
@@ -2097,11 +2191,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-place-role-constraint"/>
+ <tm:topicRef href="#located-in-container-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
+ <tm:topicRef href="#located-in"/>
</tm:role>
</tm:association>
@@ -2109,17 +2203,17 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-place-role-constraint"/>
+ <tm:topicRef href="#located-in-container-role-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#place"/>
+ <tm:topicRef href="#container"/>
</tm:role>
</tm:association>
<!-- place-role roleplayer-constraint -->
- <tm:topic id="born-in-place-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-place-role-player-constraint"/>
+ <tm:topic id="located-in-container-role-player-constraint">
+ <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-container-role-player-constraint"/>
<tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type><tm:topicRef href="#card-min"/></tm:type>
@@ -2135,11 +2229,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-place-role-player-constraint"/>
+ <tm:topicRef href="#located-in-container-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
+ <tm:topicRef href="#country"/>
</tm:role>
</tm:association>
@@ -2147,11 +2241,11 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-place-role-player-constraint"/>
+ <tm:topicRef href="#located-in-container-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
+ <tm:topicRef href="#located-in"/>
</tm:role>
</tm:association>
@@ -2159,446 +2253,22 @@
<tm:type><tm:topicRef href="#applies-to"/></tm:type>
<tm:role>
<tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-place-role-player-constraint"/>
+ <tm:topicRef href="#located-in-container-role-player-constraint"/>
</tm:role>
<tm:role>
<tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#place"/>
+ <tm:topicRef href="#container"/>
</tm:role>
</tm:association>
- <!-- writer associationrole-constraint -->
- <tm:topic id="born-in-writer-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-writer-role-constraint"/>
- <tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-writer-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-writer-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
- </tm:role>
- </tm:association>
-
- <!-- place-role roleplayer-constraint -->
- <tm:topic id="born-in-writer-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/born-in-writer-role-player-constraint"/>
- <tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-writer-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#author"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-writer-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-writer-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
- </tm:role>
- </tm:association>
-
- <!-- otherplayer-constraints:
- A "born-in" association must have exactly one writer-role with a
- player of the type author and one place-role with a player of the
- type city. -->
- <tm:topic id="born-in-otherrole-constraint-for-writer">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/born-in-otherrole-constraint-for-writer"/>
- <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-min"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-max"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#author"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
- <tm:topicRef href="#place"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
- </tm:role>
- </tm:association>
-
- <tm:topic id="born-in-otherrole-constraint-for-place">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/born-in-otherrole-constraint-for-place"/>
- <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-min"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-max"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-place"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-place"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#place"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-place"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-place"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
- <tm:topicRef href="#writer"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#born-in-otherrole-constraint-for-place"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
- <tm:topicRef href="#author"/>
- </tm:role>
- </tm:association>
-
- <!-- located-in associations have to have one role of the type container with
- a player of the type country. The other role is of type containee with
- a player of the type city. -->
- <!-- place associationrole-constraint -->
- <tm:topic id="located-in-container-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-container-role-constraint"/>
- <tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-container-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#located-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-container-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#container"/>
- </tm:role>
- </tm:association>
-
- <!-- place-role roleplayer-constraint -->
- <tm:topic id="located-in-container-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-container-role-player-constraint"/>
- <tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-container-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-container-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#located-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-container-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#container"/>
- </tm:role>
- </tm:association>
-
- <!-- writer associationrole-constraint -->
- <tm:topic id="located-in-containee-role-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-containee-role-constraint"/>
- <tm:instanceOf><tm:topicRef href="#associationrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-containee-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#located-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-containee-role-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#containee"/>
- </tm:role>
- </tm:association>
-
- <!-- place-role roleplayer-constraint -->
- <tm:topic id="located-in-containee-role-player-constraint">
- <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-containee-role-player-constraint"/>
- <tm:instanceOf><tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-min"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-containee-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-containee-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#located-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-containee-role-player-constraint"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#containee"/>
- </tm:role>
- </tm:association>
-
- <!-- otherplayer-constraints:
- A "born-in" association must have exactly one writer-role with a
- player of the type author and one place-role with a player of the
- type city. -->
- <tm:topic id="located-in-otherrole-constraint-for-container">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/located-in-otherrole-constraint-for-container"/>
- <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
+
+ <!-- otherplayer-constraints:
+ A "located-in" association must have exactly one container-role with a
+ player of the type country and one containee-role with a player of the
+ type region. -->
+ <tm:topic id="located-in-otherrole-constraint-for-container">
+ <tm:subjectIdentifier href="http://some.where/contraint-psis/located-in-otherrole-constraint-for-container"/>
+ <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
<tm:occurrence>
<tm:type>
<tm:topicRef href="#card-min"/>
@@ -2673,82 +2343,6 @@
</tm:role>
</tm:association>
- <tm:topic id="located-in-otherrole-constraint-for-containee">
- <tm:subjectIdentifier href="http://some.where/contraint-psis/located-in-otherrole-constraint-for-containee"/>
- <tm:instanceOf><tm:topicRef href="#otherrole-constraint"/></tm:instanceOf>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-min"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- <tm:occurrence>
- <tm:type>
- <tm:topicRef href="#card-max"/>
- </tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
- </tm:occurrence>
- </tm:topic>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-otherrole-constraint-for-containee"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#associationtype-role"/></tm:type>
- <tm:topicRef href="#born-in"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-otherrole-constraint-for-containee"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#roletype-role"/></tm:type>
- <tm:topicRef href="#containee"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-otherrole-constraint-for-containee"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#topictype-role"/></tm:type>
- <tm:topicRef href="#region"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-otherrole-constraint-for-containee"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#otherroletype-role"/></tm:type>
- <tm:topicRef href="#container"/>
- </tm:role>
- </tm:association>
-
- <tm:association>
- <tm:type><tm:topicRef href="#applies-to"/></tm:type>
- <tm:role>
- <tm:type><tm:topicRef href="#constraint-role"/></tm:type>
- <tm:topicRef href="#located-in-otherrole-constraint-for-containee"/>
- </tm:role>
- <tm:role>
- <tm:type><tm:topicRef href="#othertopictype-role"/></tm:type>
- <tm:topicRef href="#country"/>
- </tm:role>
- </tm:association>
<!-- ===================================================================== -->
<!-- === the "user's" topic map ========================================== -->
More information about the Isidorus-cvs
mailing list