Author: lgiessmann Date: Tue Jun 23 15:37:47 2009 New Revision: 60
Log: ajax-client: fixed a lot of bugs in scope/type-handling; now also scopes will be validated and if there exist some scopes in the requested fragment these scopes will be used as default; currently it is possible to use one scope twice - if there are more scope-constraints with an intersection of scope-topics - this should be fixed anytime
Modified: trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js ============================================================================== --- trunk/src/ajax/javascripts/datamodel.js (original) +++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 15:37:47 2009 @@ -930,6 +930,7 @@ this.__frame__.writeAttribute({"class" : CLASSES.scopeContainer()}); this.__container__ = new Array(); this.resetValues(contents, constraints); + this.__constraints__ = constraints; }, "resetValues" : function(contents, constraints){ try{ @@ -942,6 +943,8 @@ this.__container__ = new Array(); }
+ this.__constraints__ = constraints; + // --- sets contents corresponding to the passed constraints if(constraints && constraints.length){ var cContents = contents ? contents.clone() : null; @@ -1010,10 +1013,81 @@ return false; }, "isValid" : function(){ - for(var i = 0; i != this.__container__.length; ++i){ - if(this.__container__[i].isUsed() === true) return true; + var errorStr = ""; + var ret = true; + var allContent = this.getContent(); + if(!allContent) allContent = new Array(); + var allFoundContent = new Array(); + if(allContent) allContent = allContent.flatten(); + if((!this.__constraints__ || this.__constraints__length === 0) && allContent.length !== 0){ + this.showError("No constraints found for the existing scopes!"); + return false; } - return false; + for(var i = 0; this.__constraints__ && i !== this.__constraints__.length; ++i){ + var min = parseInt(this.__constraints__[i].cardMin); + var max = this.__constraints__[i].cardMax === MAX_INT ? MMAX_INT : parseInt(this.__constraints__[i].cardMax); + var scopes = this.__constraints__[i].scopeTypes; + if(scopes) scopes = scopes.flatten(); + else scopes = new Array(); + + // --- checks all available types for the current constraint + var currentFoundContent = new Array(); + for(var j = 0; j !== allContent.length; ++j){ + if(scopes.indexOf(allContent[j]) !== -1){ + currentFoundContent.push(allContent[j]); + allFoundContent.push(allContent[j]); + } + } + currentFoundContent = currentFoundContent.uniq(); + allFoundContent = allFoundContent.uniq(); + + // --- find topics for the found psis + var foundScopes = 0; + var _scopes = this.__constraints__[i].scopeTypes; + for(var j = 0; _scopes && j !== _scopes.length; ++j){ + for(var k = 0; k !== _scopes[j].length; ++k){ + for(var l = 0; l !== currentFoundContent.length; ++l){ + if(_scopes[j][k].indexOf(currentFoundContent[l]) !== -1){ + ++foundScopes; + break; + } + } + } + } + // --- checks card-min/card-max + var scStr = ""; + for(var j = 0; j !== scopes.length; ++j){ + if(scopes[j].length !== 0) scStr += "<br/> *" + scopes[j]; + } + + if(min > foundScopes){ + if(errorStr.length !== 0) errorStr += "<br/><br/>"; + errorStr += "card-min(" + min + ") of the scope-constraint with the available scopes" + scStr + "<br/>is not satisfied(" + foundScopes + ")!" + ret = false; + } + if(max !== MMAX_INT && max < foundScopes){ + if(errorStr.length !== 0) errorStr += "<br/><br/>"; + errorStr += "card-max(" + max + ") of the scope-constraint with the available scopes" + scStr + "<br/>is not satisfied(" + foundScopes + ")!" + ret = false; + } + } + + // --- removes all checked contents + for(var i = 0; i !== allFoundContent.length; ++i) allContent = allContent.without(allFoundContent[i]); + if(allContent && allContent.length !== 0){ + allContent = allContent.flatten(); + scStr = ""; + for(var j = 0; j !== allContent.length; ++j){ + if(allContent[j].length !== 0) scStr += "<br/> *" + allContent[j]; + } + if(errorStr.length !== 0) errorStr += "<br/><br/>"; + errorStr += "No constraint found for the scopes "" + scStr + ""!"; + ret = false; + } + + if(ret === true) this.hideError(); + else if(errorStr.length !== 0)this.showError(errorStr); + return ret; }, "getContent" : function(){ var values = new Array(); @@ -1022,16 +1096,19 @@ 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]); + values.push(cValues[j][0]); } } }catch(err){ return new Array(); } + if(values.length === 0) return null; + values = values.uniq(); + for(var i = 0; i !== values.length; ++i) values[i] = new Array(values[i]); return values; }, "toJSON" : function(){ - if(this.getContent().length === 0) return "null"; + if(!this.getContent() || this.getContent().length === 0) return "null"; return this.getContent().toJSON(); }, "disable" : function(){ @@ -1356,7 +1433,11 @@ if(valueValid === false) this.showError("The name-value "" + this.__value__.__frames__[0].getContent() + "" doesn't matches the constraint "" + this.__value__.__frames__[0].getRegexp() + ""!"); else this.hideError(); var variantsValid = this.__variants__.isValid(); - return valueValid && variantsValid; + var scopeValid = this.scopeIsValid(); + return valueValid && variantsValid && scopeValid; + }, + "scopeIsValid" : function(){ + return this.__scope__.isValid(); }, "minimize" : function(){ var trs = this.__table__.select("tr"); @@ -1537,6 +1618,7 @@ for(var j = 0; j !== this.__containers__[i].length; ++j){ for(var k = 0; k !== this.__containers__[i][j].__frames__.length; ++k){ this.__containers__[i][j].__frames__[k].hideError(); + if(this.__containers__[i][j].__frames__[k].scopeIsValid() === false) ret = false; if(this.__containers__[i][j].__frames__[k].isUsed() === true && this.__containers__[i][j].__frames__[k].isEmpty() === false){ allNames.push(this.__containers__[i][j].__frames__[k]); } @@ -1730,7 +1812,11 @@ var regexp = new RegExp(this.__constraint__.regexp); // TODO: validate the data via the given datatype // TODO: validate the uniqeuoccurrence-constraint - return regexp.match(this.__value__.value); + var scopeValid = this.scopeIsValid(); + return regexp.match(this.__value__.value) && scopeValid; + }, + "scopeIsValid" : function(){ + return this.__scope__.isValid(); }, "minimize" : function(){ var trs = this.__table__.select("tr"); @@ -1887,6 +1973,7 @@ allOccurrences.push(this.__containers__[i][j].__frames__[k]); } this.__containers__[i][j].__frames__[k].hideError(); + if(this.__containers__[i][j].__frames__[k].scopeIsValid() === false) ret = false; } } } @@ -2892,6 +2979,9 @@ } this.__disable__ = false; }, + "scopeIsValid" : function(){ + return this.__scope__.isValid(); + }, "isValid" : function(){ var ret = true; var errorStr = ""; @@ -3018,10 +3108,10 @@ } } - + var scopeValid = this.scopeIsValid(); if(ret === false) this.showError(errorStr); else this.hideError(); - return ret; + return ret && scopeIsValid; }});