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)
14 # XXX CCAR : ne suis pas certain que typret doive etre
15 # initialise à None (a verifier)
18 def get_sdprods(self,nom_sd):
20 Fonction : retourne le concept produit par l etape de nom nom_sd
21 s il existe sinon None
24 if self.sd.nom == nom_sd:
26 for co in self.sdprods:
27 if co.nom==nom_sd:return co
30 def make_contexte(self,fichier,text):
32 Cette méthode sert à créer un contexte en interprétant un texte source
35 # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
36 contexte = self.get_contexte_jdc(fichier,text)
38 raise Exception("Impossible de relire le fichier")
40 self.g_context = contexte
41 if hasattr(self,'contexte_fichier_init'):
42 self.old_contexte_fichier_init = self.contexte_fichier_init
43 self.contexte_fichier_init = contexte
44 # XXX la validité ne doit pas etre forcée à 1. Que faut-il faire exactement ???
47 #self.state = 'unchanged'
49 def get_contexte_jdc(self,fichier,text):
51 Interprète text comme un texte de jdc et retourne le
53 cad le dictionnaire des sd disponibles à la dernière étape
54 Si text n'est pas un texte de jdc valide, retourne None
55 --> utilisée par ops.POURSUITE et INCLUDE
58 # on essaie de créer un objet JDC...
59 context_ini = self.parent.get_contexte_avant(self)
61 CONTEXT.unset_current_step()
62 j=self.jdc.definition(procedure=text,cata=self.jdc.cata,
64 context_ini = context_ini,
67 # XXX en passant par un jdc auxiliaire, on risque de rendre les etapes inactives
68 # on les force dans l'etat actif
69 for etape in j.etapes:
74 CONTEXT.set_current_step(self)
75 if not j.cr.estvide():
76 raise Exception("Impossible de relire le fichier\n"+str(j.cr))
78 #XXX la validité d'un source inclus n'est pas identique à celle d'un JDC complet
79 # impossible de la tester en dehors du JDC d'accueil
82 # raise Exception("Le fichier contient des erreurs\n"+str(j.cr))
83 j_context=j.get_contexte_avant(None)
84 # XXX j.g_context doit donner le meme résultat
85 # On retourne le contexte apres la derniere etape
86 # XXX j.supprime() ???
87 self.verif_contexte(j_context)
88 # Le contexte est acceptable. On récupère les étapes internes (pour validation)
92 def verif_contexte(self,context):
94 On verifie que le contexte context peut etre inséré dans le jeu
95 de commandes à la position de self
97 for nom_sd,sd in context.items():
98 if not isinstance(sd,ASSD):continue
99 if self.parent.get_sd_apres_etape(nom_sd,etape=self):
100 # Il existe un concept apres self => impossible d'inserer
101 raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
102 "%s existe déjà dans le jeu de commandes." % nom_sd)
104 def reevalue_sd_jdc(self):
106 Avec la liste des SD qui ont été supprimées, propage la
107 disparition de ces SD dans totues les étapes et descendants
109 l_sd = self.diff_contextes()
110 if len(l_sd) == 0 : return
112 self.jdc.delete_concept(sd)
114 def diff_contextes(self):
116 Réalise la différence entre les 2 contextes
117 old_contexte_fichier_init et contexte_fichier_init
118 cad retourne la liste des sd qui ont disparu
120 if not hasattr(self,'old_contexte_fichier_init'):return []
122 for old_key in self.old_contexte_fichier_init.keys():
123 if not self.contexte_fichier_init.has_key(old_key):
124 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
125 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
126 return l_sd_suppressed
128 def supprime_sdprods(self):
131 Lors d'une destruction d'etape, detruit tous les concepts produits
132 Un opérateur n a qu un concept produit
133 Une procedure n'en a aucun
134 Une macro en a en général plus d'un
136 if not self.is_reentrant() :
137 # l'étape n'est pas réentrante
138 # le concept retourné par l'étape est à supprimer car il était
141 self.parent.del_sdprod(self.sd)
142 self.parent.delete_concept(self.sd)
143 # On détruit les concepts à droite du signe =
144 for co in self.sdprods:
145 self.parent.del_sdprod(co)
146 self.parent.delete_concept(co)
147 # Si la macro a des etapes et des concepts inclus, on les detruit
148 for nom_sd,co in self.g_context.items():
149 if not isinstance(co,ASSD):continue
150 print "Delete: ",self.nom,co.nom
151 self.parent.del_sdprod(co)
152 self.parent.delete_concept(co)
153 # On met g_context à blanc