commit-gnue
[Top][All Lists]
Advanced

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

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


From: johannes
Subject: r5056 - in trunk/gnue-appserver/src: . classrep language
Date: Fri, 30 Jan 2004 07:27:48 -0600 (CST)

Author: johannes
Date: 2004-01-30 07:27:47 -0600 (Fri, 30 Jan 2004)
New Revision: 5056

Removed:
   trunk/gnue-appserver/src/classrep/crpopulate.py
Modified:
   trunk/gnue-appserver/src/classrep/Base.py
   trunk/gnue-appserver/src/classrep/Class.py
   trunk/gnue-appserver/src/classrep/Definition.py
   trunk/gnue-appserver/src/classrep/Module.py
   trunk/gnue-appserver/src/classrep/Namespace.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/dtest.py
   trunk/gnue-appserver/src/classrep/mtest.py
   trunk/gnue-appserver/src/classrep/test.py
   trunk/gnue-appserver/src/geasSession.py
   trunk/gnue-appserver/src/geasSessionManager.py
   trunk/gnue-appserver/src/language/Object.py
   trunk/gnue-appserver/src/language/ObjectList.py
Log:
Rebuilt the classrepository. Language interface has no longer a cache.


Modified: trunk/gnue-appserver/src/classrep/Base.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Base.py   2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/Base.py   2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,30 +19,77 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Base.py,v 1.3 2003/10/21 12:26:50 jvetter Exp $
+# $Id$
 
 import types
+from gnue.appserver.language import Object
+from Namespace import EClassRepository
 
 # =============================================================================
 # Class-wrapper for dictionaries
 # =============================================================================
+
 class BaseDictionary:
 
   # ---------------------------------------------------------------------------
   # Construct an instance 
   # ---------------------------------------------------------------------------
-  def __init__ (self, session, defaultCache = None):
+  def __init__ (self, session, tablename, defaultItems = None):
     self.session = session
-    self._cache  = {}
+    self.table   = tablename
+    self._items  = {}
 
-    if defaultCache:
-      self._cache = defaultCache
+    if defaultItems is not None:
+      self._items = defaultItems
 
   # ---------------------------------------------------------------------------
+  # Reload the dictionary from the database by merging new records in
+  # ---------------------------------------------------------------------------
+  def reload (self):
+    list = self.session.find (self.table, self.getCondition (),
+                                          self.getSortorder (),
+                                          ['gnue_name'])
+    self.mergeIntoList (list)
+
+  # ---------------------------------------------------------------------------
+  # Merge a given object list with the dictionaries list
+  # ---------------------------------------------------------------------------
+  def mergeIntoList (self, addList):
+    for obj in addList:  
+      found = 0
+
+      for item in self._items.values ():
+        if item.gnue_id == obj.gnue_id:
+          found = 1
+          break
+
+      if not found:
+        newItem = self.getNewItem (obj)
+        self._items [newItem.fullName] = newItem
+
+  # ---------------------------------------------------------------------------
+  # Return the conditions to be used on reload ()
+  # ---------------------------------------------------------------------------
+  def getCondition (self):
+    return []
+
+  # ---------------------------------------------------------------------------
+  # Return the sortorder to be used on reload ()
+  # ---------------------------------------------------------------------------
+  def getSortorder (self):
+    return ['gnue_id']
+
+  # ---------------------------------------------------------------------------
+  # Use getNewItem in derived classes to instanciate new dictionary-items
+  # ---------------------------------------------------------------------------
+  def getNewItem (self, obj):
+    raise EClassRepository ("%s: getNewItem() not implemented!" % self.table)
+
+  # ---------------------------------------------------------------------------
   # Return all keys 
   # ---------------------------------------------------------------------------
   def keys (self):
-    keys = self._cache.keys ()
+    keys = self._items.keys ()
     keys.sort ()
     return keys
 
@@ -51,25 +98,25 @@
   # ---------------------------------------------------------------------------
   def values (self):
     keys = self.keys ()
-    return map (self._cache.get, keys)
+    return map (self._items.get, keys)
 
   # ---------------------------------------------------------------------------
   # Return all key-value-pairs
   # ---------------------------------------------------------------------------
   def items (self):
-    return self._cache.items ()
+    return self._items.items ()
 
   # ---------------------------------------------------------------------------
   # Check for a specified key
   # ---------------------------------------------------------------------------
   def has_key (self, key):
-    return self._cache.has_key (key)
+    return self._items.has_key (key)
 
   # ---------------------------------------------------------------------------
   # Return the number of items in the dictionary
   # ---------------------------------------------------------------------------
   def __len__ (self):
-    return len (self._cache)
+    return len (self._items)
 
   # ---------------------------------------------------------------------------
   # Route class-access to the underlying dictionary
@@ -82,23 +129,49 @@
 # This class maps all dictionary-keys to properties
 # =============================================================================
 class BaseObject:
-  def __init__ (self, data):
-    self._data = data
 
   # ---------------------------------------------------------------------------
-  # Undefined attributes must exist in data-dictionary
+  # Constructor
   # ---------------------------------------------------------------------------
+  def __init__ (self, sessionManager, classname, object = None, pDefs = None):
+    self._sm        = sessionManager
+    self.classname  = classname
+    self._object    = object 
+
+    if pDefs is None:
+      self.predefined = {}
+    else:
+      self.predefined = pDefs
+
+  # ---------------------------------------------------------------------------
+  # Return an attributes value
+  # ---------------------------------------------------------------------------
   def __getattr__ (self, attr):
