[Pywps-commits] r867 - in trunk: . pywps/Parser pywps/Process pywps/Wps

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri Nov 6 17:44:53 CET 2009


Author: jachym
Date: 2009-11-06 17:44:41 +0100 (Fri, 06 Nov 2009)
New Revision: 867

Modified:
   trunk/pywps/Parser/Execute.py
   trunk/pywps/Process/InAndOutputs.py
   trunk/pywps/Process/Process.py
   trunk/pywps/Wps/Execute.py
   trunk/wps.py
Log:
better debuging and base64 encoding fixes

Modified: trunk/pywps/Parser/Execute.py
===================================================================
--- trunk/pywps/Parser/Execute.py	2009-11-06 14:08:17 UTC (rev 866)
+++ trunk/pywps/Parser/Execute.py	2009-11-06 16:44:41 UTC (rev 867)
@@ -90,15 +90,18 @@
             self.wps.inputs["responseform"] = self.parseResponseForm(
                                                         responseFormNode)
         except IndexError:
-            self.wps.inputs["responseform"] = None
+            self.wps.inputs["responseform"] = {}
 
         # OGC 05-007r7 page 36, Table 49
         # Either responseDocument or rawDataOutput should be specified, not both
-        if not self.wps.inputs.has_key('responseform') or\
-           (not self.wps.inputs["responseform"].has_key("rawdataoutput") and \
-            not self.wps.inputs["responseform"].has_key("responsedocument")):
+        if self.wps.inputs.has_key('responseform') and \
+           (self.wps.inputs["responseform"].has_key("rawdataoutput") and \
+            self.wps.inputs["responseform"].has_key("responsedocument")):
             raise self.wps.exceptions.InvalidParameterValue(
                 "Either responseDocument or rawDataOutput should be specified, but not both")
+        else:
+            self.wps.inputs["responseform"]["responsedocument"] = {}
+            self.wps.inputs["responseform"]["rawdataoutput"] = {}
 
     def parseResponseForm(self,responseFormNode):
         """ Parse requested response form node """
@@ -197,7 +200,6 @@
 
         parsedDataInputs = []
 
-        import sys
         for inputNode in inputsNode.getElementsByTagNameNS(self.nameSpace,
                                                                 "Input"):
             # input Identifier
@@ -212,7 +214,6 @@
 
             # Title and Abstract are only mandatory and not necessary:
             # skipping, not supported yet
-
             # formchoice
             try:
                 dataTypeNode = inputNode.getElementsByTagNameNS(
@@ -351,13 +352,13 @@
                                         "*","encoding")
         attributes["schema"] = complexDataNode.getAttributeNS(
                                         "*","schema")
+        attributes["value"] = None
+
         for complexDataChildNode in complexDataNode.childNodes:
             # CDATA or text and the input value is empty and the Text or
             # CDATA is not empty
-            if (complexDataChildNode.nodeType == \
-                xml.dom.minidom.Text.nodeType or \
-                complexDataChildNode.nodeType == \
-                xml.dom.minidom.CDATASection.nodeType) and\
+            if (complexDataChildNode.nodeType == xml.dom.minidom.Text.nodeType or \
+                complexDataChildNode.nodeType == xml.dom.minidom.CDATASection.nodeType) and\
                 complexDataChildNode.nodeValue and not attributes["value"]:
                 attributes["value"] = complexDataChildNode.nodeValue
             # xml input

Modified: trunk/pywps/Process/InAndOutputs.py
===================================================================
--- trunk/pywps/Process/InAndOutputs.py	2009-11-06 14:08:17 UTC (rev 866)
+++ trunk/pywps/Process/InAndOutputs.py	2009-11-06 16:44:41 UTC (rev 867)
@@ -31,7 +31,9 @@
     maxOccurs = None
     type = None
     value = None
+    ms = None # magic mimeTypes
 
+
     def __init__(self,identifier,title,abstract=None,
                 metadata=[],minOccurs=1,maxOccurs=1,type=None):
         """Input initialization
@@ -62,6 +64,7 @@
         self.maxOccurs = maxOccurs
         self.type = type
         self.value = None
+
         return
     
     def setValue(self,input):
@@ -294,6 +297,10 @@
 
         self.formats = formats
         self.format = self.formats[0]
+
+        self.ms = magic.open(magic.MAGIC_MIME)
+        self.ms.load()
+
         return
 
     def setValue(self, input):
@@ -320,9 +327,10 @@
         data {String} the data, which should be stored
         """
         import tempfile
