commit-gnue
[Top][All Lists]
Advanced

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

gnue/appserver/src/_featuretest GEDI.py GEMA.py...


From: Jan Ischebeck
Subject: gnue/appserver/src/_featuretest GEDI.py GEMA.py...
Date: Wed, 19 Jun 2002 09:15:46 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Jan Ischebeck <address@hidden>  02/06/19 09:15:46

Modified files:
        appserver/src/_featuretest: GEDI.py GEMA.py README TODO atest.py 
                                    geasInstance.py geasList.py 
                                    geasMetaObject.py geasNameSpace.py 
                                    geasObject.py geasSession.py 
                                    geasSuperObject.py 
Added files:
        appserver/src/_featuretest: geasAuthentification.py 
                                    geasConnectionPool.py 
                                    geasObjectServer.py 

Log message:
        add a better seperation between data fetching and object creation
        different other code cleanups

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasAuthentification.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasConnectionPool.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasObjectServer.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/GEDI.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/GEMA.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/README.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/TODO.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/atest.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasInstance.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasList.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasMetaObject.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasNameSpace.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasObject.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasSession.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/appserver/src/_featuretest/geasSuperObject.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: gnue/appserver/src/_featuretest/GEDI.py
diff -c gnue/appserver/src/_featuretest/GEDI.py:1.2 
gnue/appserver/src/_featuretest/GEDI.py:1.3
*** gnue/appserver/src/_featuretest/GEDI.py:1.2 Thu May 23 17:24:02 2002
--- gnue/appserver/src/_featuretest/GEDI.py     Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: GEDI.py,v 1.2 2002/05/23 21:24:02 siesel Exp $
  
  # 
=============================================================================
  # Basic class
--- 19,25 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: GEDI.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
  
  # 
=============================================================================
  # Basic class
***************
*** 30,35 ****
--- 30,88 ----
  from gnue.common import GDataSource
  
  
+ class GEDI:
+  
+   # 
---------------------------------------------------------------------------
+   # Initalize
+   # 
---------------------------------------------------------------------------
+ 
+   def __init__ (self, connections):
+     self._connections = connections
+     self.storage=[databaseStorageAdapter(connections)]
+     self.OID_hint_cache={}
+     # load OID_hint_cache from database
+ 
+   def addStorage(self,storage):
+     self._storage.append[storage]
+ 
+   #
+   # a) this function returns an object stored at any place just out of the OID
+   # passed, if you know which class you need you should use the getInstances
+   # function of the class which should be much faster
+   # b) this function don't look into the cache, if an object with that OID is
+   # already loaded
+   #
+ 
+   def getObjectData (self,GOID, tablename, indexrow, fieldList ):
+     return self.storage[0].getObjectData (GOID, tablename,indexrow, fieldList)
+     
+   def getObjectByOID(self,OID,hint=None,classOID=None):
+     # 1. check OID lookup cache (if OID in cache, go directly to datasource X)
+     # 2. check Datastore a,b,c,d, until OID is found
+     # 2b. check on all other remote appserver instances for that OID
+     #                 ( if found on remote and used often here, think about
+     #                   transfering it here)
+     # 3. write OID into datasource lookup cache
+     if classOID!=None:
+       # check if class contains hint, and use then use that hint
+       pass
+     if hint!=None:
+       pass # check datasource 'hint'
+     
+     # if not found:
+     #        for all dataStorage check for that OID
+ 
+     if classOID!=None:
+       # MetaObj=getObjectByOID(classOID)
+       # MetaObj.loadInstanceFrom(OID,datasource)
+       pass
+     else:
+       # try out all classes for one that fits.    
+       pass
+     
+   def requestStorageAdapter(self,info1,info2):
+     return databaseStorageAdapter()
+   
  class basicStorageAdapter:
    pass
    
***************
*** 60,66 ****
    def getObject( self,OID ):     
      return OID
  
!   def getObjectData (self,GOID, tablename, fieldList ):
      self._conditions = []
      self._sort = ["zip"]
      
--- 113,119 ----
    def getObject( self,OID ):     
      return OID
  
!   def getObjectData (self, GOID, tablename, indexrow, fieldList ):
      self._conditions = []
      self._sort = ["zip"]
      
***************
*** 76,95 ****
  
      self._datasource.phaseInit ()
      
-     # TODO: get the column names from the prefetch field names
      for field in fieldList:
        self._datasource.referenceField (field)
      self._resultset = self._datasource.createResultSet ()
      
      moreRecords=self._resultset.firstRecord ()