-    try:
-      value = self._data [attr]
-      if isinstance (value, types.UnicodeType):
-        return value.encode ('utf-8')
-      else:
-        return value
+    if self._isPredefined (attr):
+      return self._getValue (self.predefined [attr])
+    else:
+      return self._getValue (getattr (self._getObject (), attr))
 
-    except KeyError:
-      raise AttributeError, attr
+  # ---------------------------------------------------------------------------
+  # Make sure unicode-type values will be encoded as utf-8
+  # ---------------------------------------------------------------------------
+  def _getValue (self, value):
+    if isinstance (value, types.UnicodeType):
+      return value.encode ('utf-8')
+    else:
+      return value
 
-    except:
-      raise
+  # ---------------------------------------------------------------------------
+  # Check wether an attribute is predefined or not
+  # ---------------------------------------------------------------------------
+  def _isPredefined (self, attr):
+    return self.predefined.has_key (attr)
 
+  # ---------------------------------------------------------------------------
+  # Get a language interface object
+  # ---------------------------------------------------------------------------
+  def _getObject (self):
+    if self._object is None:
+      self._object = Object (self._sm, 0, self.classname, self.gnue_id)
+    else:
+      return self._object

Modified: trunk/gnue-appserver/src/classrep/Class.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Class.py  2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/Class.py  2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Class.py,v 1.11 2003/11/08 18:43:28 siesel Exp $
+# $Id$
 
 import types
 from Base import *
@@ -35,44 +35,50 @@
   # ---------------------------------------------------------------------------
   # Create a dictionary with all classes [from a specified module]
   # ---------------------------------------------------------------------------
-  def __init__ (self, session, moduleDict, module = None, definition = None):
-    BaseDictionary.__init__ (self, session)
+  def __init__ (self, sessionManager, session, moduleDict, module = None, 
+                predefines = None):
+    BaseDictionary.__init__ (self, session, 'gnue_class')
 
+    self._sm        = sessionManager
     self.modules    = moduleDict
     self._module    = module
 
-    self.definition = definition
+    if predefines is not None:
+      for cDict in predefines.classes ():
+        cMod     = self.modules.find (cDict ['gnue_module'])
+        proplist = predefines.properties (cDict ['gnue_id'])
 
-    if not definition:
-      self.definition = self.modules.definition
+        aClass = Class (self._sm, session, self, cMod, None, cDict, proplist)
+        self._items [aClass.fullName] = aClass
 
-    # if we have an initial definition, use all it's classes
-    if self.definition:
-      list = [klass [1] for klass in self.definition.classes ()]
-      self._updateCache (list)
-
     # if a module is specified, fetch all it's classes 
     if module is not None:
       if self.modules.classdict:
         for item in self.modules.classdict.values ():
           if item.module.fullName == module.fullName:
-            self._cache [item.fullName] = item
+            self._items [item.fullName] = item
       else:
-        self._updateCache (self._requestData (module.gnue_id))
+        self.mergeIntoList (self._requestData (module.gnue_id))
 
-    # otherwise preload the cache with all available classes !
-    else:
-      self._updateCache (self._requestData ())
 
   # ---------------------------------------------------------------------------
-  # Update the cache with all business objects in list
+  # Create a new instance for a dictionary-item
   # ---------------------------------------------------------------------------
-  def _updateCache (self, list):
-    for item in list:
-      klass = self._class_from_cache (item)
-      self._cache [klass.fullName] = klass
+  def getNewItem (self, object):
+    module = self.modules.find (object.gnue_module)
+    return Class (self._sm, self.session, self, module, object)
 
   # ---------------------------------------------------------------------------
+  # Get an apropriate reload ()-condition
+  # ---------------------------------------------------------------------------
+  def getCondition (self):
+    if self._module is not None:
+      return [["eq", ""], ["field", "gnue_module"], 
+             ["const", self._module.gnue_id]]
+    else:
+      return []
+
+  # ---------------------------------------------------------------------------
   # Request a list of matching business objects
   # ---------------------------------------------------------------------------
   def _requestData (self, moduleId = None, className = None):
@@ -91,22 +97,6 @@
                               ["gnue_module", "gnue_name"])
 
   # ---------------------------------------------------------------------------
-  # Return an item from the cache using the ModuleDict for module verification
-  # ---------------------------------------------------------------------------
-  def _class_from_cache (self, item):
-    module = self._module_from_cache (item)
-    return Class (self, module, item)
-
-  # ---------------------------------------------------------------------------
-  # Return the module of a cached item
-  # ---------------------------------------------------------------------------
-  def _module_from_cache (self, item):
-    for module in self.modules.values ():
-      if module.gnue_id == item.gnue_module:
-       return module
-    raise EBadReference (item.gnue_name, "gnue_module")
-
-  # ---------------------------------------------------------------------------
   # Return a class object if it exists
   # ---------------------------------------------------------------------------
   def get (self, name):
@@ -114,15 +104,15 @@
     module = self.modules [moduleName]
 
     # is the class already cached ?
-    if self._cache.has_key (name):
-      return self._cache [name]
+    if self._items.has_key (name):
+      return self._items [name]
 
     # since we had no match cached, ask for it
     res = self._requestData (module.gnue_id, className)
 
     if len (res) == 1:
-      self._updateCache (res)
-      return self._cache [name]
+      self._items [name] = self.getNewItem (res [0])
+      return self._items [name]
 
     raise EClassNotFound (name)
 
