source: TI02-CSML/trunk/services/3rdParty/pywps-1.0.0/pywps/Wps/inputs.py @ 2194

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/services/3rdParty/pywps-1.0.0/pywps/Wps/inputs.py@2194
Revision 2194, 11.1 KB checked in by lawrence, 13 years ago (diff)

Adding various specs and 3rd party code of interest for the CSML
services development.

Line 
1"""
2This module parses the input for WPS. Input
3can be either XML string or comma and = separated string in form
4
5    name1=value1,name2=value2,name3=value3,value4
6"""
7# Author:       Jachym Cepicky
8#               http://les-ejk.cz
9# Lince:
10#
11# Web Processing Service implementation
12# Copyright (C) 2006 Jachym Cepicky
13#
14# This program is free software; you can redistribute it and/or modify
15# it under the terms of the GNU General Public License as published by
16# the Free Software Foundation; either version 2 of the License, or
17# (at your option) any later version.
18#
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22# GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
27
28
29import xml
30from xml.sax import make_parser
31from xml.sax.handler import feature_namespaces
32import sys
33
34#--------------------------------------------------------------------#
35# processExecuteXML - for parsing the input xml document using sax   #
36#--------------------------------------------------------------------#
37class processExecuteXML(xml.sax.handler.ContentHandler):
38    """
39    processExecuteXML defineds the sax handler for parsing input XML file
40    reseved by XML POST
41    """
42    def __init__(self):
43        self.inInput = None
44        self.inDataInputs = None
45        self.inIdentifier = None
46        self.inValue = None
47
48        self.inComplexValue = False
49
50        self.value = ''
51        self.ident = ''
52
53        self.values = {} # here will be the input values stored
54        self.values['datainputs'] = {}
55
56        self.valueFirstChild = None
57        self.inComplexValueInValue = False
58
59    def startElementNS(self,name, qname, attrs):
60        if name[1] == "DataInputs":
61            self.inDataInputs = True
62        if name[1] == "Identifier":
63            self.inIdentifier = True
64        if name[1] == "ComplexValueReference":
65            self.inValue = True
66            self.inComplexValueReference = True
67            self.value = attrs[(None,'reference')]
68        if name[1] == "ComplexValue":
69            self.inComplexValue = True
70        if name[1] == "LiteralValue":
71            self.inValue = True
72            self.inLiteralValue = True
73
74        # for embeded xmls in
75        # <ComplexValue><Value>...</Value></ComplexValue>
76        if self.inComplexValueInValue and not self.valueFirstChild:
77            self.valueFirstChild = name
78
79        # for embeded xmls in
80        # <ComplexValue><Value>...</Value></ComplexValue>
81        # in next step,
82        if name[1] == "Value":
83            self.inComplexValueInValue = True
84
85    def endElementNS(self,name, qname):
86
87        if name[1] == "DataInputs":
88            self.inDataInputs = False
89        if name[1] == "Identifier":
90            self.inIdentifier = False
91        if name[1] == "ComplexValue":
92            self.value = "!complexvalue!"
93        if name[1] == "BoundingBoxValue":
94            self.value = "!bboxvalue!"
95
96        if self.value and self.ident:
97           
98            # if it exists, it will be array
99            if self.values['datainputs'].has_key(self.ident):
100               
101                # "value" -> [value]
102                self.values['datainputs'][self.ident] = \
103                        [self.values['datainputs'][self.ident]]
104                # [value] -> [value1,value2]
105                self.values['datainputs'][self.ident].append(self.value)
106            # normal value else
107            else:
108                self.values['datainputs'][self.ident] = self.value
109            self.value = self.ident = ''
110
111        if name[1] == "ComplexValue":
112            self.inValue = False
113        if name[1] == "LiteralValue":
114            self.inValue = False
115        if name[1] == "ComplexValueReference":
116            self.inValue = False
117
118        if name[1] == "Input":
119            self.inComplexValue = False
120            self.inComplexValueReference = False
121            self.inLiteralValue = False
122
123    def characters(self,characters):
124        """
125        Here are the values taken
126        """
127
128        characters = characters.strip()
129
130        if self.inIdentifier and not self.inDataInputs:
131            self.values['identifier'] = characters
132        elif self.inIdentifier and self.inDataInputs:
133            self.ident = characters
134        elif self.inValue and self.inDataInputs:
135            self.value = characters
136
137
138class Inputs:
139    """
140    This class will store the input structure
141    """
142    def __init__(self):
143        self.values = {}
144
145    #--------------------------------------------------------------------#
146    # formvalsPost2dict - convert xml input to dictionary structure      #
147    #--------------------------------------------------------------------#
148    def formvalsPost2dict(self,file,size):
149        """
150        stores the input formValues to to input structure. suppose,
151        formValues['request'] parameter is xml string
152        """
153        import xml.dom.minidom
154
155        # read only defined size
156        if size:
157            inputxml = file.read(size)
158        else:
159            inputxml = file.read()
160
161        # maximum size exceeded
162        if file.read():
163            return "FileSizeExceeded"
164
165        try:
166            formDocument = xml.dom.minidom.parseString(inputxml)
167        except xml.parsers.expat.ExpatError,e:
168            return e
169
170        #
171        # decribe process request
172        #
173        if formDocument.firstChild.tagName == "DescribeProcess":
174            self.values['request'] = "DescribeProcess"
175            from ogc import processdescription
176
177            pdrWps = processdescription.WPS()
178            requestAttrs = pdrWps.pd['request']
179
180            for identifier in formDocument.getElementsByTagNameNS("*","Identifier"):
181                if not 'identifier' in self.values.keys():
182                    self.values['identifier'] = []
183                self.values['identifier'].append(identifier.firstChild.data)
184
185            for attribute in requestAttrs['attributes']:
186                value = None
187                value = formDocument.firstChild.getAttribute(attribute)
188                # if there is no such attribute, exception
189                if not value:
190                    if attribute.lower() == "request":
191                        continue
192                    if requestAttrs[attribute]['oblig'] == "m":
193                        return "DescribeProcess"
194                else:
195                    self.values[attribute] =  value
196
197        #
198        # execute request
199        #
200        elif formDocument.firstChild.tagName == "Execute":
201
202            from ogc import execute
203            exEps = execute.WPS()
204            requestExec = exEps.e['request']
205
206
207            parser=make_parser()
208
209            # Create the handler
210            eh = processExecuteXML()
211
212            # Tell the parser we are not interested in XML namespaces
213            parser.setFeature(feature_namespaces, 1)
214
215            # Tell the parser to use our handler
216            parser.setContentHandler(eh)
217
218            # Parse the input
219            parser.feed(inputxml)
220            self.values = eh.values
221
222
223            # attributes
224            for attribute in requestExec['attributes']:
225                value = formDocument.firstChild.getAttribute(attribute)
226                # if there is no such attribute, exception
227                if not value:
228                    if attribute.lower() == "request":
229                        continue
230                    if requestExec[attribute]['oblig'] == "m":
231                        return "DescribeProcess"
232                else:
233                    self.values[attribute] =  value
234
235            self.values['request'] = "Execute"
236            pass
237
238            # complexvalues
239            for input in self.values['datainputs'].keys():
240                if self.values['datainputs'][input] == "!complexvalue!":
241                    for Input in formDocument.getElementsByTagName("Input"):
242                        cmplxval = Input.getElementsByTagName("ComplexValue")
243                        identifier = Input.getElementsByTagName("ows:Identifier")[0].firstChild.data
244                        if len(cmplxval) and identifier == input:
245                            self.values['datainputs'][input] = cmplxval[0].getElementsByTagNameNS(eh.valueFirstChild[0],eh.valueFirstChild[1])[0].toprettyxml()
246
247                elif self.values['datainputs'][input] == "!bboxvalue!":
248                    for Input in formDocument.getElementsByTagName("Input"):
249                        cmplxval = Input.getElementsByTagName("BoundingBoxValue")
250                        identifier = Input.getElementsByTagName("ows:Identifier")[0].firstChild.data
251                        if len(cmplxval) and identifier == input:
252                            self.values['datainputs'][input] = []
253                            geom = \
254                                    cmplxval[0].getElementsByTagName("LowerCorner")[0].firstChild.data.split()
255                            self.values['datainputs'][input].append(geom[0])
256                            self.values['datainputs'][input].append(geom[1])
257
258                            geom = \
259                                    cmplxval[0].getElementsByTagName("UpperCorner")[0].firstChild.data.split()
260                            self.values['datainputs'][input].append(geom[0])
261                            self.values['datainputs'][input].append(geom[1])
262
263            # identifier is array
264            self.values['identifier'] = [self.values['identifier']]
265
266        # not describeprocess and not execute: exception
267        else:
268            return formDocument.firstChild.tagName
269        return
270
271    def formvalsGet2dict(self,formValues):
272        """
273        stores the input formValues to to input structure. suppose,
274        formValues['request'] parameter is something like
275       
276        "describeprocess" or "execute".
277        """
278       
279        for key in formValues.keys():
280            self.values[key] = formValues[key]
281        if 'identifier' in formValues.keys():
282            self.values['identifier'] = formValues['identifier'].split(",")
283        if 'datainputs' in formValues.keys():
284            self.values['datainputs'] = []
285            datainputs = formValues['datainputs'].split(",")
286            #
287            # DataInputs must be even number
288            #
289            if len(datainputs) % 2 != 0:
290                return "DataInputs"
291            #
292            # Array -> Dictionary
293            #
294            self.values['datainputs'] = dict(zip(datainputs[0::2], datainputs[1::2]))
295        return
296
297    def controllProcesses(self,processes,formValues):
298        """
299        controlls, if there is such process in processes array
300        """
301        if formValues.has_key('request') and \
302           formValues['request'].lower() == "describeprocess" or \
303           formValues['request'].lower() == "execute":
304            if formValues.has_key('identifier'):
305                for process in formValues['identifier']:
306                    if not process in processes:
307                        return process
308            else:
309                return "identifier"
310        return
Note: See TracBrowser for help on using the repository browser.