commit-gnue
[Top][All Lists]
Advanced

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

r6249 - trunk/gnue-appserver/src/gcd


From: johannes
Subject: r6249 - trunk/gnue-appserver/src/gcd
Date: Sat, 4 Sep 2004 04:53:25 -0500 (CDT)

Author: johannes
Date: 2004-09-04 04:53:24 -0500 (Sat, 04 Sep 2004)
New Revision: 6249

Modified:
   trunk/gnue-appserver/src/gcd/GCParser.py
   trunk/gnue-appserver/src/gcd/readgcd.py
Log:
Added message-support to gnue-readgcd


Modified: trunk/gnue-appserver/src/gcd/GCParser.py
===================================================================
--- trunk/gnue-appserver/src/gcd/GCParser.py    2004-09-03 18:42:10 UTC (rev 
6248)
+++ trunk/gnue-appserver/src/gcd/GCParser.py    2004-09-04 09:53:24 UTC (rev 
6249)
@@ -18,13 +18,14 @@
 #
 # Copyright 2001-2004 Free Software Foundation
 #
-# $Id: $
+# $Id$
 
 import re
 
 from gnue.common.definitions import GParser, GObjects, GRootObj
 from gnue.common.definitions.GParserHelpers import GContent
 from gnue.common.formatting import GTypecast
+from gnue.common.apps import errors
 from gnue.appserver.classrep import helpers, Namespace
 
 
@@ -36,7 +37,7 @@
 # Exceptions
 # =============================================================================
 
-class Error (gException):
+class Error (errors.ApplicationError):
   pass
 
 class NoModuleError (Error):
@@ -64,6 +65,14 @@
           % {'class': classname, 'property': propName}
     Error.__init__ (self, msg)
 
+class MissingLanguageError (Error):
+  def __init__ (self):
+    msg = _("No language specified for messages")
+    Error.__init__ (self, msg)
+
+class MissingNameError (Error):
+  pass
+
 # =============================================================================
 # load an XML object tree from a given stream and return it's root object
 # =============================================================================
@@ -184,7 +193,30 @@
             'Typecast': GTypecast.integer}
         },
         'ParentTags': ('procedure',)
-      }
+      },
+
+      'messages': {
+        'BaseClass': GCMessages,
+        'Attributes': {
+          'language': {
+            'Required': True,
+            'Typecast': GTypecast.text}
+        }, # Attributes
+        'ParentTags': ('module',)
+      }, # messages
+
+      'message': {
+        'BaseClass': GCMessage,
+        'Attributes': {
+          'name': {
+            'Required': True,
+            'Unique': True,
+            'Typecast': GTypecast.name}
+        }, # Attributes
+        'ParentTags'    : ('messages',),
+        'MixedContent'  : True,
+        'KeepWhitespace': True,
+      }, # message
     }
 
   return GParser.buildImportableTags ('module', xmlElements)
@@ -229,7 +261,6 @@
   # ---------------------------------------------------------------------------
 
   def _validate (self):
-
     if hasattr (self, 'type'):
       fieldType = self.type.lower ().strip ()
       tpMatch   = re.compile ('^(\w+)').match (fieldType)
@@ -281,8 +312,17 @@
   def __init__ (self, parent = None):
     GRootObj.GRootObj.__init__ (self, 'module', getXMLelements, 
self.__module__)
     GCObject.__init__ (self, parent, type = 'GCModule')
+    self._inits.extend ([None, self._validate])
 
+  # ---------------------------------------------------------------------------
+  # Validate a module tag
+  # ---------------------------------------------------------------------------
 
+  def _validate (self):
+    if not len (self.name):
+      raise MissingNameError, _("Module has no name")
+
+
 # =============================================================================
 # The class object
 # =============================================================================
@@ -299,6 +339,9 @@
   # ---------------------------------------------------------------------------
 
   def _validate (self):
+    if not len (self.name):
+      raise MissingNameError, _("Class has no name")
+
     if not isinstance (self._parent, GCModule):
       raise NoModuleError, self.name
 