-        from os import curdir
+        from os import curdir, rename
 
         outputName = tempfile.mktemp(prefix="pywpsInput",dir=curdir)
+        fout = None
         try:
             fout=open(outputName,'wb')
         except IOError, what:
@@ -333,16 +341,13 @@
         fout.write(data)
         fout.close()
 
-        # load the mimetypes
-        ms = magic.open(magic.MAGIC_MIME)
-        ms.load()
         
         # check, if the file is binary or not
         if self.format["mimeType"].find("text") == -1:
             # it *should* be binary, is the file really binary?
             # if so, convert it to binary using base64
-            if ms.open(fout.name).find("text") > -1: 
-                sys.rename(fout.name,fout.name+".base64")
+            if self.ms.file(fout.name).find("text") > -1: 
+                rename(fout.name,fout.name+".base64")
                 try:
                     base64.decode(open(fout.name+".base64"),
                                 open(fout.name,"w"))
@@ -353,7 +358,7 @@
                 
 
         # check the mimeType again
-        self.checkMimeType(ms.open(fout.name))
+        self.checkMimeType(fout.name,self.ms.file(fout.name))
             
         resp = self._setValueWithOccurence(self.value, outputName)
         if resp:
@@ -392,6 +397,7 @@
 
         outputName = tempfile.mktemp(prefix="pywpsInput",dir=curdir)
 
+        fout = None
         try:
             fout=open(outputName,'wb')
         except IOError, what:
@@ -422,9 +428,7 @@
         fout.close()
 
         # check the mimetypes
-        ms = magic.open(magic.MAGIC_MIME)
-        ms.load()
-        self.checkMimeType(ms.open(fout.name))
+        self.checkMimeType(fout.name,self.ms.open(fout.name))
 
         resp = self._setValueWithOccurence(self.value, outputName)
         if resp:
@@ -440,21 +444,22 @@
         """
         pass
 
-    def checkMimeType(self,mimeType):
+    def checkMimeType(self,fileName,mimeType):
         """Check, if the given mimetype is in self.formats
 
         Parameters:
+        fileName {String}
         mimeType {String}
         """
         mimeTypes = "";
         for format in self.formats:
             mimeTypes += format["mimeType"] + " ";
-            if ms.file(fout.name()) in format["mimeType"]:
+            if self.ms.file(fileName) in format["mimeType"]:
                 self.format = format
                 return
         if self.format == None:
             self.onProblem("InvalidParameterValue",
-                "Files mimeType ["+ ms.file(fout.name()) +
+                "Files mimeType ["+ self.ms.file(fileName) +
                 " does not correspond with allowed mimeType values, which can be on from ["+ mimeTypes+"]")
 
 
@@ -558,6 +563,7 @@
     type = None
     asReference = None
     value = None
+    ms = None # magic mimeTypes
 
     def __init__(self,identifier,title,abstract=None,
                 metadata=[],type=None, asReference=False):
@@ -679,6 +685,10 @@
 
         self.formats = formats
         self.format = formats[0]
+
+        self.ms = magic.open(magic.MAGIC_MIME)
+        self.ms.load()
+
         return
 
     def setValue(self, value):

Modified: trunk/pywps/Process/Process.py
===================================================================
--- trunk/pywps/Process/Process.py	2009-11-06 14:08:17 UTC (rev 866)
+++ trunk/pywps/Process/Process.py	2009-11-06 16:44:41 UTC (rev 867)
@@ -25,6 +25,7 @@
 import time
 import types
 import sys,os
+import traceback
 
 class Status:
     """
@@ -461,6 +462,7 @@
                 stdin=subprocessstdin, stdout=subprocessstdout,
                 stderr=subprocessstderr)
         except Exception,e :
+            traceback.print_exc(file=sys.stderr)
             self.failed = True
             raise Exception("Could not perform command [%s]: %s" % (cmd,e))
 

Modified: trunk/pywps/Wps/Execute.py
===================================================================
--- trunk/pywps/Wps/Execute.py	2009-11-06 14:08:17 UTC (rev 866)
+++ trunk/pywps/Wps/Execute.py	2009-11-06 16:44:41 UTC (rev 867)
@@ -25,7 +25,7 @@
 
 from Response import Response
 from htmltmpl import TemplateError
-import time,os,sys,tempfile,re,types, ConfigParser, base64
+import time,os,sys,tempfile,re,types, ConfigParser, base64, traceback
 from shutil import copyfile as COPY
 from shutil import rmtree as RMTREE
 
