commit-gnue
[Top][All Lists]
Advanced

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

r5065 - in trunk/gnue-appserver/src: . classrep language


From: johannes
Subject: r5065 - in trunk/gnue-appserver/src: . classrep language
Date: Wed, 4 Feb 2004 10:04:25 -0600 (CST)

Author: johannes
Date: 2004-02-04 10:04:22 -0600 (Wed, 04 Feb 2004)
New Revision: 5065

Added:
   trunk/gnue-appserver/src/language/Exceptions.py
Modified:
   trunk/gnue-appserver/src/classrep/Base.py
   trunk/gnue-appserver/src/classrep/Class.py
   trunk/gnue-appserver/src/classrep/Module.py
   trunk/gnue-appserver/src/classrep/Procedure.py
   trunk/gnue-appserver/src/classrep/Property.py
   trunk/gnue-appserver/src/classrep/__init__.py
   trunk/gnue-appserver/src/classrep/test.py
   trunk/gnue-appserver/src/geasInstance.py
   trunk/gnue-appserver/src/language/Object.py
   trunk/gnue-appserver/src/language/ObjectList.py
   trunk/gnue-appserver/src/language/Procedure.py
   trunk/gnue-appserver/src/language/Session.py
   trunk/gnue-appserver/src/language/test.py
   trunk/gnue-appserver/src/test.py
Log:
Removed caching-stuff from language interface and changed the constructors
of language interface and classrepository to use language/Session instead of
sessionManager and sessionId. Made sure to use proper 'underlining' for
private/protected and public identifiers.


Modified: trunk/gnue-appserver/src/classrep/Base.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Base.py   2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/classrep/Base.py   2004-02-04 16:04:22 UTC (rev 
5065)
@@ -43,10 +43,10 @@
   # Reload the dictionary from the database by merging new records in
   # ---------------------------------------------------------------------------
   def reload (self):
-    list = self._session.find (self.table, self._getReloadCondition (),
-                                           self._getSortorder (),
-                                           self._getColumns ())
-    self.mergeIntoList (list)
+    rlist = self._session.find (self.table, self._getReloadCondition (),
+                                            self._getSortorder (),
+                                            self._getColumns ())
+    self.mergeIntoList (rlist)
 
   # ---------------------------------------------------------------------------
   # Merge a given object list with the dictionaries list
@@ -93,7 +93,7 @@
   # Use _getNewItem in derived classes to instanciate new dictionary-items
   # ---------------------------------------------------------------------------
   def _getNewItem (self, obj):
-    raise EClassRepository ("%s: getNewItem() not implemented!" % self.table)
+    raise EClassRepository ("%s: _getNewItem() not implemented!" % self.table)
 
   # ---------------------------------------------------------------------------
   # Return all keys 
@@ -154,10 +154,11 @@
   # ---------------------------------------------------------------------------
   # Constructor
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, classname, object = None, pDefs = None):
+  def __init__ (self, session, classname, aObject = None, pDefs = None):
     self.classname    = classname
-    self._sm          = sessionManager
-    self.__object     = object 
+    self._session     = session
+
+    self.__object     = aObject 
     self.__predefined = {}
 
     if pDefs is not None:
@@ -186,6 +187,6 @@
   # ---------------------------------------------------------------------------
   def __getObject (self):
     if self.__object is None:
-      self.__object = Object (self._sm, 0, self.classname, self.gnue_id)
-    else:
-      return self.__object
+      self.__object = Object (self._session, self.classname, self.gnue_id)
+
+    return self.__object

Modified: trunk/gnue-appserver/src/classrep/Class.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Class.py  2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/classrep/Class.py  2004-02-04 16:04:22 UTC (rev 
5065)
@@ -35,12 +35,10 @@
   # ---------------------------------------------------------------------------
   # Create a dictionary with all classes [from a specified module]
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, moduleDict, module = None, 
-                predefines = None):
+  def __init__ (self, session, moduleDict, module = None, predefines = None):
     BaseDictionary.__init__ (self, session, 'gnue_class')
 
     self.modules    = moduleDict
-    self._sm        = sessionManager
     self.__module   = module
 
     # Note: this 'predefines' is a RepositoryDefinition
@@ -49,7 +47,7 @@
         cMod     = self.modules.find (cDict ['gnue_module'])
         proplist = predefines.properties (cDict ['gnue_id'])
 
-        aClass = Class (self._sm, session, self, cMod, None, cDict, proplist)
+        aClass = Class (session, self, cMod, None, cDict, proplist)
         self._items [aClass.fullName] = aClass
 
     # if this class dictionary is for a special module, we populate it with
@@ -64,6 +62,7 @@
         # fetch a fresh copy from the datasource
         self.reload ()
 
+
   # ---------------------------------------------------------------------------
   # Reload the dictionary and run nested reloads for all classes 
   # ---------------------------------------------------------------------------
