Author: lgiessmann Date: Tue May 19 05:23:26 2009 New Revision: 31
Log: fixed some problems in the json-tmcl module and started to implement the ajax-client
Added: trunk/src/ajax/css/frame.css (contents, props changed) - copied, changed from r26, /trunk/src/ajax/css/home.css trunk/src/ajax/javascripts/create.js trunk/src/ajax/javascripts/datamodel.js trunk/src/ajax/javascripts/edit.js trunk/src/ajax/javascripts/requests.js (contents, props changed) trunk/src/ajax/javascripts/search.js trunk/src/ajax/javascripts/tmcl_tools.js Removed: trunk/src/ajax/css/home.css trunk/src/ajax/javascripts/edit_topic.js trunk/src/ajax/javascripts/make_fragment_node.js Modified: trunk/docs/xtm_json.txt trunk/src/ajax/css/main.css trunk/src/ajax/css/navi.css trunk/src/ajax/isidorus.html trunk/src/ajax/javascripts/constants.js trunk/src/ajax/javascripts/home.js trunk/src/ajax/javascripts/navi.js trunk/src/json/json_tmcl.lisp trunk/src/json/json_tmcl_validation.lisp trunk/src/rest_interface/set-up-json-interface.lisp trunk/src/unit_tests/poems.xtm
Modified: trunk/docs/xtm_json.txt ============================================================================== --- trunk/docs/xtm_json.txt (original) +++ trunk/docs/xtm_json.txt Tue May 19 05:23:26 2009 @@ -186,7 +186,10 @@ //+ This message constains a list of topics represented as a list of topic //+ psis which are exclusive instances for the owner. //+----------------------------------------------------------------------------- -[ [ "topic-1-psi-1", "topic-2-psi-2", "..." ], [ "topic-2-psi", "..." ], <...> ] +{ + "owner" : ["psi-1", "..."], + "exclusives" : [ [ "topic-1-psi-1", "topic-2-psi-2", "..." ], [ "topic-2-psi", "..." ], <...> ] +}
//+----------------------------------------------------------------------------- @@ -234,14 +237,14 @@ //+ The scopeConstraint-Object contains a list of all available scopes of //+ for an association/name/occurrence element - this depends where this //+ json-onbject is contained. -//+ The member availableScopeTypes contains a list of topics in psi-list -//+ representation which can be used as scope. +//+ The member availableScopeTypes contains a list of lists of topics in +//+ form of psi-lists. //+ cardMin defines the minimum number of all scopes of the parent element //+ (association/name/occurrence). //+ cardMax defines the maximum number of all scopes of the parent element. //+----------------------------------------------------------------------------- { - "scopeTypes" : [ [ "topic-1-psi-1", "topic-1-psi-2", "..." ], [ "topic-2-psi-1", "..." ] <...> ], + "scopeTypes" : [ [ [ "psi-1-1", "psi-1-2", "..." ], [ "subtype-psi-1", "..." ], <...> ], [ "psi-2-1" "..."], <...> ], "cardMin" : "unsigned integer in string representation", "cardMax" : "unsigend integer in string representation or the string MAX_INT" } @@ -255,7 +258,7 @@ //+----------------------------------------------------------------------------- { "nametypescopes" : [ { - "nametype" : [psi-1, psi-2, "..." ], + "nameType" : [psi-1, psi-2, "..." ], "scopeConstraints" : [ <scopeConstraints> ] }, <...>
Copied: trunk/src/ajax/css/frame.css (from r26, /trunk/src/ajax/css/home.css) ============================================================================== --- /trunk/src/ajax/css/home.css (original) +++ trunk/src/ajax/css/frame.css Tue May 19 05:23:26 2009 @@ -9,36 +9,19 @@ /* in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. */ /*----------------------------------------------------------------------------*/
- -.topicSummaryTd { - width: 40px; - border: solid 1px gray; -} - -#topicTable { - width: 80%; - border: solid 1px gray; - margin-left: auto; - margin-right: auto; - margin-top: 10px; - margin-bottom: 10px; -} - -th { - color: red; - border: solid 1px gray; +ul.fragmentFrame { + list-style-type: none; }
-ul.topicTable { - list-style: none; +caption { + font-size: 1.5em; + font-weight: bold; }
-div.naviTopicTable { - width: 80%; - margin-left: auto; - margin-right: auto; +td.controlColumn { + background-color: #eaeaee; }
-select.topicTable { - margin-left: 20px; +tr.showHiddenRows { + background-color: #eaeaee; } \ No newline at end of file
Modified: trunk/src/ajax/css/main.css ============================================================================== --- trunk/src/ajax/css/main.css (original) +++ trunk/src/ajax/css/main.css Tue May 19 05:23:26 2009 @@ -10,42 +10,31 @@ /*----------------------------------------------------------------------------*/
-.clickable{ - cursor: pointer; - padding-left: 5px; - padding-right: 5px; -} - -.clickable:hover{ - text-decoration: underline; -} - -.clickable:active{ - color: red; -} - -.headerRow { - background-color: #EEEEFF; -} - - -.topicHeaderRow { - background-color: #CCE5FF; +body { + width: 1024px; + margin-left: auto; + margin-right: auto; }
-.topicStubsHeaderRow { - background-color: #CCE5FF; +#subPage { + color: #333377; + min-height: 800px; + border-left: 1px solid #d1d1d3; + border-right: 1px solid #d1d1d3; + border-bottom: 1px solid #d1d1d3; + margin-top: -21px; }
-.associationsHeaderRow { - background-color: #CCE5FF; +h1 { + margin-left: 10px; + padding-top: 20px; }
-.tmIdsHeaderRow { - background-color: #CCE5FF; +.clickable { + cursor: pointer; }
-.frame{ - border: 1px outset black; - margin: 5px; -} +.errorMessage { + color: red; + font-size: 0.85em; +} \ No newline at end of file
Modified: trunk/src/ajax/css/navi.css ============================================================================== --- trunk/src/ajax/css/navi.css (original) +++ trunk/src/ajax/css/navi.css Tue May 19 05:23:26 2009 @@ -11,11 +11,55 @@
#navi { - border: solid 1px; - margin-top: 10px; - margin-bottom: 10px; + background-color: #aebae3; + width: 1022px; + margin-left: auto; + margin-right: auto; + padding-top: 10px; + padding-bottom: 5px; + border-left: 1px solid #d1d1d3; + border-top: 1px solid #d1d1d3; + border-right: 1px solid #d1d1d3; }
-.naviElem { - background-color: silver; -} \ No newline at end of file +#navi > span { + color: #fbfcff; + cursor: pointer; + border-left: 1px solid #aebae3; + border-top: 1px solid #aebae3; + border-right: 1px solid #aebae3; + padding-left: 3px; + padding-right: 3px; + padding-top: 3px; + padding-bottom: 5px; + font-weight: bold; +} + +#navi > span:first-child { + border-left: none; +} + +#navi > span:first-child:hover { + border-left: none; +} + +#navi > span:hover { + color: #333377; + background-color: #fbfcff; + border-left: 1px solid #d1d1d3; + border-top: 1px solid #d1d1d3; + border-right: 1px solid #d1d1d3; +} + +#navi > .isActive { + color: #333377; + background-color: #fbfcff; + border-left: 1px solid #d1d1d3; + border-top: 1px solid #d1d1d3; + border-right: 1px solid #d1d1d3; +} + +#navi > .isActive:hover { + color: #333377; + background-color: #fbfcff; +}
Modified: trunk/src/ajax/isidorus.html ============================================================================== --- trunk/src/ajax/isidorus.html (original) +++ trunk/src/ajax/isidorus.html Tue May 19 05:23:26 2009 @@ -18,7 +18,7 @@
<!-- includes all necessary css-files --> <link rel="stylesheet" type="text/css" href="css/main.css"/> - <link rel="stylesheet" type="text/css" href="css/home.css"/> + <link rel="stylesheet" type="text/css" href="css/frame.css"/> <link rel="stylesheet" type="text/css" href="css/navi.css"/>
<!-- error handling for javascript code --> @@ -45,21 +45,25 @@
<!-- includes own javascript files --> <script language="JavaScript" type="text/javascript" src="javascripts/constants.js"></script> - <script language="JavaScript" type="text/javascript" src="javascripts/make_fragment_node.js"></script> - <script language="JavaScript" type="text/javascript" src="javascripts/edit_topic.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/tmcl_tools.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/requests.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/datamodel.js"></script> <script language="JavaScript" type="text/javascript" src="javascripts/home.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/search.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/edit.js"></script> + <script language="JavaScript" type="text/javascript" src="javascripts/create.js"></script> <script language="JavaScript" type="text/javascript" src="javascripts/navi.js"></script> </head>
<body> <div id="page"> <div id="navi"> - <span id="home" class="naviElem clickable">home</span> - <span id="searchTopic" class="naviElem clickable">search topic</span> - <span id="editTopic" class="naviElem clickable">edit topic</span> - <span id="createTopic" class="naviElem clickable">create topic</span> + <span id="home" class="isActive">Home</span> + <span id="searchTopic" class="clickableButton">Search Topics</span> + <span id="editTopic" class="clickableButton">Edit Topics</span> + <span id="createTopic" class="clickableButton">Create Topics</span> </div> - <div id="content" style="border: red solid 1px;"> + <div id="subPage"> </div> </div> </body>
Modified: trunk/src/ajax/javascripts/constants.js ============================================================================== --- trunk/src/ajax/javascripts/constants.js (original) +++ trunk/src/ajax/javascripts/constants.js Tue May 19 05:23:26 2009 @@ -10,116 +10,86 @@ //+-----------------------------------------------------------------------------
-var TIMEOUT = 5000; // const TIMEOUT = 5000 --> "const" doesn't work under IE +// --- Some constants fot the http connections via the XMLHttpRequest-Object +var TIMEOUT = 10000; // const TIMEOUT = 10000 --> "const" doesn't work under IE var HOST_PREF = "http://localhost:8000/"; var GET_PREFIX = HOST_PREF + "json/get/"; +var GET_STUB_PREFIX = HOST_PREF + "json/topicstubs/"; +var TMCL_TYPE_URL = HOST_PREF + "json/tmcl/type/"; +var TMCL_INSTANCE_URL = HOST_PREF + "json/tmcl/instance/"; var COMMIT_URL = HOST_PREF + "json/commit/"; var ALL_PSIS_URL = HOST_PREF + "json/psis/"; +var TYPE_PSIS_URL = HOST_PREF + "json/tmcl/types/"; var OWN_URL = HOST_PREF + "isidorus"; var SUMMARY_URL = HOST_PREF + "json/summary"
-// --- a kind of enum for the the different pages with an attribute and a value -var PAGES = {"home" : "home", "search" : "searchTopic", "edit" : "editTopic", "create" : "createTopic"};
-// --- contains most css classes used in this project -var CLASSES = {"__addBtnHeader" : "addButton", - "__associationFrame" : "associationFrame", - "__associationsFrame" : "assocaitionsFrame", - "__associationsHeader" : "associationsHeaderRow", - "__button" : "clickable", - "__fragmentFrame" : "fragmentFrame", - "__frame" : "frame", - "__header" : "headerRow", - "__headerTitle" : "title", - "__hideBtnHeader" : "hideButton", - "__inAssociationFrame" : "inAssociationFrame", - "__inNameFrame" : "inNameFrame", - "__inOccurrenceFrame" : "inOccurrenceFrame", - "__inRoleFrame" : "inRoleFrame", - "__instanceOfFrame" : "instanceOf", - "__inTopicFrame" : "inTopicFrame", - "__inTopicStubFrame" : "inTopicStubFrame", - "__inVariantFrame" : "inVariantFrame", - "__itemIdentityFrame" : "itemIdentity", - "__listFrame" : "listFrame", - "__nameFrame" : "nameFrame", - "__namesFrame" : "namesFrame", - "__occurrenceFrame" : "occurrenceFrame", - "__occurrencesFrame" : "occurrencesFrame", - "__playerFrame" : "playerFrame", - "__removeBtnHeader" : "removeButton", - "__removeBtnRow" : "rowDel", - "__resourceFrame" : "resourceFrame", - "__roleFrame" : "roleFrame", - "__rolesFrame" : "roleFrame", - "__row" : "row", - "__scopeFrame" : "scopeFrame", - "__subjectIdentifierFrame" : "subjectIdentifier", - "__subjectLocatorFrame" : "subjectLocator", - "__textareaRow" : "rowTextArea", - "__textRow" : "rowTextfield", - "__tmIdsFrame" : "tmIdsFrame", - "__tmIdsHeader" : "tmIdsHeaderRow", - "__topicFrame" : "topicFrame", - "__topicHeader" : "topicHeaderRow", - "__topicIdFrame" : "topicId", - "__topicStubFrame" : "topicStubFrame", - "__topicStubsHeader" : "topicStubsHeaderRow", - "__topicStubsFrame" : "topicStubsFrame", - "__typeFrame" : "typeFrame", - "__valueFrame" : "valueFrame", - "__variantFrame" : "variantFrame", - "__variantHeader" : "variantHeaderRow", - "__variantsFrame" : "variantsFrame", - - "addBtnHeader" : function(){ return this.__button + " " + this.__addBtnHeader; }, - "associationFrame" : function(){ return this.__frame + " " + this.__associationFrame; }, - "associationsFrame" : function(){ return this.__frame + " " + this.__associationsFrame; }, - "associationsHeader" : function(){ return this.__associationsHeader; }, - "button" : function(){ this.__button; }, - "fragmentFrame" : function(){ return this.__frame + " " + this.__fragmentFrame; }, - "frame" : function(){ return this.__frame; }, - "header" : function(){ return this.__header; }, - "headerTitle" : function(){ return this.__headerTitle; }, - "hideBtnHeader" : function(){ return this.__button + " " + this.__hideBtnHeader; }, - "inAssociationFrame" : function(){ return this.__inAssociationFrame; }, - "inNameFrame" : function(){ return this.__inNameFrame; }, - "inOccurrenceFrame" : function(){ return this.__inOccurrenceFrame; }, - "inRoleFrame" : function(){ return this.__inRoleFrame; }, - "instanceOfFrame" : function(){ return this.__instanceOfFrame; }, - "inTopicFrame" : function(){ return this.__inTopicFrame; }, - "inTopicStubFrame" : function(){ return this.__inTopicStubFrame; }, - "inVariantFrame" : function(){ return this.__inVariantFrame; }, - "itemIdentityFrame" : function(){ return this.__itemIdentityFrame; }, - "listFrame" : function(){ return this.__frame + " " + this.__listFrame; }, - "nameFrame" : function(){ return this.__frame + " " + this.__nameFrame; }, - "namesFrame" : function(){ return this.__frame + " " + this.__namesFrame; }, - "occurrenceFrame" : function(){ return this.__frame + " " + this.__occurrenceFrame; }, - "occurrencesFrame" : function(){ return this.__frame + " " + this.__occurrencesFrame; }, - "playerFrame" : function(){ return this.__playerFrame; }, - "removeBtnHeader" : function(){ return this.__button + " " + this.__removeBtnHeader; }, - "removeBtnRow" : function(){ return this.__button + " " + this.__removeBtnRow; }, - "roleFrame" : function(){ return this.__frame + " " + this.__roleFrame; }, - "rolesFrame" : function(){ return this.__frame + " " + this.__rolesFrame; }, - "row" : function(){ return this.__row; }, - "scopeFrame" : function(){ return this.__scopeFrame; }, - "resourceFrame" : function(){ return this.__frame + " " + this.__resourceFrame; }, - "subjectIdentifierFrame" : function(){ return this.__subjectIdentifierFrame; }, - "subjectLocatorFrame" : function(){ return this.__subjectLocatorFrame; }, - "textareaRow" : function(){ return this.__textareaRow; }, - "textRow" : function(){ return this.__textRow; }, - "tmIdsFrame" : function(){ return this.__frame + " " + this.__tmIdsFrame; }, - "tmIdsHeader" : function(){ return this.__tmIdsHeader; }, - "topicFrame" : function(){ return this.__frame + " " + this.__topicFrame; }, - "topicHeader" : function(){ return this.__topicHeader; }, - "topicIdFrame" : function(){ return this.__topicIdFrame; }, - "topicStubFrame" : function(){ return this.__frame + " " + this.__topicStubFrame; }, - "topicStubsHeader" : function(){ return this.__topicStubsHeader; }, - "topicStubsFrame" : function(){ return this.__frame + " " + this.__topicStubsFrame; }, - "typeFrame" : function(){ return this.__typeFrame; }, - "valueFrame" : function(){ return this.__valueFrame; }, - "variantFrame" : function(){ return this.__frame + " " + this.__variantFrame; }, - "variantHeader" : function(){ return this.__variantHeader; }, - "variantsFrame" : function(){ return this.__frame + " " + this.__variantsFrame; } +// --- A kind of enum for the the different pages with an attribute and a value +var PAGES = {"home" : "home", "search" : "searchTopic", "edit" : "editTopic", "create" : "createTopic", "current" : ""}; + +var ANY_URI = "http://www.w3.org/2001/XMLSchema#anyURI"; +var STRING = "http://www.w3.org/2001/XMLSchema#string"; + +// --- Contains most css classes used in this project +// --- There should be called only the function to be sure to don't override +// --- the original values. +var CLASSES = {"__divPage__" : "page", + "__divSubPage__" : "subPage", + "__divContent__" : "content", + "__divTextrowWithRemoveButton__" : "textrowWithRemoveButton", + "__divTextrowWithoutRemoveButton__" : "textrowWithoutRemoveButton", + "__divSelectrowWithRemoveButton__" : "selectrowWithRemoveButton", + "__divSelectrowWithoutRemoveButton__" : "selectrowWithoutRemoveButton", + "__spanClickable__" : "clickable", + "__notVisible__" : "notvisible", + "__divError__" : "errorMessage", + "__ulFragmentFrame__" : "fragmentFrame", + "__tableTopicFrame__" : "topicFrame", + "__trTopicIdFrame__" : "topicIdFrame", + "__tdContent__" : "content", + "__tdDescription__" : "description", + "__divInstanceOfFrame__" : "instanceOfFrame", + "__divItemIdentityFrame__" : "itemIdentityFrame", + "__divSubjectLocatorFrame__" : "subjectLocatorFrame", + "__divSubjectIdentifierFrame__" : "subjectIdentifierFrame", + "__divNameContainer__" : "nameContainer", + "__divNameFrame__" : "nameFrame", + "__trControlColumn__" : "controlColumn", + "__trShowHiddenRows__" : "showHiddenRows", + "__trTypeFrame__" : "typeFrame", + "__divScopeFrame__" : "scopeFrame", + "__divValueFrame__" : "valueFrame", + "__divVariantFrame__" : "variantFrame", + "__divVariantContainer__" : "variantContainer", + "__divDatatypeFrame__" : "datatypeFrame", + + "page" : function(){ return this.__divPage__; }, + "subPage" : function(){ return this.__divSubPage__; }, + "content" : function(){ return this.__divContent__; }, + "textrowWithRemoveButton" : function(){ return this.__divTextrowWithRemoveButton__; }, + "textrowWithoutRemoveButton" : function(){ return this.__divTextrowWithoutRemoveButton__; }, + "selectrowWithRemoveButton" : function(){ return this.__divSelectrowWithRemoveButton__; }, + "selectrowWithoutRemoveButton" : function(){ return this.__divSelectrowWithoutRemoveButton__; }, + "clickable" : function(){ return this.__spanClickable__; }, + "notVisible" : function(){ return this.__notVisible__; }, + "error" : function(){ return this.__divError__; }, "fragmentFrame" : function(){ return this.__ulFragmentFrame__; }, + "topicFrame" : function(){ return this.__tableTopicFrame__; }, + "topicIdFrame" : function(){ return this.__trTopicIdFrame__; }, + "content" : function(){ return this.__tdContent__; }, + "description" : function(){ return this.__tdDescription__; }, + "instanceOfFrame" : function(){ return this.__divInstanceOfFrame__; }, + "itemIdentityFrame" : function(){ return this.__divItemIdentityFrame__; }, + "subjectLocatorFrame" : function(){ return this.__divSubjectLocatorFrame__; }, + "subjectIdentifierFrame" : function(){ return this.__divSubjectIdentifierFrame__; }, + "nameContainer" : function(){ return this.__divNameContainer__; }, + "nameFrame" : function(){ return this.__divNameFrame__; }, + "controlColumn" : function(){ return this.__trControlColumn__; }, + "showHiddenRows" : function(){ return this.__trShowHiddenRows__; }, + "typeFrame" : function(){ return this.__trTypeFrame__; }, + "scopeFrame" : function(){ return this.__divScopeFrame__; }, + "valueFrame" : function(){ return this.__divValueFrame__; }, + "variantFrame" : function(){ return this.__divVariantFrame__; }, + "variantContainer" : function(){ return this.__divVariantContainer__; }, + "datatypeFrame" : function(){ return this.__divDatatypeFrame__; } }; \ No newline at end of file
Added: trunk/src/ajax/javascripts/create.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/create.js Tue May 19 05:23:26 2009 @@ -0,0 +1,63 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + + +function makeCreate(psi) +{ + var content = new Element("div", {"class" : CLASSES.content()}); + var header = new Element("h1").update("Create a Topic"); + content.insert(header, {"position" : "bottom"}); + $(CLASSES.subPage()).insert(content, {"position" : "bottom"}); + + try{ + var fragmentFrame = new Element("ul", {"class" : CLASSES.fragmentFrame()}); + content.insert({"bottom" : fragmentFrame}); + var liTopicSelect = new Element("li", {"class" : CLASSES.instanceOfFrame()}); + fragmentFrame.insert({"bottom" : liTopicSelect}); + + + function makeInstanceOfFrame(context){ + function makeFragment(psis, constraints){ + var items = $$("li." + CLASSES.topicFrame()); + for(var i = 0; i != items.length; ++i){ + items[i].remove(); + } + + var topic = new TopicC(null, (constraints ? constraints.topicConstraints : null)); + context.insert({"after" : new Element("li", {"class" : CLASSES.topicFrame()}).update(topic.getFrame())}); + } + + function onSuccessHandler(xhr){ + var json = null; + try{ + json = xhr.responseText.evalJSON(); + } + catch(innerErr){ + alert("Got bad JSON data from " + xhr.request.url + "\n\n" + innerErr); + } + var instanceOf = null; + try{ + instanceOf = new InstanceOfC(json.flatten().sort(), makeFragment); + context.insert({"bottom" : instanceOf.getFrame()}); + } + catch(innerErr){ + alert("There occurred an error by creating an InstanceOfC frame, please reload this page!\n\n" + innerErr); + } + } + + getTypePsis(onSuccessHandler, null); + } + + makeInstanceOfFrame(liTopicSelect); + }catch(err){ + alert(err); + } +} \ No newline at end of file
Added: trunk/src/ajax/javascripts/datamodel.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/datamodel.js Tue May 19 05:23:26 2009 @@ -0,0 +1,1158 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + +// --- The base class of all Frames defined in this file. +var FrameC = Class.create({"initialize" : function(content, owner, min, max){ + if(!owner) throw "From FrameC(): owner must be set but is null"; + if(max !== -1 && (min > max || max === 0))throw "From FrameC(): min must be > max(" + max + ") and > 0 but is " + min; + if(!owner.__frames__) owner.__frames__ = new Array(); + owner.__frames__.push(this); + + this.__frame__ = new Element("div"); + this.__remove__ = new Element("span", {"class" : CLASSES.clickable()}).update("-"); + this.__add__ = new Element("span", {"class" : CLASSES.clickable()}).update("+"); + + checkRemoveAddButtons(owner, min, max); + + this.__error__ = new Element("div", {"class" : CLASSES.error()}); + this.__error__.hide(); + this.__content__ = new Element("span").update(content); + + this.__frame__.insert({"bottom" : this.__remove__}); + this.__frame__.insert({"bottom" : this.__content__}); + this.__frame__.insert({"bottom" : this.__add__}); + this.__frame__.insert({"bottom" : this.__error__}); + + setRemoveAddHandler(this, owner, min, max, function(){ + return new FrameC("", owner, min, max); + }); + }, + "getFrame" : function(){ + return this.__frame__; + }, + "remove" : function(){ + return this.getFrame().remove(); + }, + "hide" : function(){ + this.getFrame().hide(); + }, + "show" : function(){ + this.getFrame().show(); + }, + "getContent" : function(){ + return this.__content__.textContent; + }, + "toJSON" : function(){ + return this.getContent().toJSON(); + }, + "showError" : function(message){ + this.__error__.update(message); + this.__error__.show(); + }, + "hideError" : function(){ + this.__error__.hide(); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + }, + "showRemoveButton" : function(){ + this.__remove__.show(); + }, + "hideAddButton" : function(){ + this.__add__.hide(); + }, + "showAddButton" : function(){ + this.__add__.show(); + }, + "append" : function(elem){ + return this.getFrame().insert({"after" : elem}); + }}); + + +// --- This class represents a textrow with the functionality of FrameC plus the method isValid +// --- which returns a boolean value depending on the instance's value and the given regular expression. +var TextrowC = Class.create(FrameC, {"initialize" : function($super, content, regexp, owner, min, max, cssTitle){ + $super(content, owner, min, max); + owner.__frames__.pop(); + owner.__frames__.push(this); + + this.__regexp__ = new RegExp(regexp); + this.__frame__.writeAttribute({"class" : CLASSES.textrowWithRemoveButton()}); + this.__content__.remove(); + this.__content__ = new Element("input", {"type" : "text", "value" : content}); + if(cssTitle && cssTitle.length){ + this.__content__.writeAttribute({"title" : cssTitle}); + } + this.__remove__.insert({"after" : this.__content__}); + + checkRemoveAddButtons(owner, min, max); + setRemoveAddHandler(this, owner, min, max, function(){ + return new TextrowC("", regexp, owner, min, max, cssTitle); + }); + }, + "getContent" : function(){ + return this.__content__.value; + }, + "isValid" : function(){ + return this.__regexp__.match(this.getContent()); + }, + "showRemoveButton" : function($super){ + this.__remove__.show(); + this.getFrame().writeAttribute({"class" : CLASSES.textrowWithRemoveButton()}); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + this.getFrame().writeAttribute({"class" : CLASSES.textrowWithoutRemoveButton()}); + }}); + + +// --- This class represents a selectrow with the functionality of FrameC. +var SelectrowC = Class.create(FrameC, {"initialize" : function($super, contents, owner, min, max){ + if(!contents || !contents.length)throw "From SelectrowC(): contents must be an array!"; + $super(contents, owner, min, max); + owner.__frames__.pop(); + owner.__frames__.push(this); + + this.__frame__.writeAttribute({"class" : CLASSES.selectrowWithRemoveButton()}); + this.__content__.remove(); + this.__content__ = new Element("select"); + for(var i = 0; i != contents.length; ++i){ + // --- the attribute value must be set for IE + this.__content__.insert({"bottom" : new Element("option", {"value" : contents[i]}).update(contents[i])}); + } + this.__remove__.insert({"after" : this.__content__}); + + checkRemoveAddButtons(owner, min, max); + setRemoveAddHandler(this, owner, min, max, function(){ + return new SelectrowC(contents, owner, min, max); + }); + }, + "getContent" : function(){ + return this.__content__.value; + }, + "showRemoveButton" : function(){ + this.__remove__.show(); + this.getFrame().writeAttribute({"class" : CLASSES.selectrowWithRemoveButton()}); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + this.getFrame().writeAttribute({"class" : CLASSES.selectrowWithoutRemoveButton()}); + }}); + + +// --- The base Class for alomost all frames which contains other frames like names, occurrences, ... +var ContainerC = Class.create({"initialize" : function(){ + this.__frame__ = new Element("div"); + this.__error__ = new Element("div", {"class" : CLASSES.error()}); + this.__error__.hide(); + this.__frame__.insert({"bottom" : this.__error__}); + }, + "hide" : function(){ + this.__frame__.hide(); + }, + "show" : function(){ + this.__frame__.show(); + }, + "getFrame" : function(){ + return this.__frame__; + }, + "getContent" : function(unique, removeNull){ + return ""; + }, + "toJSON" : function(unique, removeNull){ + return this.getContent(unique, removeNull).toJSON(); + }, + "showError" : function(message){ + this.__error__.update(message); + this.__error__.show(); + }, + "hideError" : function(){ + this.__error__.hide(); + }, + "append" : function(newElem){ + this.getFrame().insert({"after" : newElem}); + }, + "remove" : function(){ + this.getFrame().remove(); + }}); + + +// --- Represents a container for all instanceOf-Psis of a fragment's topic +var InstanceOfC = Class.create(ContainerC, {"initialize" : function($super, contents, successFun){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.instanceOfFrame()}); + this.__container__ = new Object(); + try{ + var row = new SelectrowC(contents, this.__container__, 1, -1); + this.__error__.insert({"before" : row.getFrame()}); + } + catch(err){ + throw "From InstanceOfC(): The following exception was thrown:\n" + err; + this.__container__ = null; + } + this.__commit__ = new Element("input", {"type" : "button", "value" : "get constraints"}); + + function setHandler(myself){ + function onSuccessHandler(xhr){ + var json = null; + try{ + json = xhr.responseText.evalJSON(); + } + catch(err){ + alert("Got bad JSON data from " + xhr.request.url + "!\n\n" + err); + } + + var ret = checkExclusiveInstances(json, myself.getContent(true)); + if(ret){ + var str = "Some topics own exclusive-instance-constraints, please deselect the corresponding topics!<br/>"; + for(var i = 0; i != ret.length; ++i){ + for(var j = 0; j != ret[i].length; ++j){ + if(j === 0){ + str += "<br/>" + ret[i][j]; + } + else { + str += " " + ret[i][j]; + } + str += "<br/>"; + } + } + var items = $$("li." + CLASSES.topicFrame()); + for(var i = 0; i != items.length; ++i){ + items[i].remove(); + } + myself.showError(str); + } + else { + successFun(contents, json); + } + } + + myself.__commit__.observe("click", function(event){ + myself.hideError(); + requestConstraints(myself.toJSON(true), onSuccessHandler, null); + }); + } + setHandler(this); + + this.__error__.insert({"before" : this.__commit__}); + }, + "getContent" : function(unique, removeNull){ + var values = new Array(); + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + if(unique === true && values.indexOf(this.__container__.__frames__[i].getContent()) !== -1) continue; + if(removeNull === true && this.__container__.__frames__[i].getContent().strip().length === 0) continue; + values.push(this.__container__.__frames__[i].getContent().strip()); + } + return values; + }}); + + + +// --- Representation of a itemIdentity frame. +var ItemIdentityC = Class.create(ContainerC, {"initialize" : function($super, contents){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.itemIdentityFrame()}); + this.__container__ = new Object(); + + try{ + for(var i = 0; i != contents.length; ++i){ + new TextrowC(contents[i], ".*", this.__container__, 1, -1, null); + this.__error__.insert({"before" : this.__container__.__frames__[i].getFrame()}); + } + } + catch(err){ + this.__container__ = new Object(); + new TextrowC("", ".*", this.__container__, 1, -1, null); + this.__error__.insert({"before" : this.__container__.__frames__[i].getFrame()}); + } + }, + "getContent" : function(unique, removeNull){ + var values = new Array(); + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + if(unique === true && values.indexOf(this.__container__.__frames__[i].getContent()) !== -1) continue; + if(removeNull === true && this.__container__.__frames__[i].getContent().strip().length === 0) continue; + values.push(this.__container__.__frames__[i].getContent().strip()); + } + return values; + }, + "toJSON" : function(unique, removeNull){ + var content = this.getContent(unique, removeNull); + return content.length === 0 ? "null" : content.toJSON(); + }}); + + +// --- Representation of a subjectLocator and subjectIdentifier frames. +var IdentifierC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, cssClass){ + $super(); + this.__frame__.writeAttribute({"class" : cssClass}); + this.__containers__ = new Array(); + + try{ + if((!contents || contents.length === 0) && constraints && constraints.length > 0){ + for(var i = 0; i != constraints.length; ++i){ + this.__containers__.push(new Object()); + var min = parseInt(constraints[i].cardMin); + var max = constraints[i].cardMax !== "MAX_INT" ? parseInt(constraints[i].cardMax) : "*"; + if(max !== 0){ + var cssTitle = "min: " + min + " max: " + max + " regular expression: " + constraints[i].regexp; + for(var j = 0; j != (min === 0 ? 1 : min); ++j){ + var row = new TextrowC("", constraints[i].regexp, this.__containers__[i], + min === 0 ? 1 : min, max === "*" ? -1 : max, cssTitle); + this.__error__.insert({"before" : row.getFrame()}); + } + } + } + } + else { + // TODO: check already existing contents and order them to the corresponding fields + } + } + catch(err){ + alert("From IdentifierC(): " + err); + } + }, + "getContent" : function(unique, removeNull){ + var values = new Array(); + for(var i = 0; i != this.__containers__.length; ++i){ + for(var j = 0; j != this.__containers__[i].__frames__.length; ++j){ + if(unique === true && values.indexOf(this.__containers__[i].__frames__[j].getContent()) !== -1) continue; + if(removeNull === true && this.__containers__[i].__frames__[j].getContent().strip().length === 0) continue; + values.push(this.__containers__[i].__frames__[j].getContent().strip()); + } + } + return values; + }, + "isValid" : function(){ + // TODO: check the validity of this frame with the passed constraints and return a boolean value + return true; + }}); + + +// --- Represantation of a scope frame, doesn't contain SelectrowCs, because the values must be unique! +// --- So this class uses another implementation. +var ScopeC = Class.create(ContainerC, {"initialize" : function($super, contents, min, max){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.scopeFrame()}); + this.__error__ = this.__error__.remove(); + + this.__container__ = null; + this.__contents__ = contents; + this.resetRows(this.__contents__, min, max); + }, + "resetRows" : function(contents, min, max){ + try{ + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + this.__container__.__frames__[i].remove(); + } + this.__container__ = new Object(); + } + catch(err){ + this.__container__ = new Object(); + }; + + this.__contents__ = contents; + if(!contents || contents.length < min) throw "From ScopeC.resetRows(): contents.length (" + + (contents ? contents.length : "null") + ") must be > min (" + min + ")!"; + if(max !== -1 && (min > max || max === 0))throw "From FrameC(): min must be > max(" + max + ") and > 0 but is " + min; + + + var options = new Array(); + for(var i = 0; i != contents.length; ++i){ + var topicPsis = new Array(); + for(var j = 0; j != contents[i].length; ++j){ + for(var k = 0; k != contents[i][j].length; ++k){ + topicPsis.push(contents[i][j][k]); + } + } + options.push(topicPsis); + } + + function checkValues(myself){ + var rows = myself.getFrame().select("div"); + var selectedItems = new Array(); + // --- collects all old selected values and removes the option elements + for(var i = 0; i != rows.length; ++i){ + var selects = rows[i].select("select"); + if(selects[0].value.strip().length !== 0) selectedItems.push(selects[0].value); + selects[0].update(""); + } + + // --- recreates the original values + var values = options.clone(); + for(var i = 0; i != rows.length && i != selectedItems.length; ++i){ + var select = rows[i].select("select")[0]; + var selectedIdx = new Array(); + for(var j = 0; j != values.length; ++j){ + if(values[j].indexOf(selectedItems[i]) !== -1){ + for(var k = 0; k != values[j].length; ++k){ + select.insert({"bottom" : new Element("option", {"value" : values[j][k]}).update(values[j][k])}); + if(values[j][k] === selectedItems[i])select.writeAttribute({"selected" : "selected"}); + //values = values.without(values[j]); + selectedIdx.push(j); + } + break; + } + } + var cleanedValues = new Array(); + for(var k = 0; k != values.length; ++k){ + if(selectedIdx.indexOf(k) === -1){ + cleanedValues.push(values[k]); + } + } + values = cleanedValues; + } + + // --- fills all empty select elements + for(var i = 0; i != rows.length; ++i){ + var select = rows[i].select("select")[0]; + if(select.childElements().length === 0 && values.length !== 0){ + for(var j = 0; j != values[0].length; ++j){ + select.insert({"bottom" : new Element("option", {"value" : values[0][j]}).update(values[0][j])}); + } + values.shift(); + } + } + + // --- adds the values which wasn't distributed + for(var i = 0; i != rows.length; ++i){ + var select = rows[i].select("select")[0]; + for(var j = 0; j != values.length; ++j){ + for(var k = 0; k != values[j].length; ++k){ + select.insert({"bottom" : new Element("option" , {"value" :values[j][k]}).update(values[j][k])}); + } + } + } + }// checkValues + + + function addHandlers(myself){ + var rows = myself.getFrame().select("div"); + checkValues(myself); + + function addHandler(event){ + var div = new Element("div", {"class" : CLASSES.selectrowWithRemoveButton()}); + myself.getFrame().insert({"bottom" : div}); + var select = new Element("select"); + div.insert({"top" : select}); + addHandlers(myself); + } + + function removeHandler(event){ + event.element().up().remove(); + addHandlers(myself); + } + + for(var i = 0; i != rows.length; ++i){ + var spans = rows[i].select("span." + CLASSES.clickable()); + var removeS = null; + var addS = null; + if(spans.length === 0){ + removeS = new Element("span", {"class" : CLASSES.clickable()}).update("-"); + removeS.observe("click", removeHandler); + addS = new Element("span", {"class" : CLASSES.clickable()}).update("+"); + addS.observe("click", addHandler); + rows[i].insert({"top" : removeS}); + rows[i].insert({"bottom" : addS}); + } + else { + removeS = spans[0]; + addS = spans[1]; + } + + if(max === -1 || max > rows.length){ + addS.show() + } + else { + addS.hide(); + } + + if(min !== -1 || min < rows.length){ + removeS.show() + rows[i].writeAttribute({"class" : CLASSES.selectrowWithRemoveButton()}); + } + else { + removeS.hide(); + rows[i].writeAttribute({"class" : CLASSES.selectrowWithoutRemoveButton()}); + } + if(i == 0 && rows.length === 1 && max > 1){ + rows[i].writeAttribute({"class" : CLASSES.selectrowWithoutRemoveButton()}); + removeS.hide(); + } + } + } // addHandlers + + for(var i = 0; i != (min === -1 ? 1 : min); ++i){ + var div = new Element("div", {"class" : CLASSES.selectrowWithoutRemoveButton()}); + var select = new Element("select"); + for(var j = 0; j != options.length; ++j){ + if(j === i || j > min){ + for(var k = 0; k != options[j].length; ++k){ + select.insert({"bottom" : new Element("option", {"value" : options[j][k]}).update(options[j][k])}); + } + } + } + + + div.insert({"top" : select}); + this.getFrame().insert({"bottom" : div}); + addHandlers(this); + } + }, + "getContent" : function(unique, removeNull){ + // --- unique and removeNull aren't be used, they exist only for consistency + var values = new Array(); + var rows = this.getFrame().select("div"); + for(var i = 0; i != rows.length; ++i){ + values.push(new Array(rows[i].select("select")[0].value)); // must be a list of lists + } + return values; + } + }); + + + +// --- Representation of a variant element +var VariantC = Class.create(ContainerC, {"initialize" : function($super, contents, owner){ + $super(); + if(!owner.__frames__) owner.__frames__ = new Array(); + owner.__frames__.push(this); + this.__frame__.writeAttribute({"class" : CLASSES.variantFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.variantFrame()}); + this.__frame__.insert({"top" : this.__table__}); + + try{ + // --- control row + itemIdentity + makeControlRow(this, 4, contents ? contents.itemIdentities : null); + checkRemoveAddButtons(owner, 1, -1); + setRemoveAddHandler(this, owner, 1, -1, function(){ + return new VariantC(null, owner); + }); + + // --- scopes + this.__scopes__ = null; + //TODO: implement -> also in the server + this.__table__.insert({"bottom" : newRow(CLASSES.scopeFrame(), "Scope", new Element("div"))}); + + // --- resourceValue + var value = ""; + var datatype = ""; + if(contents && contents.resourceRef && contents.resourceRef.length !== 0){ + value = contents.resourceRef; + datatype = ANY_URI; + } + else if(contents && contents.resourceData){ + value = contents.resourceData.value; + datatype = contents.resourceData.datatype; + } + + this.__value__ = new Element("textarea", {"rows" : 3}).update(value); + this.__table__.insert({"bottom" : newRow(CLASSES.valueFrame(), "Resource Value", this.__value__)}); + + // --- datatype + this.__datatype__ = new Object(); + new TextrowC(datatype, ".*", this.__datatype__, 1, 1, null); + this.__table__.insert({"bottom" : newRow(CLASSES.datatypeFrame(), "Datatype", this.__datatype__.__frames__[0].getFrame())}); + + // --- minimize + this.minimize(); + } + catch(err){ + alert("From VariantC(): " + err); + } + }, + "getContent" : function(){ + var resourceRef = null; + var resourceData = null; + if(this.__datatype__.__frames__[0].getContent() === ANY_URI){ + resourceRef = this.__value__.textContent.strip(); + } + else { + var datatype = STRING; + if(this.__datatype__.__frames__[0].getContent().strip() !== "") + datatype = this.__datatype__.__frames__[0].getContent().strip(); + resoureceData = {"datatype" : datatype, "value" : this.__value__.textContent.strip()}; + } + + // TODO: scopes + if(this.__itemIdentity__.getContent(true, true).length === 0 && + resourceRef === null && resourceData === null) return null; + return {"itemIdentities" : this.__itemIdentity__.getContent(true, true), + "scopes" : null, + "resourceRef" : resourceRef, + "resourceData" : resourceData}; + + }, + "toJSON" : function(){ + var resourceRef = null; + var resourceData = null; + if(this.__datatype__.__frames__[0].getContent() === ANY_URI){ + resourceRef = this.__value__.value.strip().toJSON(); + } + else { + var datatype = STRING.toJSON(); + if(this.__datatype__.__frames__[0].getContent().strip() !== "") + datatype = this.__datatype__.__frames__[0].getContent().strip().toJSON(); + resourceData = "{"datatype":" + datatype + ","value":" + this.__value__.value.strip().toJSON() + "}"; + } + + // TODO: scopes + return "{"itemIdentities":" + this.__itemIdentity__.toJSON(true, true) + + ","scopes":null,"resourceRef":" + resourceRef + ","resourceData":" + resourceData + "}"; + + }, + "isValid" : function(){ + return this.__value__.value.strip() !== ""; + }, + "isUsed" : function(){ + return (this.__itemIdentity__.getContent(true, true).length !== 0 || + this.__value__.value.strip() !== "" || this.__datatype__.__frames__[0].getContent().strip() !== ""); + }, + "showRemoveButton" : function(){ + this.__remove__.show(); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + }, + "showAddButton" : function(){ + this.__add__.show(); + }, + "hideAddButton" : function(){ + this.__add__.hide(); + }, + "minimize" : function(){ + var trs = this.__table__.select("tr"); + for(var i = 0; i != trs.length; ++i){ + if(i === 0) trs[i].show(); + else trs[i].hide(); + } + } + }); + + +// --- contains all variants of a name element +var VariantContainerC = Class.create(ContainerC, {"initialize" : function($super, contents){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.variantContainer()}); + this.__container__ = new Object(); + + if(contents && contents.length != 0){ + for(var i = 0; i != contents.length; ++i){ + var variant = new VariantC(contents[i], this.__container__); + this.__frame__.insert({"bottom" : variant.getFrame()}); + } + } + else { + var variant = new VariantC(null, this.__container__); + this.__frame__.insert({"bottom" : variant.getFrame()}); + } + }, + "getContent" : function(){ + var values = new Array(); + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + if(this.__container__.__frames__[i].isUsed() === true){ + values.push(this.__container__.__frames__[i].getContent()); + } + } + return values; + }, + "isValid" : function(){ + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + if(this.__container__.__frames__[i].isUsed() === true && + this.__container__.__frames__[i].isValid() === false) return false; + } + return true; + }, + "toJSON" : function(){ + var str = "["; + for(var i = 0; i != this.__container__.__frames__.length; ++i){ + if(this.__container__.__frames__[i].isUsed() === true){ + str += this.__container__.__frames__[i].toJSON(); + } + if(i < this.__container__.__frames__.length - 1){ + str += "," + } + } + str += "]"; + return str === "[]" ? null : str; + }}); + + +// --- representation of a name element +var NameC = Class.create(ContainerC, {"initialize" : function($super, contents, nametypescopes, simpleConstraint, owner, min, max, cssTitle){ + $super(); + if(!owner) throw "From NameC(): owner must be set but is null"; + if(max !== -1 && (min > max || max === 0))throw "From FrameC(): min must be > max(" + max + ") and > 0 but is " + min; + if(!owner.__frames__) owner.__frames__ = new Array(); + owner.__frames__.push(this); + + this.__frame__.writeAttribute({"class" : CLASSES.nameFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.nameFrame()}); + this.__frame__.insert({"top" : this.__table__}); + + try{ + // --- control row + ItemIdentity + makeControlRow(this, 5, contents ? contents.itemIdentities : null); + checkRemoveAddButtons(owner, min, max); + setRemoveAddHandler(this, owner, min, max, function(){ + return new NameC(null, nametypescopes, simpleConstraint, owner, min, max, cssTitle); + }); + + // --- type + var types = new Array(); + for(var i = 0; nametypescopes && i !== nametypescopes.length; ++i){ + for(j = 0; j != nametypescopes[i].nameType.length; ++j){ + types.push(nametypescopes[i].nameType[j]); + if(contents && contents.type && contents.type[0] === nametypescopes[i].nameType[j]){ + var sslected = nametypescopes[i].nameType[j]; + types[types.length - 1] = types[0]; + types[0] = selected; + } + } + } + this.__type__ = new Object(); + var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame()); + this.__table__.insert({"bottom" : tr}); + + // --- scopes + this.__scopes__ = null; + if(nametypescopes && nametypescopes[0].scopeConstraints){ + // TODO: pass the selected items seperately to the object, so they can be chosen as default + var scopeTypes = nametypescopes[0].scopeConstraints[0].scopeTypes; + var min = parseInt(nametypescopes[0].scopeConstraints[0].cardMin); + var max = nametypescopes[0].scopeConstraints[0].cardMax !== "MAX_INT" ? parseInt(nametypescopes[0].scopeConstraints[0].cardMax) : "*"; + this.__scopes__ = new ScopeC(scopeTypes, min === 0 ? 1 : min, max === "*" ? -1 : max); + tr = newRow(CLASSES.scopeFrame(), "Scope", this.__scopes__.getFrame()); + this.__table__.insert({"bottom" : tr}); + } + else { + var tr = new Element("tr", {"class" : CLASSES.scopeFrame()}); + var tdd = new Element("td", {"class" : CLASSES.description()}).update("Scope"); + var tdc = new Element("td", {"class" : CLASSES.content()}); + tr.insert({"top" : tdd}); + tr.insert({"bottom" : tdc}); + this.__table__.insert({"bottom" : tr}); + } + + // --- value + this.__value__ = new Object(); + var cssTitleV = "min: " + min + " max: " + max + " regular expression: " + (simpleConstraint ? simpleConstraint.regexp : ".*"); + new TextrowC((contents && contents.value ? contents.value : ""), (simpleConstraint ? simpleConstraint.regexp : ".*"), this.__value__, 1, 1, cssTitleV); + this.__table__.insert({"bottom" : newRow(CLASSES.valueFrame(), "Value", this.__value__.__frames__[0].getFrame())}); + + // --- variants + this.__variants__ = new VariantContainerC(contents? contents.variants : null); + this.__table__.insert({"bottom" : newRow(CLASSES.variantContainer(), "Variants", this.__variants__.getFrame())}); + + // --- adds a second show handler, so the variants will be hidden, when the entire + // --- name element will be shown + function addSecondShowHandler(myself){ + myself.__table__.select("tr")[0].observe("click", function(event){ + try{ + for(var i = 0; i != myself.__variants__.__container__.__frames__.length; ++i){ + myself.__variants__.__container__.__frames__[i].minimize(); + } + }catch(tmp){ alert(tmp);} + }); + } + + addSecondShowHandler(this); + } + catch(err){ + alert("From NameC(): " + err); + } + }, + "getContent" : function(){ + if(this.isUsed() === false) return null; + return {"itemIdentities" : this.__itemIdentity__.getContent(true, true), + "scopes" : this.__scopes__.getContent(), + "value" : this.__value__.__frames__[0].getContent(), + "variants" : this.__variants__.getContent()}; + }, + "toJSON" : function(){ + if(this.isUsed() === false) return "null"; + return "{"itemIdentities":" + this.__itemIdentity__.toJSON(true, true) + + ","type":[" + this.__type__.__frames__[0].toJSON() + + "],"scopes":" + (this.__scopes__ ? this.__scopes__.toJSON() : "null") + + ","value":" + this.__value__.__frames__[0].toJSON() + + ","variants":" + this.__variants__.toJSON() + "}"; + }, + "isUsed" : function(){ + return this.__itemIdentity__.getContent(true, true).length !== 0 || + this.__value__.__frames__[0].getContent().strip().length !== 0 || + this.__variants__.getContent().length !== 0; + }, + "showRemoveButton" : function(){ + this.__remove__.show(); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + }, + "showAddButton" : function(){ + this.__add__.show(); + }, + "hideAddButton" : function(){ + this.__add__.hide(); + }, + "isValid" : function(){ + // TODO: check the content and the constraints + variants.isValid() + return true; + }}); + + + +// --- contains all names of a topic +var NameContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.nameContainer()}); + this.__containers__ = new Array(); + + try{ + if((!contents || contents.length === 0) && constraints && constraints.length > 0){ + for(var i = 0; i != constraints.length; ++i){ + this.__containers__.push(new Array()); + for(var j = 0; j != constraints[i].constraints.length; ++j){ + this.__containers__[i].push(new Object()); + var min = parseInt(constraints[i].constraints[j].cardMin); + var max = constraints[i].constraints[j].cardMax !== "MAX_INT" ? parseInt(constraints[i].constraints[j].cardMax) : "*"; + var regexp = constraints[i].constraints[j].regexp; + if(max !== 0){ + var title = "min: " + min + " max: " + max + " regular expression: " + constraints[i].regexp; + var name = new NameC("", constraints[i].nametypescopes, constraints[i].constraints[j], + this.__containers__[i][j], min === 0 ? 1 : min, max === "*" ? -1 : max, title); + this.__error__.insert({"before" : name.getFrame()}); + } + } + } + } + else { + // TODO: check already existing contents and order them to the corresponding fields + } + } + catch(err){ + alert("From NameContainerC(): " + err); + } + }, + "getContent" : function(){ + var values = new Array(); + for(var i = 0; i != this.__containers__.length; ++i){ + for(var j = 0; j != this.__containers__[i].length; ++j){ + for(var k = 0; k != this.__containers__[i][j].__frames__.length; ++k){ + if(this.__containers__[i][j].__frames__[k].isUsed() === true){ + values.push(this.__containers__[i][j].__frames__[k].getContent()); + } + } + } + } + return values; + }, + "toJSON" : function(){ + var str = "["; + for(var i = 0; i != this.__containers__.length; ++i){ + for(var j = 0; j != this.__containers__[i].length; ++j){ + for(var k = 0; k != this.__containers__[i][j].__frames__.length; ++k){ + if(this.__containers__[i][j].__frames__[k].isUsed() === true){ + str += this.__containers__[i][j].__frames__[k].toJSON() + ","; + } + } + } + } + if(str.endsWith(",")) str = str.slice(0, str.length - 1); + str += "]"; + return str === "[]" ? null : str; + }, + "isValid" : function(){ + // TODO: check the validity of this frame with the passed constraints and return a boolean value + isValid() of all names + return true; + }}); + + + +var OccurrenceC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, owner, min, max, cssTitl){ + +}, + "getContent" : function(){ + // TODO: implement + }, + "toJSON" : function(){ + // TODO: implement + }, + "isUsed" : function(){ + // TODO: implement + }, + "showRemoveButton" : function(){ + this.__remove__.show(); + }, + "hideRemoveButton" : function(){ + this.__remove__.hide(); + }, + "showAddButton" : function(){ + this.__add__.show(); + }, + "hideAddButton" : function(){ + this.__add__.hide(); + }, + "isValid" : function(){ + // TODO: check the content and the constraints + return true; + }}); + + + +var OccurrenceContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints){ + +}, + "isValid" : function(){ + // TODO: implement this method + return true; + }, + "getContent" : function(){ + // TODO: implement this method + }, + "toJSON" : function(){ + // TODO: implement this method + }}); + + + + + +var TopicC = Class.create(ContainerC, {"initialize" : function($super, content, constraints){ + $super(); + try{ + this.__frame__ .writeAttribute({"class" : CLASSES.topicFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.topicFrame()}); + this.__frame__.insert({"top" : this.__table__}); + this.__caption__ = new Element("caption").update("Topic"); + this.__table__.insert({"top" : this.__caption__}); + + // --- topic id + this.__topicid__ = new Object(); + new TextrowC((content ? content.topicid : null), ".*", this.__topicid__, 1, 1, null); + this.__table__.insert({"bottom" : newRow(CLASSES.topicIdFrame(), "Topic ID", this.__topicid__.__frames__[0].getFrame())}); + + // --- itemIdentity + this.__itemIdentity__ = new ItemIdentityC(content ? content.itemIdentities : null); + this.__table__.insert({"bottom" : newRow(CLASSES.itemIdentityFrame(), "ItemIdentity", this.__itemIdentity__.getFrame())}); + + // --- subjectLocator + var _contents = (content ? content.subjectLocators : null); + var _constraints = (constraints ? constraints.subjectLocatorConstraints : null); + this.__subjectLocator__ = new IdentifierC(_contents, _constraints, CLASSES.subjectLocatorFrame()); + this.__table__.insert({"bottom" : newRow(CLASSES.subjectLocatorFrame(), "SubjectLocator", this.__subjectLocator__.getFrame())}); + + // --- subjectIdentifier + _contents = (content ? content.subjectIdentifiers : null); + _constraints = (constraints ? constraints.subjectIdentifierConstraints : null); + this.__subjectIdentifier__ = new IdentifierC(_contents, _constraints, CLASSES.subjectIdentifierFrame()); + this.__table__.insert({"bottom" : newRow(CLASSES.subjectIdentifierFrame(), "SubjectIdentifier", this.__subjectIdentifier__.getFrame())}); + + // --- names + _contents = (content ? content.names : null); + _constraints = (constraints ? constraints.topicNameConstraints : null); + this.__name__ = new NameContainerC(_contents, _constraints); + this.__table__.insert({"bottom" : newRow(CLASSES.nameContainer(), "Names", this.__name__.getFrame())}); + + + + + + + + + + + var tmp = new Element("input", {"type" : "button", "value" : "test"}); + function tester(myself){ + tmp.observe("click", function(event){ + //alert(myself.__subjectLocator__.getContent() + " -> " + myself.__subjectLocator__.toJSON() + "\n\n" + myself.__subjectLocator__.getContent(true, true) + " -> " + myself.__subjectLocator__.toJSON(true, true)); + + }); + }; + tester(this); + this.__frame__.insert({"bottom" : tmp}); + }catch(err){ + alert("From TopciC(): " + err); + } + }, + "getContent" : function(){ + return {"id" : this.__topicid__.__frames__[0].getContent }; + } + }); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// --- helper function to create a dom-fragment of the form +// --- <tr class="rowClass"><td class="description">description</td> +//---- <td class="content">content</td></tr> +function newRow(rowClass, description, content){ + var tr = new Element("tr", {"class" : rowClass}); + tr.insert({"top" : new Element("td", {"class" : CLASSES.description()}).update(description)}); + tr.insert({"bottom" : new Element("td", {"class" : CLASSES.content()}).update(content)}); + return tr; +} + + +// --- Helper function for the constructors of all classes +// --- of the type FrameC. +// --- There will be set the remome and add handler. +function setRemoveAddHandler(myself, owner, min, max, call){ + myself.__remove__.stopObserving(); + myself.__add__.stopObserving(); + myself.__remove__.observe("click", function(event){ + myself.remove(); + owner.__frames__ = owner.__frames__.without(myself); + if(min >= owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].hideRemoveButton(); + } + } + if(max > owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].showAddButton(); + } + } + }); + + myself.__add__.observe("click", function(event){ + var newElem = call(); + myself.append(newElem.getFrame()); + if(remove === true && min !== -1 && owner.__frames__.length > min){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].showRemoveButton(); + } + } + if(max > -1 && max <= owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].hideAddButton(); + } + } + }); +} + + +// --- Helper function for the constructors of all classes +// --- of the type FrameC. +// --- There will be checked the visibility of the remove and +// --- add buttons. +function checkRemoveAddButtons(owner, min, max){ + if(min >= owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].hideRemoveButton(); + } + } + + if(min > -1 && min < owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].showRemoveButton(); + } + } + + if(max > -1 && max <= owner.__frames__.length){ + for(var i = 0; i != owner.__frames__.length; ++i){ + owner.__frames__[i].hideAddButton(); + } + } +} + + +// --- creates a control row for NameC, OccurrenceC and VariantC with a nested ItemIdentity frame. +function makeControlRow(myself, rowspan, contents) +{ + var tr = new Element("tr", {"class" : CLASSES.itemIdentityFrame()}); + var tdCtrl = new Element("td", {"class" : CLASSES.controlColumn(), "rowspan" : rowspan}); + tr.insert({"top" : tdCtrl}) + var tdDesc = new Element("td", {"class" : CLASSES.description()}).update("ItemIdentity"); + tr.insert({"bottom" : tdDesc}); + var min = new Element("span", {"class" : CLASSES.clickable()}).update("«"); + myself.__min__ = min; + myself.__remove__ = new Element("span", {"class" : CLASSES.clickable()}).update("-"); + myself.__add__ = new Element("span", {"class" : CLASSES.clickable()}).update("+"); + tdCtrl.insert({"top" : min}); + tdCtrl.insert({"bottom" : "<br/>"}); + tdCtrl.insert({"bottom" : myself.__remove__}); + tdCtrl.insert({"bottom" : "<br/>"}); + tdCtrl.insert({"bottom" : myself.__add__}); + var tdCont = new Element("td", {"class" : CLASSES.content()}); + tr.insert({"bottom" : tdCont}); + myself.__itemIdentity__ = new ItemIdentityC(contents ? contents.itemIdentities : null); + tdCont.insert({"top" : myself.__itemIdentity__.getFrame()}); + myself.__table__.insert({"bottom" : tr}); + + var trCtrl = new Element("tr", {"class" : CLASSES.showHiddenRows()}); + trCtrl.insert({"top" : new Element("td", {"class" : CLASSES.clickable()}).update("»")}); + myself.__table__.insert({"top" : trCtrl}); + trCtrl.hide(); + trCtrl.observe("click", function(){ + var trs = myself.__table__.select("tr"); + for(var i = 0; i != trs.length; ++i) trs[i].show(); + trCtrl.hide(); + }); + + // --- min click-handler + min.observe("click", function(event){ + var trs = myself.__table__.select("tr"); + for(var i = 0; i != trs.length; ++i){ + if(i === 0) trs[i].show(); + else trs[i].hide(); + } + }); +} \ No newline at end of file
Added: trunk/src/ajax/javascripts/edit.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/edit.js Tue May 19 05:23:26 2009 @@ -0,0 +1,18 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + + +function makeEdit(psi) +{ + var content = new Element("div", {"class" : CLASSES.content()}); + var header = new Element("h1").update("Edit a Topic"); + $(CLASSES.subPage()).insert((content.insert(header, {"position" : "bottom"})), {"position" : "bottom"}); +}
Modified: trunk/src/ajax/javascripts/home.js ============================================================================== --- trunk/src/ajax/javascripts/home.js (original) +++ trunk/src/ajax/javascripts/home.js Tue May 19 05:23:26 2009 @@ -10,265 +10,9 @@ //+-----------------------------------------------------------------------------
-// --- with this object there will be set the first and last index of topics to get by the ajax request -// --- further this object handles out of range violations and some other site effects, e.g. -// --- topicsPerPage === -1 -> show all topics, ... -var __idx = {"firstIdx" : 0, "lastIdx" : 10, "lastDirectionForward" : true, "topicsPerPage" : 10, "outOfRange" : false, - "topicPerPageVals" : ["5", "10", "15", "25", "50", "100", "200", "300", "All"], - "getTopicPerPageVals" : function(){ return this.topicPerPageVals; }, - "getFirstIdx" : function(){ return this.firstIdx; }, - "setFirstIdx" : function(x) { if(typeof(x) === "number" && x >= 0) this.firstIdx = x; }, - "getLastIdx" : function(){ return this.lastIdx; }, - "setLastIdx" : function(x) { if(typeof(x) === "number" && x >= 0) this.lastIdx = x; }, - "getLastDirectionForward" : function() { return this.lastDirectionForward; }, - "setLastDirectionForward" : function(x) { if(typeof(x) === "boolean") this.lastDirectionForward = x; }, - "getTopicsPerPage" : function() {return (this.topicsPerPage === -1 ? "nil" : this.topicsPerPage); }, - "getTopicsPerPageAsNumber" : function(){ return this.topicsPerPage; }, - "setTopicsPerPage" : function(x) { - if(typeof(x) === "number" && x > 0){ - this.topicsPerPage = x; - this.lastIdx = this.firstIdx + this.topicsPerPage; - } - else if(typeof(x) === "number" && x === -1){ - this.topicsPerPage = x; - this.lastIdx = "nil"; - } - }, - "getOutOfRange" : function() { return this.outOfRange; }, - "setOutOfRange" : function(x){ if(typeof(x) === "boolean") this.outOfRange = x; }, - "next" : function() { - if(this.outOfRange) return; - this.firstIdx += this.topicsPerPage; - if(this.topicsPerPage !== -1){ this.lastIdx = this.firstIdx + this.topicsPerPage; } - else { this.lastIdx = "nil"; } - this.lastDirectionForward = true; - }, - "prev" : function() { - if(this.topicsPerPage !== -1){ - this.firstIdx -= this.topicsPerPage; - if(this.firstIdx < 0)this.firstIdx = 0; - this.lastIdx = this.firstIdx + this.topicsPerPage; - } - else { - this.firstIdx = 0; - this.lastIdx = "nil"; - } - this.lastDirectionForward = false; - } - }; - - - -// --- creates a html table with the id "tableId" and appends it on the element with the id -// --- "parentId", if the variable next ist set to true there will be shown the next -// --- topics otherwise the previous topics -// --- the table looks like the following schema: -// --- itemIdentity | subjectLocator | subjectIdentifier | instanceOf | name | occurrence -function makeHome(parentId, tableId, next) +function makeHome() { - // --- create the ajax-request handlers ------------------------------------ - function onSuccessHandler(xhr) - { - // --- creates the navigation div-element with a forward-, backward- button and a - // --- selection box where the user can choose the amount of topics per page - function createTableNavi(top) - { - // --- creates the backwards and forwards buttons, if they don't exist - if(($("naviDivTop") === null && top === true) || ($("naviDivBottom") === null && top === false) && $(parentId)){ - var div = new Element("div", {"id" : (top ? "naviDivTop" : "naviDivBottom"), "class" : "naviTopicTable " + PAGES.home}); - var lftBtn = new Element("input", {"type" : "button", "id" : (top ? "topicTableLftBtnTop" : "topicTableLftBtnBottom")}); - var rgtBtn = new Element("input", {"type" : "button", "id" : (top ? "topicTableRgtBtnTop" : "topicTableRgtBtnBottom")}); - lftBtn.value = "<<"; - rgtBtn.value = ">>"; - rgtBtn.setStyle({"float" : "right"}); - lftBtn.setStyle({"float" : "left"}); - div.insert(lftBtn, {"position" : "top"}); - div.insert(rgtBtn, {"position" : "bottom"}); - $("content").insert(div, {"position" : "top"}); - - rgtBtn.observe("click", function(event) - { - __idx.next(); - makeHome(parentId, tableId, true); - }); - lftBtn.observe("click", function(event) - { - __idx.prev(); - makeHome(parentId, tableId, false); - }); - - var select = new Element("select", {"id" : (top === true ? "topicTableSelectTop" : "topicTableSelectBottom"), "class" : "topicTable"}); - var selectValues = __idx.getTopicPerPageVals(); - var selectInnerHTML = ""; - selectValues.each(function(value, idx) - { - var numberValue = value; - numberValue = (numberValue === "All" ? "-1" : numberValue); - if(Number(numberValue) !== __idx.getTopicsPerPageAsNumber()){ - select.insert(new Element("option", {"value" : numberValue}).update(value), {"position" : "bottom"}); - } - else { - select.insert(new Element("option", {"value" : numberValue, "selected" : "selected"}).update(value), {"position" : "bottom"}); - } - }); - div.insert(select, {"position" : "content"}); - - select.observe("change", function(event) - { - __idx.setTopicsPerPage(Number(event.element().value)); - makeHome(parentId, tableId, true); - }); - } - } - - - try { - var topicSummaries = xhr.responseText.evalJSON(); - // --- inserts or updates the topic table if there is some json data or - // --- if there isn't a table yet - if(topicSummaries !== null || $(tableId) === null){ - // --- removes the old table - if there exists an element with the id "tableId" - if($(tableId) !== null)$(tableId).remove(); - if($("naviDivTop") !== null)$("naviDivTop").remove(); - if($("naviDivBottom") !== null)$("naviDivBottom").remove(); - - createTableNavi(true); - - // --- creates the html table - var topicTable = new Element("table", {"id" : "topicTable", "class" : PAGES.home}); - - // --- creates the header row - var header = new Element("tr"); - header.insert(new Element("th", {"id" : "itemIdentityTh"}).update("itemIdentity"), {"position" : "bottom"}); - header.insert(new Element("th", {"id" : "subjectLocatorTh"}).update("subjectLocator"), {"position" : "bottom"}); - header.insert(new Element("th", {"id" : "subjectIdentifierTh"}).update("subjectIdentifier"), {"position" : "bottom"}); - header.insert(new Element("th", {"id" : "instanceOfTh"}).update("instanceOf"), {"position" : "bottom"}); - header.insert(new Element("th", {"id" : "nameTh"}).update("name"), {"position" : "bottom"}); - header.insert(new Element("th", {"id" : "occurrenceTh"}).update("occurrence"), {"position" : "bottom"}); - topicTable.insert(header, {"position" : "top"}); - - // --- creates the topic summary data of the json object - if(topicSummaries !== null){ - topicSummaries.each(function(topicSummary, idx) - { - var tr = new Element("tr"); - - - var itemIdentity = new Element("td", {"class" : "topicSummaryTd"}); - var ul = new Element("ul", {"class" : "topicTable"}); - itemIdentity.insert(ul, {"position" : "top"}); - if(topicSummary.itemIdentities){ - topicSummary.itemIdentities.each(function(itemIdentityJ, innerIdx) - { - ul.insert(new Element("li").update(itemIdentityJ), {"position" : "bottom"}); - }); - } - - var subjectLocator = new Element("td", {"class" : "topicSummaryTd"}); - ul = new Element("ul", {"class" : "topicTable"}); - subjectLocator.insert(ul, {"position" : "top"}); - if(topicSummary.subjectLocators){ - topicSummary.subjectLocators.each(function(subjectLocatorJ, innerIdx) - { - ul.insert(new Element("li").update(subjectLocatorJ), {"position" : "bottom"}); - }); - } - - var subjectIdentifier = new Element("td", {"class" : "topicSummaryTd"}); - ul = new Element("ul", {"class" : "topicTable"}); - subjectIdentifier.insert(ul, {"position" : "top"}); - if(topicSummary.subjectIdentifiers){ - topicSummary.subjectIdentifiers.each(function(subjectIdentifierJ, innerIdx) - { - var li = new Element("li", {"class" : "clickable"}).update(subjectIdentifierJ); - ul.insert(li, {"position" : "bottom"}); - li.observe("click", function(event) - { - var node = event.element(); - makePage(PAGES.edit, node.textContent); - }); - }); - } - - var instanceOf = new Element("td", {"class" : "topicSummaryTd"}); - ul = new Element("ul", {"class" : "topicTable"}); - instanceOf.insert(ul, {"position" : "top"}); - if(topicSummary.instanceOfs){ - topicSummary.instanceOfs.each(function(instanceOfJ, innerIdx) - { - if(instanceOfJ){ - instanceOfJ.each(function(psi, psiIdx) - { - ul.insert(new Element("li").update(psi), {"position" : "top"}); - }); - } - }); - } - - var name = new Element("td", {"class" : "topicSummaryTd"}); - ul = new Element("ul", {"class" : "topicTable"}); - name.insert(ul, {"position" : "top"}); - if(topicSummary.names){ - topicSummary.names.each(function(nameJ, innerIdx) - { - ul.insert(new Element("li").update(nameJ), {"position" : "top"}); - }); - } - - var occurrence = new Element("td", {"class" : "topicSummaryTd"}); - ul = new Element("ul", {"class" : "topicTable"}); - occurrence.insert(ul, {"position" : "top"}); - if(topicSummary.occurrences){ - topicSummary.occurrences.each(function(occurrenceJ, innerIdx) - { - ul.insert(new Element("li").update(occurrenceJ), {"position" : "top"}); - }); - } - - tr.insert(itemIdentity, {"position" : "bottom"}); - tr.insert(subjectLocator, {"position" : "bottom"}); - tr.insert(subjectIdentifier, {"position" : "bottom"}); - tr.insert(instanceOf, {"position" : "bottom"}); - tr.insert(name, {"position" : "bottom"}); - tr.insert(occurrence, {"position" : "bottom"}); - - topicTable.insert(tr, {"position" : "bottom"}); - }); - } - } - - // --- there was no data received or not all requested - // --- so it's not allowed to increment the indices of the requested topics - if(topicSummaries === null || topicSummaries.length != __idx.getTopicsPerPage()){ - __idx.setOutOfRange(true); - } - else { - __idx.setOutOfRange(false); - } - - // --- inserts the table in the parent element - if($(parentId)){ - $(parentId).insert(topicTable, {"position" : "top"}); - } - createTableNavi(false); - } - catch(err){ - window.alert("got bad json data from: " + SUMMARY_URL + "\n\n" + err); - } - } - - - function onFailureHandler(xhr) - { - window.alert("something went wrong ...\n" + xhr.status + ": " + xhr.statusText); - } - - - // --- the real ajax request - new Ajax.Request(SUMMARY_URL, - {"method" : "get", - "onSuccess" : onSuccessHandler, - "onFailure" : onFailureHandler, - "parameters" : {"start" : __idx.getFirstIdx(), "end" : __idx.getLastIdx()} - }); -} \ No newline at end of file + var content = new Element("div", {"class" : CLASSES.content()}); + var header = new Element("h1").update("Topic Map Overview"); + $(CLASSES.subPage()).insert((content.insert(header, {"position" : "bottom"})), {"position" : "bottom"}); +}
Modified: trunk/src/ajax/javascripts/navi.js ============================================================================== --- trunk/src/ajax/javascripts/navi.js (original) +++ trunk/src/ajax/javascripts/navi.js Tue May 19 05:23:26 2009 @@ -13,49 +13,55 @@ // --- adds some event handlers to the navigation elements function addHandlersToNavi() { - $(PAGES.home).observe("click", function(){ makePage(PAGES.home, ""); }); - $(PAGES.search).observe("click", function(){ makePage(PAGES.search, ""); }); - $(PAGES.edit).observe("click", function(){ makePage(PAGES.edit, ""); }); - $(PAGES.create).observe("click", function(){ makePage(PAGES.create, ""); }); + $(PAGES.home).observe("click", function(event){ setNaviClasses(event.element()); makePage(PAGES.home, ""); }); + $(PAGES.search).observe("click", function(event){ setNaviClasses(event.element()); makePage(PAGES.search, ""); }); + $(PAGES.edit).observe("click", function(event){ setNaviClasses(event.element()); makePage(PAGES.edit, ""); }); + $(PAGES.create).observe("click", function(event){ setNaviClasses(event.element()); makePage(PAGES.create, ""); });
// --- necessary for the first call of the page - makePage(PAGES.home); + makePage(PAGES.home, ""); +} + + +// --- Sets the classes of all navi-elements to the default class. +// --- The currently clicked element is set to "isActive". +function setNaviClasses(activeNaviElement) +{ + $(PAGES.home).writeAttribute({"class" : "clickableButton"}); + $(PAGES.search).writeAttribute({"class" : "clickableButton"}); + $(PAGES.edit).writeAttribute({"class" : "clickableButton"}); + $(PAGES.create).writeAttribute({"class" : "clickableButton"}); + activeNaviElement.writeAttribute({"class" : "isActive"}); }
// --- generates the current page depending on the variable __currentPage function makePage(newPage, psi) { + // --- if there is called the subpage which is already displayed + // --- there will be done nothing! + if(newPage === PAGES.current) return; + PAGES.current = newPage; + // --- removes the old content - cleanPage(newPage); + $(CLASSES.subPage()).update();
// --- creates the new content switch(newPage){ case PAGES.home: - makeHome("content", "topicTable", true); + makeHome(); break; case PAGES.search: + makeSearch(psi); break; case PAGES.edit: - makeEdit(psi); + makeEdit(psi) break; case PAGES.create: + makeCreate(psi); break; } }
-// --- removes all old DOM-Elements - if the page to create is not -// --- the old page -function cleanPage(newPage) -{ - $("content").childElements().each(function(nodeToDelete, idx) - { - if(!nodeToDelete.hasClassName(newPage)) - nodeToDelete.remove(); - }); -} - - -document.observe("dom:loaded", addHandlersToNavi); - +document.observe("dom:loaded", addHandlersToNavi); \ No newline at end of file
Added: trunk/src/ajax/javascripts/requests.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/requests.js Tue May 19 05:23:26 2009 @@ -0,0 +1,55 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + + +// --- This is the default error handler of the used ajax.requests. +function defaultFailureHandler(xhr) +{ + window.alert("Something went wrong by calling "" + xhr.request.url + ""\n" + xhr.status + + ": " + xhr.statusText + "\n" + xhr.responseText); +} + + +// --- Gets all type psis from the server. +function getTypePsis(onSuccessHandler, onFailureHandler) +{ + try{ + var onFailure = onFailureHandler ? onFailureHandler : defaultFailureHandler; + + new Ajax.Request(TYPE_PSIS_URL, { + "method" : "get", + "requestHeaders" : ["If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT"], + "onSuccess" : onSuccessHandler, + "onFailure" : onFailure}); + } + catch(err){ + alert("Could not request all type PSIs, please try again!\n\n" + err); + } +} + + +// --- Sends a post-request to the server with the passed psis as postBody. +// --- Gets a constraint-object. +function requestConstraints(psis, onSuccessHandler, onFailureHandler) +{ + try{ + var onFailure = onFailureHandler ? onFailureHandler : defaultFailureHandler; + + new Ajax.Request(TMCL_TYPE_URL, { + "method" : "post", + "postBody" : psis, + "onSuccess" : onSuccessHandler, + "onFailure" : onFailure}); + } + catch(err){ + alert("Could not request contraints, please try again!\n\n" + err); + } +} \ No newline at end of file
Added: trunk/src/ajax/javascripts/search.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/search.js Tue May 19 05:23:26 2009 @@ -0,0 +1,18 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + + +function makeSearch(psi) +{ + var content = new Element("div", {"class" : CLASSES.content()}); + var header = new Element("h1").update("Search a Topic"); + $(CLASSES.subPage()).insert((content.insert(header, {"position" : "bottom"})), {"position" : "bottom"}); +}
Added: trunk/src/ajax/javascripts/tmcl_tools.js ============================================================================== --- (empty file) +++ trunk/src/ajax/javascripts/tmcl_tools.js Tue May 19 05:23:26 2009 @@ -0,0 +1,66 @@ +//+----------------------------------------------------------------------------- +//+ Isidorus +//+ (c) 2008-2009 Marc Kuester, Christoph Ludwig, Lukas Giessmann +//+ +//+ Isidorus is freely distributable under the LGPL license. +//+ This ajax module uses the frameworks PrototypeJs and Scriptaculous, both +//+ are distributed under the MIT license. +//+ You can find a detailed description in trunk/docs/LGPL-LICENSE.txt and +//+ in trunk/src/ajax/javascripts/external/MIT-LICENSE.txt. +//+----------------------------------------------------------------------------- + + +// --- Returns an Array of the type [<boolean>, <string>]. +// --- If there are exclusive-instance-constraints, the return value is an array +// --- of the form [false, "message"] otherwise [true, ""]. +function checkExclusiveInstances(constraints, psis){ + try{ + var exc = constraints.topicConstraints.exclusiveInstances; + var ret = new Array(); + for(var i = 0; i !== psis.length; ++i){ + var currentArray = new Array(psis[i]); + for(var j = 0; j !== exc.length; ++j){ + for(var k = 0; k !== exc[j].exclusives.length; ++k){ + for(var l = 0; l !== exc[j].exclusives[k].length; ++l){ + if(exc[j].exclusives[k][l] === psis[i]){ + for(var m = 0; m != exc[j].owner.length; ++m){ + currentArray.push(exc[j].owner[m]); + } + break; + } + } + } + } + + if(currentArray.length > 1)ret.push(currentArray); + } + if(ret.length === 0) return null; + return ret; + } + catch(err){ + return null; + } +} + + +// --- checks SubjectLocator and SubjectIdentifier contraints and contents +function checkIdentifierConstraints(contents, constraints) +{ + var innerConstents = (!contents ? new Array() : contents); + if((!constraints || constraints.length === 0) && innerConstraints.length === 0) return false; + + for(var i = 0; i != constraints.length; ++i){ + var regexp = constraints[i].regexp; + var min = constraints[i].cardMin; + var max = constraints[i].cardMax; + + var foundContents = 0; + for(var j = 0; j != innerContents.length; ++j){ + var rex = new RegExp(regexp); + if(rex.match(innerContents[j]) === true) ++foundContents; + } + + if(foundContents < min || foundContents > max) return false; + } + return true; +} \ 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 Tue May 19 05:23:26 2009 @@ -13,21 +13,32 @@ ;; ============================================================================= ;; --- all fragment constraints ------------------------------------------------ ;; ============================================================================= -(defun get-constraints-of-fragment(topic-psi &key (treat-as 'type)) +(defun get-constraints-of-fragment(topic-psis &key (treat-as 'type)) + "Returns a json string with all constraints of this topic-psis. + topic-psis must contain one item if it is treated as instance other wiese there can be more psis + then the fragment will be treated as an instanceOf all passed psis." (let ((associationtype (get-item-by-psi *associationtype-psi*)) (associationtype-constraint (get-item-by-psi *associationtype-constraint-psi*)) - (topic - (let ((psi - (elephant:get-instance-by-value 'PersistentIdC 'uri topic-psi))) - (when psi - (identified-construct psi))))) - (when topic + (topics nil)) + (when (and (not (eql treat-as 'type)) + (> (length topic-psis) 1)) + (error "From get-constraints-of-fragment: when treat-as is set ot instance there must be exactly one item in topic-psis!")) + + (loop for topic-psi in topic-psis + do (let ((psi + (elephant:get-instance-by-value 'PersistentIdC 'uri topic-psi))) + (if psi + (pushnew (identified-construct psi) topics) + (error "Topic "~a" not found!" topic-psi)))) + (when topics (let ((topic-constraints (let ((value - (get-constraints-of-topic topic :treat-as treat-as))) + (get-constraints-of-topic topics :treat-as treat-as))) (concatenate 'string ""topicConstraints":" value)))) (let ((available-associations ;what's with association which have only a associationrole-constraint? - (get-available-associations-of-topic topic :treat-as treat-as))) + (remove-duplicates + (loop for topic in topics + append (get-available-associations-of-topic topic :treat-as treat-as))))) (dolist (item available-associations) (topictype-p item associationtype associationtype-constraint)) (let ((associations-constraints @@ -46,6 +57,40 @@ (concatenate 'string "{" topic-constraints "," associations-constraints "}"))) json-string))))))) + +;(defun get-constraints-of-fragment(topic-psi &key (treat-as 'type)) +; (let ((associationtype (get-item-by-psi *associationtype-psi*)) +; (associationtype-constraint (get-item-by-psi *associationtype-constraint-psi*)) +; (topic +; (let ((psi +; (elephant:get-instance-by-value 'PersistentIdC 'uri topic-psi))) +; (when psi +; (identified-construct psi))))) +; (when topic +; (let ((topic-constraints +; (let ((value +; (get-constraints-of-topic topic :treat-as treat-as))) +; (concatenate 'string ""topicConstraints":" value)))) +; (let ((available-associations ;what's with association which have only a associationrole-constraint? +; (get-available-associations-of-topic topic :treat-as treat-as))) +; (dolist (item available-associations) +; (topictype-p item associationtype associationtype-constraint)) +; (let ((associations-constraints +; (concatenate 'string ""associationsConstraints":" +; (let ((inner-associations-constraints "[")) +; (loop for available-association in available-associations +; do (let ((value +; (get-constraints-of-association available-association))) +; (setf inner-associations-constraints +; (concatenate 'string inner-associations-constraints value ",")))) +; (if (string= inner-associations-constraints "[") +; (setf inner-associations-constraints "null") +; (setf inner-associations-constraints +; (concatenate 'string (subseq inner-associations-constraints 0 (- (length inner-associations-constraints) 1)) "]"))))))) +; (let ((json-string +; (concatenate 'string +; "{" topic-constraints "," associations-constraints "}"))) +; json-string)))))))
;; ============================================================================= @@ -351,37 +396,77 @@ ;; ============================================================================= ;; --- all topic constraints --------------------------------------------------- ;; ============================================================================= -(defun get-constraints-of-topic (topic-instance &key(treat-as 'type)) - "Returns a constraint list with the constraints: - subjectidentifier-constraints, subjectlocator-constraints, - topicname-constraints, topicoccurrence-constraints and - uniqueoccurrence-constraints." - (let ((constraint-topics - (get-all-constraint-topics-of-topic topic-instance :treat-as treat-as))) +(defun get-constraints-of-topic (topic-instances &key(treat-as 'type)) + "Returns a constraint list with the constraints: + subjectidentifier-constraints, subjectlocator-constraints, + topicname-constraints, topicoccurrence-constraints and + uniqueoccurrence-constraints. + topic-instances should be a list with exactly one item if trea-as is set to type + otherwise it can constain more items." + (declare (list topic-instances)) + (when (and (> (length topic-instances) 1) + (not (eql treat-as 'type))) + (error "From get-constraints-of-topic: topic-instances must contain exactly one item when treated as instance!")) + (let ((abstract-topictype-constraints nil) + (exclusive-instance-constraints nil) + (subjectidentifier-constraints nil) + (subjectlocator-constraints nil) + (topicname-constraints nil) + (topicoccurrence-constraints nil) + (uniqueoccurrence-constraints nil)) + (loop for topic-instance in topic-instances + do (let ((current-constraints + (get-all-constraint-topics-of-topic topic-instance :treat-as treat-as))) + (dolist (item (getf current-constraints :abstract-topictype-constraints)) + (pushnew item abstract-topictype-constraints)) + (dolist (item (getf current-constraints :exclusive-instance-constraints)) + (let ((current-list + (list topic-instance (list item)))) + (let ((found-item + (find current-list exclusive-instance-constraints :key #'first))) + (if found-item + (dolist (inner-item (second current-list)) + (pushnew inner-item (second found-item))) + (push current-list exclusive-instance-constraints))))) + (dolist (item (getf current-constraints :subjectidentifier-constraints)) + (pushnew item subjectidentifier-constraints)) + (dolist (item (getf current-constraints :subjectlocator-constraints)) + (pushnew item subjectlocator-constraints)) + (dolist (item (getf current-constraints :topicname-constraints)) + (pushnew item topicname-constraints)) + (dolist (item (getf current-constraints :topicoccurrence-constraints)) + (pushnew item topicoccurrence-constraints)) + (dolist (item (getf current-constraints :uniqueoccurrence-constraints)) + (pushnew item uniqueoccurrence-constraints)))) (let ((exclusive-instance-constraints - (let ((value - (get-exclusive-instance-constraints (getf constraint-topics :exclusive-instance-constraints)))) + (let ((value "[")) + (loop for exclusive-instance-constraint in exclusive-instance-constraints + do (setf value (concatenate 'string value + (get-exclusive-instance-constraints (first exclusive-instance-constraint) + (second exclusive-instance-constraint)) ","))) + (if (string= value "[") + (setf value "null") + (setf value (concatenate 'string (subseq value 0 (- (length value) 1)) "]"))) (concatenate 'string ""exclusiveInstances":" value))) (subjectidentifier-constraints (let ((value - (get-simple-constraints (getf constraint-topics :subjectidentifier-constraints) :error-msg-constraint-name "subjectidentifier"))) + (get-simple-constraints subjectidentifier-constraints :error-msg-constraint-name "subjectidentifier"))) (concatenate 'string ""subjectIdentifierConstraints":" value))) (subjectlocator-constraints (let ((value - (get-simple-constraints (getf constraint-topics :subjectlocator-constraints) :error-msg-constraint-name "subjectlocator"))) + (get-simple-constraints subjectlocator-constraints :error-msg-constraint-name "subjectlocator"))) (concatenate 'string ""subjectLocatorConstraints":" value))) (topicname-constraints (let ((value - (get-topicname-constraints (getf constraint-topics :topicname-constraints)))) + (get-topicname-constraints topicname-constraints))) (concatenate 'string ""topicNameConstraints":" value))) (topicoccurrence-constraints (let ((value - (get-topicoccurrence-constraints (getf constraint-topics :topicoccurrence-constraints) - (getf constraint-topics :uniqueoccurrence-constraints)))) + (get-topicoccurrence-constraints topicoccurrence-constraints uniqueoccurrence-constraints))) (concatenate 'string ""topicOccurrenceConstraints":" value))) (abstract-constraint (concatenate 'string ""abstractConstraint":" - (if (getf constraint-topics :abstract-constraint) + (if abstract-topictype-constraints "true" "false")))) (let ((json-string @@ -390,12 +475,50 @@ topicoccurrence-constraints "," abstract-constraint "}"))) json-string))))
- -(defun get-exclusive-instance-constraints(exclusive-instances-lists) - "Returns a list of psis which represents some topics." +;(defun get-constraints-of-topic (topic-instances &key(treat-as 'type)) +; (let ((constraint-topics +; (get-all-constraint-topics-of-topic topic-instance :treat-as treat-as))) +; (let ((exclusive-instance-constraints +; (let ((value +; (get-exclusive-instance-constraints (getf constraint-topics :exclusive-instance-constraints)))) +; (concatenate 'string ""exclusiveInstances":" value))) +; (subjectidentifier-constraints +; (let ((value +; (get-simple-constraints (getf constraint-topics :subjectidentifier-constraints) :error-msg-constraint-name "subjectidentifier"))) +; (concatenate 'string ""subjectIdentifierConstraints":" value))) +; (subjectlocator-constraints +; (let ((value +; (get-simple-constraints (getf constraint-topics :subjectlocator-constraints) :error-msg-constraint-name "subjectlocator"))) +; (concatenate 'string ""subjectLocatorConstraints":" value))) +; (topicname-constraints +; (let ((value +; (get-topicname-constraints (getf constraint-topics :topicname-constraints)))) +; (concatenate 'string ""topicNameConstraints":" value))) +; (topicoccurrence-constraints +; (let ((value +; (get-topicoccurrence-constraints (getf constraint-topics :topicoccurrence-constraints) +; (getf constraint-topics :uniqueoccurrence-constraints)))) +; (concatenate 'string ""topicOccurrenceConstraints":" value))) +; (abstract-constraint +; (concatenate 'string ""abstractConstraint":" +; (if (getf constraint-topics :abstract-topictype-constraints) +; "true" +; "false")))) +; (let ((json-string +; (concatenate 'string "{" exclusive-instance-constraints "," subjectidentifier-constraints +; "," subjectlocator-constraints "," topicname-constraints "," +; topicoccurrence-constraints "," abstract-constraint "}"))) +; json-string)))) + + +(defun get-exclusive-instance-constraints(owner exclusive-instances-lists) + "Returns a JSON-obejct of the following form: + {owner: [psi-1, psi-2], exclusives: [[psi-1-1, psi-1-2], [psi-2-1, <...>], <...>]}." (let ((constraint-role (get-item-by-psi *constraint-role-psi*)) (applies-to (get-item-by-psi *applies-to-psi*)) - (topictype-role (get-item-by-psi *topictype-role-psi*))) + (topictype-role (get-item-by-psi *topictype-role-psi*)) + (topictype (get-item-by-psi *topictype-psi*)) + (topictype-constraint (get-item-by-psi *topictype-constraint-psi*))) (let ((topics (remove-duplicates (loop for exclusive-instances-list in exclusive-instances-lists @@ -408,10 +531,13 @@ append (loop for other-role in (roles (parent role)) when (and (eq topictype-role (instance-of other-role)) (not (eq owner (player other-role)))) - collect (player other-role))))))))) - (json:encode-json-to-string (map 'list #'(lambda(y) - (map 'list #'uri y)) - (map 'list #'psis topics)))))) + ;collect (player other-role))))))))) + append (getf (list-subtypes (player other-role) topictype topictype-constraint) :subtypes))))))))) + (concatenate 'string "{"owner":" (json-exporter::identifiers-to-json-string owner) + ","exclusives":" + (json:encode-json-to-string (map 'list #'(lambda(y) + (map 'list #'uri y)) + (map 'list #'psis topics))) "}"))))
(defun get-simple-constraints(constraint-topics &key (error-msg-constraint-name "uniqueoccurrence")) @@ -456,7 +582,7 @@ (defun get-topicname-constraints(constraint-topics) "Returns all topicname constraints as a list of the following form: [{nametypescopes:[{nameType: [psi-1, psi-2], scopeConstraints: [<scopeConstraint>]}, - {nameType: [subtype-1-psi-1], scopeConstriants: [<scopeConstraints>]}, + {nameType: [subtype-1-psi-1], scopeConstraints: [<scopeConstraints>]}, constraints: [<simpleConstraint>, <...>]}, <...>]." (let ((constraint-role (get-item-by-psi *constraint-role-psi*)) @@ -742,7 +868,7 @@
(defun get-constraint-occurrence-value(topic &key (what 'regexp)) "Checks the occurrence-value of a regexp, card-min or card-max - constriant-occurrence. + constraint-occurrence. If what = 'regexp and the occurrence-value is empty there will be returned the value '.*!'. If what = 'card-min and the occurrence-value is empty there will be returned @@ -905,7 +1031,7 @@ :uniqueoccurrence-constraints uniqueoccurrence-constraints)))
-(defmethod get-all-constraint-topics-of-topic (topic-instance &key (treat-as 'type)) +(defun get-all-constraint-topics-of-topic (topic-instance &key (treat-as 'type)) "Returns a list of constraint-topics of the topics-instance's base type(s). If topic c is instanceOf a and b, there will be returned all constraint-topics of the topic types a and b.
Modified: trunk/src/json/json_tmcl_validation.lisp ============================================================================== --- trunk/src/json/json_tmcl_validation.lisp (original) +++ trunk/src/json/json_tmcl_validation.lisp Tue May 19 05:23:26 2009 @@ -30,7 +30,7 @@ (eq applies-to (instance-of (parent role)))) return (loop for other-role in (roles (parent role)) when (and (eq constraint-role (instance-of other-role)) - (eq abstract-topictype-constraint (player other-role))) + (topictype-of-p (player other-role) abstract-topictype-constraint)) return t))))
Modified: trunk/src/rest_interface/set-up-json-interface.lisp ============================================================================== --- trunk/src/rest_interface/set-up-json-interface.lisp (original) +++ trunk/src/rest_interface/set-up-json-interface.lisp Tue May 19 05:23:26 2009 @@ -15,8 +15,8 @@ (defparameter *json-get-summary-url* "/json/summary/?$") ;the url to get a summary od all topic stored in isidorus; you have to set the GET-parameter "start" for the start index of all topics within elephant and the GET-paramter "end" for the last index of the topic sequence -> http://localhost:8000/json/summary/?start=12&end=13 (defparameter *json-get-all-type-psis* "/json/tmcl/types/?$") ;returns a list of all psis that can be a type (defparameter *json-get-topic-stub-prefix* "/json/topicstubs/(.+)$") ;the json prefix for getting some topic stub information of a topic -(defparameter *json-get-type-tmcl-prefix* "/json/tmcl/type/(.+)$") ;the json prefix for getting some tmcl information of a topic treated as a type -(defparameter *json-get-instance-tmcl-prefix* "/json/tmcl/instance/(.+)$") ;the json prefix for getting some tmcl information of a topic treated as an instance +(defparameter *json-get-type-tmcl-url* "/json/tmcl/type/?$") ;the json url for getting some tmcl information of a topic treated as a type +(defparameter *json-get-instance-tmcl-url* "/json/tmcl/instance/?$") ;the json url for getting some tmcl information of a topic treated as an instance (defparameter *ajax-user-interface-url* "/isidorus/?$") ;the url to the user interface; if you want to get all topics set start=0&end=nil -> localhost:8000/isidorus (defparameter *ajax-user-interface-css-prefix* "/css") ;the url to the css files of the user interface (defparameter *ajax-user-interface-css-directory-path* "ajax/css") ;the directory contains the css files @@ -30,8 +30,8 @@ (json-get-summary-url *json-get-summary-url*) (json-get-all-type-psis *json-get-all-type-psis*) (json-get-topic-stub-prefix *json-get-topic-stub-prefix*) - (json-get-type-tmcl-prefix *json-get-type-tmcl-prefix*) - (json-get-instance-tmcl-prefix *json-get-instance-tmcl-prefix*) + (json-get-type-tmcl-url *json-get-type-tmcl-url*) + (json-get-instance-tmcl-url *json-get-instance-tmcl-url*) (ajax-user-interface-url *ajax-user-interface-url*) (ajax-user-interface-file-path *ajax-user-interface-file-path*) (ajax-user-interface-css-prefix *ajax-user-interface-css-prefix*) @@ -84,12 +84,14 @@ (create-regex-dispatcher json-get-all-type-psis #'return-all-tmcl-types) hunchentoot:*dispatch-table*) (push - (create-regex-dispatcher json-get-type-tmcl-prefix #'(lambda(&optional psi) - (return-tmcl-info-of-psi 'json-tmcl::type psi))) + (create-regex-dispatcher json-get-type-tmcl-url #'(lambda(&optional param) + (declare (ignorable param)) + (return-tmcl-info-of-psis 'json-tmcl::type))) hunchentoot:*dispatch-table*) (push - (create-regex-dispatcher json-get-instance-tmcl-prefix #'(lambda(&optional psi) - (return-tmcl-info-of-psi 'json-tmcl::instance psi))) + (create-regex-dispatcher json-get-instance-tmcl-url #'(lambda(&optional param) + (declare (ignorable param)) + (return-tmcl-info-of-psis 'json-tmcl::instance))) hunchentoot:*dispatch-table*) (push (create-regex-dispatcher json-commit-url #'json-commit) @@ -102,6 +104,8 @@ ;; --- some handlers for the json-rest-interface ------------------------------- ;; ============================================================================= (defun return-all-tmcl-types(&optional param) + "Returns all topics that are valid types -> so they have to be valid to the + topictype-constraint (if it exists) and the can't be abstract." (declare (ignorable param)) (handler-case (let ((all-topics (elephant:get-instances-by-class 'd:TopicC)) @@ -150,29 +154,55 @@ (format nil "Condition: Topic "~a" not found" psi)))))
-(defun return-tmcl-info-of-psi(treat-as &optional psi) +(defun return-tmcl-info-of-psis(treat-as) "Returns a json string which represents the defined tmcl-constraints of the topic and the associations where this topic can be a player." - (assert psi) - (let ((http-method (hunchentoot:request-method*))) - (if (eq http-method :GET) - (let ((identifier (string-replace psi "%23" "#"))) - (setf (hunchentoot:content-type*) "application/json") ;RFC 4627 - (handler-case (let ((tmcl - (json-tmcl:get-constraints-of-fragment identifier :treat-as treat-as))) - (if tmcl - (progn - (setf (hunchentoot:content-type*) "application/json") ;RFC 4627 - tmcl) - (progn - (setf (hunchentoot:return-code*) hunchentoot:+http-not-found+) - (setf (hunchentoot:content-type*) "text") - (format nil "Topic "~a" not found." psi)))) + (let ((http-method (hunchentoot:request-method*))) + (if (or (eq http-method :POST) + (eq http-method :PUT)) + (let ((external-format (flexi-streams:make-external-format :UTF-8 :eol-style :LF))) + (let ((json-data (hunchentoot:raw-post-data :external-format external-format :force-text t))) + (handler-case (let ((psis + (json:decode-json-from-string json-data))) + (let ((tmcl + (json-tmcl:get-constraints-of-fragment psis :treat-as treat-as))) + (if tmcl + (progn + (setf (hunchentoot:content-type*) "application/json") ;RFC 4627 + tmcl) + (progn + (setf (hunchentoot:return-code*) hunchentoot:+http-not-found+) + (setf (hunchentoot:content-type*) "text") + (format nil "Topic "~a" not found." psis))))) (condition (err) (progn (setf (hunchentoot:return-code*) hunchentoot:+http-internal-server-error+) (setf (hunchentoot:content-type*) "text") - (format nil "Condition: "~a"" err))))) - (setf (hunchentoot:return-code*) hunchentoot:+http-bad-request+)))) + (format nil "Condition: "~a"" err)))))) + (setf (hunchentoot:return-code*) hunchentoot:+http-bad-request+)))) + +;(defun return-tmcl-info-of-psis(treat-as &otptional psi) +; "Returns a json string which represents the defined tmcl-constraints of the +; topic and the associations where this topic can be a player." +; (alert psi) +; (let ((http-method (hunchentoot:request-method*))) +; (if (eq http-method :GET) +; (let ((identifier (string-replace psi "%23" "#"))) +; (setf (hunchentoot:content-type*) "application/json") ;RFC 4627 +; (handler-case (let ((tmcl +; (json-tmcl:get-constraints-of-fragment identifier :treat-as treat-as))) +; (if tmcl +; (progn +; (setf (hunchentoot:content-type*) "application/json") ;RFC 4627 +; tmcl) +; (progn +; (setf (hunchentoot:return-code*) hunchentoot:+http-not-found+) +; (setf (hunchentoot:content-type*) "text") +; (format nil "Topic "~a" not found." psis)))) +; (condition (err) (progn +; (setf (hunchentoot:return-code*) hunchentoot:+http-internal-server-error+) +; (setf (hunchentoot:content-type*) "text") +; (format nil "Condition: "~a"" err))))) +; (setf (hunchentoot:return-code*) hunchentoot:+http-bad-request+))))
(defun return-all-topic-psis (&optional param)
Modified: trunk/src/unit_tests/poems.xtm ============================================================================== --- trunk/src/unit_tests/poems.xtm (original) +++ trunk/src/unit_tests/poems.xtm Tue May 19 05:23:26 2009 @@ -1,90 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <tm:topicMap version="2.0" xmlns:tm="http://www.topicmaps.org/xtm/%22%3E - - <!-- === association-test ================================================ --> - <tm:topic id="test-scope-1"> - <tm:subjectIdentifier href="test-scope-1"/> - tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> - </tm:topic> - - <tm:topic id="test-scope-2"> - <tm:subjectIdentifier href="test-scope-2"/> - tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> - </tm:topic> - - <tm:topic id="written-by-test-scope-constraint"> - <tm:subjectIdentifier href="written-by-test-scope-constraint"/> - 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%22%3E1</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%22%3E1</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-test-scope-constraint"/> - </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="#written-by-test-scope-constraint"/> - </tm:role> - tm:role - tm:type - <tm:topicRef href="#scopetype-role"/> - </tm:type> - <tm:topicRef href="#test-scope-1"/> - </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="#written-by-test-scope-constraint"/> - </tm:role> - tm:role - tm:type - <tm:topicRef href="#scopetype-role"/> - </tm:type> - <tm:topicRef href="#test-scope-2"/> - </tm:role> - </tm:association> - <!-- === end association-test ============================================ --> - - <!-- ===================================================================== --> <!-- === TMCL meta-model topics ========================================== --> <!-- ===================================================================== --> @@ -678,6 +593,84 @@ tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> </tm:topic>
+ <!-- region --> + <tm:topic id="region"> + <tm:subjectIdentifier href="http://some.where/base-psis/region%22/%3E + tm:instanceOf<tm:topicRef href="#topictype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="abstract-constraint-for-region"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/abstract-constraint-for-region%22/%3E + tm:instanceOf<tm:topicRef href="#abstract-topictype-constraint"/></tm:instanceOf> + </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="#abstract-constraint-for-region"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#region"/> + </tm:role> + </tm:association> + + <tm:topic id="region-name"> + <tm:subjectIdentifier href="http://some.where/base-psis/region-name%22/%3E + tm:instanceOf<tm:topicRef href="#nametype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="region-population"> + <tm:subjectIdentifier href="http://some.where/base-psis/region-population%22/%3E + tm:instanceOf<tm:topicRef href="#occurrencetype"/></tm:instanceOf> + </tm:topic> + + <!-- city --> + <tm:topic id="city"> + <tm:subjectIdentifier href="http://some.where/base-psis/city%22/%3E + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#supertype-subtype"/></tm:type> + tm:role + tm:type<tm:topicRef href="#supertype"/></tm:type> + <tm:topicRef href="#region"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#subtype"/></tm:type> + <tm:topicRef href="#city"/> + </tm:role> + </tm:association> + + <!-- metropolis --> + <tm:topic id="metropolis"> + <tm:subjectIdentifier href="http://some.where/base-psis/metropolis%22/%3E + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#supertype-subtype"/></tm:type> + tm:role + tm:type<tm:topicRef href="#supertype"/></tm:type> + <tm:topicRef href="#region"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#subtype"/></tm:type> + <tm:topicRef href="#metropolis"/> + </tm:role> + </tm:association> + + <!-- country --> + <tm:topic id="country"> + <tm:subjectIdentifier href="http://some.where/base-psis/country%22/%3E + tm:instanceOf<tm:topicRef href="#topictype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="country-name"> + <tm:subjectIdentifier href="http://some.where/base-psis/country-name%22/%3E + tm:instanceOf<tm:topicRef href="#nametype"/></tm:instanceOf> + </tm:topic> + <!-- association author-poem --> <tm:topic id="written-by"> <tm:subjectIdentifier href="http://some.where/base-psis/written-by%22/%3E @@ -694,6 +687,34 @@ tm:instanceOf<tm:topicRef href="#roletype"/></tm:instanceOf> </tm:topic>
+ <!-- association country-city --> + <tm:topic id="located-in"> + <tm:subjectIdentifier href="http://some.where/base-psis/located-in%22/%3E + tm:instanceOf<tm:topicRef href="#associationtype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="container"> + <tm:subjectIdentifier href="http://some.where/base-psis/container%22/%3E + tm:instanceOf<tm:topicRef href="#roletype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="containee"> + <tm:subjectIdentifier href="http://some.where/base-psis/containee%22/%3E + tm:instanceOf<tm:topicRef href="#roletype"/></tm:instanceOf> + </tm:topic> + + <!-- association author-city --> + <tm:topic id="born-in"> + <tm:subjectIdentifier href="http://some.where/base-psis/born-in%22/%3E + tm:instanceOf<tm:topicRef href="#associationtype"/></tm:instanceOf> + </tm:topic> + + <!-- writer already defined for written-by --> + + <tm:topic id="place"> + <tm:subjectIdentifier href="http://some.where/base-psis/place%22/%3E + tm:instanceOf<tm:topicRef href="#roletype"/></tm:instanceOf> + </tm:topic>
<!-- ===================================================================== --> <!-- === own datamodel: exclusive type constraint ======================== --> @@ -728,6 +749,30 @@ </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="#exc"/> + </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="#exc"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#country"/> + </tm:role> + </tm:association> + <!-- ===================================================================== --> <!-- === own datamodel: subjectIdentifier constraints ==================== --> <!-- ===================================================================== --> @@ -797,9 +842,69 @@ </tm:role> </tm:association>
- <!-- further subjectidentifiers of author and poem --> - <tm:topic id="sic-author-poem"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/sic-author-poem%22/%3E + <!-- subjectidentifier of region --> + <tm:topic id="sic-region"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/sic-region%22/%3E + tm:instanceOf<tm:topicRef href="#subjectidentifier-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5Ehttp://some.where/psis/regio...</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="#sic-region"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#region"/> + </tm:role> + </tm:association> + + <!-- subjectidentifier of country --> + <tm:topic id="sic-country"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/sic-country%22/%3E + tm:instanceOf<tm:topicRef href="#subjectidentifier-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5Ehttp://some.where/psis/count...</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="#sic-country"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#country"/> + </tm:role> + </tm:association> + + <!-- further subjectidentifiers of all topics --> + <tm:topic id="sic-all"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/all%22/%3E tm:instanceOf<tm:topicRef href="#subjectidentifier-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -819,7 +924,7 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#sic-author-poem"/> + <tm:topicRef href="#sic-all"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> @@ -831,7 +936,7 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#sic-author-poem"/> + <tm:topicRef href="#sic-all"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> @@ -839,15 +944,39 @@ </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="#sic-all"/> + </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="#sic-all"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#country"/> + </tm:role> + </tm:association> +
<!-- ===================================================================== --> - <!-- === own datamodel: subjectIdentifier constraints ==================== --> + <!-- === own datamodel: subjectLocator constraints ======================= --> <!-- ===================================================================== --> - <!-- all instances of author and poem are not allowed to own a + <!-- all instances of author, poem, city and country are not allowed to own a subjectLocator -->
- <tm:topic id="slc-author-poem"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/slc-author-poem%22/%3E + <tm:topic id="slc-author-poem-city-country"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/slc-author-poem-city-country%22/%3E tm:instanceOf<tm:topicRef href="#subjectlocator-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -867,7 +996,7 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#slc-author-poem"/> + <tm:topicRef href="#slc-author-poem-city-country"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> @@ -879,7 +1008,7 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#slc-author-poem"/> + <tm:topicRef href="#slc-author-poem-city-country"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> @@ -887,8 +1016,32 @@ </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="#slc-author-poem-city-country"/> + </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="#slc-author-poem-city-country"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#country"/> + </tm:role> + </tm:association> + <!-- ===================================================================== --> - <!-- === own datamodel: names constraints ================================ --> + <!-- === own datamodel: name constraints ================================= --> <!-- ===================================================================== --> <!-- instances of the type author has to own a name of the type first-name and one of the type last-name. both must be valid to the regular @@ -902,11 +1055,11 @@ tm:instanceOf<tm:topicRef href="#topicname-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E0</tm:resourceData> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</tm:resourceData> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E3</tm:resourceData> </tm:occurrence> tm:occurrence tm:type<tm:topicRef href="#regexp"/></tm:type> @@ -944,7 +1097,7 @@ tm:instanceOf<tm:topicRef href="#topicname-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E0</tm:resourceData> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</tm:resourceData> </tm:occurrence> tm:occurrence tm:type<tm:topicRef href="#card-max"/></tm:type> @@ -986,7 +1139,7 @@ tm:instanceOf<tm:topicRef href="#topicname-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E0</tm:resourceData> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</tm:resourceData> </tm:occurrence> tm:occurrence tm:type<tm:topicRef href="#card-max"/></tm:type> @@ -1022,20 +1175,13 @@ </tm:role> </tm:association>
- - <!-- ===================================================================== --> - <!-- === own datamodel: occurences constraints =========================== --> - <!-- ===================================================================== --> - <!-- every instance of the topic author can have one occurrence of the type - author-info which contains a resourceRef (= datatype #anyURI) --> - - <!-- author info occurrence --> - <tm:topic id="author-occurrence-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/author-occurrence-constraint%22/%3E - tm:instanceOf<tm:topicRef href="#topicoccurrence-constraint"/></tm:instanceOf> + <!-- region: region-name --> + <tm:topic id="region-name-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/region-name-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#topicname-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E0</tm:resourceData> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</tm:resourceData> </tm:occurrence> tm:occurrence tm:type<tm:topicRef href="#card-max"/></tm:type> @@ -1051,11 +1197,11 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#author-occurrence-constraint"/> + <tm:topicRef href="#region-name-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> - <tm:topicRef href="#author"/> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
@@ -1063,7 +1209,150 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#author-occurrence-constraint"/> + <tm:topicRef href="#region-name-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#nametype-role"/></tm:type> + <tm:topicRef href="#region-name"/> + </tm:role> + </tm:association> + + <!-- country: country-name + A country hast to have at least one name with the scope "en" or "de". + There can exist both names with the scopes "en" and "de". --> + <tm:topic id="country-name-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/country-name-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#topicname-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E2</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5E.+$</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="#country-name-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#country"/> + </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="#country-name-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#nametype-role"/></tm:type> + <tm:topicRef href="#country-name"/> + </tm:role> + </tm:association> + + <!-- country-name scopes --> + <tm:topic id="scoped-country-name-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-country-name-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#nametypescope-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E2</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-country-name-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#nametype-role"/></tm:type> + <tm:topicRef href="#country-name"/> + </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-country-name-constraint"/> + </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-country-name-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#de"/> + </tm:role> + </tm:association> + + + <!-- ===================================================================== --> + <!-- === own datamodel: occurence constraints ============================ --> + <!-- ===================================================================== --> + <!-- every instance of the topic author can have one occurrence of the type + author-info which contains a resourceRef (= datatype #anyURI) --> + + <!-- author info occurrence --> + <tm:topic id="author-occurrence-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/author-occurrence-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#topicoccurrence-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E0</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%22%3E1</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5E.+$</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="#author-occurrence-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="#author-occurrence-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> @@ -1137,57 +1426,824 @@ </tm:role> </tm:association>
- <!-- poem content-occurrence datatype --> - <tm:topic id="poem-content-occurrence-datatype-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/poem-content-occurrence-datatype-constrain... - 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%22%3Ehttp://www.w3.org/2001/XMLSchem...</tm:resourceData> - </tm:occurrence> - </tm:topic> - + <!-- poem content-occurrence datatype --> + <tm:topic id="poem-content-occurrence-datatype-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/poem-content-occurrence-datatype-constrain... + 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%22%3Ehttp://www.w3.org/2001/XMLSchem...</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="#poem-content-occurrence-datatype-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> + <tm:topicRef href="#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 --> + <tm:topic id="unique-poem-occurrence-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/unique-poem-occurrence-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#uniqueoccurrence-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5E.*$</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="#unique-poem-occurrence-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#poem"/> + </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="#unique-poem-occurrence-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> + <tm:topicRef href="#poem-content"/> + </tm:role> + </tm:association> + + <!-- add a scope to the occurrence "poem-content" --> + <tm:topic id="scoped-poem-occurrence-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-poem-occurrence-constraint%22/%3E + tm:instanceOf<tm:topicRef href="#occurrencetypescope-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E2</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-poem-occurrence-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> + <tm:topicRef href="#poem-content"/> + </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-poem-occurrence-constraint"/> + </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-poem-occurrence-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#de"/> + </tm:role> + </tm:association> + + <!-- city population-occurrence --> + <tm:topic id="region-population-occurrence-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/region-population-occurrence-constraint%22... + tm:instanceOf<tm:topicRef href="#topicoccurrence-constraint"/></tm:instanceOf> + tm:occurrence + tm:type<tm:topicRef href="#card-min"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</tm:resourceData> + </tm:occurrence> + tm:occurrence + tm:type<tm:topicRef href="#regexp"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5E.+$</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="#region-population-occurrence-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="#region-population-occurrence-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> + <tm:topicRef href="#region-population"/> + </tm:role> + </tm:association> + + <!-- city population-occurrence datatype --> + <tm:topic id="region-population-occurrence-datatype-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/region-population-occurrence-datatype-cons... + 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%22%3Ehttp://www.w3.org/2001/XMLSchem...</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="#region-population-occurrence-datatype-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> + <tm:topicRef href="#region-population"/> + </tm:role> + </tm:association> + + <!-- ===================================================================== --> + <!-- === own datamodel: association (-role) constraints ================== --> + <!-- ===================================================================== --> + <!-- there exists one asoociation of the type written-by between the types + author and poem. where one role is of type writer which has a player + 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 + written-by --> + <tm:topic id="written-by-writer-role-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/written-by-writer-role-constraint%22/%3E + 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%22%3E1</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%22%3E1</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-writer-role-constraint"/> + </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="#written-by-writer-role-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#writer"/> + </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%2... + 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%22%3E1</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%22%3E1</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-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="#written-by-writer-role-player-constraint"/> + </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="#written-by-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> + + + <!-- 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%22/%3E + 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%22%3E1</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%22%3E1</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-constraint"/> + </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="#written-role-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#written"/> + </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%22/%3E + 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%22%3E1</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%22%3E1</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:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#poem"/> + </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="#written-role-player-constraint"/> + </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="#written-role-player-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#written"/> + </tm:role> + </tm:association> + + + <!-- 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> + tm:occurrence + tm:type + <tm:topicRef href="#card-min"/> + </tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E1</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: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="#written-by-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="#written-by-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="#written-by-otherrole-constraint-for-writer"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#otherroletype-role"/></tm:type> + <tm:topicRef href="#written"/> + </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="#written-by-otherrole-constraint-for-writer"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#othertopictype-role"/></tm:type> + <tm:topicRef href="#poem"/> + </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... + 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%22%3E1</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%22%3E1</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-written"/> + </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="#written-by-otherrole-constraint-for-written"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#written"/> + </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="#written-by-otherrole-constraint-for-written"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#poem"/> + </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="#written-by-otherrole-constraint-for-written"/> + </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="#written-by-otherrole-constraint-for-written"/> + </tm:role> + tm:role + 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 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%22/%3E + 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%22%3E1</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%22%3E1</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-place-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-place-role-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#place"/> + </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%22/%3... + 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%22%3E1</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%22%3E1</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-place-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="#born-in-place-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-place-role-player-constraint"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#place"/> + </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%22/%3E + 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%22%3E1</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%22%3E1</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%22/%... + 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%22%3E1</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%22%3E1</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%22/... + 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%22%3E1</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%22%3E1</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="#poem-content-occurrence-datatype-constraint"/> + <tm:topicRef href="#born-in-otherrole-constraint-for-writer"/> </tm:role> tm:role - tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> - <tm:topicRef href="#poem-content"/> + tm:type<tm:topicRef href="#othertopictype-role"/></tm:type> + <tm:topicRef href="#region"/> </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 --> - <tm:topic id="unique-poem-occurrence-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/unique-poem-occurrence-constraint%22/%3E - tm:instanceOf<tm:topicRef href="#uniqueoccurrence-constraint"/></tm:instanceOf> + <tm:topic id="born-in-otherrole-constraint-for-place"> + <tm:subjectIdentifier href="http://some.where/contraint-psis/born-in-otherrole-constraint-for-place%22/%... + 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%22%3E1</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%22%3E1</tm:resourceData> </tm:occurrence> - tm:occurrence - tm:type<tm:topicRef href="#regexp"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3E%5E.*$</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="#unique-poem-occurrence-constraint"/> + <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="#poem"/> + tm:type<tm:topicRef href="#associationtype-role"/></tm:type> + <tm:topicRef href="#born-in"/> </tm:role> </tm:association>
@@ -1195,37 +2251,23 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#unique-poem-occurrence-constraint"/> + <tm:topicRef href="#born-in-otherrole-constraint-for-place"/> </tm:role> tm:role - tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> - <tm:topicRef href="#poem-content"/> + tm:type<tm:topicRef href="#roletype-role"/></tm:type> + <tm:topicRef href="#place"/> </tm:role> </tm:association> - - <!-- add a scope to the occurrence "poem-content" --> - <tm:topic id="scoped-poem-occurrence-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-poem-occurrence-constraint%22/%3E - tm:instanceOf<tm:topicRef href="#occurrencetypescope-constraint"/></tm:instanceOf> - tm:occurrence - tm:type<tm:topicRef href="#card-min"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E1</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%22%3E2</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-poem-occurrence-constraint"/> + <tm:topicRef href="#born-in-otherrole-constraint-for-place"/> </tm:role> tm:role - tm:type<tm:topicRef href="#occurrencetype-role"/></tm:type> - <tm:topicRef href="#poem-content"/> + tm:type<tm:topicRef href="#topictype-role"/></tm:type> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
@@ -1233,11 +2275,11 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#scoped-poem-occurrence-constraint"/> + <tm:topicRef href="#born-in-otherrole-constraint-for-place"/> </tm:role> tm:role - tm:type<tm:topicRef href="#scopetype-role"/></tm:type> - <tm:topicRef href="#en"/> + tm:type<tm:topicRef href="#otherroletype-role"/></tm:type> + <tm:topicRef href="#writer"/> </tm:role> </tm:association>
@@ -1245,27 +2287,20 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#scoped-poem-occurrence-constraint"/> + <tm:topicRef href="#born-in-otherrole-constraint-for-place"/> </tm:role> tm:role - tm:type<tm:topicRef href="#scopetype-role"/></tm:type> - <tm:topicRef href="#de"/> + tm:type<tm:topicRef href="#othertopictype-role"/></tm:type> + <tm:topicRef href="#author"/> </tm:role> </tm:association>
- - <!-- ===================================================================== --> - <!-- === own datamodel: association (-role) constraints ================== --> - <!-- ===================================================================== --> - <!-- there exists one asoociation of the type written-by between the types - author and poem. where one role is of type writer which has a player - 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 - written-by --> - <tm:topic id="writer-role-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/writer-role-constraint%22/%3E + <!-- 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%22/%3... tm:instanceOf<tm:topicRef href="#associationrole-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -1281,11 +2316,11 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#writer-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="#written-by"/> + <tm:topicRef href="#located-in"/> </tm:role> </tm:association>
@@ -1293,17 +2328,17 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#writer-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="#writer"/> + <tm:topicRef href="#container"/> </tm:role> </tm:association>
- <!-- the writer role owns a player of the type author --> - <tm:topic id="writer-role-player-constraint"> - <tm:subjectIdentifier href="http://some.where/constraint-psis/writer-role-player-constraint%22/%3E + <!-- 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-constrain... tm:instanceOf<tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -1319,11 +2354,11 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#writer-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="#author"/> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
@@ -1331,11 +2366,11 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#writer-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="#written-by"/> + <tm:topicRef href="#located-in"/> </tm:role> </tm:association>
@@ -1343,19 +2378,17 @@ tm:type<tm:topicRef href="#applies-to"/></tm:type> tm:role tm:type<tm:topicRef href="#constraint-role"/></tm:type> - <tm:topicRef href="#writer-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="#writer"/> + <tm:topicRef href="#container"/> </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%22/%3E + <!-- writer associationrole-constraint --> + <tm:topic id="located-in-containee-role-constraint"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/located-in-containee-role-constraint%22/%3... tm:instanceOf<tm:topicRef href="#associationrole-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -1371,11 +2404,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-constraint"/> + <tm:topicRef href="#located-in-containee-role-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#associationtype-role"/></tm:type> - <tm:topicRef href="#written-by"/> + <tm:topicRef href="#located-in"/> </tm:role> </tm:association>
@@ -1383,17 +2416,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-role-constraint"/> + <tm:topicRef href="#located-in-containee-role-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#roletype-role"/></tm:type> - <tm:topicRef href="#written"/> + <tm:topicRef href="#containee"/> </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%22/%3E + <!-- 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-constrain... tm:instanceOf<tm:topicRef href="#roleplayer-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -1409,11 +2442,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="#located-in-containee-role-player-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> - <tm:topicRef href="#poem"/> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
@@ -1421,11 +2454,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="#located-in-containee-role-player-constraint"/> </tm:role> tm:role tm:type<tm:topicRef href="#associationtype-role"/></tm:type> - <tm:topicRef href="#written-by"/> + <tm:topicRef href="#located-in"/> </tm:role> </tm:association>
@@ -1433,27 +2466,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-role-player-constraint"/> + <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="#written"/> + <tm:topicRef href="#containee"/> </tm:role> </tm:association>
- - <!-- 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="written-by-otherrole-constraint-for-writer"/> + <!-- 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-contain... tm:instanceOf<tm:topicRef href="#otherrole-constraint"/></tm:instanceOf> tm:occurrence tm:type @@ -1473,11 +2499,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="#located-in-otherrole-constraint-for-container"/> </tm:role> tm:role tm:type<tm:topicRef href="#associationtype-role"/></tm:type> - <tm:topicRef href="#written-by"/> + <tm:topicRef href="#located-in"/> </tm:role> </tm:association>
@@ -1485,11 +2511,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="#located-in-otherrole-constraint-for-container"/> </tm:role> tm:role tm:type<tm:topicRef href="#roletype-role"/></tm:type> - <tm:topicRef href="#writer"/> + <tm:topicRef href="#container"/> </tm:role> </tm:association>
@@ -1497,11 +2523,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="#located-in-otherrole-constraint-for-container"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> - <tm:topicRef href="#author"/> + <tm:topicRef href="#country"/> </tm:role> </tm:association>
@@ -1509,11 +2535,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="#located-in-otherrole-constraint-for-container"/> </tm:role> tm:role tm:type<tm:topicRef href="#otherroletype-role"/></tm:type> - <tm:topicRef href="#written"/> + <tm:topicRef href="#containee"/> </tm:role> </tm:association>
@@ -1521,16 +2547,16 @@ 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="#located-in-otherrole-constraint-for-container"/> </tm:role> tm:role tm:type<tm:topicRef href="#othertopictype-role"/></tm:type> - <tm:topicRef href="#poem"/> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
- <tm:topic id="written-by-otherrole-constraint-for-written"> - <tm:subjectIdentifier href="written-by-otherrole-constraint-for-written"/> + <tm:topic id="located-in-otherrole-constraint-for-containee"> + <tm:subjectIdentifier href="http://some.where/contraint-psis/located-in-otherrole-constraint-for-contain... tm:instanceOf<tm:topicRef href="#otherrole-constraint"/></tm:instanceOf> tm:occurrence tm:type @@ -1550,11 +2576,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="#located-in-otherrole-constraint-for-containee"/> </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>
@@ -1562,11 +2588,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="#located-in-otherrole-constraint-for-containee"/> </tm:role> tm:role tm:type<tm:topicRef href="#roletype-role"/></tm:type> - <tm:topicRef href="#written"/> + <tm:topicRef href="#containee"/> </tm:role> </tm:association>
@@ -1574,11 +2600,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="#located-in-otherrole-constraint-for-containee"/> </tm:role> tm:role tm:type<tm:topicRef href="#topictype-role"/></tm:type> - <tm:topicRef href="#poem"/> + <tm:topicRef href="#region"/> </tm:role> </tm:association>
@@ -1586,11 +2612,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="#located-in-otherrole-constraint-for-containee"/> </tm:role> tm:role tm:type<tm:topicRef href="#otherroletype-role"/></tm:type> - <tm:topicRef href="#writer"/> + <tm:topicRef href="#container"/> </tm:role> </tm:association>
@@ -1598,17 +2624,131 @@ 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="#located-in-otherrole-constraint-for-containee"/> </tm:role> tm:role tm:type<tm:topicRef href="#othertopictype-role"/></tm:type> - <tm:topicRef href="#author"/> + <tm:topicRef href="#country"/> </tm:role> </tm:association>
<!-- ===================================================================== --> <!-- === the "user's" topic map ========================================== --> <!-- ===================================================================== --> + <tm:topic id="germany"> + <tm:subjectIdentifier href="http://some.where/psis/country/germany%22/%3E + tm:instanceOf<tm:topicRef href="#country"/></tm:instanceOf> + tm:name + tm:scope<tm:topicRef href="#de"/></tm:scope> + tm:valueDeutschland</tm:value> + </tm:name> + tm:name + tm:scope<tm:topicRef href="#en"/></tm:scope> + tm:valueGermany</tm:value> + </tm:name> + </tm:topic> + + <tm:topic id="poland"> + <tm:subjectIdentifier href="http://some.where/psis/country/poland%22/%3E + tm:instanceOf<tm:topicRef href="#country"/></tm:instanceOf> + tm:name + tm:scope<tm:topicRef href="#de"/></tm:scope> + tm:valuePolen</tm:value> + </tm:name> + tm:name + tm:scope<tm:topicRef href="#en"/></tm:scope> + tm:valuePoland</tm:value> + </tm:name> + </tm:topic> + + <tm:topic id="frankfurt_am_main"> + <tm:subjectIdentifier href="http://some.where/psis/city/frankfurt_am_main%22/%3E + tm:instanceOf<tm:topicRef href="#metropolis"/></tm:instanceOf> + tm:name + tm:type<tm:topicRef href="#region-name"/></tm:type> + tm:valueFrankfurt am Main</tm:value> + </tm:name> + tm:occurrence + tm:type<tm:topicRef href="#region-population"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedLong%22%3E659021</tm:resourceData> + </tm:occurrence> + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#located-in"/></tm:type> + tm:role + tm:type<tm:topicRef href="#container"/></tm:type> + <tm:topicRef href="#germany"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#containee"/></tm:type> + <tm:topicRef href="#frankfurt_am_main"/> + </tm:role> + </tm:association> + + <tm:topic id="marbach_am_neckar"> + <tm:subjectIdentifier href="http://some.where/psis/city/marbach_am_neckar%22/%3E + tm:instanceOf<tm:topicRef href="#city"/></tm:instanceOf> + tm:name + tm:type<tm:topicRef href="#region-name"/></tm:type> + tm:valueMarbach am Neckar</tm:value> + </tm:name> + tm:occurrence + tm:type<tm:topicRef href="#region-population"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedLong%22%3E15601</tm:resourceData> + </tm:occurrence> + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#located-in"/></tm:type> + tm:role + tm:type<tm:topicRef href="#container"/></tm:type> + <tm:topicRef href="#germany"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#containee"/></tm:type> + <tm:topicRef href="#marbach_am_neckar"/> + </tm:role> + </tm:association> + + <tm:topic id="lubowitz"> + <tm:subjectIdentifier href="http://some.where/psis/city/lubowitz%22/%3E + tm:instanceOf<tm:topicRef href="#city"/></tm:instanceOf> + tm:name + tm:type<tm:topicRef href="#region-name"/></tm:type> + tm:valueLubowitz</tm:value> + </tm:name> + tm:occurrence + tm:type<tm:topicRef href="#region-population"/></tm:type> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedLong%22%3E365</tm:resourceData> + </tm:occurrence> + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#located-in"/></tm:type> + tm:role + tm:type<tm:topicRef href="#container"/></tm:type> + <tm:topicRef href="#poland"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#containee"/></tm:type> + <tm:topicRef href="#lubowitz"/> + </tm:role> + </tm:association> + + <tm:topic id="eichendorff"> + <tm:subjectIdentifier href="http://some.where/psis/author/eichendorff%22/%3E + tm:instanceOf<tm:topicRef href="#author"/></tm:instanceOf> + tm:name + tm:type<tm:topicRef href="#first-name"/></tm:type> + tm:valueJoseph Karl Benedikt</tm:value> + </tm:name> + tm:name + tm:type<tm:topicRef href="#last-name"/></tm:type> + tm:valuevon Eichendorff</tm:value> + </tm:name> + </tm:topic> + <tm:topic id="goethe"> <tm:subjectIdentifier href="http://some.where/psis/author/goethe%22/%3E <!-- must have a psi of this form --> <tm:subjectIdentifier href="http://some.where/psis/persons/goethe%22/%3E <!-- can own psis of any form --> @@ -1627,6 +2767,18 @@ </tm:occurrence> </tm:topic>
+ tm:association + tm:type<tm:topicRef href="#born-in"/></tm:type> + tm:role + tm:type<tm:topicRef href="#place"/></tm:type> + <tm:topicRef href="#frankfurt_am_main"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#writer"/></tm:type> + <tm:topicRef href="#goethe"/> + </tm:role> + </tm:association> + <tm:topic id="schiller"> <tm:subjectIdentifier href="http://some.where/psis/author/schiller%22/%3E <!-- must have a psi of this form --> tm:instanceOf<tm:topicRef href="#author"/></tm:instanceOf> <!-- must be an instanceOf author --> @@ -1644,15 +2796,23 @@ </tm:occurrence> </tm:topic>
+ tm:association + tm:type<tm:topicRef href="#born-in"/></tm:type> + tm:role + tm:type<tm:topicRef href="#place"/></tm:type> + <tm:topicRef href="#marbach_am_neckar"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#writer"/></tm:type> + <tm:topicRef href="#schiller"/> + </tm:role> + </tm:association> + <tm:topic id="zauberlehrling"> <tm:subjectIdentifier href="http://some.where/psis/poem/zauberlehrling%22/%3E <!-- must have a psi of this form --> <tm:subjectIdentifier href="http://some.where/psis/der_zauberlehrling%22/%3E <!-- can own psis of any form --> tm:instanceOf - <tm:topicRef href="#poem"/><!-- - <tm:topicRef href="#author"/> - <tm:topicRef href="#zauberlehrling"/> - <tm:topicRef href="#topictype-constraint"/>--> - </tm:instanceOf> <!-- must be an instanceOf poem --> + <tm:topicRef href="#poem"/></tm:instanceOf> <!-- must be an instanceOf poem --> tm:name tm:type<tm:topicRef href="#title"/></tm:type> <!-- must have a name of the type title --> tm:valueDer Zauberlehrling</tm:value> @@ -1826,10 +2986,6 @@ </tm:occurrence> </tm:topic>
- <!-- some assocaitions between goethe and some of his poems, - currently there are no associations between the topic schiller - and any other topic, because there are no topic representing - a poem of schiller --> tm:association tm:type<tm:topicRef href="#written-by"/></tm:type> tm:role @@ -1854,4 +3010,187 @@ </tm:role> </tm:association>
+ <tm:topic id="resignation"> + <tm:subjectIdentifier href="http://some.where/psis/poem/resignation%22/%3E <!-- must have a psi of this form --> + tm:instanceOf<tm:topicRef href="#poem"/></tm:instanceOf> <!-- must be an instanceOf poem --> + tm:name + tm:type<tm:topicRef href="#title"/></tm:type> <!-- must have a name of the type title --> + tm:valueResignation - Eine Phantasie</tm:value> + </tm:name> + tm:occurrence + tm:type<tm:topicRef href="#poem-content"/></tm:type> <!-- must have an occurrence of the type poem-content with the scope de or en --> + tm:scope<tm:topicRef href="#de"/></tm:scope> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3EAuch ich war in Arkadien geboren, +Auch mir hat die Natur +An meiner Wiege Freude zugeschworen, +Auch ich war in Arkadien geboren, +Doch Tränen gab der kurze Lenz mir nur. + +Des Lebens Mai blüht einmal und nicht wieder, +Mir hat er abgeblüht. +Der stille Gott - o weinet, meine Brüder - +Der stille Gott taucht meine Fackel nieder, +Und die Erscheinung flieht. + +Da steh ich schon auf deiner Schauerbrücke, +Ehrwürdge Geistermutter - Ewigkeit. +Empfange meinen Vollmachtbrief zum Glücke, +Ich bring ihn unerbrochen dir zurücke, +Mein Lauf ist aus. Ich weiß von keiner Seligkeit. + +Vor deinem Thron erheb ich meine Klage, +Verhüllte Richterin. +Auf jenem Stern ging eine frohe Sage, +Du thronest hier mit des Gerichtes Waage +Und nennest dich Vergelterin. + +Hier - spricht man - warten Schrecken auf den Bösen, +Und Freuden auf den Redlichen. +Des Herzens Krümmen werdest du entblößen, +Der Vorsicht Rätsel werdest du mir lösen +Und Rechnung halten mit dem Leidenden. + +Hier öffne sich die Heimat dem Verbannten, +Hier endige des Dulders Dornenbahn. +Ein Götterkind, das sie mir Wahrheit nannten, +Die meisten flohen, wenige nur kannten, +Hielt meines Lebens raschen Zügel an. + +»Ich zahle dir in einem andern Leben, +Gib deine Jugend mir! +Nichts kann ich dir als diese Weisung geben.« +Ich nahm die Weisung auf das andre Leben, +Und meiner Jugend Freuden gab ich ihr. + +»Gib mir das Weib, so teuer deinem Herzen, +Gib deine Laura mir. +Jenseits der Gräber wuchern deine Schmerzen.« - +Ich riß sie blutend aus dem wunden Herzen +Und weinte laut und gab sie ihr. + +»Du siehst die Zeit nach jenen Ufern fliegen, +Die blühende Natur +Bleibt hinter ihr - ein welker Leichnam - liegen. +Wenn Erd und Himmel trümmernd auseinanderfliegen, +Daran erkenne den erfüllten Schwur.« + +»Die Schuldverschreibung lautet an die Toten«, +Hohnlächelte die Welt, +»Die Lügnerin, gedungen von Despoten, +Hat für die Wahrheit Schatten dir geboten, +Du bist nicht mehr, wenn dieser Schein verfällt.« + +Frech witzelte das Schlangenheer der Spötter: +»Vor einem Wahn, den nur Verjährung weiht, +Erzitterst du? Was sollen deine Götter, +Des kranken Weltplans schlau erdachte Retter, +Die Menschenwitz des Menschen Notdurft leiht? + +Ein Gaukelspiel, ohnmächtigen Gewürmen +Vom Mächtigen gegönnt, +Schreckfeuer, angesteckt auf hohen Türmen, +Die Phantasie des Träumers zu bestürmen, +Wo des Gesetzes Fackel dunkel brennt. + +Was heißt die Zukunft, die uns Gräber decken? +Die Ewigkeit, mit der du eitel prangst? +Ehrwürdig nur, weil schlaue Hüllen sie verstecken, +Der Riesenschatten unsrer eignen Schrecken +Im hohlen Spiegel der Gewissensangst; + +Ein Lügenbild lebendiger Gestalten, +Die Mumie der Zeit, +Vom Balsamgeist der Hoffnung in den kalten +Behausungen des Grabes hingehalten, +Das nennt dein Fieberwahn - Unsterblichkeit? + +Für Hoffnungen - Verwesung straft sie Lügen - +Gabst du gewisse Güter hin? +Sechstausend Jahre hat der Tod geschwiegen, +Kam je ein Leichnam aus der Gruft gestiegen, +Der Meldung tat von der Vergelterin?" - + +Ich sah die Zeit nach deinen Ufern fliegen, +Die blühende Natur +Blieb hinter ihr, ein welker Leichnam, liegen, +Kein Toter kam aus seiner Gruft gestiegen, +Und fest vertraut ich auf den Götterschwur. + +All meine Freuden hab ich dir geschlachtet, +Jetzt werf ich mich vor deinen Richterthron. +Der Menge Spott hab ich beherzt verachtet, +Nur deine Güter hab ich groß geachtet, +Vergelterin, ich fodre meinen Lohn. + +"Mit gleicher Liebe lieb ich meine Kinder!" +Rief unsichtbar ein Genius. +"Zwei Blumen", rief er, "- hört es, Menschenkinder - +Zwei Blumen blühen für den weisen Finder, +Sie heißen Hoffnung und Genuß. + +Wer dieser Blumen eine brach, begehre +Die andre Schwester nicht. +Genieße, wer nicht glauben kann. Die Lehre +Ist ewig wie die Welt. Wer glauben kann, entbehre. +Die Weltgeschichte ist das Weltgericht. + +Du hast gehofft, dein Lohn ist abgetragen, +Dein Glaube war dein zugewognes Glück. +Du konntest deine Weisen fragen, +Was man von der Minute ausgeschlagen, +Gibt keine Ewigkeit zurück."</tm:resourceData> + </tm:occurrence> + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#written-by"/></tm:type> + tm:role + tm:type<tm:topicRef href="#writer"/></tm:type> + <tm:topicRef href="#schiller"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#written"/></tm:type> + <tm:topicRef href="#resignation"/> + </tm:role> + </tm:association> + + <tm:topic id="mondnacht"> + <tm:subjectIdentifier href="http://some.where/psis/poem/mondnacht%22/%3E <!-- must have a psi of this form --> + tm:instanceOf<tm:topicRef href="#poem"/></tm:instanceOf> <!-- must be an instanceOf poem --> + tm:name + tm:type<tm:topicRef href="#title"/></tm:type> <!-- must have a name of the type title --> + tm:valueMondnacht</tm:value> + </tm:name> + tm:occurrence + tm:type<tm:topicRef href="#poem-content"/></tm:type> <!-- must have an occurrence of the type poem-content with the scope de or en --> + tm:scope<tm:topicRef href="#de"/></tm:scope> + <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string%22%3EEs war, als hätt' der Himmel +Die Erde still geküsst, +Dass sie im Blütenschimmer +Von ihm nun träumen müsst'. + +Die Luft ging durch die Felder, +Die Ähren wogten sacht, +Es rauschten leis' die Wälder, +So sternklar war die Nacht. + +Und meine Seele spannte +Weit ihre Flügel aus, +Flog durch die stillen Lande, +Als flöge sie nach Haus.</tm:resourceData> + </tm:occurrence> + </tm:topic> + + tm:association + tm:type<tm:topicRef href="#written-by"/></tm:type> + tm:role + tm:type<tm:topicRef href="#writer"/></tm:type> + <tm:topicRef href="#eichendorff"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#written"/></tm:type> + <tm:topicRef href="#mondnacht"/> + </tm:role> + </tm:association> + </tm:topicMap>