@@ -131,34 +121,26 @@
 # =============================================================================
 # An implementation of a single class
 # =============================================================================
-class Class:
+class Class (BaseObject):
   
   # ---------------------------------------------------------------------------
   # Wrapping a business object class
   # ---------------------------------------------------------------------------
-  def __init__ (self, classDict, module, object):
-    self._object    = object
-    self.classes    = classDict
+  def __init__ (self, sessionManager, session, classDict, module, object, 
+                predefs = None, propDefList = None):
+    BaseObject.__init__ (self, sessionManager, 'gnue_class', object, predefs)
+
+    self.session    = session
     self.module     = module
-    self.definition = classDict.definition
     self.fullName   = createName (module.gnue_name, self.gnue_name)
     self.table      = self.fullName
+    self.classes    = classDict
 
-    self.properties = PropertyDict (classDict.session, classDict.modules, self)
-    self.procedures = ProcedureDict (classDict.session, classDict.modules, 
self)
+    self.properties = PropertyDict (self._sm, session, self, propDefList)
+    self.procedures = ProcedureDict (self._sm, session, self)
 
 
   # ---------------------------------------------------------------------------
-  # Attribute access is redirected into the gnue-namespace
-  # ---------------------------------------------------------------------------
-  def __getattr__ (self, attr):
-    value = getattr (self._object, attr)
-    if isinstance (value, types.UnicodeType):
-      return value.encode ('utf-8')
-    else:
-      return value
-
-  # ---------------------------------------------------------------------------
   # Return a property by name
   # ---------------------------------------------------------------------------
   def findProp (self, name):

Modified: trunk/gnue-appserver/src/classrep/Definition.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Definition.py     2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/Definition.py     2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Definition.py,v 1.3 2003/09/19 09:00:48 reinhard Exp $
+# $Id$
 
 import ConfigParser
 import string
@@ -97,7 +97,7 @@
   def modules (self):
     res = []
     for module in self._modules.keys ():
-      res.append ((module, BaseObject (self._modules [module])))
+      res.append (self._modules [module])
 
     return res
   
@@ -107,10 +107,10 @@
   def classes (self, module = None):
     res = []
     for classname in self._classes.keys ():
-      if module and splitName (classname) [0] <> module:
-       continue
+      if (module is not None) and splitName (classname) [0] <> module:
+        continue
 
-      res.append ((classname, BaseObject (self._classes [classname])))
+      res.append (self._classes [classname])
 
     return res
 
@@ -120,10 +120,12 @@
   def properties (self, klass = None):
     res = []
     for propname in self._properties.keys ():
-      if klass and string.split (propname, '.') [0] <> klass:
-       continue
+      if klass:
+        if string.split (propname, '.') [0] <> klass and \
+           self._properties [propname] ['gnue_class'] <> klass:
+          continue
 
-      res.append ((propname, BaseObject (self._properties [propname])))
+      res.append (self._properties [propname])
 
     return res
 
@@ -139,6 +141,7 @@
   for m in x.modules ():
     print m
 
+
   print "\nClasses:"
   for c in x.classes ():
     print c
@@ -150,15 +153,12 @@
   print "\n\n"
 
   for p in x.properties ('gnue_module'):
-    (key, obj) = p
-    print "Key :", key
-    print "Name:", obj.gnue_name
+    print "gnue_module::", p
 
 
-  print [m [1] for m in x.modules ()]
-  mmod = x.modules () [0][1]
-  print mmod._data.keys ()
-
   print "----"
 
   print x.classes ('gnue')
+
+  print "=============="
+  print x.properties ('00000000000000000000000000000010')

Modified: trunk/gnue-appserver/src/classrep/Module.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Module.py 2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/Module.py 2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Module.py,v 1.9 2003/10/21 12:26:50 jvetter Exp $
+# $Id$
 
 import types
 from Base import *
@@ -35,39 +35,23 @@
   # 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, session, definition = None):
-    BaseDictionary.__init__ (self, session)
-    self.definition = definition
-    self.classdict  = None
+  def __init__ (self, sessionManager, session, predefines = None):
+    BaseDictionary.__init__ (self, session, 'gnue_module')
 
-    if definition:
-      self._updateCache ([module [1] for module in definition.modules ()])
-    else:
-      self._updateCache (self._requestData ())
+    self._sm = sessionManager
 
-  # ---------------------------------------------------------------------------
-  # Integrate a list of business objects into the cache
-  # ---------------------------------------------------------------------------
-  def _updateCache (self, list):
-    for item in list:
-      module = self._module_from_cache (item)
-      self._cache [module.fullName] = module
+    # 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)
+        self._items [module.fullName] = module
 
-  # ---------------------------------------------------------------------------
-  # Internal: Request modules from datasource (optional matching a name)
-  # ---------------------------------------------------------------------------
-  def _requestData (self, name = None):
-    cond = []
-    if name:
-      cond = [["eq", ""], ["field", "gnue_name"], ["const", name]]
-    return self.session.find ("gnue_module", cond, ["gnue_name"],
-                             ["gnue_name", "gnue_id"])
 
   # ---------------------------------------------------------------------------
-  # Internal: create an instance from a cached object
+  # Create a new module instance
   # ---------------------------------------------------------------------------
