OpenLayers OpenLayers

Changeset 5300

Show
Ignore:
Timestamp:
11/30/07 11:02:51 (1 year ago)
Author:
ahocevar
Message:

fixes in parser to be more strict on child nodes; new convenience method getNodeOrChildrenByTagName helps us to remove duplicate code sequences from parseFilter.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sandbox/ahocevar/styles/lib/OpenLayers/Format/SLD.js

    r5274 r5300  
    7171     */ 
    7272    overrideDefaultStyleKey: true, 
    73      
     73 
     74 
    7475    /** 
    7576     * Constructor: OpenLayers.Format.SLD 
     
    284285     */ 
    285286    parseFilter: function(xmlNode) { 
     287        // ogc:FeatureId filter 
     288        var filter = this.getNodeOrChildrenByTagName(xmlNode, "FeatureId"); 
     289        if (filter) { 
     290            var rule = new OpenLayers.Rule.FeatureId(); 
     291            for (var i=0; i<filter.length; i++) { 
     292                rule.fids.push(filter[i].getAttribute("fid")); 
     293            } 
     294            return rule; 
     295        } 
     296         
     297        // ogc:And filter 
     298        filter = this.getNodeOrChildrenByTagName(xmlNode, "And"); 
     299        if (filter) { 
     300            var rule = new OpenLayers.Rule.Logical( 
     301                    {type: OpenLayers.Rule.Logical.AND}); 
     302            var filters = filter[0].childNodes;  
     303            for (var i=0; i<filters.length; i++) { 
     304                if (filters[i].nodeType == 1) { 
     305                    rule.children.push(this.parseFilter(filters[i])); 
     306                } 
     307            } 
     308            return rule; 
     309        } 
     310 
     311        // ogc:Or filter 
     312        filter = this.getNodeOrChildrenByTagName(xmlNode, "Or"); 
     313        if (filter) { 
     314            var rule = new OpenLayers.Rule.Logical( 
     315                    {type: OpenLayers.Rule.Logical.OR}) 
     316            var filters = filter[0].childNodes;  
     317            for (var i=0; i<filters.length; i++) { 
     318                if (filters[i].nodeType == 1) { 
     319                    rule.children.push(this.parseFilter(filters[i])); 
     320                } 
     321            } 
     322            return rule; 
     323        } 
     324 
     325        // ogc:Not filter 
     326        filter = this.getNodeOrChildrenByTagName(xmlNode, "Not"); 
     327        if (filter) { 
     328            var rule = new OpenLayers.Rule.Logical( 
     329                    {type: OpenLayers.Rule.Logical.NOT}); 
     330            rule.children.push(this.parseFilter(filter[0])); 
     331            return rule; 
     332        } 
     333         
     334        // Comparison filters 
     335        for (var type in this.TYPES) { 
     336            var filter = this.getNodeOrChildrenByTagName(xmlNode, type); 
     337            if (filter) { 
     338                filter = filter[0]; 
     339                var rule = new OpenLayers.Rule.Comparison({ 
     340                        type: OpenLayers.Rule.Comparison[this.TYPES[type]], 
     341                        property: this.parseProperty( 
     342                                filter, this.ogcns, "PropertyName")}); 
     343                // ogc:PropertyIsBetween 
     344                if (this.TYPES[type] == "BETWEEN") { 
     345                    rule.lowerBoundary = this.parseProperty( 
     346                            filter, this.ogcns, "LowerBoundary"); 
     347                    rule.upperBoudary = this.parseProperty( 
     348                            filter, this.ogcns, "UpperBoundary"); 
     349                } else { 
     350                    rule.value = this.parseProperty( 
     351                            filter, this.ogcns, "Literal"); 
     352                    // ogc:PropertyIsLike 
     353                    if (this.TYPES[type] == "LIKE") { 
     354                        var wildCard = filter.getAttribute("wildCard"); 
     355                        var singleChar = filter.getAttribute("singleChar"); 
     356                        var escape = filter.getAttribute("escape"); 
     357                        rule.value2regex(wildCard, singleChar, escape); 
     358                    } 
     359                } 
     360                return rule; 
     361            } 
     362        } 
     363         
     364        // if we get here, the filter was empty 
     365        return new OpenLayers.Rule(); 
     366    }, 
     367     
     368    /** 
     369     * Method: getNodeOrChildrenByTagName 
     370     * Convenience method to get a node or its child nodes, but only 
     371     * those matching a tag name. 
     372     *  
     373     * Returns: 
     374     * {Array(<DOMElement>)} or null if no matching content is found 
     375     */ 
     376    getNodeOrChildrenByTagName: function(xmlNode, tagName) { 
    286377        var nodeName = (xmlNode.prefix) ? 
    287378               xmlNode.nodeName.split(":")[1] : 
    288379               xmlNode.nodeName; 
    289380 
    290         // ogc:FeatureId filter 
    291         var fidFilter = (nodeName == "FeatureId") ? 
    292                 xmlNode : 
    293                 this.getElementsByTagNameNS(xmlNode, this.ogcns, "FeatureId"); 
    294         if (fidFilter && fidFilter.length > 0) { 
    295             var rule = new OpenLayers.Rule.FeatureId(); 
    296             for (var i=0; i<fidFilter.length; i++) { 
    297                 rule.fids.push(fidFilter[i].getAttribute("fid")); 
    298             } 
    299             return rule; 
    300         } 
    301          
    302         // ogc:And filter 
    303         var andFilter = (nodeName == "And") ? 
    304                 xmlNode : 
    305                 this.getElementsByTagNameNS(xmlNode, this.ogcns, "And"); 
    306         if (andFilter.length > 0) { 
    307             andFilter = andFilter[0]; 
    308         } 
    309         if (andFilter.childNodes && andFilter.parentNode == xmlNode) { 
    310             var rule = new OpenLayers.Rule.Logical( 
    311                     {type: OpenLayers.Rule.Logical.type.AND}); 
    312             var filters = andFilter.childNodes;  
    313             for (var i=0; i<filters.length; i++) { 
    314                 if (filters[i].nodeType == 1) { 
    315                     rule.children.push(this.parseFilter(filters[i])); 
    316                 } 
    317             } 
    318             return rule; 
    319         } 
    320  
    321         // ogc:Or filter 
    322         var orFilter = (nodeName == "Or") ? 
    323                 xmlNode : 
    324                 this.getElementsByTagNameNS(xmlNode, this.ogcns, "Or"); 
    325         if (orFilter.length > 0) { 
    326             orFilter = orFilter[0]; 
    327         } 
    328         if (orFilter.childNodes && orFilter.parentNode == xmlNode) { 
    329             var rule = new OpenLayers.Rule.Logical( 
    330                     {type: OpenLayers.Rule.Logical.type.OR}) 
    331             var filters = orFilter.childNodes;  
    332             for (var i=0; i<filters.length; i++) { 
    333                 if (filters[i].nodeType == 1) { 
    334                     rule.children.push(this.parseFilter(filters[i])); 
    335                 } 
    336             } 
    337             return rule; 
    338         } 
    339  
    340         // ogc:Not filter 
    341         var notFilter = (nodeName == "Not") ? 
    342                 xmlNode : 
    343                 this.getElementsByTagNameNS(xmlNode, this.ogcns, "Not"); 
    344         if (notFilter.length > 0) { 
    345             notFilter = notFilter[0]; 
    346         } 
    347         if (notFilter.childNodes && notFilter.parentNode == xmlNode) { 
    348             var rule = new OpenLayers.Rule.Logical( 
    349                     {type: OpenLayers.Rule.Logical.type.NOT}); 
    350             rule.children.push(this.parseFilter(notFilter)); 
    351             return rule; 
    352         } 
    353          
    354         // Comparison filters 
    355         for (var i in OpenLayers.Rule.Comparison.type) { 
    356             // calculate the rule node name 
    357             var type = OpenLayers.String.camelize("-property-is-"+ 
    358                     i.replace( 
    359                     /_/g, "-").toLowerCase()); 
    360             var comparisonFilter = (nodeName == type) ? 
    361                     xmlNode : 
    362                     this.getElementsByTagNameNS(xmlNode, this.ogcns, type); 
    363             if (comparisonFilter.length > 0) { 
    364                 comparisonFilter = comparisonFilter[0]; 
    365             } 
    366             if (comparisonFilter.childNodes) { 
    367                 var rule = new OpenLayers.Rule.Comparison({ 
    368                         type: OpenLayers.Rule.Comparison.type[i], 
    369                         property: this.parseProperty( 
    370                                 comparisonFilter, this.ogcns, "PropertyName")}); 
    371                 // ogc:PropertyIsBetween 
    372                 if (OpenLayers.Rule.Comparison.type[i] == 
    373                             OpenLayers.Rule.Comparison.type.BETWEEN) { 
    374                     rule.lowerBoundary = this.parseProperty( 
    375                             comparisonFilter, this.ogcns, "LowerBoundary"); 
    376                     rule.upperBoudary = this.parseProperty( 
    377                             comparisonFilter, this.ogcns, "UpperBoundary"); 
    378                 } else { 
    379                     rule.value = this.parseProperty( 
    380                             comparisonFilter, this.ogcns, "Literal"); 
    381                     // ogc:PropertyIsLike 
    382                     if (OpenLayers.Rule.Comparison.type[i] == 
    383                                 OpenLayers.Rule.Comparison.type.LIKE) { 
    384                         var wildCard = comparisonFilter.getAttribute("wildCard"); 
    385                         var singleChar = comparisonFilter.getAttribute("singleChar"); 
    386                         var escape = comparisonFilter.getAttribute("escape"); 
    387                         rule.value2regex(wildCard, singleChar, escape); 
    388                     } 
    389                 } 
    390                 return rule; 
    391             } 
    392         } 
    393          
    394         // if we get here, the filter was empty 
    395         return new OpenLayers.Rule(); 
     381        if (nodeName == tagName) { 
     382            return [xmlNode]; 
     383        } else { 
     384            var nodelist = this.getElementsByTagNameNS( 
     385                    xmlNode, this.ogcns, tagName); 
     386        } 
     387 
     388        // make a new list which only contains matching child nodes 
     389        if (nodelist.length > 0) { 
     390            var node; 
     391            var list = []; 
     392            for (var i=0; i<nodelist.length; i++) { 
     393                node = nodelist[i]; 
     394                if (node.parentNode == xmlNode) { 
     395                    list.push(node); 
     396                } 
     397            } 
     398            return list.length > 0 ? list : null; 
     399        } 
     400         
     401        return null; 
    396402    }, 
    397403     
     
    534540    }, 
    535541     
     542    /** 
     543     * Constant: TYPES 
     544     * {Object} Mapping between SLD rule names and rule type constants. 
     545     *  
     546     */ 
     547    TYPES: {'PropertyIsEqualTo': 'EQUAL_TO', 
     548            'PropertyIsNotEqualTo': 'NOT_EQUAL_TO', 
     549            'PropertyIsLessThan': 'LESS_THAN', 
     550            'PropertyIsGreaterThan': 'GREATER_THAN', 
     551            'PropertyIsLessThanOrEqualTo': 'LESS_THAN_OR_EQUAL_TO', 
     552            'PropertyIsGreaterThanOrEqualTo': 'GREATER_THAN_OR_EQUAL_TO', 
     553            'PropertyIsBetween': 'BETWEEN', 
     554            'PropertyIsLike': 'LIKE'}, 
     555 
    536556    CLASS_NAME: "OpenLayers.Format.SLD"  
    537557});