-     if moreRecords==0:
-       raise geasObjectNotFound,"Object (OID=%s) is not defined in table %s." 
% \
-             (OID,tablename)
      data=[]
      while (moreRecords==1):
        newdr={}
        record=self._resultset.current
!       if record.getField("goid")==GOID:
          for field in fieldList:
            newdr[field] = record.getField(field)
                    
--- 129,146 ----
  
      self._datasource.phaseInit ()
      
      for field in fieldList:
        self._datasource.referenceField (field)
+     self._datasource.referenceField (indexrow)
+     
      self._resultset = self._datasource.createResultSet ()
      
      moreRecords=self._resultset.firstRecord ()
      data=[]
      while (moreRecords==1):
        newdr={}
        record=self._resultset.current
!       if record.getField(indexrow)==GOID:
          for field in fieldList:
            newdr[field] = record.getField(field)
                    
Index: gnue/appserver/src/_featuretest/GEMA.py
diff -c gnue/appserver/src/_featuretest/GEMA.py:1.1 
gnue/appserver/src/_featuretest/GEMA.py:1.2
*** gnue/appserver/src/_featuretest/GEMA.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/GEMA.py     Wed Jun 19 09:15:46 2002
***************
*** 19,31 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: GEMA.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  # 
=============================================================================
  # Basic class
  # 
=============================================================================
  
  import geasObject
  
  class geasMethodCompilationError(geasObject.Error):
    # Raised when a python method couldn't be compiled
--- 19,32 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: GEMA.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  # 
=============================================================================
  # Basic class
  # 
=============================================================================
  
  import geasObject
+ import new
  
  class geasMethodCompilationError(geasObject.Error):
    # Raised when a python method couldn't be compiled
***************
*** 90,96 ****
     def __init__(self, OID, parent_OID, methodSource):
        geasObject.geasObject.__init__(self,OID, parent_OID)
        self.compiledMethod = None
!       self.methodSource = methodSource      
  
     def formatSourceCode(self):
       # format Source code
--- 91,99 ----
     def __init__(self, OID, parent_OID, methodSource):
        geasObject.geasObject.__init__(self,OID, parent_OID)
        self.compiledMethod = None
!       self.methodSource = methodSource
! 
!       # add classname (should be an OID)
  
     def formatSourceCode(self):
       # format Source code
***************
*** 129,135 ****
       for i in params:
         args["param%s" % j]=i
         j=j+1
!      exec self.compiledMethod in globals(),args
       return args["rvalue"]      
   
     def addPreMethodHook(self,hook):
--- 132,138 ----
       for i in params:
         args["param%s" % j]=i
         j=j+1
!      exec self.compiledMethod in self._ns,args
       return args["rvalue"]      
   
     def addPreMethodHook(self,hook):
***************
*** 142,144 ****
--- 145,150 ----
       self.preMethodHook = hook          
       self.methodSource = self.methodSource + 'postMethodHook(self)\n'
       self.compileMethod()
+ 
+    def requestPythonMethod(self,instance,_class):
+      return new.instancemethod(self,instance,_class)
Index: gnue/appserver/src/_featuretest/README
diff -c gnue/appserver/src/_featuretest/README:1.1 
gnue/appserver/src/_featuretest/README:1.2
*** gnue/appserver/src/_featuretest/README:1.1  Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/README      Wed Jun 19 09:15:46 2002
***************
*** 1,9 ****
--- 1,28 ----
+ WHATS THIS?
+ ===========
  
  This is a feature enhanced*, testing version of the application server.
  
  It is a testfield for implementing functions and features, which could be
  added to the app. server later.
  
+ the idea of the current implementation of _featuretest is to have a kind 
+ of "object server" which is very very simple, but which has objects to 
+ implement the rest of the server funtionality. (like the f.e. the HURD) 
+ Because these objects are objects of the "objects server" themselves,
+ they can be updated and reloaded on a running system, and the most
+ important: they can be stored and loaded from a database. I.e. you can
+ store session states, class definitions, normal objects with using the same
+ code.
+ 
+ a list of concepts I'm trying to implement:
+      NameSpaces
+      Methods
+      MetaObjects
+      
+      
+ HOW TO TEST
+ ============
  
  To try out this version just call "python atest.py" in this directory.
  You have to set the INSTALL_PREFIX and possibly add an --connections command 