@@ -74,13 +73,15 @@
       aClass.properties.reload ()
       aClass.procedures.reload ()
 
+
   # ---------------------------------------------------------------------------
   # Create a new instance for a dictionary-item
   # ---------------------------------------------------------------------------
   def _getNewItem (self, object):
     module = self.modules.find (object.gnue_module)
-    return Class (self._sm, self._session, self, module, object)
+    return Class (self._session, self, module, object)
 
+
   # ---------------------------------------------------------------------------
   # Get an apropriate reload ()-condition
   # ---------------------------------------------------------------------------
@@ -91,6 +92,7 @@
     else:
       return []
 
+
   # ---------------------------------------------------------------------------
   # Create a condition to retrieve the klass specified by 'key'
   # ---------------------------------------------------------------------------
@@ -101,6 +103,7 @@
     return [["eq", ""], ["field", "gnue_module"], ["const", module.gnue_id],
             ["eq", ""], ["field", "gnue_name"], ["const", className]]
 
+
   # ---------------------------------------------------------------------------
   # On find () this dictionary will prepare the following columns ()
   # ---------------------------------------------------------------------------
@@ -117,18 +120,17 @@
   # ---------------------------------------------------------------------------
   # Wrapping a business object class
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, classDict, module, object, 
-                predefs = None, propDefList = None):
-    BaseObject.__init__ (self, sessionManager, 'gnue_class', object, predefs)
+  def __init__ (self, session, classDict, module, object, predefs = None, 
+                propDefList = None):
+    BaseObject.__init__ (self, session, 'gnue_class', object, predefs)
 
     self.module     = module
     self.fullName   = createName (module.gnue_name, self.gnue_name)
     self.table      = self.fullName
     self.classes    = classDict
-    self._session   = session
 
-    self.properties = PropertyDict (self._sm, session, self, propDefList)
-    self.procedures = ProcedureDict (self._sm, session, self)
+    self.properties = PropertyDict (session, self, propDefList)
+    self.procedures = ProcedureDict (session, self)
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-appserver/src/classrep/Module.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Module.py 2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/classrep/Module.py 2004-02-04 16:04:22 UTC (rev 
5065)
@@ -36,22 +36,20 @@
   # This class behaves like a dictionary of all available modules with the
   # keys being the module names and the values being Module objects.
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, predefines = None):
+  def __init__ (self, session, predefines = None):
     BaseDictionary.__init__ (self, session, 'gnue_module')
 
-    self._sm = sessionManager
-
     # Note: this 'predefines' is a RepositoryDefinition
     if predefines is not None:
       for mDict in predefines.modules ():
-        module = Module (self._sm, self._session, self, None, mDict)
+        module = Module (self._session, self, None, mDict)
         self._items [module.fullName] = module
 
   # ---------------------------------------------------------------------------
   # Create a new module instance
   # ---------------------------------------------------------------------------
-  def _getNewItem (self, object):
-    return Module (self._sm, self._session, self, object)
+  def _getNewItem (self, aObject):
+    return Module (self._session, self, aObject)
 
   # ---------------------------------------------------------------------------
   # Create a condition to reload a single module
@@ -77,23 +75,23 @@
   # ---------------------------------------------------------------------------
   # Constructor
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, mDict, object=None, pDefs=None):
-    BaseObject.__init__ (self, sessionManager, 'gnue_module', object, pDefs)
+  def __init__ (self, session, mDict, aObject = None, pDefs = None):
+    BaseObject.__init__ (self, session, 'gnue_module', aObject, pDefs)
 
     self.modules  = mDict
     self.fullName = self.gnue_name
-    self._session = session
 
   # ---------------------------------------------------------------------------
   # Return an attribute's value
   # ---------------------------------------------------------------------------
   def __getattr__ (self, attr):
     if attr == 'classes':
-      self.__dict__ ['classes'] = ClassDict (self._sm, self._session, 
-                                             self.modules, self)
+      self.__dict__ ['classes'] = ClassDict (self._session, self.modules, self)
+
       # Make sure the created class-dictionary is up to date
       self.classes.reload ()
       return self.classes
+
     else:
       return BaseObject.__getattr__ (self, attr)
 

Modified: trunk/gnue-appserver/src/classrep/Procedure.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Procedure.py      2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/classrep/Procedure.py      2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -31,22 +31,23 @@
 class ProcedureDict (BaseDictionary):
 
   # ---------------------------------------------------------------------------
-  # Construct a Procedure-Dictionary for class klass
+  # Construct a Procedure-Dictionary for class aClass
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, klass, predefs = None):
+  def __init__ (self, session, aClass, predefs = None):
     BaseDictionary.__init__ (self, session, 'gnue_procedure')
 