-  def _module_from_cache (self, item):
-    return Module (self, item)
+  def getNewItem (self, object):
+    return Module (self._sm, self.session, self, object)
 
   # ---------------------------------------------------------------------------
   # Return a Module object if the given module exists
@@ -75,30 +59,43 @@
   def get (self, name):
     # is the requested module cached? 
     if self.has_key (name):
-      return self._cache [name]
+      return self._items [name]
 
     # since it isn't cached we've to ask for it
-    list = self._requestData (name)
+    cond = [["eq", ""], ["field", "gnue_name"], ["const", name]]
+    list = self.session.find ("gnue_module", cond, ["gnue_name"],
+                             ["gnue_name", "gnue_id"])
 
     # if we have an exact match extend the cache
     if len (list) == 1:
-      self._updateCache (list)
-      return self._cache [name]
+      self._items [name] = self.getNewItem (list [0])
+      return self._items [name]
       
     raise EModuleNotFound (name)
 
+  # ---------------------------------------------------------------------------
+  # Find a listed module by its id
+  # ---------------------------------------------------------------------------
+  def find (self, moduleId):
+    for mod in self.values ():
+      if mod.gnue_id == moduleId:
+        return mod
+    return None
 
 
 # =============================================================================
 # A Business Object Module
 # =============================================================================
-class Module:
+class Module (BaseObject):
 
-  def __init__ (self, modDict, object):
-    # _object is the underlying business object
-    self.modules  = modDict
-    self._object  = object
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+  def __init__ (self, sessionManager, session, mDict, object=None, pDefs=None):
+    BaseObject.__init__ (self, sessionManager, 'gnue_module', object, pDefs)
 
+    self.session  = session
+    self.modules  = mDict
     self.fullName = self.gnue_name
 
   # ---------------------------------------------------------------------------
@@ -106,13 +103,11 @@
   # ---------------------------------------------------------------------------
   def __getattr__ (self, attr):
     if attr == 'classes':
-      self.__dict__ ['classes'] = ClassDict (self.modules.session,
+      self.__dict__ ['classes'] = ClassDict (self._sm, self.session, 
                                              self.modules, self)
+      # Make sure the created class-dictionary is up to date
+      self.classes.reload ()
       return self.classes
-
     else:
-      value = getattr (self._object, attr)
-      if isinstance (value, types.UnicodeType):
-        return value.encode ('utf-8')
-      else:
-        return value
+      return BaseObject.__getattr__ (self, attr)
+

Modified: trunk/gnue-appserver/src/classrep/Namespace.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Namespace.py      2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/Namespace.py      2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Namespace.py,v 1.4 2003/10/19 22:08:04 reinhard Exp $
+# $Id$
 
 import string
 
@@ -76,6 +76,14 @@
     EClassRepository.__init__ (self, msg)
 
 # =============================================================================
+# Requested property does not exist
+# =============================================================================
+class EProcedureNotFound (EClassRepository):
+  def __init__ (self, classname, procedure):
+    msg = "Class '%s' has no procedure '%s'." % (classname, procedure)
+    EClassRepository.__init__ (self, msg)
+
+# =============================================================================
 # Class repository definition file has an invalid structure
 # =============================================================================
 class EInvalidDefinition (EClassRepository):

Modified: trunk/gnue-appserver/src/classrep/Procedure.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Procedure.py      2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/Procedure.py      2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Procedure.py,v 1.2 2003/11/09 23:40:41 siesel Exp $
+# $Id$
 
 import types
 from Base import *
@@ -30,46 +30,37 @@
 # =============================================================================
 class ProcedureDict (BaseDictionary):
 
+  #
+  # TODO: find a good place to call a ProcedureDict.reload () automatically
+  #
+
   # ---------------------------------------------------------------------------
   # Construct a Procedure-Dictionary for class klass
   # ---------------------------------------------------------------------------
-  def __init__ (self, session, moduleDict, klass, definition = None):
-    BaseDictionary.__init__ (self, session)
+  def __init__ (self, sessionManager, session, klass, predefs = None):
+    BaseDictionary.__init__ (self, session, 'gnue_procedure')
 
-    self.modules    = moduleDict
+    self._sm        = sessionManager
     self.klass      = klass
-    self.definition = definition
+    self.module     = klass.module
 
-    if not self.definition:
-      self.definition = klass.definition
+  # ---------------------------------------------------------------------------
+  # 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, self.klass, object)
 
-    if not self.definition:
-      self.definition = moduleDict.definition
-
-    if self.definition:
-      list = [prop [1] for prop in self.definition.properties (klass.fullName)]
-      self._updateCache (list)
-
-    self._updateCache (self._requestData (self.klass.gnue_id))
-
   # ---------------------------------------------------------------------------
-  # Update cache with all business objects in list
+  # A reload () returns only the procedures of the class
   # ---------------------------------------------------------------------------
-  def _updateCache (self, list):
-    for item in list:
-      procedure = self._procedure_from_cache (item)
-      self._cache [procedure.fullName] = procedure
+  def getCondition (self):
+    return [["eq", ""], ["field", "gnue_class"], ["const", self.klass.gnue_id]]
 
   # ---------------------------------------------------------------------------
   # Read a list of properties from the datasource
   # ---------------------------------------------------------------------------
   def _requestData (self, classId, procedureName = None):
-    # Special case: if there is already a procedure with a matching class id
-    # we assume all properties of the requesed class are already cached
-    for prop in self.values ():
-      if prop.gnue_class == classId: 
-       return []
-
     cond = [["eq", ""], ["field", "gnue_class"], ["const", classId]]
 
     if procedureName:
@@ -81,38 +72,21 @@
                                 "gnue_comment"])
 
   # ---------------------------------------------------------------------------