Index: gnue/appserver/src/_featuretest/TODO
diff -c gnue/appserver/src/_featuretest/TODO:1.1 
gnue/appserver/src/_featuretest/TODO:1.2
*** gnue/appserver/src/_featuretest/TODO:1.1    Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/TODO        Wed Jun 19 09:15:46 2002
***************
*** 3,9 ****
  
  Change objects and interfaces to the definitions in odmg.txt
  
! rebuild storage framework for a consistent use of GEDI and GEOR
  
  add support to store instances of objects back into the db
  
--- 3,9 ----
  
  Change objects and interfaces to the definitions in odmg.txt
  
! rebuild storage framework for a consistent use of GEDI and GEOR ...     (70%)
  
  add support to store instances of objects back into the db
  
***************
*** 23,25 ****
--- 23,28 ----
  
  add a geasAccessObject to the Appserver
  
+ add local/remote attribut to geasObject. local objects can be changed, remote 
object are created on an other instance of the appserver and a change object 
request has to be sended to the other instance. this request will be polled and 
a result has to be returned before the next commit.
+ 
+ create a parent/meta object for metaobject namespace obj etc....       (done)
Index: gnue/appserver/src/_featuretest/atest.py
diff -c gnue/appserver/src/_featuretest/atest.py:1.1 
gnue/appserver/src/_featuretest/atest.py:1.2
*** gnue/appserver/src/_featuretest/atest.py:1.1        Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/atest.py    Wed Jun 19 09:15:46 2002
***************
*** 19,32 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: atest.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  import os
  from gnue.common import GClientApp
  from gnue.common import GLoginHandler
! import geasSession
! import geasSuperObject
! import geasNameSpace
  
  # 
=============================================================================
  # Test application
--- 19,35 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: atest.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  import os
  from gnue.common import GClientApp
  from gnue.common import GLoginHandler
! #import geasSession
! #import geasSuperObject
! #import geasNameSpace
! import geasObjectServer
! import GEDI
! import geasConnectionPool
  
  # 
=============================================================================
  # Test application
***************
*** 42,52 ****
      self.connections.setLoginHandler (testLoginHandler ())
  
      print "Server initalisation..."
!     server=geasSuperObject.geasSuperObject (1,1)
!     server.setConnections(self.connections)
! 
      print "New Session"
!     sess=server.getSession()
      
      print "\nNew Instance"
      instance=sess.Address.newInstance()
--- 45,57 ----
      self.connections.setLoginHandler (testLoginHandler ())
  
      print "Server initalisation..."
!     server=geasObjectServer.geasObjectServer()
!     server.gedi=GEDI.GEDI(self.connections)
!     cp=geasConnectionPool.geasConnectionPool(server)  # get connection pool
!     cp.loadConfiguration('/etc/gnue/appserver.conf')
!     
      print "New Session"
!     sess=cp.getSession()
      
      print "\nNew Instance"
      instance=sess.Address.newInstance()
***************
*** 58,64 ****
      print "  Name  :", instance.name
      print "  Street:", instance.street
      print "  City  :", instance.city
!     print "on one line: %s " % instance.formatAddress()
      print "\nNow call the function 'do' of the instance:"
      instance.do("nothing", "in the sun", "working","on the edge")
  
--- 63,70 ----
      print "  Name  :", instance.name
      print "  Street:", instance.street
      print "  City  :", instance.city
!     print "on one line by calling instance.formatAddress :\n %s " \
!           % instance.formatAddress()
      print "\nNow call the function 'do' of the instance:"
      instance.do("nothing", "in the sun", "working","on the edge")
  
Index: gnue/appserver/src/_featuretest/geasInstance.py
diff -c gnue/appserver/src/_featuretest/geasInstance.py:1.1 
gnue/appserver/src/_featuretest/geasInstance.py:1.2
*** gnue/appserver/src/_featuretest/geasInstance.py:1.1 Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/geasInstance.py     Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasInstance.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  # 
=============================================================================
  # Instance class
--- 19,25 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasInstance.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  # 
=============================================================================
  # Instance class
***************
*** 51,61 ****
    def put (self, fieldname, value):
      # TODO: translate the field name into a column name
      self._record.setField (fieldname, value)
-     self._record.post ()      # FIXME: Do that here? or elsewhere? later?
  
    # 
---------------------------------------------------------------------------
    # Call a method
    # 
---------------------------------------------------------------------------
  
    def call (self, methodname):
      pass
