1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
23 import traceback,types,string
27 from Noyau.N_ASSD import ASSD
29 # import rajoutés suite à l'ajout de Build_sd --> à résorber
31 from Noyau import N_Exception
32 from Noyau.N_Exception import AsException
33 # fin import à résorber
35 class MACRO_ETAPE(I_ETAPE.ETAPE):
38 I_ETAPE.ETAPE.__init__(self)
39 # XXX CCAR : ne suis pas certain que typret doive etre
40 # initialise à None (a verifier)
43 def get_sdprods(self,nom_sd):
45 Fonction : retourne le concept produit par l etape de nom nom_sd
46 s il existe sinon None
49 if self.sd.nom == nom_sd:
51 for co in self.sdprods:
52 if co.nom==nom_sd:return co
55 def make_contexte(self,fichier,text):
57 Cette méthode sert à créer un contexte en interprétant un texte source
60 # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
61 contexte = self.get_contexte_jdc(fichier,text)
63 raise Exception("Impossible de relire le fichier")
65 self.g_context = contexte
66 if hasattr(self,'contexte_fichier_init'):
67 self.old_contexte_fichier_init = self.contexte_fichier_init
68 self.contexte_fichier_init = contexte
69 # XXX la validité ne doit pas etre forcée à 1. Que faut-il faire exactement ???
72 #self.state = 'unchanged'
74 def get_contexte_jdc(self,fichier,text):
76 Interprète text comme un texte de jdc et retourne le
78 cad le dictionnaire des sd disponibles à la dernière étape
79 Si text n'est pas un texte de jdc valide, retourne None
80 --> utilisée par ops.POURSUITE et INCLUDE
83 # on essaie de créer un objet JDC...
84 context_ini = self.parent.get_contexte_avant(self)
86 CONTEXT.unset_current_step()
87 j=self.jdc.definition(procedure=text,cata=self.jdc.cata,
89 context_ini = context_ini,
92 # XXX en passant par un jdc auxiliaire, on risque de rendre les etapes inactives
93 # on les force dans l'etat actif
94 for etape in j.etapes:
99 CONTEXT.set_current_step(self)
100 if not j.cr.estvide():
101 raise Exception("Impossible de relire le fichier\n"+str(j.cr))
103 #XXX la validité d'un source inclus n'est pas identique à celle d'un JDC complet
104 # impossible de la tester en dehors du JDC d'accueil
106 #if not cr.estvide():
107 # raise Exception("Le fichier contient des erreurs\n"+str(j.cr))
108 j_context=j.get_contexte_avant(None)
109 # XXX j.g_context doit donner le meme résultat
110 # On retourne le contexte apres la derniere etape
111 # XXX j.supprime() ???
112 self.verif_contexte(j_context)
113 # Le contexte est acceptable. On récupère les étapes internes (pour validation)
117 def verif_contexte(self,context):
119 On verifie que le contexte context peut etre inséré dans le jeu
120 de commandes à la position de self
122 for nom_sd,sd in context.items():
123 if not isinstance(sd,ASSD):continue
124 if self.parent.get_sd_apres_etape(nom_sd,etape=self):
125 # Il existe un concept apres self => impossible d'inserer
126 raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
127 "%s existe déjà dans le jeu de commandes." % nom_sd)
129 def reevalue_sd_jdc(self):
131 Avec la liste des SD qui ont été supprimées, propage la
132 disparition de ces SD dans totues les étapes et descendants
134 l_sd = self.diff_contextes()
135 if len(l_sd) == 0 : return
137 self.jdc.delete_concept(sd)
139 def diff_contextes(self):
141 Réalise la différence entre les 2 contextes
142 old_contexte_fichier_init et contexte_fichier_init
143 cad retourne la liste des sd qui ont disparu
145 if not hasattr(self,'old_contexte_fichier_init'):return []
147 for old_key in self.old_contexte_fichier_init.keys():
148 if not self.contexte_fichier_init.has_key(old_key):
149 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
150 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
151 return l_sd_suppressed
153 def supprime_sdprods(self):
156 Lors d'une destruction d'etape, detruit tous les concepts produits
157 Un opérateur n a qu un concept produit
158 Une procedure n'en a aucun
159 Une macro en a en général plus d'un
161 if not self.is_reentrant() :
162 # l'étape n'est pas réentrante
163 # le concept retourné par l'étape est à supprimer car il était
166 self.parent.del_sdprod(self.sd)
167 self.parent.delete_concept(self.sd)
168 # On détruit les concepts à droite du signe =
169 for co in self.sdprods:
170 self.parent.del_sdprod(co)
171 self.parent.delete_concept(co)
172 # Si la macro a des etapes et des concepts inclus, on les detruit
173 for nom_sd,co in self.g_context.items():
174 if not isinstance(co,ASSD):continue
175 print "Delete: ",self.nom,co.nom
176 self.parent.del_sdprod(co)
177 self.parent.delete_concept(co)
178 # On met g_context à blanc
181 def Build_sd(self,nom):
183 Construit le concept produit de l'opérateur. Deux cas
184 peuvent se présenter :
186 - le parent n'est pas défini. Dans ce cas, l'étape prend en charge
187 la création et le nommage du concept.
189 - le parent est défini. Dans ce cas, l'étape demande au parent la
190 création et le nommage du concept.
193 if not self.isactif():return
194 # CCAR : meme modification que dans I_ETAPE
195 if not self.isvalid(sd='non') : return
196 else:self.state='undetermined'
198 # On positionne la macro self en tant que current_step pour que les
199 # étapes créées lors de l'appel à sd_prod et à op_init aient la macro
201 self.set_current_step()
203 sd= self.parent.create_sdprod(self,nom)
204 if type(self.definition.op_init) == types.FunctionType:
205 apply(self.definition.op_init,(self,self.parent.g_context))
207 sd=self.get_sd_prod()
208 if sd != None and self.reuse == None:
209 # On ne nomme le concept que dans le cas de non reutilisation
212 self.reset_current_step()
213 if self.jdc and self.jdc.par_lot == "NON" :
216 except AsException,e:
217 self.reset_current_step()
218 raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
219 'fichier : ',self.appel[1],e)
221 #self.reset_current_step()
224 self.reset_current_step()
225 l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
226 raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
227 'fichier : ',self.appel[1]+'\n',