-  # Get a procedure from the cache
-  # ---------------------------------------------------------------------------
-  def _procedure_from_cache (self, item):
-    return Procedure (self._module_from_cache (item), self.klass, item)
-
-  # ---------------------------------------------------------------------------
-  # Get a module from a cache-item
-  # ---------------------------------------------------------------------------
-  def _module_from_cache (self, item):
-    for module in self.modules.values ():
-      if module.gnue_id == item.gnue_module:
-       return module
-    raise EBadReference (item.gnue_name, "gnue_module")
-
-
-  # ---------------------------------------------------------------------------
   # Return a Procedure object if it exists
   # ---------------------------------------------------------------------------
   def get (self, name):
-    (moduleName, propName) = splitName (name)
-    module = self.modules [moduleName]
+    (moduleName, procName) = splitName (name)
 
     # is the procedure already cached
     if self.has_key (name):
-      return self._cache [name]
+      return self._items [name]
 
     # since we had no match in the cache ask for it
-    res = self._requestData (self.klass.gnue_id, name)
+    res = self._requestData (self.klass.gnue_id, procName)
 
     if len (res) == 1:
-      self._updateCache (res)
-      return self._cache [name]
+      self._items [name] = self.getNewItem (res [0])
+      return self._items [name]
 
     raise EProcedureNotFound (self.klass.fullName, name)
 
@@ -120,25 +94,17 @@
 # =============================================================================
 # A Business Object Procedure
 # =============================================================================
-class Procedure:
+class Procedure (BaseObject):
 
   # ---------------------------------------------------------------------------
   # Construct a new procedure from module, class and business object
   # ---------------------------------------------------------------------------
-  def __init__ (self, module, klass, object):
-    self.module   = module
+  def __init__ (self, sessionManager, module, klass, object, pDefs = None):
+    BaseObject.__init__ (self, sessionManager, 'gnue_procedure', object, pDefs)
+
     self.klass    = klass
-    self._object  = object
+    self.module   = module
 
     # gnue_procedure.gnue_name is already a fully qualified identifier
     self.fullName = createName (module.gnue_name, self.gnue_name)
 
-  # ---------------------------------------------------------------------------
-  # all unknown attributes are routed to the gnue-namespace
-  # ---------------------------------------------------------------------------
-  def __getattr__ (self, attr):
-    value = getattr (self._object, attr)
-    if isinstance (value, types.UnicodeType):
-      return value.encode ('utf-8')
-    else:
-      return value

Modified: trunk/gnue-appserver/src/classrep/Property.py
===================================================================
--- trunk/gnue-appserver/src/classrep/Property.py       2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/Property.py       2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: Property.py,v 1.9 2003/10/19 22:08:04 reinhard Exp $
+# $Id$
 
 import types
 from Base import *
@@ -33,32 +33,33 @@
   # ---------------------------------------------------------------------------
   # Construct a Property-Dictionary for class klass
   # ---------------------------------------------------------------------------
-  def __init__ (self, session, moduleDict, klass, definition = None):
-    BaseDictionary.__init__ (self, session)
+  def __init__ (self, sessionManager, session, klass, predefs = None):
+    BaseDictionary.__init__ (self, session, 'gnue_property')
 
-    self.modules    = moduleDict
+    self._sm        = sessionManager
     self.klass      = klass
-    self.definition = definition
+    self.module     = klass.module
 
-    if not self.definition:
-      self.definition = klass.definition
+    if predefs is not None:
+      for pDef in predefs:
+        pMod = self.module.modules.find (pDef ['gnue_module'])
+        prop = Property (self._sm, pMod, self.klass, None, pDef)
+        self._items [prop.fullName] = prop
+    else:
+      self.reload ()
 
-    if not self.definition:
-      self.definition = moduleDict.definition
+  # ---------------------------------------------------------------------------
+  # 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, self.klass, object)
 
-    if self.definition:
-      list = [prop [1] for prop in self.definition.properties (klass.fullName)]
-      self._updateCache (list)
-
-    self._updateCache (self._requestData (self.klass.gnue_id))
-
   # ---------------------------------------------------------------------------
-  # Update cache with all business objects in list
+  # Restrict a reload () to the classes properties 
   # ---------------------------------------------------------------------------
-  def _updateCache (self, list):
-    for item in list:
-      property = self._property_from_cache (item)
-      self._cache [property.fullName] = property
+  def getCondition (self):
+    return [["eq", ""], ["field", "gnue_class"], ["const", self.klass.gnue_id]]
 
   # ---------------------------------------------------------------------------
   # Read a list of properties from the datasource
@@ -81,38 +82,19 @@
                                 "gnue_comment"])
 
   # ---------------------------------------------------------------------------
-  # Get a property from the cache
-  # ---------------------------------------------------------------------------
-  def _property_from_cache (self, item):
-    return Property (self._module_from_cache (item), self.klass, item)
-
-  # ---------------------------------------------------------------------------
-  # Get a module from a cache-item
-  # ---------------------------------------------------------------------------
-  def _module_from_cache (self, item):
-    for module in self.modules.values ():
-      if module.gnue_id == item.gnue_module:
-       return module
-    raise EBadReference (item.gnue_name, "gnue_module")
-
-
-  # ---------------------------------------------------------------------------
   # Return a Property object if it exists
   # ---------------------------------------------------------------------------
   def get (self, name):