--- 51,68 ----
    def put (self, fieldname, value):
      # TODO: translate the field name into a column name
      self._record.setField (fieldname, value)
  
    # 
---------------------------------------------------------------------------
    # Call a method
    # 
---------------------------------------------------------------------------
  
    def call (self, methodname):
+     # not yet implemented
      pass
+ 
+   # 
---------------------------------------------------------------------------
+   # Delete this instance 
+   # 
---------------------------------------------------------------------------
+ 
+   def delete(self):
+     self._record.delete()
Index: gnue/appserver/src/_featuretest/geasList.py
diff -c gnue/appserver/src/_featuretest/geasList.py:1.2 
gnue/appserver/src/_featuretest/geasList.py:1.3
*** gnue/appserver/src/_featuretest/geasList.py:1.2     Thu May 23 17:26:48 2002
--- gnue/appserver/src/_featuretest/geasList.py Wed Jun 19 09:15:46 2002
***************
*** 19,35 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasList.py,v 1.2 2002/05/23 21:26:48 siesel Exp $
  
! from gnue.common import GDataSource
  import geasInstance
! import geasObject
  
  # 
=============================================================================
  # List class
  # 
=============================================================================
  
! class geasList(geasObject.geasObject):
  
    # 
---------------------------------------------------------------------------
    # Initalize
--- 19,35 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasList.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
  
! from gnue.common import GDataSource,GConditions
  import geasInstance
! import string
  
  # 
=============================================================================
  # List class
  # 
=============================================================================
  
! class geasList:
  
    # 
---------------------------------------------------------------------------
    # Initalize
***************
*** 41,47 ****
      self._classname = classname
      self._prefetch = []
      self._conditions = []
-     self._sort = []
  
    # 
---------------------------------------------------------------------------
    # Actually these 3 only set variables
--- 41,46 ----
***************
*** 50,57 ****
    def setPrefetch (self, prefetch):
      self._prefetch = prefetch
      
!   def setConditions (self, conditions):
      self._conditions = conditions
        
    def setSort (self, sort):
      self._sort = sort
--- 49,67 ----
    def setPrefetch (self, prefetch):
      self._prefetch = prefetch
      
! 
!   # conditions = an list consisting of condition elements written down in
!   # prefix  notation i.e. (a=12) AND (c=121) -> AND = a 12 = c 121
!   # every element of the list is a tuple containing the following parts:
!   # type (eq,and,const...)  value  i.e. ('eq','') or ('const',12)
! 
!   def setConditions (self, conditions):    
      self._conditions = conditions
+     
+     # now building GCondition tree
+     self._conditionTree = GConditions.buildTreeFromPrefix(conditions)
+ 
+     
        
    def setSort (self, sort):
      self._sort = sort
***************
*** 64,95 ****
      self._datasource = GDataSource.GDataSource ()
      # TODO: get the table name from the class name
      self._datasource.buildObject (name = "",
!                                 database = "gnue",
                                  table = self._classname)
      self._datasource.setConnectionManager (self._session._connections)
      self._datasource._datasourceDictionary={}
      
      self._datasource.phaseInit ()
      # TODO: get the column names from the prefetch field names
      for field in self._prefetch:
        self._datasource.referenceField (field)
!     self._resultset = self._datasource.createResultSet ()
  
    # 
---------------------------------------------------------------------------
    # Get the first instance in the list
    # 
---------------------------------------------------------------------------
  
    def firstInstance (self):
!     if self._resultset.firstRecord ()==0:
        return None
-     return self._parent.buildInstance(self._resultset.current)
- 
  
    # 
---------------------------------------------------------------------------
    # Get the next instance in the list
    # 
---------------------------------------------------------------------------
  
    def nextInstance (self):
!     if self._resultset.nextRecord ()==0:
        return None
!     return self._parent.buildInstance(self._resultset.current)
--- 74,125 ----
      self._datasource = GDataSource.GDataSource ()
      # TODO: get the table name from the class name
      self._datasource.buildObject (name = "",
!                                 database = self._session._database,
                                  table = self._classname)
      self._datasource.setConnectionManager (self._session._connections)
+ 
+     # bug fix should be moved into common after the freeze
      self._datasource._datasourceDictionary={}
+ 
+     # set the field to sort (has to be called before phase init
+     if hasattr(self,"_sort"):      
+       self._datasource.order_by=string.joinfields(self._sort,",")
      
      self._datasource.phaseInit ()
      # TODO: get the column names from the prefetch field names
      for field in self._prefetch:
        self._datasource.referenceField (field)
