Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / Noyau / N_PROC_ETAPE.py
1 """ 
2     Ce module contient la classe PROC_ETAPE qui sert à vérifier et à exécuter
3     une procédure
4 """
5
6 # Modules Python
7 import types,sys,string
8 import traceback
9
10 # Modules EFICAS
11 import N_MCCOMPO, N_ETAPE
12 from N_Exception import AsException
13 import N_utils
14
15 class PROC_ETAPE(N_ETAPE.ETAPE):
16    """
17       Cette classe hérite de ETAPE. La seule différence porte sur le fait
18       qu'une procédure n'a pas de concept produit
19
20    """
21    nature = "PROCEDURE"
22    def __init__(self,oper=None,args={}):
23       """
24          Attributs :
25
26           - definition : objet portant les attributs de définition d'une étape de type opérateur. Il
27                          est initialisé par l'argument oper.
28
29           - valeur : arguments d'entrée de type mot-clé=valeur. Initialisé avec l'argument args.
30
31       """
32       self.definition=oper
33       self.valeur=args
34       self.nettoiargs()
35       self.parent=CONTEXT.get_current_step()
36       self.etape = self
37       self.nom=oper.nom
38       self.idracine=oper.label
39       self.appel=N_utils.callee_where()
40       self.mc_globaux={}
41       self.sd=None
42       self.actif=1
43       self.make_register()
44
45    def make_register(self):
46       """
47          Initialise les attributs jdc, id, niveau et réalise les enregistrements
48          nécessaires
49       """
50       if self.parent :
51          self.jdc = self.parent.get_jdc_root()
52          self.id=self.parent.register(self)
53          self.niveau=None
54       else:
55          self.jdc = self.parent =None
56          self.id=None
57          self.niveau=None
58
59    def McBuild(self):
60       """
61          Demande la construction des sous-objets et les stocke dans l'attribut
62          mc_liste.
63       """
64       self.mc_liste=self.build_mc()
65
66    def Build_sd(self):
67       """
68           Cette methode applique la fonction op_init au contexte du parent
69           et lance l'exécution en cas de traitement commande par commande
70           Elle doit retourner le concept produit qui pour une PROC est toujours None
71           En cas d'erreur, elle leve une exception : AsException ou EOFError
72       """
73       if not self.isactif():return
74       try:
75          if self.parent:
76             if type(self.definition.op_init) == types.FunctionType: 
77                apply(self.definition.op_init,(self,self.parent.g_context))
78          else:
79             pass
80          if self.jdc.par_lot == "NON" :
81             self.Execute()
82       except AsException,e:
83         raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
84                               'fichier : ',self.appel[1],e)
85       except EOFError:
86         self.reset_current_step()
87         raise
88       except :
89         l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
90         raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
91                           'fichier : ',self.appel[1]+'\n',
92                           string.join(l))
93
94    def supprime(self):
95       """
96          Méthode qui supprime toutes les références arrières afin que l'objet puisse
97          être correctement détruit par le garbage collector
98       """
99       N_MCCOMPO.MCCOMPO.supprime(self)
100       self.jdc=None
101       self.appel=None
102
103    def accept(self,visitor):
104       """
105          Cette methode permet de parcourir l'arborescence des objets
106          en utilisant le pattern VISITEUR
107       """
108       visitor.visitPROC_ETAPE(self)
109
110    def update_context(self,d):
111       """
112          Met à jour le contexte de l'appelant passé en argument (d)
113          Une PROC_ETAPE n ajoute pas directement de concept dans le contexte
114          Seule une fonction enregistree dans op_init pourrait le faire
115       """
116       if type(self.definition.op_init) == types.FunctionType:
117         apply(self.definition.op_init,(self,d))
118
119
120