-    (moduleName, propName) = splitName (name)
-    module = self.modules [moduleName]
-
     # is the property already cached
     if self.has_key (name):
-      return self._cache [name]
+      return self._items [name]
 
     # since we had no match in the cache ask for it
     res = self._requestData (self.klass.gnue_id, name)
 
     if len (res) == 1:
-      self._updateCache (res)
-      return self._cache [name]
+      self._items [name] = self.getNewItem (res [0])
+      return self._items [name]
 
     raise EPropertyNotFound (self.klass.fullName, name)
 
@@ -120,19 +102,22 @@
 # =============================================================================
 # A Business Object Property
 # =============================================================================
-class Property:
+class Property (BaseObject):
 
   # ---------------------------------------------------------------------------
   # Construct a new property from module, class and business object
   # ---------------------------------------------------------------------------
-  def __init__ (self, module, klass, object):
-    self.module   = module
+  def __init__ (self, sessionManager, module, klass, object, pDefs = None):
+    
+    BaseObject.__init__ (self, sessionManager, 'gnue_property', object, pDefs)
+
     self.klass    = klass
-    self._object  = object
+    self.module   = module
 
     # gnue_property.gnue_name is already a fully qualified identifier
-    self.fullName = createName (module.gnue_name, self.gnue_name)
+    self.fullName = createName (self.module.gnue_name, self.gnue_name)
     self.column   = self.fullName
+    
     if self.gnue_type == 'string':
       self.fullType = '%s(%d)' % (self.gnue_type, int (self.gnue_length))
     elif self.gnue_type == 'number':
@@ -143,13 +128,3 @@
                                        int (self.gnue_scale))
     else:
       self.fullType = self.gnue_type
-
-  # ---------------------------------------------------------------------------
-  # all unknown attributes are routed to the gnue-namespace
-  # ---------------------------------------------------------------------------
-  def __getattr__ (self, attr):
-    value = getattr (self._object, attr)
-    if isinstance (value, types.UnicodeType):
-      return value.encode ('utf-8')
-    else:
-      return value

Modified: trunk/gnue-appserver/src/classrep/__init__.py
===================================================================
--- trunk/gnue-appserver/src/classrep/__init__.py       2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/__init__.py       2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: __init__.py,v 1.14 2003/10/21 12:26:50 jvetter Exp $
+# $Id$
 
 import os, sys
 
@@ -34,11 +34,7 @@
 # Global module and class list
 # -----------------------------------------------------------------------------
 
-modules = None
-classes = None
-
 def init (server):
-  global modules, classes
   
   # First, load the hardwired default repository
   try:
@@ -49,14 +45,17 @@
     basedir = os.path.join (paths.data, "share", "gnue", "appserver")
 
   defaultRepository = os.path.join (basedir, "repository.ini")
-  modules = ModuleDict (None, RepositoryDefinition (defaultRepository))
-  classes = ClassDict (None, modules)
 
-  # Now, we can access the database to load the real repository
   session = Session.InternalSession (server)
-  new_modules = ModuleDict (session)
-  new_classes = ClassDict (session, new_modules)
-  modules = new_modules
-  classes = new_classes
-  modules.classdict = classes
+
+  # Create a boot-catalogue from the ini-file
+  bootcat = RepositoryDefinition (defaultRepository)
+
+  server.modules = ModuleDict (server, session, bootcat)
+  server.classes = ClassDict (server, session, server.modules, None, bootcat)
+  server.modules.classdict = server.classes
+
+  server.modules.reload ()
+  server.classes.reload ()
+
   return