! 
!     if hasattr(self,"_conditionTree"):
!       self._resultset = self._datasource.createResultSet(self._conditionTree)
!     else:
!       self._resultset = self._datasource.createResultSet()
!       
  
    # 
---------------------------------------------------------------------------
    # Get the first instance in the list
    # 
---------------------------------------------------------------------------
  
    def firstInstance (self):
!     if self._resultset.firstRecord () != 0:
!       return self._parent.buildInstance(self._resultset.current)
!     else:
        return None
  
    # 
---------------------------------------------------------------------------
    # Get the next instance in the list
    # 
---------------------------------------------------------------------------
  
    def nextInstance (self):
!     if self._resultset.nextRecord () != 0:
!       return self._parent.buildInstance(self._resultset.current)
!     else:
        return None
! 
!   # 
---------------------------------------------------------------------------
!   # insert a new empty instance in the list and return it 
!   # 
---------------------------------------------------------------------------
! 
!   def insertNewInstance (self):
!     self._resultset.insertRecord ()
!     return geasInstance.geasInstance (self._classname, 
self._resultset.current)
Index: gnue/appserver/src/_featuretest/geasMetaObject.py
diff -c gnue/appserver/src/_featuretest/geasMetaObject.py:1.1 
gnue/appserver/src/_featuretest/geasMetaObject.py:1.2
*** gnue/appserver/src/_featuretest/geasMetaObject.py:1.1       Mon May 13 
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasMetaObject.py   Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasMetaObject.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  from gnue.common import GDebug
  import geasObject
--- 19,25 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasMetaObject.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  from gnue.common import GDebug
  import geasObject
***************
*** 28,56 ****
  import copy
  
  
  # 
=============================================================================
  # Basic class
  # 
=============================================================================
  
! class geasClass(geasObject.geasObject):
!   pass
! 
! class geasMetaObject(geasObject.geasObject):
  
    # 
---------------------------------------------------------------------------
    # Initalize
    # 
---------------------------------------------------------------------------
  
!   def __init__ (self, OID, parent_OID, GEDI=None):
      self._OID = OID
      self._parent_OID = parent_OID
      self._classAttribs = {}
      self._classMethods = {}
      self._instanceAttribs = {}
      self._instanceMethods = {}
-     if GEDI!=None:
-       self._GEDI=GEDI
-       self.loadObjectDefinition()
  
    # 
---------------------------------------------------------------------------
    # Get the OID of the object from which this is an instance, or
--- 28,114 ----
  import copy
  
  
+ class geasMetaObject(geasObject.geasObject):
+   def __init__ (self, OID, parent_OID):
+     self._OID = OID
+     self._parent_OID = parent_OID
+ 
+   def getChildByOID(self,OID):
+     return None
+ 
+ class geasSimpleObjectFactory(geasMetaObject):
+   # this class is a factory which loads and stores namespaces, class objects 
+   # etc., which could be described in a config file by this settings:
+   # [namespacefactory]
+   # factory=geasMultipleRowOneTableFactory
+   # tablename='geas_name_space'
+   # classname='geasNameSpace'
+   # populatefunction=registerObject
+   # oidrow=goid
+   # row1='name'
+   # row2='ref_OID'
+   # similar to this definition a Factory for a simple geasClass obj
+   # [classfactory]
+   # factory=geasMultipleRowOneTableFactory
+   # tablename='geas_classes'
+   # classname='geasClass'
+   # populatefunction=addAttribute
+   # oidrow=goid
+   # row1='name'
+   # row2='type'
+   # row3='default'
+   def __init__(self,OID,parent_OID,datasource,tablename,objclass,oidrow,
+                rownames,populatefunction):
+     geasMetaObject.__init__(self,OID,parent_OID)
+     self._datasource=datasource
+     self._tablename=tablename
+     self._objclass=objclass  
+     self._oidrow=oidrow 
+     self._rownames=rownames
+     self._populatefunction=populatefunction
+ 
+     
+   def getChildByOID(self,OID):
+     # self._oidrow should also be send to datasource
+     # at the moment it defaults to "goid"
+     data=self._datasource.getObjectData(OID,self._tablename,
+                                         [self._oidrow]+self._rownames)
+     if data and len(data)>0:
+       # build new object
+       o = self._objclass(OID,self._OID)
+       populate = getattr(o,self._populatefunction)
+       for record in data:
+         params=[]
+         for i in self._rownames:
+           params.append(record[i])
+         populate(*params)
+         
+       # save object into cache        
+       registerObject(o)
+       
+       # return new object
+       return o
+     else:
+       return None
+ 
+ 
  # 