@@ -419,3 +462,39 @@
   def __init__ (self, parent):
     GCTypeDefinition.__init__ (self, parent, objType = 'GCParameter')
 
+
+# =============================================================================
+# This class implements a collection of messages
+# =============================================================================
+
+class GCMessages (GCObject):
+  def __init__ (self, parent):
+    GCObject.__init__ (self, parent, type = 'GCMessages')
+    self._inits.extend ([None, self._validate])
+
+  def _validate (self):
+    if not len (self.language):
+      raise MissingLanguageError
+
+    self.module = self._parent.name
+
+
+# =============================================================================
+# This class implements a single message
+# =============================================================================
+
+class GCMessage (GCObject):
+  def __init__ (self, parent):
+    GCObject.__init__ (self, parent, type = 'GCMessage')
+    self._inits.extend ([None, self._validate])
+
+  def _validate (self):
+    if not len (self.name):
+      raise MissingNameError, _("Message tag has an empty 'name' attribute")
+
+    if '_' in self.name:
+      self.name = self.name.split ('_') [-1]
+
+    self.language = self._parent.language
+    self.module   = self._parent.module
+    self.fullName = Namespace.createName (self._parent.module, self.name)

Modified: trunk/gnue-appserver/src/gcd/readgcd.py
===================================================================
--- trunk/gnue-appserver/src/gcd/readgcd.py     2004-09-03 18:42:10 UTC (rev 
6248)
+++ trunk/gnue-appserver/src/gcd/readgcd.py     2004-09-04 09:53:24 UTC (rev 
6249)
@@ -25,7 +25,7 @@
 import os
 import whrandom
 
-from gnue.common.apps import i18n
+from gnue.common.apps import i18n, errors
 from gnue.common.apps.GClientApp import *
 from gnue.common.utils.FileUtils import openResource
 from gnue.common.datasources import GDataSource, GConditions
@@ -38,9 +38,12 @@
 # Exceptions
 # =============================================================================
 
-class Error (gException):
+class Error (errors.ApplicationError):
   pass
 
+class StartupError (errors.UserError):
+  pass
+
 class ModuleNotFoundError (Error):
   def __init__ (self, module):
     msg = u_("Module '%s' not found in class repository") % module
@@ -106,26 +109,26 @@
     self._args = [unicode (a, i18n.encoding) for a in self.ARGUMENTS]
 
     if not len (self._args):
-      self.handleStartupError (_("No input file specified."))
+      raise StartupError, _("No input file specified.")
 
+    if not self.OPTIONS ['connection']:
+      raise StartupError, _("No connection specified.")
+
     try:
       self._files = []
 
       for filename in self._args:
         self._files.append (openResource (filename))
 
-    except IOError:
-      self.handleStartupError (u_("Unable to open input file %s.") % filename)
+    except IOError, err:
+      raise StartupError, u_("Unable to open input file: %s") % err
 
 
-    if not self.OPTIONS ['connection']:
-      self.handleStartupError (_("No connection specified."))
-
     self.outfile = self.OPTIONS ['output']
 
     if self.OPTIONS ['file-only'] and self.outfile is None:
-      self.handleStartupError (_("Output to file only requested, but no "
-                                 "filename specified."))
+      raise StartupError, \
+          _("Output to file only requested, but no filename specified.")
 
 
   # ---------------------------------------------------------------------------
@@ -141,33 +144,29 @@
 
     self.__checkOptions ()
 
-    try:
-      self.tables     = []
-      self.modules    = {}
-      self.classes    = {}
-      self.properties = {}
-      self.procedures = {}
-      self.parameters = {}
+    self.tables     = []
+    self.modules    = {}
+    self.classes    = {}
+    self.properties = {}
+    self.procedures = {}
+    self.parameters = {}
+    self.messages   = {}
 
-      for item in range (len (self._files)):
-        print o (u_("Loading gcd file '%s' ...") % self._args [item])
+    for item in range (len (self._files)):
+      print o (u_("Loading gcd file '%s' ...") % self._args [item])
 
