commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

r5523 - trunk/gnue-appserver/src


From: johannes
Subject: r5523 - trunk/gnue-appserver/src
Date: Fri, 26 Mar 2004 04:03:13 -0600 (CST)

Author: johannes
Date: 2004-03-26 04:03:12 -0600 (Fri, 26 Mar 2004)
New Revision: 5523

Modified:
   trunk/gnue-appserver/src/geasInstance.py
Log:
Appserver now supports procedures with parameters (using the new language
adapter stuff)


Modified: trunk/gnue-appserver/src/geasInstance.py
===================================================================
--- trunk/gnue-appserver/src/geasInstance.py    2004-03-26 10:01:42 UTC (rev 
5522)
+++ trunk/gnue-appserver/src/geasInstance.py    2004-03-26 10:03:12 UTC (rev 
5523)
@@ -25,8 +25,8 @@
 import string
 import mx.DateTime
 import mx.DateTime.ISO
-from gnue.common.logic.language.Base import loadLanguageEngine, 
LangIfRuntimeError
 from gnue.appserver.language import Object, Session
+from gnue.common.logic.language import getLanguageAdapter
 
 # =============================================================================
 # Exceptions
@@ -47,6 +47,14 @@
                  "property": propertyName}
     gException.__init__ (self, message)
 
+class ParameterValueError (gException):
+  def __init__ (self, parameterName, value):
+    message = u_("Invalid value '%(value)s' for parameter '%(parameter)s'") \
+              % {"value"    : repr (value),
+                 "parameter": parameterName}
+    gException.__init__ (self, message)
+
+
 # =============================================================================
 # Instance class
 # =============================================================================
@@ -79,7 +87,10 @@
       elif isinstance (value, types.StringType):
         return unicode (value)
       else:
-        raise exception (propertydef.fullName, value)
+        try:
+          return unicode (str (value))
+        except:
+          raise exception (propertydef.fullName, value)
 
     elif propertydef.dbType == "number":
       # Number property: Must be something that can be converted to an int or
@@ -212,50 +223,53 @@
     # fetch the procedure definition
     proceduredef = self.__classdef.procedures [procedurename]
 
-    language = proceduredef.gnue_language
+    # check the parameters
+    for parameter in params.keys ():
+      paramDef = proceduredef.parameters [parameter]
+      params [parameter] = self.__convert (params [parameter], paramDef,
+                                           ParameterValueError)
 
-    rtlist   = self.__session.sm._langRuntimes
-    
-    if not rtlist.has_key(language):
-      self.__session.sm._langRuntimes[language] = loadLanguageEngine(language)
-      rtlist =  self.__session.sm._langRuntimes
-    
-    cx=rtlist[language].createNewContext()
+    engine = getLanguageAdapter (proceduredef.gnue_language)
 
+    cx = engine.createNewContext ()
+
     # describe the context
-    cx.setDescription('%s.%s' % (self.__classdef.fullName,procedurename),
-                      'a gnue-appserver procedure')
+    cx.shortname   = '%s.%s' % (self.__classdef.fullName, procedurename)
+    cx.description = proceduredef.gnue_comment
 
     # the object itself
-    cx.bindObject(  'self', obj, Object.Object)
+    cx.bindObject ('self', obj, Object.Object)
 
     # language interface, session functions
-    cx.bindFunction('find',           sess.find)
-    cx.bindFunction('setcontext',     sess.setcontext)
-    cx.bindFunction('new',            sess.new)
+    cx.bindFunction ('find',       sess.find)
+    cx.bindFunction ('setcontext', sess.setcontext)
+    cx.bindFunction ('new',        sess.new)
 
     # direct access to RPC API func.
-    cx.bindFunction('direct_request', self.__session.request)
-    cx.bindFunction('direct_fetch',   self.__session.fetch)
-    cx.bindFunction('direct_load',    self.__session.load)
-    cx.bindFunction('direct_store',   self.__session.store)
-    cx.bindFunction('direct_call',    self.__session.call)
+    cx.bindFunction ('direct_request', self.__session.request)
+    cx.bindFunction ('direct_fetch',   self.__session.fetch)
+    cx.bindFunction ('direct_load',    self.__session.load)
+    cx.bindFunction ('direct_store',   self.__session.store)
+    cx.bindFunction ('direct_call',    self.__session.call)
 
     # set context for the procedure
     sess.setcontext (proceduredef.module.gnue_name)
 
     try:
-      method = cx.buildMethod(proceduredef.gnue_name, proceduredef.gnue_code)
-      retcode = method(params)
+      method = cx.buildFunction (proceduredef.gnue_name, 
proceduredef.gnue_code,
+                               params)
+      result = method (**params)
+
     except Exception, msg:
+
       print _("Error occured during method invokation: %s") % msg
-      retcode = -1
+      result = None
 
     # Save changes made by the procedure
     # obj.store ()
 
     # return value of '1' to make XMLRPC happy
-    return retcode or 1
+    return result
 
 
   # ---------------------------------------------------------------------------





reply via email to

[Prev in Thread] Current Thread [Next in Thread]