52 |
|
|
53 |
from domutils import getElementsByName, getElementByName |
from domutils import getElementsByName, getElementByName |
54 |
|
|
55 |
|
from Thuban import _ |
56 |
|
|
57 |
class WMSCapabilitiesParser: |
class WMSCapabilitiesParser: |
58 |
""" |
""" |
59 |
Thuban class to parse capabilities supplied as large string. |
Thuban class to parse capabilities supplied as large string. |
70 |
access = None |
access = None |
71 |
formats = None |
formats = None |
72 |
srs_discrepancies = None |
srs_discrepancies = None |
73 |
|
error = None |
74 |
|
|
75 |
|
|
76 |
def __init__(self): |
def __init__(self): |
81 |
# Note that we must not initialise internal variables of the |
# Note that we must not initialise internal variables of the |
82 |
# class in a mutable way or it will be shared among all |
# class in a mutable way or it will be shared among all |
83 |
# instances. None is immutable, [] is not. |
# instances. None is immutable, [] is not. |
84 |
layers = [] |
self.error = [] |
85 |
|
|
86 |
|
|
87 |
def grok(self, data): |
def grok(self, data): |
92 |
Information should only be retrieved with the respective |
Information should only be retrieved with the respective |
93 |
get*() methods. |
get*() methods. |
94 |
""" |
""" |
95 |
root = xml.dom.minidom.parseString(data).documentElement |
xml_dom = xml.dom.minidom.parseString(data) |
96 |
|
root = xml_dom.documentElement |
97 |
|
|
98 |
# Extract the title |
# Extract the title |
99 |
foo = getElementByName(getElementByName(root, 'Service'), 'Title') |
foo = getElementByName(getElementByName(root, 'Service'), 'Title') |
108 |
# Extract fees information |
# Extract fees information |
109 |
foo = getElementByName(getElementByName(root, 'Service'), 'Fees') |
foo = getElementByName(getElementByName(root, 'Service'), 'Fees') |
110 |
if foo and len(foo.childNodes[0].data) \ |
if foo and len(foo.childNodes[0].data) \ |
111 |
and lower(foo.childNodes[0].data) != 'none': |
and foo.childNodes[0].data.lower() != 'none': |
112 |
self.fees = foo.childNodes[0].data |
self.fees = foo.childNodes[0].data |
113 |
|
|
114 |
# Extract access information |
# Extract access information |
115 |
foo = getElementByName(getElementByName(root, 'Service'), |
foo = getElementByName(getElementByName(root, 'Service'), |
116 |
'AccessConstraints') |
'AccessConstraints') |
117 |
if foo and len(foo.childNodes[0].data) \ |
if foo and len(foo.childNodes[0].data) \ |
118 |
and lower(foo.childNodes[0].data) != 'none': |
and foo.childNodes[0].data.lower() != 'none': |
119 |
self.access = foo.childNodes[0].data |
self.access = foo.childNodes[0].data |
120 |
|
|
121 |
# Extract output format information |
# Extract output format information |
129 |
self.peekLayers(getElementByName(getElementByName( |
self.peekLayers(getElementByName(getElementByName( |
130 |
root, 'Capability'), 'Layer'), -1) |
root, 'Capability'), 'Layer'), -1) |
131 |
|
|
132 |
|
xml_dom.unlink() |
133 |
|
|
134 |
|
|
135 |
def peekLayers(self, top, parent): |
def peekLayers(self, top, parent): |
136 |
""" |
""" |
155 |
foo = getElementByName(top, 'Title') |
foo = getElementByName(top, 'Title') |
156 |
if foo and len(foo.childNodes[0].data): |
if foo and len(foo.childNodes[0].data): |
157 |
self.layers[index]['title'] = foo.childNodes[0].data |
self.layers[index]['title'] = foo.childNodes[0].data |
158 |
|
else: |
159 |
|
# A <Title> is required for each layer, <name> is optional |
160 |
|
# See OGC 01-068r3, 7.1.4.5.1 and 7.1.4.5.2 |
161 |
|
self.error.append(_("No title found for layer #%d") % index) |
162 |
|
|
163 |
foo = getElementByName(top, 'Name') |
foo = getElementByName(top, 'Name') |
164 |
if foo and len(foo.childNodes[0].data): |
if foo and len(foo.childNodes[0].data): |
193 |
self.layers[index]['bbox'][srs][corner] \ |
self.layers[index]['bbox'][srs][corner] \ |
194 |
= foo.attributes.get(corner).nodeValue |
= foo.attributes.get(corner).nodeValue |
195 |
|
|
|
# Check for integrity |
|
|
self.checkLayerSRS(index) |
|
|
|
|
196 |
# Traverse subsidiary layers |
# Traverse subsidiary layers |
197 |
sublayer = getElementsByName(top, 'Layer') |
sublayer = getElementsByName(top, 'Layer') |
198 |
for l in sublayer: |
for l in sublayer: |
199 |
self.peekLayers(l, index) |
self.peekLayers(l, index) |
200 |
|
|
201 |
|
|
|
def checkLayerSRS(self, index): |
|
|
""" |
|
|
Checks the integrity of the underlying XML data. |
|
|
|
|
|
This is done by comparing the <SRS> elements with the |
|
|
calculated list from the BoundingBox elements. |
|
|
|
|
|
index -- position in the layers array to check |
|
|
""" |
|
|
|
|
|
pivot = index |
|
|
calculated = [] |
|
|
while pivot != -1: |
|
|
if 'bbox' in self.layers[pivot]: |
|
|
for srs in self.layers[pivot]['bbox'].keys(): |
|
|
if srs not in calculated: |
|
|
calculated.append(srs) |
|
|
pivot = self.layers[pivot]['parent'] |
|
|
|
|
|
pivot = index |
|
|
specified = [] |
|
|
while pivot != -1: |
|
|
if 'srs' in self.layers[pivot]: |
|
|
for srs in self.layers[pivot]['srs']: |
|
|
if srs not in specified: |
|
|
specified.append(srs) |
|
|
pivot = self.layers[pivot]['parent'] |
|
|
|
|
|
equal = True |
|
|
# Check for same number of elements |
|
|
if len(calculated) != len(specified): |
|
|
equal = False |
|
|
|
|
|
# Loop through all elements for existance |
|
|
for elm in calculated: |
|
|
if elm not in specified: |
|
|
equal = False |
|
|
|
|
|
if not equal: |
|
|
if self.srs_discrepancies is None: |
|
|
self.srs_discrepancies = [] |
|
|
if 'name' in self.layers[index]: |
|
|
id = "name:%s" % self.layers[index]['name'] |
|
|
else: |
|
|
id = "title:%s" % self.layers[index]['title'] |
|
|
self.srs_discrepancies.append(id) |
|
|
|
|
|
|
|
202 |
def getTitle(self): |
def getTitle(self): |
203 |
""" |
""" |
204 |
Returns the main title of the WMS object. |
Returns the main title of the WMS object. |
489 |
|
|
490 |
import os |
import os |
491 |
|
|
492 |
|
sample = "test/sample.xml" |
493 |
try: |
try: |
494 |
f = open("test/sample.xml", "r") |
f = open(sample, "r") |
495 |
except IOError: |
except IOError: |
496 |
try: |
try: |
497 |
f = open(os.path.dirname(__file__) + "/test/sample.xml", "r") |
f = open(os.path.dirname(__file__) + "/" + sample, "r") |
498 |
except IOError: |
except IOError: |
499 |
print "Cannot open sample.xml for reading" |
print "Cannot open %s for reading" % sample |
500 |
|
|
501 |
if f is not None: |
if f is not None: |
502 |
sample = f.read(); |
sample = f.read(); |