-    self._sm      = sessionManager
-    self.__class  = klass
+    self.__class  = aClass
     self.__module = self.__class.module
 
+
   # ---------------------------------------------------------------------------
   # Create a new instance of a dictionary item
   # ---------------------------------------------------------------------------
   def _getNewItem (self, object):
     pMod = self.__module.modules.find (object.gnue_module)
-    return Procedure (self._sm, pMod, object)
+    return Procedure (self._session, pMod, object)
 
+
   # ---------------------------------------------------------------------------
   # A reload () returns only the procedures of the class
   # ---------------------------------------------------------------------------
@@ -54,6 +55,7 @@
     return [["eq", ""], ["field", "gnue_class"], 
             ["const", self.__class.gnue_id]]
 
+
   # ---------------------------------------------------------------------------
   # Get a condition to match a given procedure
   # ---------------------------------------------------------------------------
@@ -64,6 +66,7 @@
             ["const", self.__class.gnue_id],
             ["eq", ""], ["field", "gnue_name"], ["const", procName]]
 
+
   # ---------------------------------------------------------------------------
   # Get a list of columns to be prepared on a find () 
   # ---------------------------------------------------------------------------
@@ -71,6 +74,7 @@
     return ["gnue_module", "gnue_class", "gnue_name", "gnue_language"]
 
 
+
 # =============================================================================
 # A Business Object Procedure
 # =============================================================================
@@ -79,8 +83,8 @@
   # ---------------------------------------------------------------------------
   # Construct a new procedure from module, class and business object
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, module, object, pDefs = None):
-    BaseObject.__init__ (self, sessionManager, 'gnue_procedure', object, pDefs)
+  def __init__ (self, session, module, object, pDefs = None):
+    BaseObject.__init__ (self, session, 'gnue_procedure', object, pDefs)
 
     # gnue_procedure.gnue_name is already a fully qualified identifier
     self.fullName = createName (module.gnue_name, self.gnue_name)

Modified: trunk/gnue-appserver/src/classrep/Property.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Property.py       2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/classrep/Property.py       2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -31,30 +31,31 @@
 class PropertyDict (BaseDictionary):
 
   # ---------------------------------------------------------------------------
-  # Construct a Property-Dictionary for class klass
+  # Construct a Property-Dictionary for class aClass
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, session, klass, predefs = None):
+  def __init__ (self, session, aClass, predefs = None):
     BaseDictionary.__init__ (self, session, 'gnue_property')
 
-    self._sm      = sessionManager
-    self.__class  = klass
+    self.__class  = aClass
     self.__module = self.__class.module
 
     # predefs is a list of dictionaries, describing the properties
     if predefs is not None:
       for pDef in predefs:
         pMod = self.__module.modules.find (pDef ['gnue_module'])
-        prop = Property (self._sm, pMod, None, pDef)
+        prop = Property (session, pMod, None, pDef)
 
         self._items [prop.fullName] = prop
 
+
   # ---------------------------------------------------------------------------
   # Create a new instance of a dictionary item
   # ---------------------------------------------------------------------------
   def _getNewItem (self, object):
     pMod = self.__module.modules.find (object.gnue_module)
-    return Property (self._sm, pMod, object)
+    return Property (self._session, pMod, object)
 
+
   # ---------------------------------------------------------------------------
   # Restrict a reload () to the classes properties 
   # ---------------------------------------------------------------------------
@@ -62,6 +63,7 @@
     return [["eq", ""], ["field", "gnue_class"], 
             ["const", self.__class.gnue_id]]
 
+
   # ---------------------------------------------------------------------------
   # Return a condition to match a given Property
   # ---------------------------------------------------------------------------
@@ -70,6 +72,7 @@
             ["const", self.__class.gnue_id],
             ["eq", ""], ["field", "gnue_name"], ["const", key]]
 
+
   # ---------------------------------------------------------------------------
   # Return a list of columns to be prepared by a find ()
   # ---------------------------------------------------------------------------
@@ -78,6 +81,7 @@
             "gnue_length", "gnue_scale", "gnue_comment"]
 
 
+
 # =============================================================================
 # A Business Object Property
 # =============================================================================
@@ -86,9 +90,8 @@
   # ---------------------------------------------------------------------------
   # Construct a new property from module, class and business object
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, module, object, pDefs = None):
-    
-    BaseObject.__init__ (self, sessionManager, 'gnue_property', object, pDefs)
+  def __init__ (self, session, module, object, pDefs = None):
+    BaseObject.__init__ (self, session, 'gnue_property', object, pDefs)
 
     self.__module   = module
 

Modified: trunk/gnue-appserver/src/classrep/__init__.py
===================================================================
--- trunk/gnue-appserver/src/classrep/__init__.py       2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/classrep/__init__.py       2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -38,9 +38,10 @@
   
   # First, load the hardwired default repository
   try:
-    basedir  = os.path.dirname(sys.modules["gnue.appserver.classrep"].__file__)
+    basedir  = os.path.dirname 
(sys.modules["gnue.appserver.classrep"].__file__)
   except:
-    basedir  = os.path.dirname(__file__)    
+    basedir  = os.path.dirname (__file__)    
+    
   if not os.path.isfile (os.path.join (basedir, "repository.ini")):
     basedir = os.path.join (paths.data, "share", "gnue", "appserver")
 
@@ -52,8 +53,8 @@
   bootcat = RepositoryDefinition (defaultRepository)
 
   # Boot the class repository using this boot-catalogue
-  server.modules = ModuleDict (server, session, bootcat)
-  server.classes = ClassDict (server, session, server.modules, None, bootcat)
+  server.modules = ModuleDict (session, bootcat)
+  server.classes = ClassDict (session, server.modules, None, bootcat)
   server.modules.classdict = server.classes
 
   # and finally refresh the repository from the datasource

Modified: trunk/gnue-appserver/src/classrep/test.py
===================================================================
--- trunk/gnue-appserver/src/classrep/test.py   2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/classrep/test.py   2004-02-04 16:04:22 UTC (rev 
5065)
@@ -37,6 +37,7 @@
 
 print '\nModule "address":'
 m = sm.modules ["address"]
+m._session.setcontext ('address')
 # m = sm.modules ["gnue"]
 print "%s: %s\n" % (m.gnue_name, m.gnue_comment)
 

Modified: trunk/gnue-appserver/src/geasInstance.py
===================================================================
--- trunk/gnue-appserver/src/geasInstance.py    2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/geasInstance.py    2004-02-04 16:04:22 UTC (rev 
5065)
@@ -267,14 +267,13 @@
     # procedure doesn't kill appserver.
     # (needs to be implemented as an option in gnue-common)
 
-    # Create an object representing the current business object
-    obj = Object.Object (self._session.sm, self._session.id,
-                         self._classdef.fullName,
-                         {"gnue_id": self._getValue ("gnue_id")})
-
     # Create a session object which with the actual session id
     sess = Session.Session (self._session.sm, self._session.id)
 
+    # Create an object representing the current business object
+    obj = Object.Object (sess, self._classdef.fullName, 
+                         self._getValue ("gnue_id"))
+
     # fetch the procedure definition
     proceduredef = self._classdef.procedures [procedurename]
 

Added: trunk/gnue-appserver/src/language/Exceptions.py
===================================================================
--- trunk/gnue-appserver/src/language/Exceptions.py     2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/language/Exceptions.py     2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -0,0 +1,61 @@
+# GNU Enterprise Application Server - Language interface Exceptions
+#
+# Copyright 2003-2004 Free Software Foundation
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General Public 
+# License as published by the Free Software Foundation; either 
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be 
+# useful, but WITHOUT ANY WARRANTY; without even the implied 
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public 
+# License along with program; see the file COPYING. If not, 
+# write to the Free Software Foundation, Inc., 59 Temple Place 
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+
+# ===========================================================================
+# Base class for all language interface exceptions
+# ===========================================================================
+class ELanguageInterface (Exception):
+
+  def __init__ (self, text):
+    self.__text = text
+    Exception.__init__ (self, self.__text)
+
+  def __repr__ (self):
+    return self.__text
+
+
+# ---------------------------------------------------------------------------
+# General qualification error
+# ---------------------------------------------------------------------------
+class EQualificationError (ELanguageInterface):
+
+  def __init__ (self, text):
+    ELanguageInterface.__init__ (self, text)
+
+# ---------------------------------------------------------------------------
+# Qualification error: no context given
+# ---------------------------------------------------------------------------
+class ENoContext (EQualificationError):
+
+  def __init__ (self, name):
+    msg = "Cannot qualifiy name '%s', no context specified." % name
+    EQualificationError.__init__ (self, msg)
+
+# ---------------------------------------------------------------------------
+# EMemberNotFound: Business object has no such member
+# ---------------------------------------------------------------------------
+class EMemberNotFound (ELanguageInterface):
+  def __init__ (self, aClass, aMember):
+    ELanguageInterface.__init__ (self, "Class '%s' has no member '%s'" % 
+                                 (aClass, aMember))


Property changes on: trunk/gnue-appserver/src/language/Exceptions.py
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: trunk/gnue-appserver/src/language/Object.py
===================================================================
--- trunk/gnue-appserver/src/language/Object.py 2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/language/Object.py 2004-02-04 16:04:22 UTC (rev 
5065)
@@ -25,7 +25,9 @@
 import types
 import mx.DateTime
 import mx.DateTime.ISO
+
 from Procedure import Procedure
+from Exceptions import EMemberNotFound
 
 # ===========================================================================
 # Helper methods