-        try:
-          schema = GCParser.loadFile (self._files [item])
-          schema.walk (self.__iterateObjects)
+      try:
+        schema = GCParser.loadFile (self._files [item])
+        schema.walk (self.__iterateObjects)
 
-        finally:
-          self._files [item].close ()
+      finally:
+        self._files [item].close ()
 
-    except Exception:
-      print sys.exc_info () [1]
+    self.executeAndGenerateCode ()
 
-    else:
-      self.executeAndGenerateCode ()
+    self.updateRepository ()
 
-      self.updateRepository ()
 
-
   # ---------------------------------------------------------------------------
   # Iterate over all top level elements
   # ---------------------------------------------------------------------------
@@ -185,6 +184,9 @@
     elif sObject._type == 'GCClass':
       self.__translateClass (sObject)
 
+    elif sObject._type == 'GCMessage':
+      self.__translateMessage (sObject)
+
   
 
   # ---------------------------------------------------------------------------
@@ -325,6 +327,17 @@
 
 
   # ---------------------------------------------------------------------------
+  # Translate a message into a dictionary for later classrep update
+  # ---------------------------------------------------------------------------
+
+  def __translateMessage (self, sObject):
+    self.messages [sObject.fullName] = { \
+                         'gnue_language': sObject.language,
+                         'gnue_name'    : sObject.name,
+                         'gnue_text'    : sObject.getChildrenAsContent (),
+                         'gnue_module'  : sObject.module}
+
+  # ---------------------------------------------------------------------------
   # Get a dictionary with all keys listed in tags and values from sObject
   # ---------------------------------------------------------------------------
 
@@ -397,6 +410,7 @@
     self._updateProperties ()
     self._updateProcedures ()
     self._updateParameter ()
+    self._updateMessages ()
 
 
   # ---------------------------------------------------------------------------
@@ -662,6 +676,59 @@
 
 
   # ---------------------------------------------------------------------------
+  # Update/add messages to the class repository
+  # ---------------------------------------------------------------------------
+
+  def _updateMessages (self):
+    attributes = {'name'    : "dts_gnueMessage",
+                  'database': self.OPTIONS ['connection'],
+                  'table'   : 'gnue_message'}
+
+    fieldList = ['gnue_id', 'gnue_module', 'gnue_language', 'gnue_name',
+                 'gnue_text']
+
+    self._dtsMessage = GDataSource.DataSourceWrapper (
+                            connections = self.connections,
+                            attributes  = attributes,
+                            fields      = fieldList,
+                            unicodeMode = True)
+
+    stat = [0, 0, 0]      # inserted, updated, unchanged
+
+    for message in self.messages.values ():
+
+      moduleId = self.__findModule (message ['gnue_module'])
+
+      cond = GConditions.buildConditionFromDict ( \
+          {'gnue_module'  : moduleId,
+           'gnue_language': message ['gnue_language'],
+           'gnue_name'    : message ['gnue_name']})
+      resultSet = self._dtsMessage.createResultSet (cond)
+
+      if resultSet.firstRecord () is None:
+        resultSet.insertRecord ()
+        modifier = 0
+        message ['gnue_id'] = self.__generateId ()
+      else:
+        message ['gnue_id'] = resultSet.current.getField ('gnue_id')
+        modifier = 1
+
+      message ['gnue_module'] = moduleId
+
+      if not self.doUpdate (resultSet, message):
+        modifier += 1
+
+      stat [modifier] += 1
+
+    if stat [0] + stat [1]:
+      self.connections.commitAll ()
+
+    print o (u_("  Messages  : %(ins)3d inserted, %(upd)3d updated, %(kept)3d "
+                "unchanged.") \
+              % {'ins': stat [0], 'upd': stat [1], 'kept': stat [2]})
+
+
+  # ---------------------------------------------------------------------------
   # Perform an update on the given resultset using a given data dictionary
   # ---------------------------------------------------------------------------
 





reply via email to

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