Deleted: trunk/gnue-appserver/src/classrep/crpopulate.py
===================================================================
--- trunk/gnue-appserver/src/classrep/crpopulate.py     2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/classrep/crpopulate.py     2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -1,96 +0,0 @@
-#
-# Populate the database with class repository definition
-#
-
-from language import App
-from Namespace import *
-from gnue.appserver import classrep
-
-# First we have to create a session from the language interface
-app = App.App ()
-lSession = app.newSession ("hacker", "secret")
-
-# Now load the initial class repository
-print "Loading repository definition ..."
-crdef = classrep.RepositoryDefinition ('classrep/repository.ini')
-
-
-print "Retrieving existing modules ..."
-modules = lSession.find ('gnue_module')
-
-for moduleDef in crdef.modules ():
-
-  if moduleDef [0] in [cmod.gnue_name for cmod in modules]:
-    newModule = None
-
-    for cmod in modules:
-      if cmod.gnue_name == moduleDef [0]:
-       newModule = cmod
-       break
-    print "Using:", newModule.gnue_name, newModule.gnue_id
-
-  else:
-    print "Building new module:", moduleDef [0]
-
-    newModule = lSession.new ('gnue_module')
-    newModule.gnue_name    = moduleDef [1].gnue_name
-    newModule.gnue_comment = moduleDef [1].gnue_comment
-    newModule.store ()
-    print "Stored %s as %s" % (newModule.gnue_name, newModule.objectId)
-
-  print "Retrieving classes of '%s' ..." % moduleDef [0]
-  classes = lSession.find ('gnue_class', 
-         [["eq", ""], ["field", "gnue_module"], ["const", newModule.objectId]])
-  kllist = [createName (newModule.gnue_name, kl.gnue_name) for kl in classes]
-
-  # Adding all classes of 'newModule'
-  for clDef in crdef.classes (newModule.gnue_name):
-    # since we need the classes property-dictionary later, we require the
-    # class-dictionary here (using the apropriate module-id).
-    aClass = classrep.classes [clDef [0]]
-    aClass.gnue_module = newModule.objectId
-
-    if clDef [0] in kllist:
-      newClass = None
-      for klass in classes:
-       if createName (newModule.gnue_name, klass.gnue_name) == clDef [0]:
-         newClass = klass
-         break
-
-      print "Using class:", newClass.gnue_name, newClass.objectId
-
-    else:
-      print "Building new class:", clDef [0]
-      newClass = lSession.new ('gnue_class')
-      newClass.gnue_module  = aClass.gnue_module
-      newClass.gnue_name    = aClass.gnue_name
-      newClass.gnue_comment = aClass.gnue_comment
-      newClass.store ()
-      print "Stored %s as %s" % (newClass.gnue_name, newClass.objectId)
-
-    print "Retrieving properties of '%s' ..." % clDef [0]
-    plist = lSession.find ('gnue_property', 
-        [["eq", ""], ["field", "gnue_class"], ["const", newClass.objectId],
-        ["eq", ""], ["field", "gnue_module"], ["const", aClass.gnue_module]])
-    properties = [pr.gnue_name for pr in plist]
-
-    for prop in aClass.properties.values ():
-      if prop.fullName in properties:
-       continue
-
-      print "Adding property:", prop.fullName
-
-      newProp = lSession.new ('gnue_property')
-      newProp.gnue_class     = newClass.objectId
-      newProp.gnue_module    = aClass.gnue_module
-      newProp.gnue_name      = prop.gnue_name
-      newProp.gnue_comment   = prop.gnue_comment
-      newProp.gnue_length    = prop.gnue_length
-      newProp.gnue_type      = prop.gnue_type
-      newProp.gnue_precision = prop.gnue_precision
-      newProp.store ()
-
-
-  print "Committing module '%s' ..." % newModule.gnue_name
-  lSession.commit ()
-

Modified: trunk/gnue-appserver/src/classrep/dtest.py
===================================================================
--- trunk/gnue-appserver/src/classrep/dtest.py  2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/dtest.py  2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,46 +19,50 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: dtest.py,v 1.5 2003/09/22 11:53:01 jvetter Exp $
+# $Id$
 #
 
-from language import App
 from gnue.appserver import classrep
+from gnue.appserver.test import testApp
+
 from Definition import *
 
-app = App.App ()
+app = testApp ()
+sm = app.getSessionManager ()
 
 print "Requesting class 'gnue_property'\n"
-klass = classrep.classes ["gnue_property"]
+klass = sm.classes ["gnue_property"]
 
 print "\n"
 
 print "Requesting class 'address_person'\n"
 
 # -------------
-klass = classrep.classes ["address_person"]
+klass = sm.classes ["address_person"]
 
 print "Name = %s, Comment = %s, Fullname = %s\n" % (klass.gnue_name, 
                   klass.gnue_comment, klass.fullName)
 print "Number of properties in class: %d" % len (klass.properties)
+print "Properties:"
 
 
 for p in klass.properties.keys ():
   pObj = klass.properties [p]
   print "Property %s: %s (%s)" % (pObj.gnue_name, pObj.gnue_type, 
       pObj.gnue_comment)
+print "End of properties"
 
-klass = classrep.classes ["gnue_module"]
+klass = sm.classes ["gnue_module"]
 print "Number of properties in %s: %d" % (klass.fullName, 
                     len (klass.properties))
 
-# print classrep.Classes.keys ()
+# print sm.Classes.keys ()
 
 # -----------------
 
 print "Now it should come faster (cached):\n"
 
-klass = classrep.classes ["address_person"]
+klass = sm.classes ["address_person"]
 
 print "Name = %s, Comment = %s, Fullname = %s\n" % (klass.gnue_name, 
                   klass.gnue_comment, klass.fullName)
@@ -73,7 +77,7 @@
 # ---- gnue_*
 
 print "Fetching gnue_class :)"
-gclass = classrep.classes ["gnue_class"]
+gclass = sm.classes ["gnue_class"]
 print "Name = %s (full:%s) Comment = %s" % (gclass.gnue_name, gclass.fullName,
                  gclass.gnue_comment)
 

Modified: trunk/gnue-appserver/src/classrep/mtest.py
===================================================================
--- trunk/gnue-appserver/src/classrep/mtest.py  2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/mtest.py  2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,23 +19,24 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place 
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: mtest.py,v 1.4 2003/09/18 15:14:10 jvetter Exp $
+# $Id$
 #
 # This testing unit dumps some values of class definitions.
 #
 
-from language import App
-from gnue.appserver import classrep
+# from gnue.appserver import classrep
+from gnue.appserver.test import testApp
 
 # First we have to create a session from the language interface
-app = App.App ()
+app = testApp ()
+sm  = app.getSessionManager ()
 
 # -----------------------------------------------------------------------------
 # Dump some values of a class definition
 # -----------------------------------------------------------------------------
 def dumpClass (aName):
   print "\nRequesting class '%s' ..." % aName
-  aClass = classrep.classes [aName]
+  aClass = sm.classes [aName]
 
   print "Fullname:", aClass.fullName
   print "Id      :", aClass.gnue_id