@@ -37,135 +39,129 @@
 class Object:
 
   # -------------------------------------------------------------------------
-  # create a new instance: collection is the owning ObjectList and objData
-  # is a dictionary as returned by fetch()
+  # Constructor
   # -------------------------------------------------------------------------
-  def __init__ (self, server, sessionId, classname, objData=None):
+  def __init__ (self, session, classname, objectId = None):
     # we won't trigger __setattr__ here ...
-    self.__dict__['_server']     = server
-    self.__dict__['_session_id'] = sessionId
-    self.__dict__['_class']      = classname
-    self.__dict__['_cache']      = {}
-    self.__dict__['objectId']    = None
+    self.__dict__['objectId']         = objectId
+    self.__dict__['_Object__session'] = session
+    self.__dict__['_Object__class']   = classname
 
-    # if a dictionary with instance data is given, populate the cache
-    if objData:
-      self.objectId = objData ['gnue_id']
 
-      if len (objData) > 1:
-        # figure out what types the attributes in objData have
-        plist = objData.keys ()
-        plist.sort ()
-        res = self._server.load (self._session_id, self._class, [''], plist)
-
-        # NOTE: in Python 2.3 we would use the enumerate () builtin :)
-        pix = 0
-        for key in plist:
-          self._cache [key] = self.rpc_to_native (objData [key], res [0] [pix])
-          pix += 1
-
-
   # -------------------------------------------------------------------------
   # Return an attribute's value; if not available in cache load from server
   # -------------------------------------------------------------------------
   def __getattr__ (self, attr):
-    if not self._cache.has_key (attr):
-      if self._attrIsValid (attr):
-        if self.objectId:
-         res = self._server.load (self._session_id, self._class, 
-                                  [self.objectId, ''], [attr])
-         # self._cache [attr] = self.rpc_to_native (res [0] [0], res [1] [0])
-         return self.rpc_to_native (res [0] [0], res [1] [0])
-        else:
-          res = self._server.load (self._session_id, self._class, [''], [attr])
-          # self._cache [attr] = self.rpc_to_native (None, res [0] [0])
-          return self.rpc_to_native (None, res [0] [0])
+    name = self.__session.qualify (attr)
 
-      elif self._attrIsMethod (attr):
-        return Procedure (self._server, self._session_id, self.objectId,
-            self._class, attr)
+    if self.__attrIsMethod (name):
+      return Procedure (self.__session, self.objectId, self.__class, name)
+
+    elif self.__attrIsValid (name):
+      sm   = self.__session.getSessionManager ()
+      sid  = self.__session.getSessionId ()
+
+      if self.objectId:
+        res = sm.load (sid, self.__class, [self.objectId, ''], [name])
+        (value, datatype) = (res [0][0], res [1][0])
+
+      # if no objectId is available we assume it's a new object
       else:
-        raise AttributeError, attr
+        res = sm.load (sid, self.__class, [''], [name])
+        (value, datatype) = (None, res [0][0])
 
-    print "ERR: %s.%s" % (self._class, attr)
-    return self._cache [attr]
+      return self.__rpc_to_native (value, datatype)
 
+    else:
+      raise EMemberNotFound (self.__class, name)
 
+
   # -------------------------------------------------------------------------
   # Set an attribute's value
   # -------------------------------------------------------------------------
   def __setattr__ (self, attr, value):
-    if self.__dict__.has_key (attr):
-      self.__dict__ [attr] = value
+    if self.__attrIsValid (attr):
+      name = self.__session.qualify (attr)
+      sm   = self.__session.getSessionManager ()
+      sid  = self.__session.getSessionId ()
+
+      res = sm.store (sid, self.__class, [self.objectId], name,
+                      [self.__native_to_rpc (value)])
+      self.objectId = res [0]
+
     else:
-      if not self._attrIsValid (attr):
-       raise AttributeError, attr
+      raise AttributeError, attr
 
-      self._cache [attr] = value
 
   # -------------------------------------------------------------------------
   # Return the Object-ID as string representation
   # -------------------------------------------------------------------------
-  # TODO: check if using __repr__() instead is a better solution
   def __str__ (self):
     return self.objectId
 
 
   # -------------------------------------------------------------------------
-  # Check if 'attr' is a valid attribute of this class
+  # Check if 'attr' is a valid property of this class
   # -------------------------------------------------------------------------
-  def _attrIsValid (self, attr):
-    return self._server.classes [self._class].properties.has_key (attr)
+  def __attrIsValid (self, attr):
+    name = self.__session.qualify (attr)
+    cdef = self.__session.getSessionManager ().classes [self.__class]
+    return cdef.properties.has_key (name)
 
   # -------------------------------------------------------------------------
   # Check if 'attr' is a valid procedure of this class
   # -------------------------------------------------------------------------