@@ -88,6 +88,7 @@
         try:
             self.template = self.templateManager.prepare(self.templateFile)
         except TemplateError,e:
+            traceback.print_exc(file=sys.stderr)
             self.cleanEnv()
             raise self.wps.exceptions.NoApplicableCode(e.__str__())
 
@@ -121,6 +122,7 @@
                 try:
                     self.statusFiles.append(open(self.statusFileName,"w"))
                 except Exception, e:
+                    traceback.print_exc(file=sys.stderr)
                     self.cleanEnv()
                     raise self.wps.exceptions.NoApplicableCode(e.__str__())
                 self.storeRequired = True
@@ -202,6 +204,7 @@
                         pass
 
                 except OSError, e:
+                    traceback.print_exc(file=sys.stderr)
                     raise self.wps.exceptions.NoApplicableCode("Fork failed: %d (%s)\n" % (e.errno, e.strerror) )
 
             # this is child process, parent is already gone away
@@ -232,9 +235,10 @@
                      statusMessage=e.value,
                      exceptioncode=e.code,
                      locator=e.locator)
+        except Exception,e:
 
-        except Exception,e:
             # set status to failed
+            traceback.print_exc(file=sys.stderr)
             self.promoteStatus(self.failed,
                     statusMessage=str(e),
                     exceptioncode="NoApplicableCode")
@@ -278,6 +282,7 @@
 
         except Exception,e:
             # set status to failed
+            traceback.print_exc(file=sys.stderr)
             self.promoteStatus(self.failed,
                     statusMessage=str(e),
                     exceptioncode="NoApplicableCode")
@@ -307,6 +312,7 @@
 
             except Exception, e:
                 self.cleanEnv()
+                traceback.print_exc(file=sys.stderr)
                 raise self.wps.exceptions.NoApplicableCode(
                 "Could not import process [%s]: %s" %\
                         (self.wps.inputs["identifier"], e))
@@ -436,6 +442,7 @@
             # execute
             processError = self.process.execute()
             if processError:
+                traceback.print_exc(file=sys.stderr)
                 raise self.wps.exceptions.NoApplicableCode(
                         "Failed to execute WPS process [%s]: %s" %\
                                 (self.process.identifier,processError))
@@ -450,6 +457,7 @@
             raise e
 
         except Exception,e:
+            traceback.print_exc(file=sys.stderr)
             raise self.wps.exceptions.NoApplicableCode(
                     "Failed to execute WPS process [%s]: %s" %\
                             (self.process.identifier,e))
@@ -729,6 +737,7 @@
                 templateOutputs.append(templateOutput);
             except Exception,e:
                 self.cleanEnv()
+                traceback.print_exc(file=sys.stderr)
                 raise self.wps.exceptions.NoApplicableCode(
                         "Process executed. Failed to build final response for output [%s]: %s" % (identifier,e))
         self.templateProcessor.set("Outputs",templateOutputs)
@@ -906,6 +915,7 @@
                     raise Exception("Location [%s] does not exist" % self.process.grassLocation)
         except Exception,e:
             self.cleanEnv()
+            traceback.print_exc(file=sys.stderr)
             raise self.wps.exceptions.NoApplicableCode("Could not init GRASS: %s" % e)
 
         return
@@ -976,8 +986,10 @@
         except ConfigParser.NoOptionError,e:
             pass
         except IOError,e:
+            traceback.print_exc(file=sys.stderr)
             raise self.wps.exceptions.NoApplicableCode("Logfile IOError: %s" % e.__str__())
         except Exception, e:
+            traceback.print_exc(file=sys.stderr)
             raise self.wps.exceptions.NoApplicableCode("Logfile error: %s" % e.__str__())
 
 

Modified: trunk/wps.py
===================================================================
--- trunk/wps.py	2009-11-06 14:08:17 UTC (rev 866)
+++ trunk/wps.py	2009-11-06 16:44:41 UTC (rev 867)
@@ -263,7 +263,10 @@
         dbg = self.getConfigValue("server","debug")
         if dbg == True or (type(dbg) == type("") and \
                 dbg.lower() == "true") or int(dbg) != 0:
-                print >>sys.stderr, "PyWPS Debug: %s" % debug.__str__()
+            print >>sys.stderr, "PyWPS Debug: %s" % debug.__str__()[0:160],
+            if len(debug.__str__()) > 160:
+                print >>sys.stderr, "...",
+            print >>sys.stderr, "\n"
 
 if __name__ == "__main__":
     wps = WPS()



More information about the Pywps-commits mailing list