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:
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user