@@ -58,7 +59,7 @@
 dumpClass ('gnue_class')
 
 print "Searching for property 'gnue_name' in class 'gnue_property' ..."
-x = classrep.classes ['gnue_property']
+x = sm.classes ['gnue_property']
 y = x.findProp ('gnue_name')
 print "Fullname:", y.fullName
 print "Module  :", y.klass.module.fullName

Modified: trunk/gnue-appserver/src/classrep/test.py
===================================================================
--- trunk/gnue-appserver/src/classrep/test.py   2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/classrep/test.py   2004-01-30 13:27:47 UTC (rev 
5056)
@@ -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.8 2003/10/21 12:26:50 jvetter Exp $
+# $Id$
 #
 
 from gnue.appserver.language import App
@@ -33,8 +33,11 @@
 print "Already loaded modules:", sm.modules.keys ()
 print "Already loaded classes:", sm.classes.keys ()
 
+print "Modules:", sm.modules.values ()
+
 print '\nModule "address":'
 m = sm.modules ["address"]
+# m = sm.modules ["gnue"]
 print "%s: %s\n" % (m.gnue_name, m.gnue_comment)
 
 print "Classes in 'address':"
@@ -45,6 +48,12 @@
     print cl.fullName + "." + p
   print "-" * 50
 
+print "Procedures of 'address_person':"
+ap = m.classes ['address_person']
+ap.procedures.reload ()
+for pr in ap.procedures.values ():
+  print "%s coded in %s" % (pr.fullName, pr.gnue_language)
+
 print "Number of modules: %d\n" % len (sm.modules)
 
 print "All modules via keys ():"

Modified: trunk/gnue-appserver/src/geasSession.py
===================================================================
--- trunk/gnue-appserver/src/geasSession.py     2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/geasSession.py     2004-01-30 13:27:47 UTC (rev 
5056)
@@ -19,10 +19,9 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# $Id: geasSession.py,v 1.40 2003/10/19 16:45:16 reinhard Exp $
+# $Id$
 
 import geasList
-import classrep
 import whrandom
 
 # =============================================================================
@@ -98,7 +97,7 @@
     if not self._authAdapter.hasAccess (self, self._user, classname):
       raise Exception, "Access to class '%s' denied" % classname
 
-    classdef = classrep.classes [classname]
+    classdef = self.sm.classes [classname]
 
     # create new List
     return geasList.geasList (self, classdef, propertylist, sortorder)
@@ -174,7 +173,7 @@
     result = []
     for object_id in obj_id_list:
       if object_id == "":
-        classdef = classrep.classes [classname]
+        classdef = self.sm.classes [classname]
         result.append ([classdef.properties[p].fullType for p in propertylist])
       else:
         instance = list.find (object_id)

Modified: trunk/gnue-appserver/src/geasSessionManager.py
===================================================================
--- trunk/gnue-appserver/src/geasSessionManager.py      2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/geasSessionManager.py      2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -19,7 +19,7 @@
 #
 # Copyright 2001-2004 Free Software Foundation
 #
-# $Id: geasSessionManager.py,v 1.17 2003/10/21 12:26:49 jvetter Exp $
+# $Id$
 
 import geasSession
 import geasAuthentication
@@ -48,8 +48,6 @@
     self._sessions = {}
     self._buildInternalSession ()
     classrep.init (self)
-    self.modules = classrep.modules
-    self.classes = classrep.classes
 
     # TODO: load default authagent depending on config setting
     self._authAdapter = geasAuthentication.geasDBAuthAgent 
(self._internalSession)

Modified: trunk/gnue-appserver/src/language/Object.py
===================================================================
--- trunk/gnue-appserver/src/language/Object.py 2004-01-30 09:54:32 UTC (rev 
5055)
+++ trunk/gnue-appserver/src/language/Object.py 2004-01-30 13:27:47 UTC (rev 
5056)
@@ -74,16 +74,20 @@
         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])
+         # 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])
+          # self._cache [attr] = self.rpc_to_native (None, res [0] [0])
+          return self.rpc_to_native (None, res [0] [0])
+
       elif self._attrIsMethod (attr):
         return Procedure (self._server, self._session_id, self.objectId,
             self._class, attr)
       else:
         raise AttributeError, attr
 
+    print "ERR: %s.%s" % (self._class, attr)
     return self._cache [attr]
 
 

Modified: trunk/gnue-appserver/src/language/ObjectList.py
===================================================================
--- trunk/gnue-appserver/src/language/ObjectList.py     2004-01-30 09:54:32 UTC 
(rev 5055)
+++ trunk/gnue-appserver/src/language/ObjectList.py     2004-01-30 13:27:47 UTC 
(rev 5056)
@@ -97,15 +97,16 @@
     rset = self._server.fetch (self._session_id, self.list_id, 
                                len (self._cache), CACHE_STEP, 0)    
     for row in rset:
-      ## Convert array into dictonary
-      i = 0
-      objData = {}
+      # Just keep the 'gnue_id' property cached 
+      objData = {"gnue_id": row [0]}
+      # i = 0
+      # objData = {}
 
-      for p in self.properties:
-        objData [p] = row [i+1]
-        i += 1
+      # for p in self.properties:
+        # objData [p] = row [i+1]
+        # i += 1
         
-      objData ["gnue_id"] = row [0]
+      # objData ["gnue_id"] = row [0]
       obj = Object (self._server, self._session_id, self.classname, objData)
       self._cache.append (obj)
 





reply via email to

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