=============================================================================
  # Basic class
  # 
=============================================================================
  
! class geasClass(geasMetaObject):
  
    # 
---------------------------------------------------------------------------
    # Initalize
    # 
---------------------------------------------------------------------------
  
!   def __init__ (self, OID, parent_OID):
      self._OID = OID
      self._parent_OID = parent_OID
      self._classAttribs = {}
      self._classMethods = {}
      self._instanceAttribs = {}
      self._instanceMethods = {}
  
    # 
---------------------------------------------------------------------------
    # Get the OID of the object from which this is an instance, or
***************
*** 69,76 ****
      pass
  
    def newInstance(self):
!     #OID=getNewOID()
!     OID=134
      # create an instance of the python class
      instance=self._pythonclass(OID,self._OID)
  
--- 127,138 ----
      pass
  
    def newInstance(self):
!     # get new OID
!     OID=getNewOID()
! 
!     if self._pythonclass==None:
!       self.createPythonClass()
!       
      # create an instance of the python class
      instance=self._pythonclass(OID,self._OID)
  
***************
*** 91,96 ****
--- 153,162 ----
      
      OID=data.getField("_OID")
      # create an instance of the python class
+ 
+     if self._pythonclass==None:
+       self.createPythonClass()
+       
      instance=self._pythonclass(OID,self._OID)
  
      # add instance attributs
***************
*** 111,117 ****
--- 177,188 ----
    def storeInstance(self, instance):    
      pass
  
+   def getChildByOID(self,OID):
+     
+     
    def getAllInstances(self):
+ 
+     # list has to check for any new still uncommited instances too
      try:
        list = geasList.geasList(self,self._classAttribs["_tablename"])
      except KeyError:
***************
*** 120,163 ****
  
      list.setPrefetch (self._instanceAttribs.keys())
      list.setConditions ([])
!     self._connections=self._GEDI._connections
      list.populate ()
  
      return list
   
!   def loadObjectDefinition(self):
  
      # to make it easy we use one table for every attributs at
      # the moment. later there will be one table for every datatype
      # i.e. byte, string, array ....
  
!     prefetch = ["goid", "name", "type", "value"]
!     tablename = "geas_meta_object"
! 
!     data=self._GEDI.getObjectData(self._OID,tablename,prefetch)
  
!     for record in data:
!       type=record["type"]
!       name=record["name"]
!       value=record["value"]
! #      print "READ  %s <%s> = %s" % (name,type,value)
!       if type=="string":
!         if (value==""):
!           self._instanceAttribs[name]=""
!         else:
!           self._classAttribs[name]=value
!       elif type=="function":        
!         m=GEMA.geasPythonMethod(132,self._OID,value)
!         self._instanceMethods[name]=m
!         #self._classMethods[name]=m
!         
!       elif type=="object":
!         o=getMetaObject(value)      
!         if (value==""):
!           self._instanceAttribs[name]=""
!         else:
!           self._classAttribs[name]=o
  
      # create an class object in python and add the
      # class methods and attributs
          
--- 191,231 ----
  
      list.setPrefetch (self._instanceAttribs.keys())
      list.setConditions ([])
!     parent=getObject(self._parent_OID)
!     self._connections=parent._datasource._connections
!     self._database='gnue'
      list.populate ()
  
      return list
   
!   def addAttribute(self,name,type,value):
  
      # to make it easy we use one table for every attributs at
      # the moment. later there will be one table for every datatype
      # i.e. byte, string, array ....
  
!     #      print "READ  %s <%s> = %s" % (name,type,value)
!     if type=="string":
!       if (value==""):
!         self._instanceAttribs[name]=""
!       else:
!         self._classAttribs[name]=value
!     elif type=="function":        
!       m=GEMA.geasPythonMethod(132,self._OID,value)
!       self._instanceMethods[name]=m
!       #self._classMethods[name]=m
!       
!     elif type=="object":
!       o=getMetaObject(value)      
!       if (value==""):
!         self._instanceAttribs[name]=""
!       else:
!         self._classAttribs[name]=o
  
!     self._pythonclass=None
  
+   def createPythonClass(self):
+     
      # create an class object in python and add the
      # class methods and attributs
          
