With dramatic flourish, I'm modifying 21 files with 1033 insertions and 815 deletions between release candidates. This moves all rule subclasses to a more natural home as filter subclasses. Also adds tests for SLD write and corrects a handful of issues there. Apologies to all who lose sleep over this sort of thing. r=ahocevar,crschmidt (closes #1492)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@6818 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2008-04-08 00:13:45 +00:00
parent d7bbcab4df
commit 1091e34c0b
18 changed files with 710 additions and 492 deletions

View File

@@ -142,24 +142,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
style.rules = obj.rules;
},
"Rule": function(node, obj) {
// Rule elements are represented as OpenLayers.Rule instances.
// Filter elements are represented as instances of
// OpenLayers.Rule subclasses.
var config = {
rules: [],
symbolizer: {}
};
this.readChildNodes(node, config);
// Now we've either got zero or one rules (from filters)
var rule;
if(config.rules.length == 0) {
delete config.rules;
rule = new OpenLayers.Rule(config);
} else {
rule = config.rules[0];
delete config.rules;
OpenLayers.Util.extend(rule, config);
}
var rule = new OpenLayers.Rule();
this.readChildNodes(node, rule);
obj.rules.push(rule);
},
"ElseFilter": function(node, rule) {
@@ -283,146 +267,121 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
},
"ogc": {
"Filter": function(node, rule) {
// Filters correspond to subclasses of OpenLayers.Rule.
// Filters correspond to subclasses of OpenLayers.Filter.
// Since they contain information we don't persist, we
// create a temporary object and then pass on the rules
// create a temporary object and then pass on the filter
// (ogc:Filter) to the parent rule (sld:Rule).
var filter = {
var obj = {
fids: [],
rules: []
filters: []
};
this.readChildNodes(node, filter);
if(filter.fids.length > 0) {
rule.rules.push(new OpenLayers.Rule.FeatureId({
fids: filter.fids
}));
}
if(filter.rules.length > 0) {
rule.rules = rule.rules.concat(filter.rules);
this.readChildNodes(node, obj);
if(obj.fids.length > 0) {
rule.filter = new OpenLayers.Filter.FeatureId({
fids: obj.fids
});
} else if(obj.filters.length > 0) {
rule.filter = obj.filters[0];
}
},
"FeatureId": function(node, filter) {
"FeatureId": function(node, obj) {
var fid = node.getAttribute("fid");
if(fid) {
filter.fids.push(fid);
obj.fids.push(fid);
}
},
"And": function(node, filter) {
var rule = new OpenLayers.Rule.Logical({
type: OpenLayers.Rule.Logical.AND
"And": function(node, obj) {
var filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.AND
});
// since FeatureId rules may be nested here, make room for them
rule.fids = [];
this.readChildNodes(node, rule);
if(rule.fids.length > 0) {
rule.rules.push(new OpenLayers.Rule.FeatureId({
fids: rule.fids
}));
}
delete rule.fids;
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"Or": function(node, filter) {
var rule = new OpenLayers.Rule.Logical({
type: OpenLayers.Rule.Logical.OR
"Or": function(node, obj) {
var filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.OR
});
// since FeatureId rules may be nested here, make room for them
rule.fids = [];
this.readChildNodes(node, rule);
if(rule.fids.length > 0) {
rule.rules.push(new OpenLayers.Rule.FeatureId({
fids: rule.fids
}));
}
delete rule.fids;
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"Not": function(node, filter) {
var rule = new OpenLayers.Rule.Logical({
type: OpenLayers.Rule.Logical.NOT
"Not": function(node, obj) {
var filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.NOT
});
// since FeatureId rules may be nested here, make room for them
rule.fids = [];
this.readChildNodes(node, rule);
if(rule.fids.length > 0) {
rule.rules.push(new OpenLayers.Rule.FeatureId({
fids: rule.fids
}));
}
delete rule.fids;
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsEqualTo": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.EQUAL_TO
"PropertyIsEqualTo": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsNotEqualTo": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.NOT_EQUAL_TO
"PropertyIsNotEqualTo": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsLessThan": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.LESS_THAN
"PropertyIsLessThan": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.LESS_THAN
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsGreaterThan": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.GREATER_THAN
"PropertyIsGreaterThan": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.GREATER_THAN
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsLessThanOrEqualTo": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO
"PropertyIsLessThanOrEqualTo": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsGreaterThanOrEqualTo": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO
"PropertyIsGreaterThanOrEqualTo": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsBetween": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.BETWEEN
"PropertyIsBetween": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN
});
this.readChildNodes(node, rule);
filter.rules.push(rule);
this.readChildNodes(node, filter);
obj.filters.push(filter);
},
"PropertyIsLike": function(node, filter) {
var rule = new OpenLayers.Rule.Comparison({
type: OpenLayers.Rule.Comparison.LIKE
"PropertyIsLike": function(node, obj) {
var filter = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.LIKE
});
this.readChildNodes(node, rule);
this.readChildNodes(node, filter);
var wildCard = node.getAttribute("wildCard");
var singleChar = node.getAttribute("singleChar");
var esc = node.getAttribute("escape");
rule.value2regex(wildCard, singleChar, esc);
filter.rules.push(rule);
filter.value2regex(wildCard, singleChar, esc);
obj.filters.push(filter);
},
"Literal": function(node, obj) {
obj.value = this.getChildValue(node);
},
"PropertyName": function(node, rule) {
rule.property = this.getChildValue(node);
"PropertyName": function(node, filter) {
filter.property = this.getChildValue(node);
},
"LowerBoundary": function(node, rule) {
rule.lowerBoundary = this.readOgcExpression(node);
"LowerBoundary": function(node, filter) {
filter.lowerBoundary = this.readOgcExpression(node);
},
"UpperBoundary": function(node, rule) {
rule.upperBoundary = this.readOgcExpression(node);
"UpperBoundary": function(node, filter) {
filter.upperBoundary = this.readOgcExpression(node);
}
}
},
@@ -682,8 +641,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
// add in optional filters
if(rule.elseFilter) {
this.writeNode(node, "ElseFilter");
} else if(rule.CLASS_NAME != "OpenLayers.Rule") {
this.writeNode(node, "ogc:Filter", rule);
} else if(rule.filter) {
this.writeNode(node, "ogc:Filter", rule.filter);
}
// add in scale limits
@@ -867,15 +826,15 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
}
},
"ogc": {
"Filter": function(rule) {
"Filter": function(filter) {
var node = this.createElementNSPlus("ogc:Filter");
var sub = rule.CLASS_NAME.split(".").pop();
var sub = filter.CLASS_NAME.split(".").pop();
if(sub == "FeatureId") {
for(var i=0; i<rule.fids.length; ++i) {
this.writeNode(node, "FeatureId", rule.fids[i]);
for(var i=0; i<filter.fids.length; ++i) {
this.writeNode(node, "FeatureId", filter.fids[i]);
}
} else {
this.writeNode(node, this.getFilterType(rule), rule);
this.writeNode(node, this.getFilterType(filter), filter);
}
return node;
},
@@ -884,120 +843,120 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
attributes: {fid: fid}
});
},
"And": function(rule) {
"And": function(filter) {
var node = this.createElementNSPlus("ogc:And");
var childRule;
for(var i=0; i<rule.rules.length; ++i) {
childRule = rule.rules[i];
var childFilter;
for(var i=0; i<filter.filters.length; ++i) {
childFilter = filter.filters[i];
this.writeNode(
node, this.getFilterType(childRule), childRule
node, this.getFilterType(childFilter), childFilter
);
}
return node;
},
"Or": function(rule) {
"Or": function(filter) {
var node = this.createElementNSPlus("ogc:Or");
var childRule;
for(var i=0; i<rule.rules.length; ++i) {
childRule = rule.rules[i];
var childFilter;
for(var i=0; i<filter.filters.length; ++i) {
childFilter = filter.filters[i];
this.writeNode(
node, this.getFilterType(childRule), childRule
node, this.getFilterType(childFilter), childFilter
);
}
return node;
},
"Not": function(rule) {
"Not": function(filter) {
var node = this.createElementNSPlus("ogc:Not");
var childRule = rule.rules[0];
var childFilter = filter.filters[0];
this.writeNode(
node, this.getFilterType(childRule), childRule
node, this.getFilterType(childFilter), childFilter
);
return node;
},
"PropertyIsEqualTo": function(rule) {
"PropertyIsEqualTo": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsEqualTo");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsNotEqualTo": function(rule) {
"PropertyIsNotEqualTo": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsNotEqualTo");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsLessThan": function(rule) {
"PropertyIsLessThan": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsLessThan");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsGreaterThan": function(rule) {
"PropertyIsGreaterThan": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsGreaterThan");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsLessThanOrEqualTo": function(rule) {
"PropertyIsLessThanOrEqualTo": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsGreaterThanOrEqualTo": function(rule) {
"PropertyIsGreaterThanOrEqualTo": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "Literal", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "Literal", filter.value);
return node;
},
"PropertyIsBetween": function(rule) {
"PropertyIsBetween": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsBetween");
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "LowerBoundary", rule);
this.writeNode(node, "UpperBoundary", rule);
this.writeNode(node, "PropertyName", filter);
this.writeNode(node, "LowerBoundary", filter);
this.writeNode(node, "UpperBoundary", filter);
return node;
},
"PropertyIsLike": function(rule) {
"PropertyIsLike": function(filter) {
var node = this.createElementNSPlus("ogc:PropertyIsLike", {
attributes: {
wildCard: "*", singleChar: ".", escape: "!"
}
});
// no ogc:expression handling for now
this.writeNode(node, "PropertyName", rule);
this.writeNode(node, "PropertyName", filter);
// convert regex string to ogc string
this.writeNode(node, "Literal", {value: rule.regex2value()});
this.writeNode(node, "Literal", filter.regex2value());
return node;
},
"PropertyName": function(rule) {
"PropertyName": function(filter) {
// no ogc:expression handling for now
return this.createElementNSPlus("ogc:PropertyName", {
value: rule.property
value: filter.property
});
},
"Literal": function(rule) {
"Literal": function(value) {
// no ogc:expression handling for now
return this.createElementNSPlus("ogc:Literal", {
value: rule.value
value: value
});
},
"LowerBoundary": function(rule) {
"LowerBoundary": function(filter) {
// no ogc:expression handling for now
var node = this.createElementNSPlus("ogc:LowerBoundary");
this.writeNode(node, "Literal", rule.lowerBoundary);
this.writeNode(node, "Literal", filter.lowerBoundary);
return node;
},
"UpperBoundary": function(rule) {
"UpperBoundary": function(filter) {
// no ogc:expression handling for now
var node = this.createElementNSPlus("ogc:UpperBoundary");
this.writeNode(node, "Literal", rule.upperBoundary);
this.writeNode(node, "Literal", filter.upperBoundary);
return node;
}
}
@@ -1006,17 +965,17 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
/**
* Method: getFilterType
*/
getFilterType: function(rule) {
var filterType = this.filterMap[rule.type];
getFilterType: function(filter) {
var filterType = this.filterMap[filter.type];
if(!filterType) {
throw "SLD writing not supported for rule type: " + rule.type;
throw "SLD writing not supported for rule type: " + filter.type;
}
return filterType;
},
/**
* Property: filterMap
* {Object} Contains a member for each rule type. Values are node names
* {Object} Contains a member for each filter type. Values are node names
* for corresponding OGC Filter child elements.
*/
filterMap: {