-  def _attrIsMethod (self, attr):
-    return self._server.classes [self._class].procedures.has_key (attr)
+  def __attrIsMethod (self, attr):
+    name = self.__session.qualify (attr)
+    cdef = self.__session.getSessionManager ().classes [self.__class]
+    return cdef.procedures.has_key (name)
 
+
   # -------------------------------------------------------------------------
   # Get an apropriate default value for type
   # -------------------------------------------------------------------------
-  def _defaultValue (self, type):
+  def __defaultValue (self, datetype):
     # NOTE: we assume None to be default value for all types
     return None
 
+
   # -------------------------------------------------------------------------
   # Convert RPC transportable type into native python object
   # -------------------------------------------------------------------------
-  def rpc_to_native (self, value, type):
+  def __rpc_to_native (self, value, datatype):
     # Empty strings indicate a default value
     if value == '':
-      return self._defaultValue (type)
+      return self.__defaultValue (datatype)
 
     # String: convert to unicode
-    elif type [:7] == 'string(':
+    elif datatype [:7] == 'string(':
       return unicode (value, 'utf-8')
 
     # Date: convert to mx.DateTime object
-    elif type == 'date':
+    elif datatype == 'date':
       return mx.DateTime.ISO.ParseDate (value)
 
     # Time: convert to mx.DateTime object
-    elif type == 'time':
+    elif datatype == 'time':
       return mx.DateTime.ISO.ParseTime (value)
 
     # DateTime: convert to mx.DateTime object
-    elif type == 'datetime':
+    elif datatype == 'datetime':
       return mx.DateTime.ISO.ParseDateTime (value)
 
     # id, number and boolean: no need to convert
-    elif type in ['id', 'boolean'] or type [:6] == 'number':
+    elif datatype in ['id', 'boolean'] or datatype [:6] == 'number':
       return value
 
     # All others (should be reference-type)
     else:
-      return Object (self._server, self._session_id, type, {'gnue_id': value})
+      return Object (self.__session, datatype, value)
 
+
   # -------------------------------------------------------------------------
   # Convert native Python object into RPC transportable datatype
   # -------------------------------------------------------------------------
-  def native_to_rpc (self, value):
+  def __native_to_rpc (self, value):
     if value is None:
       return ''
     elif isinstance (value, types.UnicodeType):
@@ -175,27 +171,9 @@
 
 
   # -------------------------------------------------------------------------
-  # Store this instance 
-  # -------------------------------------------------------------------------
-  def store (self):
-    data = []
-    prop = []
-
-    # make sure the property-list and the data-list have the same order
-    for key in self._cache.keys ():
-      if key == 'gnue_id': 
-       continue
-      prop.append (key)
-      data.append (self.native_to_rpc (self._cache [key]))
-
-    res = self._server.store (self._session_id, self._class, [self.objectId],
-                              prop, [data])
-    self.objectId = res [0]
-
-  # -------------------------------------------------------------------------
   # Delete instance and clear object-id
   # -------------------------------------------------------------------------
   def delete (self):
-    self._server.delete (self._session_id, self._class, [self.objectId])
+    self.__session.getSessionManager ().delete (
+               self.__session.getSessionId (), self.__class, [self.objectId])
     self.objectId = None
-

Modified: trunk/gnue-appserver/src/language/ObjectList.py
===================================================================
--- trunk/gnue-appserver/src/language/ObjectList.py     2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/language/ObjectList.py     2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -34,24 +34,23 @@
   # -------------------------------------------------------------------------
   # Constructor
   # -------------------------------------------------------------------------
-  def __init__ (self, server, sessionId, classname, cond, sort, properties):
-    self._server     = server
-    self._session_id = sessionId
-    self._cache      = []
+  def __init__ (self, session, classname, cond, sort, properties):
     self.classname   = classname
     self.conditions  = cond
     self.sortOrder   = sort
     self.properties  = properties
 
-    # prepare the sequence-cache
-    self._buildCache ()
+    self.__session   = session
+    self.__list      = []
 
+    self.__buildList ()
 
+
   # -------------------------------------------------------------------------
   # Return the number of elements in this sequence
   # -------------------------------------------------------------------------
   def __len__ (self):
-    return self._length
+    return self.__length
 
   # -------------------------------------------------------------------------
   # Return a slice or a specific element of this sequence
@@ -59,68 +58,88 @@
   def __getitem__ (self, index):
     try:
       if type (index) == types.SliceType:
-        return self._cache [index.start:index.stop]
+        return self.__list [index.start:index.stop]
       else:
-        return self._cache [index]
+        return self.__list [index]
+
     except:
-      # try to populate the cache for missing entries
-      if self._populateCache():
+      # try to populate the sequence with missing entries
+      if self.__populateList ():
 
         # if successful try to return entry/entries again
-        return self.__getitem__(index)
+        return self.__getitem__ (index)
       
       else:
         raise IndexError
       
