4 import traceback,types,string
8 from Noyau.N_ASSD import ASSD
10 class MACRO_ETAPE(I_ETAPE.ETAPE):
13 I_ETAPE.ETAPE.__init__(self)
15 def get_sdprods(self,nom_sd):
17 Fonction : retourne le concept produit par l etape de nom nom_sd
18 s il existe sinon None
21 if self.sd.nom == nom_sd:
23 for co in self.sdprods:
24 if co.nom==nom_sd:return co
27 def make_contexte(self,fichier,text):
29 Cette méthode sert à créer un contexte en interprétant un texte source
32 # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
33 contexte = self.get_contexte_jdc(fichier,text)
35 raise Exception("Impossible de relire le fichier")
37 self.g_context = contexte
38 if hasattr(self,'contexte_fichier_init'):
39 self.old_contexte_fichier_init = self.contexte_fichier_init
40 self.contexte_fichier_init = contexte
41 # XXX la validité ne doit pas etre forcée à 1. Que faut-il faire exactement ???
44 #self.state = 'unchanged'
46 def get_contexte_jdc(self,fichier,text):
48 Interprète text comme un texte de jdc et retourne le
50 cad le dictionnaire des sd disponibles à la dernière étape
51 Si text n'est pas un texte de jdc valide, retourne None
52 --> utilisée par ops.POURSUITE et INCLUDE
55 # on essaie de créer un objet JDC...
56 context_ini = self.parent.get_contexte_avant(self)
58 CONTEXT.unset_current_step()
59 j=self.jdc.definition(procedure=text,cata=self.jdc.cata,
61 context_ini = context_ini,
67 CONTEXT.set_current_step(self)
68 if not j.cr.estvide():
69 raise Exception("Impossible de relire le fichier\n"+str(j.cr))
71 #XXX la validité d'un source inclus n'est pas identique à celle d'un JDC complet
72 # impossible de la tester en dehors du JDC d'accueil
75 # raise Exception("Le fichier contient des erreurs\n"+str(j.cr))
76 j_context=j.get_contexte_avant(None)
77 # XXX j.g_context doit donner le meme résultat
78 # On retourne le contexte apres la derniere etape
79 # XXX j.supprime() ???
80 self.verif_contexte(j_context)
81 # Le contexte est acceptable. On récupère les étapes internes (pour validation)
85 def verif_contexte(self,context):
87 On verifie que le contexte context peut etre inséré dans le jeu
88 de commandes à la position de self
90 for nom_sd,sd in context.items():
91 if not isinstance(sd,ASSD):continue
92 if self.parent.get_sd_apres_etape(nom_sd,etape=self):
93 # Il existe un concept apres self => impossible d'inserer
94 raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
95 "%s existe déjà dans le jeu de commandes." % nom_sd)
97 def reevalue_sd_jdc(self):
99 Avec la liste des SD qui ont été supprimées, propage la
100 disparition de ces SD dans totues les étapes et descendants
102 l_sd = self.diff_contextes()
103 if len(l_sd) == 0 : return
105 self.jdc.delete_concept(sd)
107 def diff_contextes(self):
109 Réalise la différence entre les 2 contextes
110 old_contexte_fichier_init et contexte_fichier_init
111 cad retourne la liste des sd qui ont disparu
113 if not hasattr(self,'old_contexte_fichier_init'):return []
115 for old_key in self.old_contexte_fichier_init.keys():
116 if not self.contexte_fichier_init.has_key(old_key):
117 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
118 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
119 return l_sd_suppressed
121 def supprime_sdprods(self):
124 Lors d'une destruction d'etape, detruit tous les concepts produits
125 Un opérateur n a qu un concept produit
126 Une procedure n'en a aucun
127 Une macro en a en général plus d'un
129 if not self.is_reentrant() :
130 # l'étape n'est pas réentrante
131 # le concept retourné par l'étape est à supprimer car il était
134 self.parent.del_sdprod(self.sd)
135 self.parent.delete_concept(self.sd)
136 # On détruit les concepts à droite du signe =
137 for co in self.sdprods:
138 self.parent.del_sdprod(co)
139 self.parent.delete_concept(co)
140 # Si la macro a des etapes et des concepts inclus, on les detruit
141 for nom_sd,co in self.g_context.items():
142 if not isinstance(co,ASSD):continue
143 print "Delete: ",self.nom,co.nom
144 self.parent.del_sdprod(co)
145 self.parent.delete_concept(co)
146 # On met g_context à blanc