Index: gnue/appserver/src/_featuretest/geasNameSpace.py
diff -c gnue/appserver/src/_featuretest/geasNameSpace.py:1.1 
gnue/appserver/src/_featuretest/geasNameSpace.py:1.2
*** gnue/appserver/src/_featuretest/geasNameSpace.py:1.1        Mon May 13 
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasNameSpace.py    Wed Jun 19 09:15:46 2002
***************
*** 19,28 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasNameSpace.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  from gnue.common import GDebug
  import geasObject
  
  class Error(StandardError):
    # Base exception
--- 19,29 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasNameSpace.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  from gnue.common import GDebug
  import geasObject
+ import geasMetaObject
  
  class Error(StandardError):
    # Base exception
***************
*** 39,64 ****
    # Initalize
    # 
---------------------------------------------------------------------------
  
!   def __init__ (self, OID, parent_OID, GEOR, GEDI=None):
      self._OID = OID
      self._parent_OID = parent_OID
!     self._storageAdapter = None
!     self._nameSpace={}
!     self._GEOR=GEOR
!     if GEDI!=None:
!       self._GEDI=GEDI
!       self.loadNameSpace()
! 
!   def loadNameSpace(self):
!     prefetch = ["goid", "name", "ref_OID"]
!     tablename = "geas_name_space"
!     
!     data=self._GEDI.getObjectData(self._OID,tablename,prefetch)
! 
!     for record in data:
!       self.registerObject(record["name"],record["ref_OID"])
!                      
    def registerObject(self,name,OID):
      self._nameSpace[name]=OID
        
    def getOIDofObject(self,name):
--- 40,52 ----
    # Initalize
    # 
---------------------------------------------------------------------------
  
!   def __init__ (self, OID, parent_OID):
      self._OID = OID
      self._parent_OID = parent_OID
!     self._nameSpace={}    
! 
    def registerObject(self,name,OID):
+ #    print "Namespace (OID=%s): Registering %s->%s" % (self._OID,name,OID)
      self._nameSpace[name]=OID
        
    def getOIDofObject(self,name):
***************
*** 73,79 ****
            return self.__dict__[attr]
          except KeyError:
            OID=self._nameSpace[attr]
!           o=self._GEOR.getObjectByOID(OID)
            return o
          
      except KeyError, mesg:
--- 61,68 ----
            return self.__dict__[attr]
          except KeyError:
            OID=self._nameSpace[attr]
!           ## access the global function defined by geasObjectServer
!           o=getObject(OID)
            return o
          
      except KeyError, mesg:
Index: gnue/appserver/src/_featuretest/geasObject.py
diff -c gnue/appserver/src/_featuretest/geasObject.py:1.2 
gnue/appserver/src/_featuretest/geasObject.py:1.3
*** gnue/appserver/src/_featuretest/geasObject.py:1.2   Tue May 14 13:21:33 2002
--- gnue/appserver/src/_featuretest/geasObject.py       Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasObject.py,v 1.2 2002/05/14 17:21:33 siesel Exp $
  
  from gnue.common import GDebug
  import copy
--- 19,25 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasObject.py,v 1.3 2002/06/19 13:15:46 siesel Exp $
  
  from gnue.common import GDebug
  import copy
***************
*** 210,213 ****
--- 210,217 ----
       
    def setLifeTimeType(self,type):
       self._lifeTimeType=type
+ 
+   def __setattr__(self,attr,value):
+     self.__dict__["_dirty"]=1
+     self.__dict__[attr]=value
       
Index: gnue/appserver/src/_featuretest/geasSession.py
diff -c gnue/appserver/src/_featuretest/geasSession.py:1.1 
gnue/appserver/src/_featuretest/geasSession.py:1.2
*** gnue/appserver/src/_featuretest/geasSession.py:1.1  Mon May 13 18:34:11 2002
--- gnue/appserver/src/_featuretest/geasSession.py      Wed Jun 19 09:15:46 2002
***************
*** 19,44 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasSession.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  import geasList
  
  # 
=============================================================================
  # Session class
  # 
=============================================================================
  
  class geasSession:
    def __init__ (self, connections):
      self.loggedIn = 0
      self._connections = connections
  
    def login (self, user, password):
      # This username/password is for the Application Server, not for the
!     # database.
!     self.loggedIn = 1
  
    def logout (self):
      self.loggedIn = 0
  
    def createList (self, classname):
!     return geasList.geasList (self, classname)
--- 19,118 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasSession.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  import geasList
+ import geasAuthentification 
  
  # 
