Author: lgiessmann Date: Sun May 31 09:08:00 2009 New Revision: 32
Log: some fixes in the json-tmcl module and the json-data-model, some new developments in the ajax module
Added: trunk/docs/JSON_model.pdf (contents, props changed) Modified: trunk/docs/xtm_json.txt trunk/src/ajax/javascripts/constants.js trunk/src/ajax/javascripts/create.js trunk/src/ajax/javascripts/datamodel.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 trunk/src/xml/setup.lisp
Added: trunk/docs/JSON_model.pdf ============================================================================== Binary file. No diff available.
Modified: trunk/docs/xtm_json.txt ============================================================================== --- trunk/docs/xtm_json.txt (original) +++ trunk/docs/xtm_json.txt Sun May 31 09:08:00 2009 @@ -1,4 +1,4 @@ -//+----------------------------------------------------------------------------- +//+----------------------------------------------------------------------------- //+ Overview: //+ *Part 1: XTM - data model //+ *Part 2: Object summaries @@ -6,8 +6,6 @@ //+-----------------------------------------------------------------------------
- - //+----------------------------------------------------------------------------- //+ Part 1: XTM - data model: //+ The first part describes the xtm's data model, here will be all elements @@ -112,7 +110,6 @@ "roles" : [ { <role> }, { <...> } ] }
- //+----------------------------------------------------------------------------- //+ topicStub //+----------------------------------------------------------------------------- @@ -173,7 +170,6 @@ }
- //+----------------------------------------------------------------------------- //+ Part 3: TMCL - data model //+ This part explains how the tmcl-rules/suggestions of isidorus are @@ -198,13 +194,13 @@ //+ constraint, a cardMin member with the minimum cardinality of //+ the referenced element which is represented as an unsignedInt //+ and a cardMax member which describes the maximum cardinality of this -//+ element, this member contains an unsigendInt or the string +//+ element, this member contains an unsignedInt or the string //+ "MAX_INT". //+----------------------------------------------------------------------------- { "regexp" : "regular expression", "cardMin" : "unsigned integer in string representation", - "cardMax" : "unsigend integer in string representation or the string MAX_INT" + "cardMax" : "unsigned integer in string representation or the string MAX_INT" }
@@ -214,7 +210,7 @@ //+ subjectIdentifier, a cardMin member with the minimum cardinality of //+ this subjectIdentifier in a topic which is represented as an unsignedInt //+ and a cardMax member which describes the maximum cardinality of this -//+ subjectIdentifier, this member contains an unsigendInt or the string +//+ subjectIdentifier, this member contains an unsignedInt or the string //+ "MAX_INT". //+----------------------------------------------------------------------------- <simpleConstraint> @@ -226,7 +222,7 @@ //+ subjectLocator, a cardMin member with the minimum cardinality of //+ this subjectLocator in a topic which is represented as an unsignedInt //+ and a cardMax member which describes the maximum cardinality of this -//+ subjectLocator, this member contains an unsigendInt or the string +//+ subjectLocator, this member contains an unsignedInt or the string //+ "MAX_INT". //+----------------------------------------------------------------------------- <simpleConstraint> @@ -246,7 +242,7 @@ { "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" + "cardMax" : "unsigned integer in string representation or the string MAX_INT" }
@@ -254,13 +250,20 @@ //+ topicNameConstraint //+ nametypescope constains the original nametype and all valid subtypes //+ with the specific scope constraints. -//+ constriants contains the constraints for the owner topic. +//+ constraints contains the constraints for the owner topic. +//+ Note scopeConstraints is a list, because, the can be more scope +//+ constriants, e.g. one constraints wants 2 scopes of the type "en", and +//+ "de", and another, wants 3 scopes of the type "fr", "pl" and "sp". //+----------------------------------------------------------------------------- { "nametypescopes" : [ { "nameType" : [psi-1, psi-2, "..." ], "scopeConstraints" : [ <scopeConstraints> ] }, + { + "nameType" : [subtype-1-psi-1, subtype-1-psi-2, "..." ], + "scopeConstraints" : [ <scopeConstraints> ] + }, <...> ] "constraints" : [ <simpleConstraint>, < ... > ] @@ -299,10 +302,15 @@ "scopeConstraints" : [ <scopeConstraints> ], "datatypeConstraint" : "datatype" }, + { + "occurrenceType" : [ "subtype-1-psi-1", "subtype-1-psi-2", "..." ], + "scopeConstraints" : [ <scopeConstraints> ], + "datatypeConstraint" : "datatype" + }, <...> ], "constraints" : [ <simpleConstraints>, <...>], - "uniqueConstraint" : [ <uniqueConstraints>, <...> ] + "uniqueConstraints" : [ <uniqueConstraints>, <...> ] }
@@ -316,7 +324,7 @@ { "roleType" : [ [ "topic-psi-1", "topic-psi-2", "..." ], ["subtype-1-psi-1", "..."], <...> ], "cardMin" : "unsigned integer in string representation", - "cardMax" : "unsigend integer in string representation or the string MAX_INT" + "cardMax" : "unsigned integer in string representation or the string MAX_INT" }
@@ -335,7 +343,7 @@ "players" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "topic-2-psi-1", "..."], <...> ] "roleTypes" : [ [ "topic-psi-1", "topic-psi-2", "..." ], [ "subtype-psi-1", "..." ], <...> ], "cardMin" : "unsigned integer in string representation", - "cardMax" : "unsigend integer in string representation or the string MAX_INT" + "cardMax" : "unsigned integer in string representation or the string MAX_INT" }
@@ -353,7 +361,7 @@ "otherRoleType" : [ "topic-psi-1", "topic-psi-2", "..." ], "otherPlayerType" : [ "topic-psi-1", "topic-psi-2", "..." ], "cardMin" : "unsigned integer in string representation", - "cardMax" : "unsigend integer in string representation or the string MAX_INT" + "cardMax" : "unsigned integer in string representation or the string MAX_INT" }
@@ -368,6 +376,7 @@ //+ associationTypeScopes contains all available scopes for this association. //+----------------------------------------------------------------------------- { + "associationType" : [ "topic-psi-1", "topic-psi-2" ], "associationRoleConstraints" : [ <associationRoleConstraint>, <...> ], "rolePlayerConstraints" : [ <rolePlayerConstraints>, <...> ], "otherRoleConstraints" : [ <otherRoleConstraint>, <...> ], @@ -378,6 +387,8 @@ //+----------------------------------------------------------------------------- //+ topicConstraint //+ The topicConstraint contains the members: +//+ *exclusiveInstances which contains a topic-list of topic-psis depending +//+ on the users exclusive-instance-constraints //+ *subjectIdentifierConstraints which defines the subjectIdentifiers //+ *subjectLocatorConstraints which defines the subjectLocators //+ *topicNameConstraints which defines the topic names @@ -398,9 +409,7 @@ //+----------------------------------------------------------------------------- //+ fragmentConstraint //+ This JSON-Object contains all constraints necessary for an entire -//+ fragment but not the exclusive-instance-constraint. -//+ The exclusive-instance-constraint should be sent before a -//+ fragmentConstraint separately. +//+ fragment. //+ topicConstraint contains an object with all constraints of all baseTypes //+ of the mainTopic. //+ associationConstraints contains a list of all association constraints
Modified: trunk/src/ajax/javascripts/constants.js ============================================================================== --- trunk/src/ajax/javascripts/constants.js (original) +++ trunk/src/ajax/javascripts/constants.js Sun May 31 09:08:00 2009 @@ -59,10 +59,18 @@ "__trShowHiddenRows__" : "showHiddenRows", "__trTypeFrame__" : "typeFrame", "__divScopeFrame__" : "scopeFrame", + "__divScopeContainer__" : "scopeContainer", "__divValueFrame__" : "valueFrame", "__divVariantFrame__" : "variantFrame", "__divVariantContainer__" : "variantContainer", "__divDatatypeFrame__" : "datatypeFrame", + "__divOccurrenceContainer__" : "occurrenceContainer", + "__divOccurrenceFrame__" : "occurrenceFrame", + "__divAssociationContainer__" : "associationContainer", + "__divAssociationFrame__" : "associationFrame", + "__divRoleContainer__" : "roleContainer", + "__divRoleFrame__" : "roleFrame", + "__divPlayerFrame__" : "playerFrame",
"page" : function(){ return this.__divPage__; }, "subPage" : function(){ return this.__divSubPage__; }, @@ -88,8 +96,16 @@ "showHiddenRows" : function(){ return this.__trShowHiddenRows__; }, "typeFrame" : function(){ return this.__trTypeFrame__; }, "scopeFrame" : function(){ return this.__divScopeFrame__; }, + "scopeContainer" : function(){ return this.__divScopeContainer__; }, "valueFrame" : function(){ return this.__divValueFrame__; }, "variantFrame" : function(){ return this.__divVariantFrame__; }, "variantContainer" : function(){ return this.__divVariantContainer__; }, - "datatypeFrame" : function(){ return this.__divDatatypeFrame__; } + "datatypeFrame" : function(){ return this.__divDatatypeFrame__; }, + "occurrenceContainer" : function(){ return this.__divOccurrenceContainer__; }, + "occurrenceFrame" : function(){ return this.__divOccurrenceFrame__; }, + "associationContainer" : function(){ return this.__divAssociationContainer__; }, + "associationFrame" : function(){ return this.__divAssociationFrame__; }, + "roleContainer" : function(){ return this.__divRoleContainer__; }, + "roleFrame" : function(){ return this.__divRoleFrame__; }, + "playerFrame" : function(){ return this.__divPlayerFrame__; } }; \ No newline at end of file
Modified: trunk/src/ajax/javascripts/create.js ============================================================================== --- trunk/src/ajax/javascripts/create.js (original) +++ trunk/src/ajax/javascripts/create.js Sun May 31 09:08:00 2009 @@ -31,8 +31,18 @@ items[i].remove(); }
+ items = $$("li." + CLASSES.associationContainer()); + 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())}); + var liT = new Element("li", {"class" : CLASSES.topicFrame()}).update(topic.getFrame()); + context.insert({"after" : liT}); + + var associations = new AssociationContainerC(null, (constraints ? constraints.associationsConstraints : null)); + var liA = new Element("li", {"class" : CLASSES.associationContainer()}).update(associations.getFrame()); + liT.insert({"after" : liA}); }
function onSuccessHandler(xhr){
Modified: trunk/src/ajax/javascripts/datamodel.js ============================================================================== --- trunk/src/ajax/javascripts/datamodel.js (original) +++ trunk/src/ajax/javascripts/datamodel.js Sun May 31 09:08:00 2009 @@ -182,6 +182,18 @@ }, "remove" : function(){ this.getFrame().remove(); + }, + "showRemoveButton" : function(){ + try{ this.__remove__.show(); } catch(err) {} + }, + "hideRemoveButton" : function(){ + try{ this.__remove__.hide(); } catch(err) {} + }, + "showAddButton" : function(){ + try{ this.__add__.show(); } catch(err) {} + }, + "hideAddButton" : function(){ + try{ this.__add__.hide(); } catch(err) {} }});
@@ -291,36 +303,37 @@
// --- 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()}); - } + $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); + else { + // TODO: check already existing contents and order them to the corresponding fields } - }, - "getContent" : function(unique, removeNull){ - var values = new Array(); + } + catch(err){ + alert("From IdentifierC(): " + err); + } + }, + "getContent" : function(unique, removeNull){ + var values = new Array(); + try{ 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; @@ -328,12 +341,20 @@ values.push(this.__containers__[i].__frames__[j].getContent().strip()); } } + } + catch(err){ return values; - }, - "isValid" : function(){ - // TODO: check the validity of this frame with the passed constraints and return a boolean value - return true; - }}); + } + return values; + }, + "toJSON" : function(unique, removeNull){ + var content = this.getContent(unique, removeNull); + return content.length === 0 ? "null" : content.toJSON(); + }, + "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! @@ -361,9 +382,18 @@ 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; - + if(max !== -1 && min > max)throw "From FrameC(): min must be > max(" + max + ") and > 0 but is " + min;
+ // --- creates an empty div element + if(max === 0){ + this.getFrame().update(""); + var div = new Element("div", {"class" : CLASSES.selectrowWithoutRemoveButton()}); + div.insert({"top" : select}); + this.getFrame().insert({"bottom" : div}); + return; + } + + // --- creates an array with all available psis var options = new Array(); for(var i = 0; i != contents.length; ++i){ var topicPsis = new Array(); @@ -378,7 +408,7 @@ function checkValues(myself){ var rows = myself.getFrame().select("div"); var selectedItems = new Array(); - // --- collects all old selected values and removes the option elements + // --- collects all old selected values and removes the 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); @@ -410,6 +440,23 @@ values = cleanedValues; }
+ // --- if there is an empty value "" (if cardMin == 0), this value should be the last + // --- in the array (only when there is another value selected) + for(var h = 0; h != rows.length; ++h){ + var select = rows[h].select("select")[0].value; + if(select !== ""){ + for(var i = 0; i != values.length; ++i){ + for(var j = 0; j != values[i].length; ++j){ + if(values[i][j].length === 0){ + values[i] = values[values.length - 1]; + values[values.length - 1] = new Array(""); + } + } + } + break; + } + } + // --- fills all empty select elements for(var i = 0; i != rows.length; ++i){ var select = rows[i].select("select")[0]; @@ -506,17 +553,98 @@ addHandlers(this); } }, + "isUsed" : function(){ + return this.getContent(true, true).length !== 0; + }, "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 + try{ + var rows = this.getFrame().select("div"); + for(var i = 0; i != rows.length; ++i){ + var select = rows[i].select("select")[0].value; + if(unique === true && values.indexOf(select) !== -1) continue; + if(removeNull === true && select.length === 0) continue; + values.push(select); + } + } + catch(err){ + return new Array(); } return values; - } - }); + }}); + + + +// --- Contains all scope frames of an element (there can be more than one scope constraint) +var ScopeContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.scopeContainer()}); + this.__container__ = new Array(); + this.resetValues(contents, constraints); + }, + "resetValues" : function(contents, constraints){ + try{ + for(var i = 0; i != this.__container__.length; ++i){ + this.__container__[i].remove(); + } + this.__container__ = new Array(); + } + catch(err){ + this.__container__ = new Array(); + }
+ // --- sets contents corresponding to the passed constraints + if(constraints && constraints.length){ + for(var i = 0; i != constraints.length; ++i){ + var scopeTypes = constraints[i].scopeTypes; + var min = parseInt(constraints[i].cardMin); + var max = constraints[i].cardMax !== "MAX_INT" ? parseInt(constraints[i].cardMax) : "*"; + + // TODO: check and adds contents to the types + + // --- if min === 0 && there is no content, adds an empty option + if(min === 0){ // TODO: check contents of this type + scopeTypes.unshift(new Array(new Array(""))); // [[""]] + } + this.__container__.push(new ScopeC(scopeTypes, min === 0 ? 1 : min, max === "*" ? -1 : max)); + this.__error__.insert({"before" : this.__container__[this.__container__.length - 1].getFrame()}); + } + } + else { + this.getFrame().insert({"top" : new Element("div", {"class" : CLASSES.selectrowWithoutRemoveButton()})}); + } + }, + "isUsed" : function(){ + for(var i = 0; i != this.__container__.length; ++i){ + if(this.__container__[i].isUsed() === true) return true; + } + return false; + }, + "isValid" : function(){ + for(var i = 0; i != this.__container__.length; ++i){ + if(this.__container__[i].isUsed() === true) return true; + } + return false; + }, + "getContent" : function(){ + var values = new Array(); + try{ + for(var i = 0; i != this.__container__.length; ++i){ + var cValues = this.__container__[i].getContent(true, true); + for(var j = 0; j != cValues.length; ++j){ + if(values.indexOf(cValues[j]) !== -1) continue; + values.push(cValues[j]); + } + } + }catch(err){ + return new Array(); + } + return values; + }, + "toJSON" : function(){ + if(this.getContent().length === 0) return "null"; + return this.getContent().toJSON(); + }});
// --- Representation of a variant element @@ -539,27 +667,10 @@ // --- 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__)}); + this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", new Element("div"))}); - // --- 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())}); + // --- resource value and datatype + makeResource(this, contents, null, null, null); // --- minimize this.minimize(); @@ -633,8 +744,7 @@ if(i === 0) trs[i].show(); else trs[i].hide(); } - } - }); + }});
// --- contains all variants of a name element @@ -708,10 +818,10 @@ // --- type var types = new Array(); for(var i = 0; nametypescopes && i !== nametypescopes.length; ++i){ - for(j = 0; j != nametypescopes[i].nameType.length; ++j){ + for(var 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]; + var selected = nametypescopes[i].nameType[j]; types[types.length - 1] = types[0]; types[0] = selected; } @@ -722,29 +832,16 @@ 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}); - } - + this.__scope__ = new ScopeContainerC(contents && contents.scopes ? scopes : null, nametypescopes && nametypescopes[0].scopeConstraints ? nametypescopes[0].scopeConstraints : null); + this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())}); + onTypeChangeScope(this, contents ? contents.scopes : null, nametypescopes, "name"); + // --- 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); + var _min = parseInt(simpleConstraint.cardMin); + var _max = simpleConstraint.cardMax !== "MAX_INT" ? parseInt(simpleConstraint.cardMax) : "*"; + var cssTitleV = "min: " + _min + " max: " + _max + " regular expression: " + (simpleConstraint ? simpleConstraint.regexp : ".*"); + new TextrowC((contents ? contents.value : ""), (simpleConstraint ? simpleConstraint.regexp : ".*"), this.__value__, 1, 1, cssTitleV); this.__table__.insert({"bottom" : newRow(CLASSES.valueFrame(), "Value", this.__value__.__frames__[0].getFrame())}); // --- variants @@ -772,7 +869,7 @@ "getContent" : function(){ if(this.isUsed() === false) return null; return {"itemIdentities" : this.__itemIdentity__.getContent(true, true), - "scopes" : this.__scopes__.getContent(), + "scopes" : this.__scope__.getContent(), "value" : this.__value__.__frames__[0].getContent(), "variants" : this.__variants__.getContent()}; }, @@ -780,7 +877,7 @@ 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") + + "],"scopes":" + this.__scope__.toJSON() + ","value":" + this.__value__.__frames__[0].toJSON() + ","variants":" + this.__variants__.toJSON() + "}"; }, @@ -789,21 +886,16 @@ 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; + }, + "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(); + } }});
@@ -824,10 +916,11 @@ 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 title = "min: " + min + " max: " + max + " regular expression: " + 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()}); + if(min === 0)name.minimize(); } } } @@ -842,31 +935,41 @@ }, "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()); + try{ + 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; + } + catch(err){ + return values; } - 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() + ","; + try{ + 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; + } + catch(err){ + return "null"; } - 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 @@ -874,64 +977,208 @@ }});
+// --- represenation of an occurrence element +var OccurrenceC = Class.create(ContainerC, {"initialize" : function($super, contents, occurrenceTypes, constraint, uniqueConstraints, owner, min, max, cssTitle){ + $super(); + if(!owner.__frames__) owner.__frames__ = new Array(); + owner.__frames__.push(this); + this.__frame__.writeAttribute({"class" : CLASSES.occurrenceFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.occurrenceFrame()}); + this.__frame__.insert({"top" : this.__table__});
-var OccurrenceC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, owner, min, max, cssTitl){ - -}, + try{ + // --- control row + itemIdentity + makeControlRow(this, 5, contents ? contents.itemIdentities : null); + checkRemoveAddButtons(owner, 1, max); + setRemoveAddHandler(this, owner, 1, max, function(){ + return new OccurrenceC(null, occurrenceTypes, constraint, uniqueConstraints, owner, min, max, cssTitle); + }); + + // --- type + var types = new Array(); + for(var i = 0; occurrenceTypes && i !== occurrenceTypes.length; ++i){ + for(var j = 0; j != occurrenceTypes[i].occurrenceType.length; ++j){ + types.push(occurrenceTypes[i].occurrenceType[j]); + if(contents && contents.type && contents.type[0] === ooccurrenceTypes[i].occurrenceType[j]){ + var selected = occurrenceTypes[i].occurrenceType[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.__scope__ = new ScopeContainerC(contents && contents.scopes ? contents.scopes : null, occurrenceTypes && occurrenceTypes[0].scopeConstraints ? occurrenceTypes[0].scopeConstraints : null); + this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())}); + onTypeChangeScope(this, contents.scopes, occurrenceTypes, "occurrence"); + + // --- resource value and datatype + var _min = parseInt(constraint.cardMin); + var _max = constraint.cardMax !== "MAX_INT" ? parseInt(constraint.cardMax) : "*"; + var cssTitle = "min: " + _min + " max: " + _max + " regular expression: " + constraint.regexp; + makeResource(this, contents, constraint, (occurrenceTypes ? occurrenceTypes[0].datatypeConstraint : null), cssTitle); + } + catch(err){ + alert("From OccurrenceC(): " + err); + } + }, "getContent" : function(){ - // TODO: implement + if(this.isUsed() === true){ + var resourceRef = null; + var resourceData = null; + if(this.__datatype__.__frames__[0].getContent() === ANY_URI){ + resourceRef = this.__value__.value; + } + else { + resourceData = {"datatype" : this.__datatype__.__frames__[0].getContent(), + "value" : this.__value__.value}; + } + return {"itemIdentities" : this.__itemIdentity__.getContent(true, true), + "type" : [this.__type__.__frames__[0].getContent()], + "scopes" : this.__scope__.getContent(), + "resourceRef" : resourceRef, + "resourceData" : resourceData}; + } + else { + return null; + } }, "toJSON" : function(){ - // TODO: implement + if(this.isUsed() === true){ + var resourceRef = "null"; + var resourceData = "null"; + if(this.__datatype__.__frames__[0].getContent() === ANY_URI){ + resourceRef = this.__value__.value.toJSON(); + } + else { + resourceData = "{"datatype":" + this.__datatype__.__frames__[0].toJSON() + + ","value":" + this.__value__.value.toJSON() + "}"; + } + return "{"itemIdentities":" + this.__itemIdentity__.toJSON(true, true) + + ","type":[" + this.__type__.__frames__[0].toJSON() + + "],"scopes":" + this.__scope__.toJSON() + + ","resourceRef":" + resourceRef + + ","resourceData":" + resourceData + "}"; + } + else { + return "null"; + } }, "isUsed" : function(){ - // TODO: implement - }, - "showRemoveButton" : function(){ - this.__remove__.show(); - }, - "hideRemoveButton" : function(){ - this.__remove__.hide(); - }, - "showAddButton" : function(){ - this.__add__.show(); - }, - "hideAddButton" : function(){ - this.__add__.hide(); + return this.__itemIdentity__.getContent(true, true).length !== 0 || + this.__value__.value.strip().length !== 0; }, "isValid" : function(){ // TODO: check the content and the constraints return true; + }, + "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 occurrences of an topic element var OccurrenceContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints){ - -}, + $super(); + this.__containers__ = new Array(); + this.__frame__.writeAttribute({"class" : CLASSES.occurrenceContainer()}); + + 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: " + regexp; + var occurrence = new OccurrenceC("", constraints[i].occurrenceTypes, constraints[i].constraints[j], + constraints[i].uniqueConstraints, this.__containers__[i][j], + min === 0 ? 1 : min, max === "*" ? -1 : max, title); + this.__error__.insert({"before" : occurrence.getFrame()}); + if(min === 0)occurrence.minimize(); + } + } + } + } + else { + // TODO: check already existing contents and order them to the corresponding fields + } + } + catch(err){ + alert("From OccurrenceContainerC(): " + err); + } + }, "isValid" : function(){ // TODO: implement this method return true; }, "getContent" : function(){ - // TODO: implement this method + var values = new Array(); + try{ + 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; + } + catch(err){ + return values; + } }, - "toJSON" : function(){ - // TODO: implement this method + "toJSON" : function(){ + try{ + 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; + } + catch(err){ + return "null"; + } }});
- - - +// --- representation of a topic element. var TopicC = Class.create(ContainerC, {"initialize" : function($super, content, constraints){ $super(); + this.__minimized__ = false; 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.__caption__ = new Element("caption", {"class" : CLASSES.clickable()}).update("Topic"); this.__table__.insert({"top" : this.__caption__}); + + function setMinimizeHandler(myself){ + myself.__caption__.observe("click", function(event){ + myself.minimize(); + }); + } + setMinimizeHandler(this); // --- topic id this.__topicid__ = new Object(); @@ -960,32 +1207,328 @@ this.__name__ = new NameContainerC(_contents, _constraints); this.__table__.insert({"bottom" : newRow(CLASSES.nameContainer(), "Names", this.__name__.getFrame())}); - - - - + // --- occurrences + _contents = (content ? content.occurrences : null); + _constraints = (constraints ? constraints.topicOccurrenceConstraints : null); + this.__occurrence__ = new OccurrenceContainerC(_contents, _constraints); + this.__table__.insert({"bottom" : newRow(CLASSES.occurrenceContainer(), "Occurrences", this.__occurrence__.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}); + var btn = new Element("input", {"value" : "topic.toJSON()", "type" : "button"}); + function addBtnHandler(myself){ + btn.observe("click", function(event){ + alert(myself.toJSON()); + }) + } + addBtnHandler(this); + this.__frame__.insert({"bottom" : btn}); }catch(err){ alert("From TopciC(): " + err); } }, + "isValid" : function(){ + // TODO: implement + return true; + }, "getContent" : function(){ - return {"id" : this.__topicid__.__frames__[0].getContent }; - } - }); + try{ + return {"id" : this.__topicid__.__frames__[0].getContent().strip(), + "itemIdentities" : this.__itemIdentity__.getContent(true, true), + "subjectLocators" : this.__subjectLocator__.getContent(true, true), + "subjectIdentifiers" : this.__subjectIdentifier__.getContent(true, true), + "names" : this.__name__.getContent(), + "occurrences" : this.__occurrence__.getContent()}; + } + catch(err){ + return null; + } + }, + "toJSON" : function(){ + try{ + return "{"id":" + this.__topicid__.__frames__[0].getContent().strip().toJSON() + + ","itemIdentities":" + this.__itemIdentity__.toJSON(true, true) + + ","subjectLocators":" + this.__subjectLocator__.toJSON(true, true) + + ","subjectIdentifiers":" + this.__subjectIdentifier__.toJSON(true, true) + + ","names":" + this.__name__.toJSON() + + ","occurrences":" + this.__occurrence__.toJSON() + "}"; + } + catch(err){ + return "null"; + } + }, + "minimize" : function(){ + var rows = new Array(); + rows.push(this.getFrame().select("tr." + CLASSES.topicIdFrame())[0], + this.getFrame().select("tr." + CLASSES.itemIdentityFrame())[0], + this.getFrame().select("tr." + CLASSES.subjectLocatorFrame())[0], + this.getFrame().select("tr." + CLASSES.subjectIdentifierFrame())[0], + this.getFrame().select("tr." + CLASSES.nameContainer())[0], + this.getFrame().select("tr." + CLASSES.occurrenceContainer())[0]); + for(var i = 0; i != rows.length; ++i){ + if(this.__minimized__ === false) rows[i].hide(); + else rows[i].show(); + } + this.__minimized__ = !this.__minimized__; + }}); + + +// --- representation of a role element. +var RoleC = Class.create(ContainerC, {"initialize" : function($super, itemIdentities, roleTypes, rolePlayers, owner, min, max){ + $super(); + if(!owner.__frames__) owner.__frames__ = new Array(); + if(!roleTypes || roleTypes.length === 0) throw "From RoleC(): roleTypes must be set!"; + if(!rolePlayers || rolePlayers.length === 0) throw "From RoleC(): rolePalyers must be set"; + owner.__frames__.push(this); + this.__frame__.writeAttribute({"class" : CLASSES.roleFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.roleFrame()}); + this.__frame__.insert({"top" : this.__table__}); + this.__roleTypes__ = roleTypes; + this.__rolePlayers__ = rolePlayers; + + try{ + // --- control row + itemIdentity + makeControlRow(this, 3, itemIdentities); // make control row have to be changed to a separate control row for roles + checkRemoveAddButtons(owner, 1, max); + setRemoveAddHandler(this, owner, 1, max, function(){ + return new RoleC(null, roleTypes, rolePlayers, owner, min, max); + }); + + // --- type + var types = this.__roleTypes__.flatten(); + this.__type__ = new Object(); + var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame()); + this.__table__.insert({"bottom" : tr}); + + // --- player + var players = this.__rolePlayers__.flatten(); + this.__player__ = new Object(); + tr = newRow(CLASSES.playerFrame(), "Player", new SelectrowC(players, this.__player__, 1, 1).getFrame()); + this.__table__.insert({"bottom" : tr}); + } + catch(err){ + alert("From RoleC(): " + err); + } + }, + "getType" : function(){ + return this.__type__.__frames__[0].getContent(); + }, + "getPlayer" : function(){ + return this.__player__.__frames__[0].getContent(); + }, + "getContent" : function(){ + if(this.isUsed()){ + return {"itemIdentities" : this.__itemIdentity__.getContent(true, true), + "type" : new Array(this.getType()), + "topicRef" : new Array(this.getPlayer())}; + } + + return null; + }, + "toJSON" : function(){ + if(this.isUsed()){ + return "{"itemIdentities":" + this.__itemIdentity__.toJSON(true, true) + + ","type":[" + this.getType().toJSON() + "]" + + ","topicRef":[" + this.getPlayer().toJSON() + "]}"; + } + + return "null"; + }, + "isValid" : function(){ + return this.getType().length !== 0 && this.getPlayer().length !== 0; + }, + "isUsed" : function(){ + return this.getType().length !== 0 || this.getPlayer().length !== 0 || this.__itemIdentity__.getContent(true, true).length !== 0; + }}); + + +// --- contains all roles of an association +var RoleContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, roleConstraints, playerConstraints, otherRoleConstraints){ + $super(); + this.__frame__.writeAttribute({"class" : CLASSES.roleContainer()}); + this.__container__ = new Object(); + + try{ + if((!contents || contents.length === 0) && roleConstraints && playerConstraints){ + for(var i = 0; playerConstraints && i !== playerConstraints.length; ++i){ + //new RoleC(new Array("itemIdentity " + i), playerConstraints[i].roleTypes, playerConstraints[i].players, this.__container__, 1, 4); + //this.__error__.insert({"before" : this.__container__.__frames__[i].getFrame()}); + } + } + else { + // TODO: check already existing contents and order them to the corresponding fields + } + + + + } + catch(err){ + alert("From RoleContainerC(): " + err); + } + }, + "resetValues" : function(roleConstraints, playerConstraints, otherRoleConstraints){ + + // TODO: implement + }, + "getContent" : function(){ + // TODO: implement + }, + "toJSON" : function(){ + // TODO: implement + }, + "isValid" : function(){ + // TODO: implement + }, + "isUsed" : function(){ + // TODO: implement + }}); + + +// --- representation of an association element +var AssociationC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, owner){ + $super(); + if(!owner) throw "From NameC(): owner must be set but is null"; + if(!owner.__frames__) owner.__frames__ = new Array(); + owner.__frames__.push(this); + + this.__frame__.writeAttribute({"class" : CLASSES.associationFrame()}); + this.__table__ = new Element("table", {"class" : CLASSES.associationFrame()}); + this.__frame__.insert({"top" : this.__table__}); + this.__constraints__ = constraints; + this.__contents__ = contents; + + try{ + // --- control row + ItemIdentity + makeControlRow(this, 4, contents ? contents.itemIdentities : null); + checkRemoveAddButtons(owner, 1, -1); + setRemoveAddHandler(this, owner, 1, -1, function(){ + return new AssociationC(null, constraints, owner); + }); + + // --- type + var types = new Array(); + for(var i = 0; constraints && i !== constraints.length; ++i){ + for(var j = 0; j != constraints[i].associationType.length; ++j){ + types.push(constraints[i].associationType[j]); + if(contents && contents.type && contents.type[0] === constraints[i].associationType[j]){ + var selected = constraints[i].associationType[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.__scope__ = new ScopeContainerC(this.__contents__ && this.__contents__.scopes ? this.__contents__.scopes : null, this.__constraints__ && this.__constraints__[0].scopeConstraints ? this.__constraints__[0].scopeConstraints : null); + this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())}); + + // --- roles + var _roleConstraints = _playerConstraints = _otherRoleConstraints = null; + if(this.__constraints__){ + _roleConstraints = this.__constraints__[0].associationRoleConstraints; + _playerConstraints = this.__constraints__[0].rolePlayerConstraints; + _otherRoleConstraints = this.__constraints__[0].otherRoleConstraints; + } + + this.__roles__ = new RoleContainerC(this.__contents__ ? this.__contents__.roles : null, _roleConstraints, _playerConstraints, _otherRoleConstraints); + this.__table__.insert({"bottom" : newRow(CLASSES.roleContainer(), "Roles", this.__roles__.getFrame())}); + + // --- registers the onChangeHandler of the Type-selectrow + onTypeChangeScope(this, null, null, "association"); + } + catch(err){ + alert("From AssociationC(): " + err); + } + }, + "resetValues" : function(){ + // --- scope, depends only to the associationtype, roles can be ignored + // --- finds the scopes depending to the selected type + var foundIdx = -1; + for(var i = 0; this.__constraints__ && i != this.__constraints__.length; ++i) + { + if(foundIdx !== -1) break; + for(var j = 0; j != this.__constraints__[i].associationType.length; ++j){ + if(this.__type__.__frames__[0].getContent() === this.__constraints__[i].associationType[j]){ + foundIdx = i; + break; + } + } + } + this.__scope__.resetValues(null, (foundIdx === -1 ? null : this.__constraints__[foundIdx].scopeConstraints)); + + var _roleConstraints = _playerConstraints = _otherRoleConstraints = null; + if(foundIdx !== -1){ + _roleConstraints = this.__constraints__[foundIdx].associationRoleConstraints; + _playerConstraints = this.__constraints__[foundIdx].rolePlayerConstraints; + _otherRoleConstraints = this.__constraints__[foundIdx].otherRoleConstraints; + } + this.__roles__.resetValues(_roleConstraints, _playerConstraints, _otherRoleConstraints); + }, + "getContent" : function(){ + // TODO: implement + }, + "toJSON" : function(){ + // TODO: implement + }, + "isValid" : function(){ + // TODO: implement + }, + "isUsed" : function(){ + // TODO: implement + }}); + + +var AssociationContainerC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints){ + $super(); + this.__minimized__ = false; + try{ + this.__frame__ .writeAttribute({"class" : CLASSES.associationContainer()}); + this.__table__ = new Element("table", {"class" : CLASSES.associationContainer()}); + this.__frame__.insert({"top" : this.__table__}); + this.__caption__ = new Element("caption", {"class" : CLASSES.clickable()}).update("Associations"); + this.__table__.insert({"top" : this.__caption__}) + + this.__container__ = new Object(); + + for(var i = 0; contents && i != contents.length; ++i){ + var association = new AssociationC(contents[i], constraints, this.__container__); + var tr = new Element("tr", {"class" : CLASSES.associationFrame()}); + var td = new Element("td", {"class" : CLASSES.content()}); + td.update(association.getFrame()); + tr.update(td); + this.__table__.insert({"bottom" : tr}); + } + + if(!this.__container__.__frames__ && constraints && constraints.length !== 0){ + var association = new AssociationC(null, constraints, this.__container__); + var tr = new Element("tr", {"class" : CLASSES.associationFrame()}); + var td = new Element("td", {"class" : CLASSES.content()}); + td.update(association.getFrame()); + tr.update(td); + this.__table__.insert({"bottom" : tr}); + } + } + catch(err){ + alert("From AssociationContainerC(): " + err); + } + }, + "getContent" : function(){ + // TODO: implement + }, + "toJSON" : function(){ + // TODO: implement + }, + "isValid" : function(){ + // TODO: implement + }, + "minimize" : function(){ + // TODO: implement + }});
@@ -1155,4 +1698,101 @@ else trs[i].hide(); } }); +} + + +// --- This function adds a onchange handler to the type-selct-element +// --- of the instance passed through the variable myself. +// --- On changing there will be reset the scope frame to the corresponding +// --- type and when what is set to "occurrence" there will be set a corresponding +// --- datatype-value. +function onTypeChangeScope(myself, contents, constraints, what){ + try{ + var select = myself.__table__.select("tr." + CLASSES.typeFrame())[0].select("td." + CLASSES.content())[0].select("select")[0]; + select.observe("change", function(event){ + var type = event.element().value; + + var foundIdx = -1; + if(what === "name"){ + for(var i = 0; constraints && i !== constraints.length; ++i){ + if(foundIdx !== -1) break; + for(var j = 0; j !== constraints[i].nameType.length; ++j){ + if(foundIdx !== -1) break; + if(constraints[i].nameType[j] === type){ + foundIdx = i; + break; + } + } + } + myself.__scope__.resetValues(contents, (foundIdx === -1 ? null : constraints[foundIdx].scopeConstraints)); + } + else if(what === "occurrence"){ + for(var i = 0; constraints && i !== constraints.length; ++i){ + if(foundIdx !== -1) break; + for(var j = 0; j !== constraints[i].occurrenceType.length; ++j){ + if(foundIdx !== -1) break; + if(constraints[i].occurrenceType[j] === type){ + foundIdx = i; + break; + } + } + } + if(foundIdx !== -1 && constraints[foundIdx].datatypeConstraint){ + var dc = constraints[foundIdx].datatypeConstraint; + myself.__datatype__.__frames__[0].getFrame().select("input")[0].writeAttribute({"readonly" : "readonly", "value" : dc}); + } + else { + myself.__datatype__.__frames__[0].getFrame().select("input")[0].writeAttribute({"value" : ""}); + myself.__datatype__.__frames__[0].getFrame().select("input")[0].removeAttribute("readonly"); + } + myself.__scope__.resetValues(contents, (foundIdx === -1 ? null : constraints[foundIdx].scopeConstraints)); + } + else if(what === "variant"){ + // do nothing all values will be stored + } + else if(what === "association"){ + myself.resetValues(); + } + }); + } + catch(err){} +} + + +// --- sets the resource value and datatype of names and occurrences +function makeResource(myself, content, constraints, datatypeConstraint, cssTitle){ + var value = ""; + var datatype = ""; + if(content && content.resourceRef && content.resourceRef.length !== 0){ + value = content.resourceRef; + datatype = ANY_URI; + } + else if(content && content.resourceData){ + value = content.resourceData.value; + datatype = contents.resourceData.datatype; + } + + try{ + this.__value__.remove(); + this.__value__ = null; + }catch(err){} + try{ + this.__datatype__.__frames__[0].remove(); + this.__datytype__ = new Object(); + }catch(err){} + + myself.__value__ = new Element("textarea", {"rows" : 3}).update(value); + myself.__table__.insert({"bottom" : newRow(CLASSES.valueFrame(), "Resource Value", myself.__value__)}); + if(cssTitle && cssTitle.length !== 0) myself.__value__.writeAttribute({"title" : cssTitle}); + + // --- datatype + myself.__datatype__ = new Object(); + if(datatypeConstraint && datatypeConstraint.length !== 0){ + new TextrowC(datatypeConstraint, datatypeConstraint, myself.__datatype__, 1, 1, null); + myself.__datatype__.__frames__[0].getFrame().select("input")[0].writeAttribute({"readonly" : "readonly"}); + } + else { + new TextrowC(datatype, ".*", myself.__datatype__, 1, 1, null); + } + myself.__table__.insert({"bottom" : newRow(CLASSES.datatypeFrame(), "Datatype", myself.__datatype__.__frames__[0].getFrame())}); } \ 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 Sun May 31 09:08:00 2009 @@ -35,7 +35,7 @@ (let ((value (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? + (let ((available-associations ;what's with association which have only a associationrole-constraints? (remove-duplicates (loop for topic in topics append (get-available-associations-of-topic topic :treat-as treat-as))))) @@ -58,40 +58,6 @@ "{" 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))))))) -
;; ============================================================================= ;; --- all association constraints --------------------------------------------- @@ -101,7 +67,10 @@ passed associationtype-topic." (let ((constraint-topics (get-all-constraint-topics-of-association associationtype-topic))) - (let ((associationtypescope-constraints + (let ((associationtype + (concatenate 'string ""associationType":" + (json-exporter::identifiers-to-json-string associationtype-topic))) + (associationtypescope-constraints (let ((value (get-typescope-constraints associationtype-topic :what 'association))) (concatenate 'string ""scopeConstraints":" value))) (associationrole-constraints @@ -117,7 +86,7 @@ (get-otherrole-constraints (getf constraint-topics :otherrole-constraints)))) (concatenate 'string ""otherRoleConstraints":" value)))) (let ((json-string - (concatenate 'string "{" associationrole-constraints "," roleplayer-constraints "," + (concatenate 'string "{" associationtype "," associationrole-constraints "," roleplayer-constraints "," otherrole-constraints "," associationtypescope-constraints "}"))) json-string))))
@@ -217,6 +186,7 @@ (uri (first (psis (getf involved-topic-tupple :otherplayer)))) (uri (first (psis (getf involved-topic-tupple :otherrole)))) constraint-lists)) + (let ((json-player (concatenate 'string ""players":" (topics-to-json-list @@ -342,7 +312,9 @@ "Returns a list of the form ((:associationroletype <topic> :card-min <string> :card-max <string>), <...>) which describes all associationrole-constraints of the passed - constraint-topics." + constraint-topics. + If as-json is set to t the return value of this function is a json-string otherwise a + list of lists of the following form (:roletype <topic, topic, ...> :cardMin <min> :cardMax <max>)" (let ((applies-to (get-item-by-psi *applies-to-psi*)) (roletype-role (get-item-by-psi *roletype-role-psi*)) (constraint-role (get-item-by-psi *constraint-role-psi*)) @@ -366,6 +338,7 @@ associationroletype)) associationrole-constraints)))) (let ((cleaned-associationrole-constraints "[")) + ;(raw-constraints nil)) (loop for associationroletype-topic in associationroletype-topics do (let ((constraint-lists (remove-duplicate-constraints @@ -385,6 +358,7 @@ "{"roleType":" roletype-with-subtypes ","cardMin":" (getf (first constraint-lists) :card-min) ","cardMax":" (getf (first constraint-lists) :card-max) "},"))))) +
(if (string= cleaned-associationrole-constraints "[") (setf cleaned-associationrole-constraints "null") @@ -475,41 +449,6 @@ topicoccurrence-constraints "," abstract-constraint "}"))) json-string))))
-;(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: @@ -745,7 +684,7 @@ (error "found contrary occurrence-datatype-constraints: ~a~%" datatype-constraints)) (if datatype-constraint (json:encode-json-to-string (first datatype-constraint)) - nil))))) + "null")))))
(defun get-typescope-constraints(element-type-topic &key(what 'topicname))
Modified: trunk/src/json/json_tmcl_validation.lisp ============================================================================== --- trunk/src/json/json_tmcl_validation.lisp (original) +++ trunk/src/json/json_tmcl_validation.lisp Sun May 31 09:08:00 2009 @@ -241,7 +241,7 @@
(defun list-instances (topic-instance &optional (topictype (get-item-by-psi *topictype-psi*)) (topictype-constraint (get-item-by-psi *topictype-constraint-psi*))) - "Returns the topic-instance, all subtypes found by the function lis-subtypes and all direct + "Returns the topic-instance, all subtypes found by the function list-subtypes and all direct instances for the found subtypes." (let ((all-subtypes-of-this (getf (list-subtypes topic-instance topictype topictype-constraint) :subtypes)) @@ -262,10 +262,11 @@ (remove-duplicates (loop for subtype in all-instances-of-this append (getf (list-subtypes subtype nil nil) :subtypes)))))) - (remove-if #'null - (map 'list #'(lambda(x) - (handler-case (progn - (topictype-of-p x nil) - x) - (condition () nil))) - all-subtypes-of-all-instances)))))) \ No newline at end of file + (union all-instances-of-this + (remove-if #'null + (map 'list #'(lambda(x) + (handler-case (progn + (topictype-of-p x nil) + x) + (condition () nil))) + all-subtypes-of-all-instances))))))) \ No newline at end of file
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 Sun May 31 09:08:00 2009 @@ -12,7 +12,7 @@ (defparameter *json-get-prefix* "/json/get/(.+)$") ;the prefix to get a fragment by the psis -> localhost:8000/json/get/<fragment-psi> (defparameter *json-commit-url* "/json/commit/?$") ;the url to commit a json fragment by "put" or "post" (defparameter *json-get-all-psis* "/json/psis/?$") ;the url to get all topic psis of isidorus -> localhost:8000/json/psis -(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-summary-url* "/json/summary/?$") ;the url to get a summary of 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-url* "/json/tmcl/type/?$") ;the json url for getting some tmcl information of a topic treated as a type
Modified: trunk/src/unit_tests/poems.xtm ============================================================================== --- trunk/src/unit_tests/poems.xtm (original) +++ trunk/src/unit_tests/poems.xtm Sun May 31 09:08:00 2009 @@ -582,7 +582,7 @@ tm:instanceOf<tm:topicRef href="#occurrencetype"/></tm:instanceOf> </tm:topic>
- <!-- poem scopes --> + <!-- available scopes --> <tm:topic id="de"> <tm:subjectIdentifier href="http://some.where/base-psis/de%22/%3E tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> @@ -593,6 +593,26 @@ tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> </tm:topic>
+ <tm:topic id="fr"> + <tm:subjectIdentifier href="http://some.where/base-psis/fr%22/%3E + tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="fin"> + <tm:subjectIdentifier href="http://some.where/base-psis/fin%22/%3E + tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="rus"> + <tm:subjectIdentifier href="http://some.where/base-psis/rus%22/%3E + tm:instanceOf<tm:topicRef href="#scopetype"/></tm:instanceOf> + </tm:topic> + + <tm:topic id="pl"> + <tm:subjectIdentifier href="http://some.where/base-psis/pl%22/%3E + 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 @@ -1059,7 +1079,7 @@ </tm:occurrence> tm:occurrence tm:type<tm:topicRef href="#card-max"/></tm:type> - <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt%22%3E3</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="#regexp"/></tm:type> @@ -1262,8 +1282,9 @@ </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 + <!-- scope constraint 1: there must be either the scope en or de --> + <tm:topic id="scoped-country-name-constraint-1"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-country-name-constraint-1%22/%3E tm:instanceOf<tm:topicRef href="#nametypescope-constraint"/></tm:instanceOf> tm:occurrence tm:type<tm:topicRef href="#card-min"/></tm:type> @@ -1279,7 +1300,7 @@ 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:topicRef href="#scoped-country-name-constraint-1"/> </tm:role> tm:role tm:type<tm:topicRef href="#nametype-role"/></tm:type> @@ -1291,7 +1312,7 @@ 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:topicRef href="#scoped-country-name-constraint-1"/> </tm:role> tm:role tm:type<tm:topicRef href="#scopetype-role"/></tm:type> @@ -1303,14 +1324,111 @@ 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:topicRef href="#scoped-country-name-constraint-1"/> </tm:role> tm:role tm:type<tm:topicRef href="#scopetype-role"/></tm:type> <tm:topicRef href="#de"/> </tm:role> </tm:association> + + <!-- scope constraint 2: there can exist the scopes de, en, pl, fr, fin or rus --> + <tm:topic id="scoped-country-name-constraint-2"> + <tm:subjectIdentifier href="http://some.where/constraint-psis/scoped-country-name-constraint-2%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%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%3E6</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-2"/> + </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-2"/> + </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-2"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#pl"/> + </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-2"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#fr"/> + </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-2"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#fin"/> + </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-2"/> + </tm:role> + tm:role + tm:type<tm:topicRef href="#scopetype-role"/></tm:type> + <tm:topicRef href="#rus"/> + </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-2"/> + </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 ============================ -->
Modified: trunk/src/xml/setup.lisp ============================================================================== --- trunk/src/xml/setup.lisp (original) +++ trunk/src/xml/setup.lisp Sun May 31 09:08:00 2009 @@ -33,7 +33,10 @@ (if (eq xtm-format '2.0) (importer xtm-dom :tm-id tm-id :xtm-id xtm-id) (importer-xtm1.0 xtm-dom :tm-id tm-id :xtm-id xtm-id)) - (format t "#Topics in the store: ~a~%" (length (elephant:get-instances-by-class 'TopicC))))) + (format t "#Objects in the store: Topics: ~a, Associations: ~a~%" + (length (elephant:get-instances-by-class 'TopicC)) + (length (elephant:get-instances-by-class 'AssociationC))))) + ;(format t "#Topics in the store: ~a~%" (length (elephant:get-instances-by-class 'TopicC)))))
(defun setup-repository (xtm-path repository-path &key