Salome HOME
CCAR : mise a jour avec la version 7.3.23 du Noyau superviseur Aster
[tools/eficas.git] / Noyau / N_JDC.py
index 868fac35563acd187d4d1e84b200ae8ca12c8935..4068fee866baadd32aa7005fed2653b04be91b00 100644 (file)
@@ -1,4 +1,5 @@
-#@ MODIF N_JDC Noyau  DATE 23/10/2002   AUTEUR DURAND C.DURAND 
+#@ MODIF N_JDC Noyau  DATE 14/09/2004   AUTEUR MCOURTOI M.COURTOIS 
+# -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -18,6 +19,8 @@
 #                                                                       
 #                                                                       
 # ======================================================================
+
+
 """
    Ce module contient la classe JDC qui sert à interpréter un jeu de commandes
 """
@@ -99,6 +102,8 @@ NONE = None
       self.current_context={}
       self.condition_context={}
       self.index_etape_courante=0
+      self.UserError="UserError"
+      self.alea = None
 
    def compile(self):
       """
@@ -108,8 +113,7 @@ NONE = None
       """
       try:
         if self.appli != None : 
-           self.appli.affiche_infos('Compilation du fichier de commandes \
-                                     en cours ...')
+           self.appli.affiche_infos('Compilation du fichier de commandes en cours ...')
         self.proc_compile=compile(self.procedure,self.nom,'exec')
       except SyntaxError,e:
         if CONTEXT.debug : traceback.print_exc()
@@ -151,8 +155,7 @@ NONE = None
                if isinstance(sd,ASSD):self.sds_dict[sdnom]=sd
 
          if self.appli != None : 
-            self.appli.affiche_infos('Interprétation du fichier de \
-                                      commandes en cours ...')
+            self.appli.affiche_infos('Interprétation du fichier de commandes en cours ...')
          # On sauve le contexte pour garder la memoire des constantes
          # En mode edition (EFICAS) ou lors des verifications le contexte 
          # est recalculé
@@ -168,6 +171,7 @@ NONE = None
         # de commandes avant la fin
         # Fonctionnement normal, ne doit pas etre considere comme une erreur
         CONTEXT.unset_current_step()
+        self.traiter_fin_exec('commande')
 
       except AsException,e:
         # une erreur a ete identifiee
@@ -182,25 +186,44 @@ NONE = None
         s= traceback.format_exception_only("Erreur de nom",e)[0][:-1]
         message = "erreur de syntaxe,  %s ligne %d" % (s,l[-1][1])
         if CONTEXT.debug :
-          #prbanner(message)
           traceback.print_exc()
         self.cr.exception(message)
         CONTEXT.unset_current_step()
 
+      except self.UserError,exc_val:
+        self.traiter_user_exception(exc_val)
+        CONTEXT.unset_current_step()
+        self.traiter_fin_exec('commande')
+    
       except :
         # erreur inattendue
         # sys_exc_typ,sys_exc_value,sys_exc_frame = sys_exc.info() 
         # (tuple de 3 éléments)
-        if CONTEXT.debug :
-          traceback.print_exc()
-          #prbanner("erreur non prevue et non traitee prevenir \
-          #           la maintenance "+self.nom)
-        l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],
-                                     sys.exc_info()[2])
+        if CONTEXT.debug : traceback.print_exc()
+
+        exc_typ,exc_val,exc_fr=sys.exc_info()
+        l=traceback.format_exception(exc_typ,exc_val,exc_fr)
         self.cr.exception("erreur non prevue et non traitee prevenir la maintenance "+
                            self.nom+'\n'+ string.join(l))
+        del exc_typ,exc_val,exc_fr
         CONTEXT.unset_current_step()
 
+   def traiter_fin_exec(self,mode,etape=None):
+       """
+          Cette methode realise un traitement final apres l'execution de toutes
+          les commandes en mode commande par commande ou par lot
+          Par defaut il n'y a pas de traitement. Elle doit etre surchargee
+          pour en introduire un
+       """
+       print "FIN D'EXECUTION",mode,etape
+
+   def traiter_user_exception(self,exc_val):
+       """Cette methode realise un traitement sur les exceptions utilisateur    
+          Par defaut il n'y a pas de traitement. La méthode doit etre 
+          surchargée pour en introduire un.
+       """
+       return 
+
    def register(self,etape):
       """
          Cette méthode ajoute etape dans la liste des etapes : self.etapes
@@ -243,9 +266,9 @@ NONE = None
                   Dans le cas du JDC, le deuxième cas ne peut pas se produire.
       """
       sd= etape.get_sd_prod()
-      if sd != None and etape.reuse == None:
+      if sd != None and (etape.definition.reentrant == 'n' or etape.reuse is None) :
          # ATTENTION : On ne nomme la SD que dans le cas de non reutilisation 
-         # d un concept
+         # d un concept. Commande non reentrante ou reuse absent.
          self.NommerSdprod(sd,nomsd)
       return sd
 
@@ -257,6 +280,7 @@ NONE = None
           Met le concept créé dans le concept global g_context
       """
       if CONTEXT.debug : print "JDC.NommerSdprod ",sd,sdnom
+
       o=self.sds_dict.get(sdnom,None)
       if isinstance(o,ASSD):
          raise AsException("Nom de concept deja defini : %s" % sdnom)
@@ -301,20 +325,22 @@ NONE = None
       """
       if self.appli :
          # Si le JDC est relié à une application maitre, on délègue la recherche
-         file= self.appli.get_file(unite,fic_origine)
+         file,text= self.appli.get_file(unite,fic_origine)
       else:
          file = None
          if unite != None:
             if os.path.exists("fort."+str(unite)):
                file= "fort."+str(unite)
          if file == None :
-            raise AsException("Impossible de trouver le fichier correspondant \
-                               a l unite %s" % unite)
+            raise AsException("Impossible de trouver le fichier correspondant"
+                               a l unite %s" % unite)
          if not os.path.exists(file):
             raise AsException("%s n'est pas un fichier existant" % unite)
-      fproc=open(file,'r')
-      text=string.replace(fproc.read(),'\r\n','\n')
-      fproc.close()
+         fproc=open(file,'r')
+         text=fproc.read()
+         fproc.close()
+      if file == None : return None,None
+      text=string.replace(text,'\r\n','\n')
       linecache.cache[file]=0,0,string.split(text,'\n'),file
       return file,text
 
@@ -383,9 +409,12 @@ NONE = None
       if index_etape >= self.index_etape_courante:
          # On calcule le contexte en partant du contexte existant
          d=self.current_context
+         if self.index_etape_courante==0 and self.context_ini:
+            d.update(self.context_ini)
          liste_etapes=self.etapes[self.index_etape_courante:index_etape]
       else:
          d=self.current_context={}
+         if self.context_ini:d.update(self.context_ini)
          liste_etapes=self.etapes
 
       for e in liste_etapes:
@@ -398,3 +427,14 @@ NONE = None
 
    def get_global_contexte(self):
       return self.g_context.copy()
+
+   def get_cmd(self,nomcmd):
+      """
+          Méthode pour recuperer la definition d'une commande
+          donnee par son nom dans les catalogues declares
+          au niveau du jdc
+      """
+      for cata in self.cata:
+          if hasattr(cata,nomcmd):
+             return getattr(cata,nomcmd)
+