=============================================================================
  # Session class
  # 
=============================================================================
  
  class geasSession:
+ 
+   # 
---------------------------------------------------------------------------
+   # Initalize
+   # 
---------------------------------------------------------------------------
+ 
    def __init__ (self, connections):
      self.loggedIn = 0
+     self._user = ""
      self._connections = connections
+     self._database = "gnue"
+     self._activelists = []
+     self._authAdapter = geasAuthentification.geasAuthAgent()
+     self._namespace = None
+ 
+   # 
---------------------------------------------------------------------------
+   # Log into the application server
+   # 
---------------------------------------------------------------------------
  
    def login (self, user, password):
      # This username/password is for the Application Server, not for the
!     # database.    
!     self._user = user
!     self.loggedIn = self._authAdapter.authentificate(self, user,
!                                                      {'password':password} )
!     return self.loggedIn
! 
!   # 
---------------------------------------------------------------------------
!   # Logout from the application server
!   # 
---------------------------------------------------------------------------
  
    def logout (self):
+     # should the authAdapter be contacted?
      self.loggedIn = 0
  
+   # 
---------------------------------------------------------------------------
+   # Create a new list of business objects of a given class
+   # 
---------------------------------------------------------------------------
+ 
    def createList (self, classname):
!     
!     # check if user has access rights for this list
!     if self._authAdapter.hasAccess (self, self._user, classname):
!       
!       # create new List
!       newlist=geasList.geasList (self, classname)
!       # every new list will be added to the _activelists list
!       # which will be parsed for commit and rollback actions
!       self._activelists.append(newlist)
!       return newlist;
!     
!     else: # no access
!       return None
! 
!   # 
---------------------------------------------------------------------------
!   # Commit the active transaction
!   # 
---------------------------------------------------------------------------
! 
!   def commit (self):
!     for l in self._activelists:
!       l._resultset.post()
!       l._datasource.commit()
! 
!   # 
---------------------------------------------------------------------------
!   # Rollback the active transaction
!   # 
---------------------------------------------------------------------------
! 
!   def rollback (self):  
!     for l in self._activelists:
!       if hasattr(l,"_datasource"):
!         l._datasource.rollback()    
! 
!   # 
---------------------------------------------------------------------------
!   # Set Namespace
!   # 
---------------------------------------------------------------------------
! 
!   def setNamespace(self,ns):
!     self._namespace=ns
! 
!   # 
---------------------------------------------------------------------------
!   # Access Namespace
!   # 
---------------------------------------------------------------------------
! 
!   def __getattr__(self,attr):
!     if self.__dict__.has_key(attr):
!       return self.__dict__[attr]
!     else:
!       return getattr(self._namespace,attr)
Index: gnue/appserver/src/_featuretest/geasSuperObject.py
diff -c gnue/appserver/src/_featuretest/geasSuperObject.py:1.1 
gnue/appserver/src/_featuretest/geasSuperObject.py:1.2
*** gnue/appserver/src/_featuretest/geasSuperObject.py:1.1      Mon May 13 
18:34:11 2002
--- gnue/appserver/src/_featuretest/geasSuperObject.py  Wed Jun 19 09:15:46 2002
***************
*** 19,25 ****
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasSuperObject.py,v 1.1 2002/05/13 22:34:11 siesel Exp $
  
  from gnue.common import GDataSource
  import geasObject
--- 19,25 ----
  # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
! # $Id: geasSuperObject.py,v 1.2 2002/06/19 13:15:46 siesel Exp $
  
  from gnue.common import GDataSource
  import geasObject
***************
*** 32,38 ****
  # super object class
  # 
=============================================================================
  
! class geasSuperObject(geasObject.geasObject):
  
    # 
---------------------------------------------------------------------------
    # Initalize
--- 32,38 ----
  # super object class
  # 
=============================================================================
  
! class geasSuperObject(geasMetaObject.geasMetaObject):
  
    # 
---------------------------------------------------------------------------
    # Initalize
***************
*** 61,66 ****
--- 61,69 ----
      return ns
  
    def getObjectByOID(self,GOID):
+     # 1. check OID lookup cache (if OID in cache, go directly to datasource X)
+     # 2. check Datastore a,b,c,d, until OID is found
+     # 3. write OID into datasource lookup cache
      return geasMetaObject.geasMetaObject(GOID,self._OID,self._datastore)
      
    def loadMetaObject(self,GOID):



reply via email to

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