-      
-      
 
   # -------------------------------------------------------------------------
-  # Create a cache for this sequence
+  # Create an initial sequence
   # -------------------------------------------------------------------------
-  def _buildCache (self):
-    self.list_id = self._server.request (self._session_id, self.classname,
-                                         self.conditions, self.sortOrder, 
-                                        self.properties)
-    # fix for gnue-common 0.5.1 release:
-    #  - don't depend on RecordSet.Count functionality
-    # self._length = self._server.count (self._session_id, self.list_id)
-    self._cache  = []
+  def __buildList (self):
+    sm  = self.__session.getSessionManager ()
+    sid = self.__session.getSessionId ()
 
-    self._populateCache()
+    self.__list_id = sm.request (sid, self.classname, self.conditions, 
+                                      self.sortOrder, self.properties)
+    self.__list = []
+    self.__populateList ()
 
       
   # -------------------------------------------------------------------------
   # Populate Cache
   # -------------------------------------------------------------------------
-  def _populateCache (self):
-    rset = self._server.fetch (self._session_id, self.list_id, 
-                               len (self._cache), CACHE_STEP, 0)    
+  def __populateList (self):
+    sm  = self.__session.getSessionManager ()
+    sid = self.__session.getSessionId ()
+
+    rset = sm.fetch (sid, self.__list_id, len (self.__list), CACHE_STEP, 0)
     for row in rset:
-      # Just keep the 'gnue_id' property cached 
-      objData = {"gnue_id": row [0]}
-      # i = 0
-      # objData = {}
+      obj = Object (self.__session, self.classname, row [0])
+      self.__list.append (obj)
 
-      # for p in self.properties:
-        # objData [p] = row [i+1]
-        # i += 1
-        
-      # objData ["gnue_id"] = row [0]
-      obj = Object (self._server, self._session_id, self.classname, objData)
-      self._cache.append (obj)
-
     # fix for gnue-common 0.5.1 release (will be removed for later releases 
     # of gnue-common)
-    self._length = len (self._cache)
+    self.__length = len (self.__list)
 
     # return number of updated rows
     return len (rset)
     
 
   # -------------------------------------------------------------------------
-  # Extend the cached sequence
+  # Append an item to the sequence
   # -------------------------------------------------------------------------
   def append (self, value):
-    self._cache.append (value)
+    self.__list.append (value)
 
+
+  # -------------------------------------------------------------------------
+  # Extend the sequence by another list
+  # -------------------------------------------------------------------------
+  def extend (self, alist):
+    self.__list.extend (alist)
+
+
+  # -------------------------------------------------------------------------
+  # Returns the index of the first element with a matching key-value-pair
+  # -------------------------------------------------------------------------
+  def index (self, key, value):
+    idx = 0
+    for item in self.__list:
+      if item.key == value:
+        return idx
+      idx += 1
+
+    raise ValueError, "No %s.%s with a value of '%s' found." % 
+                      (self.classname, key, value)
+
+
+  # -------------------------------------------------------------------------
+  # Returns the number of elements with a matching key-value-pair
+  # -------------------------------------------------------------------------
+  def count (self, key, value):
+    num = 0
+    for item in self.__list:
+      if item.key == value:
+        num += 1
+    return num

Modified: trunk/gnue-appserver/src/language/Procedure.py
===================================================================
--- trunk/gnue-appserver/src/language/Procedure.py      2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/language/Procedure.py      2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: $
+# $Id$
 
 # =============================================================================
 # Implement a callable environment for the language interface 
@@ -29,17 +29,18 @@
   # ---------------------------------------------------------------------------
   # Constructor
   # ---------------------------------------------------------------------------
-  def __init__ (self, sessionManager, sessionId, objectId, className, 
-        procedureName):
-    self._sm         = sessionManager
-    self._session_id = sessionId
-    self._object_id  = objectId
-    self._class      = className
-    self.method      = procedureName
+  def __init__ (self, session, objectId, className, procedureName):
+    self.method      = session.qualify (procedureName)
 
+    self.__session   = session
+    self.__object_id = objectId
+    self.__class     = className
+
   # ---------------------------------------------------------------------------
   # Delegate calls of this object to the session manager
   # ---------------------------------------------------------------------------
   def __call__ (self, *args, **kwargs):
-    self._sm.call (self._session_id, self._class, [self._object_id],
-        self.method, args)
+    sm  = self.__session.getSessionManager ()
+    sid = self.__session.getSessionId ()
+
+    s.call (sid, self.__class, [self.__objectId], self.method, args)

Modified: trunk/gnue-appserver/src/language/Session.py
===================================================================
--- trunk/gnue-appserver/src/language/Session.py        2004-02-02 22:07:47 UTC 
(rev 5064)
+++ trunk/gnue-appserver/src/language/Session.py        2004-02-04 16:04:22 UTC 
(rev 5065)
@@ -23,6 +23,7 @@
 
 from ObjectList import ObjectList
 from Object import Object
+from Exceptions import ENoContext
 
 
 # ===========================================================================
@@ -34,50 +35,74 @@
   # Constructor
   # -------------------------------------------------------------------------
   def __init__ (self, sessionManager, sessionId):
-    self._sm         = sessionManager
-    self._session_id = sessionId
+    self.__sm         = sessionManager
+    self.__session_id = sessionId
+    self.__context    = None
 
   # -------------------------------------------------------------------------
+  # Get the session's sessionManager
+  # -------------------------------------------------------------------------
+  def getSessionManager (self):
+    return self.__sm
+
+  # -------------------------------------------------------------------------
+  # Get the session's id
+  # -------------------------------------------------------------------------
+  def getSessionId (self):
+    return self.__session_id
+
+  # -------------------------------------------------------------------------
+  # Set the default context
+  # -------------------------------------------------------------------------
+  def setcontext (self, context):
+    self.__context = context
+
+  # -------------------------------------------------------------------------
+  # Ensure the given name is fully qualified using the current context
+  # -------------------------------------------------------------------------
+  def qualify (self, name):
+    if '_' in name:
+      return name
+    else:
+      if self.__context is None:
+        raise ENoContext (name)
+      else:
+        return "%s_%s" % (self.__context, name)
+
+
+  # -------------------------------------------------------------------------
   # Close the session 
   # -------------------------------------------------------------------------
   def close (self):
-    if self._sm:
-      self._sm.close (self._session_id, None)
-      self._sm = self._session_id = None
+    if self.__sm is not None:
+      self.__sm.close (self.__session_id, None)
+      self.__sm = self.__session_id = None
 
   # -------------------------------------------------------------------------
   # Commit the current transaction
   # -------------------------------------------------------------------------
   def commit (self):
-    if self._session_id:
-      self._sm.commit (self._session_id)
+    if self.__session_id is not None:
+      self.__sm.commit (self.__session_id)
 
   # -------------------------------------------------------------------------
   # Revoke the current transaction
   # -------------------------------------------------------------------------
   def rollback (self):
-    if self._session_id:
-      self._sm.rollback (self._session_id)
+    if self.__session_id is not None:
+      self.__sm.rollback (self.__session_id)
 
   # -------------------------------------------------------------------------
-  # Set the default context
-  # -------------------------------------------------------------------------
-  def setcontext (self, context):
-    if self._session_id:
-      self._sm.setcontext (self._session_id, context)
-
-  # -------------------------------------------------------------------------
   # Return a collection of 'classname' matching the given arguments
   # -------------------------------------------------------------------------
   def find (self, classname, cond=[], sort=['gnue_id'], properties=[]):
-    return ObjectList (self._sm, self._session_id, classname, cond, sort,
-                       properties)
+    return ObjectList (self, classname, cond, sort, properties)
 
   # -------------------------------------------------------------------------
   # Create a new instance of classname
   # -------------------------------------------------------------------------
   def new (self, classname):
-    return Object (self._sm, self._session_id, classname)
+    return Object (self, classname)
 
 
 
@@ -90,11 +115,10 @@
   # Constructor
   # -------------------------------------------------------------------------
   def __init__ (self, sessionManager, user, password):
-    sessionId = sessionManager.open ({'user': user, 'password': password})
-    Session.__init__ (self, sessionManager, sessionId)
+    Session.__init__ (self, sessionManager,
+                  sessionManager.open ({'user': user, 'password': password}))
 
 
-
 # =============================================================================
 # InternalSession uses 0 as Session-Id
 # =============================================================================

Modified: trunk/gnue-appserver/src/language/test.py
===================================================================
--- trunk/gnue-appserver/src/language/test.py   2004-02-02 22:07:47 UTC (rev 
5064)
+++ trunk/gnue-appserver/src/language/test.py   2004-02-04 16:04:22 UTC (rev 
5065)
@@ -25,8 +25,11 @@
 from gnue.appserver.language import App
 
 app = App.App ()
+
+print "requesting new session ..."
 session = app.newSession ('test', 'test')
 
+print "fetching all persons..."
 list = session.find ('address_person', sort = ['address_name'],
                      properties = ['address_name', 'address_street'])
 

Modified: trunk/gnue-appserver/src/test.py
===================================================================
--- trunk/gnue-appserver/src/test.py    2004-02-02 22:07:47 UTC (rev 5064)
+++ trunk/gnue-appserver/src/test.py    2004-02-04 16:04:22 UTC (rev 5065)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: test.py,v 1.19 2003/10/09 21:42:10 siesel Exp $
+# $Id$
 
 import os
 from gnue.common.apps import GClientApp





reply via email to

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