# -----------------
class X_definition:
# -----------------
- def adjoint(self, liste1, liste2):
- #print ('adjoint', liste1, liste2)
- l=[]
- for elt1 in liste1:
- for elt2 in liste2:
- newListe=deepcopy(elt1)
- if elt2 != []: newListe.append(elt2)
- l.append(newListe)
- return l
-
- def adjointUnMot(self, liste1, mot):
- l=[]
- for elt1 in liste1:
- newListe=deepcopy(elt1)
- newListe.append(mot)
- l.append(newListe)
- return l
-
- def remplaceListeParContenuEtVide(self, liste1, liste2):
- listeFinale=[]
- for elt1 in liste1 :
- for eltListe in liste2:
- newListe=deepcopy(elt1)
- if eltListe!=[] :newListe+=eltListe
- if newListe not in listeFinale : listeFinale.append(newListe)
- return listeFinale
-
-
- def fusionne2Listes(self, liste1, liste2):
- #print ('fusionne2Liste', liste1, liste2)
- listeFinale=[]
- for elt1 in liste1 :
- for eltListe in liste2:
- newListe=deepcopy(elt1)
- if eltListe!=[] :newListe.append(eltListe)
- listeFinale.append(newListe)
- #print (listeFinale)
- return listeFinale
-
- def getNomDuCodeDumpe(self):
- if hasattr(self,'nomDuCodeDumpe') : return
- obj=self
- while ( not hasattr(obj,'nomDuCodeDumpe') ): obj=obj.pere
- self.nomDuCodeDumpe = obj.nomDuCodeDumpe
- self.code=obj.code
-
- def getXPathComplet(self):
- obj=self
- textePath='/'+self.code+":"+self.nom
- while ( hasattr(obj,'pere') ):
- obj=obj.pere
- if isinstance(obj, X_BLOC) : continue
- textePath= '/'+ self.code + ":" + obj.nom + textePath
- textePath='.' + textePath
- return textePath
-
- def getXPathSansSelf(self):
- obj=self
- textePath=''
- while ( hasattr(obj,'pere') ):
- obj=obj.pere
- if isinstance(obj, X_BLOC) : continue
- textePath= self.code + ":" + obj.nom + '/' + textePath
- textePath='./'+ self.code + ":" + textePath
- return textePath
-
- def getNomCompletAvecBloc(self):
- obj=self
- texteNom=self.nom
- while ( hasattr(obj,'pere') ):
- texteNom=obj.pere.nom+'_'+texteNom
- obj=obj.pere
- return texteNom
-
- def metAJourPyxb(self,nomDuTypePyxb) :
- self.aCreer=False
- self.nomDuTypePyxb=nomDuTypePyxb
- cata = CONTEXT.getCurrentCata()
- nom='T_'+self.nom
- if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
- if not (nom in cata.dictTypesXSD.keys()) :
- cata.dictTypesXSD[nom] = [self,]
- else :
- cata.dictTypesXSD[nom].append(self)
-
- def definitNomDuTypePyxb(self,forceACreer=False,debug=False):
- if debug : print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet())
- if hasattr(self,'nomDuTypePyxb') : self.aCreer = False; return self.nomDuTypePyxb
- #debug=False
- if debug : print ('definitNomDuTypePyxb traitement pour ', self.nom)
- self.aCreer = True
- cata = CONTEXT.getCurrentCata()
- nom='T_'+self.nom
- if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
- if not (nom in cata.dictTypesXSD.keys()) :
- if debug : print ('definitNomDuTypePyxb encore jamais traite ', self.nom , ' a pour type' , nom)
- cata.dictTypesXSD[nom] = [self,]
- self.nomDuTypePyxb=nom
- return nom
-
- if nom == 'T_Consigne' : return nom
-
- if not forceACreer :
- self.aCreer = False
- listePossible=cata.dictTypesXSD[nom]
- indice=0
- while (indice < len(listePossible)) :
- objAComparer=listePossible[indice]
- if debug : print (self.compare)
- if self.compare(objAComparer) :
- self.nomDuTypePyxb=objAComparer.nomDuTypePyxb
- if debug : print (self, objAComparer)
- if debug : print (type(self), type(objAComparer))
- if debug : print ('definitNomDuTypePyxb', self.nom , 'type identique', objAComparer.nomDuTypePyxb )
- # c est nul pour la comparaison mais cela permet d etre ok dans le dictionnaire passe a Accas
- cata.dictTypesXSD[nom].append(self)
- if self.label != 'SIMP' :
- if objAComparer not in list(cata.dictTypesXSDJumeaux.keys()) : cata.dictTypesXSDJumeaux[objAComparer]=[self,]
- else : cata.dictTypesXSDJumeaux[objAComparer].append(self)
- return objAComparer.nomDuTypePyxb
- indice += 1
- self.aCreer = True
- cata.dictTypesXSD[nom].append(self)
- nomAlter='T_'+self.nom+'_'+str(indice)
- if (hasattr (self, 'nomXML')) and self.nomXML != None :
- nomAlter='T_'+self.nomXML+'_'+str(indice)
- self.nomDuTypePyxb=nomAlter
- return nomAlter
+ def adjoint(self, liste1, liste2):
+ #print ('adjoint', liste1, liste2)
+ l=[]
+ for elt1 in liste1:
+ for elt2 in liste2:
+ newListe=deepcopy(elt1)
+ if elt2 != []: newListe.append(elt2)
+ l.append(newListe)
+ return l
+
+ def adjointUnMot(self, liste1, mot):
+ l=[]
+ for elt1 in liste1:
+ newListe=deepcopy(elt1)
+ newListe.append(mot)
+ l.append(newListe)
+ return l
+
+ def remplaceListeParContenuEtVide(self, liste1, liste2):
+ listeFinale=[]
+ for elt1 in liste1 :
+ for eltListe in liste2:
+ newListe=deepcopy(elt1)
+ if eltListe!=[] :newListe+=eltListe
+ if newListe not in listeFinale : listeFinale.append(newListe)
+ return listeFinale
+
+
+ def fusionne2Listes(self, liste1, liste2):
+ #print ('fusionne2Liste', liste1, liste2)
+ listeFinale=[]
+ for elt1 in liste1 :
+ for eltListe in liste2:
+ newListe=deepcopy(elt1)
+ if eltListe!=[] :newListe.append(eltListe)
+ listeFinale.append(newListe)
+ #print (listeFinale)
+ return listeFinale
+
+ def getNomDuCodeDumpe(self):
+ if hasattr(self,'nomDuCodeDumpe') : return
+ obj=self
+ while ( not hasattr(obj,'nomDuCodeDumpe') ): obj=obj.pere
+ self.nomDuCodeDumpe = obj.nomDuCodeDumpe
+ self.code=obj.code
+
+ def getXPathComplet(self):
+ obj=self
+ textePath='/'+self.code+":"+self.nom
+ while ( hasattr(obj,'pere') ):
+ obj=obj.pere
+ if isinstance(obj, X_BLOC) : continue
+ textePath= '/'+ self.code + ":" + obj.nom + textePath
+ textePath='.' + textePath
+ return textePath
+
+ def getXPathSansSelf(self):
+ obj=self
+ textePath=''
+ while ( hasattr(obj,'pere') ):
+ obj=obj.pere
+ if isinstance(obj, X_BLOC) : continue
+ textePath= self.code + ":" + obj.nom + '/' + textePath
+ textePath='./'+ self.code + ":" + textePath
+ return textePath
+
+ def getNomCompletAvecBloc(self):
+ obj=self
+ texteNom=self.nom
+ while ( hasattr(obj,'pere') ):
+ texteNom=obj.pere.nom+'_'+texteNom
+ obj=obj.pere
+ return texteNom
+
+ def metAJourPyxb(self,nomDuTypePyxb) :
+ self.aCreer=False
+ self.nomDuTypePyxb=nomDuTypePyxb
+ cata = CONTEXT.getCurrentCata()
+ nom='T_'+self.nom
+ if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
+ if not (nom in cata.dictTypesXSD.keys()) :
+ cata.dictTypesXSD[nom] = [self,]
+ else :
+ cata.dictTypesXSD[nom].append(self)
+
+ def definitNomDuTypePyxb(self,forceACreer=False,debug=False):
+ if debug : print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet())
+ if hasattr(self,'nomDuTypePyxb') : self.aCreer = False; return self.nomDuTypePyxb
+ #debug=False
+ if debug : print ('definitNomDuTypePyxb traitement pour ', self.nom)
+ self.aCreer = True
+ cata = CONTEXT.getCurrentCata()
+ nom='T_'+self.nom
+ if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
+ if not (nom in cata.dictTypesXSD.keys()) :
+ if debug : print ('definitNomDuTypePyxb encore jamais traite ', self.nom , ' a pour type' , nom)
+ cata.dictTypesXSD[nom] = [self,]
+ self.nomDuTypePyxb=nom
+ return nom
+
+ if nom == 'T_Consigne' : return nom
+
+ if not forceACreer :
+ self.aCreer = False
+ listePossible=cata.dictTypesXSD[nom]
+ indice=0
+ while (indice < len(listePossible)) :
+ objAComparer=listePossible[indice]
+ if debug : print (self.compare)
+ if self.compare(objAComparer) :
+ self.nomDuTypePyxb=objAComparer.nomDuTypePyxb
+ if debug : print (self, objAComparer)
+ if debug : print (type(self), type(objAComparer))
+ if debug : print ('definitNomDuTypePyxb', self.nom , 'type identique', objAComparer.nomDuTypePyxb )
+ # c est nul pour la comparaison mais cela permet d etre ok dans le dictionnaire passe a Accas
+ cata.dictTypesXSD[nom].append(self)
+ if self.label != 'SIMP' :
+ if objAComparer not in list(cata.dictTypesXSDJumeaux.keys()) : cata.dictTypesXSDJumeaux[objAComparer]=[self,]
+ else : cata.dictTypesXSDJumeaux[objAComparer].append(self)
+ return objAComparer.nomDuTypePyxb
+ indice += 1
+ self.aCreer = True
+ cata.dictTypesXSD[nom].append(self)
+ nomAlter='T_'+self.nom+'_'+str(indice)
+ if (hasattr (self, 'nomXML')) and self.nomXML != None :
+ nomAlter='T_'+self.nomXML+'_'+str(indice)
+ self.nomDuTypePyxb=nomAlter
+ return nomAlter
# ----------------------------------------
class X_compoFactoriseAmbigu(X_definition):
# ----------------------------------------
- def __init__(self,nom,listeDeCreation,pere, debug=False):
- #if nom == 'blocFormatFichierMed_blocFormatFichierAll' : debug = True
- # import traceback
- # traceback.print_stack()
- if debug :
- for (i) in listeDeCreation : print (i.nom)
- self.label='BlocAmbigu'
- self.nom=nom
- self.pere=pere
- self.statut='f'
- self.entites={}
- self.mcXSD=[]
- self.ordre_mc=[]
- for mc in listeDeCreation :
- self.mcXSD.append(mc)
- self.ordre_mc.append(mc.nom)
-
- if debug : print (self.mcXSD)
- if debug : print (self.ordre_mc)
- self.construitEntites(self.mcXSD)
- self.constructionArbrePossibles()
- lesPossibles=deepcopy(self.arbrePossibles)
-
- self.getNomDuCodeDumpe()
- self.nomDuTypePyxb = self.definitNomDuTypePyxb()
- if debug : print (self.nomDuTypePyxb)
- self.texteSimple = ''
- self.texteComplexeVenantDesFils = ''
- self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb)
- # on enleve [] des possibles puisque l elt sera optionnel
- lesPossibles.remove([])
- if debug : print ('________________ init de compoAmbigu',self.nom, lesPossibles)
- if debug : print ('self.entites', self.entites)
- self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root')
- if debug : print ('self.mcXSD',self.mcXSD)
- self.texteComplexe += finTypeSubstDsBlocFactorise
- self.texteComplexe +=self.texteComplexeVenantDesFils
- #print ('fin pour prepareDumpXSD pour', self.nom)
-
- def compare(self,autreMC):
- if self.label != autreMC.label : return False
- #PN : le bug est la
- # arbre des possibles identiques mais les types different
- # comment faire ?
- #print (self.arbrePossibles)
- #print (autreMC.arbrePossibles)
- #if self.arbrePossibles== autreMC.arbrePossibles : return True
- return False
-
- def construitEntites(self, laListe):
- for mc in laListe :
- if mc.nom in self.entites.keys() : self.entites[mc.nom].append(mc)
- else : self.entites[mc.nom] = [mc,]
- if mc.label == 'BLOC' or mc.label == 'BlocAmbigu':
- self.ajouteLesMCFilsAEntite(mc)
-
-
- def ajouteLesMCFilsAEntite(self,blocMc):
- for mcFilsNom in blocMc.entites.keys():
- if mcFilsNom == 'Consigne' or mcFilsNom == 'blocConsigne' : continue
- if mcFilsNom not in self.entites.keys(): self.entites[mcFilsNom]=[]
- if blocMc.label == 'BlocAmbigu' :
- for mc in blocMc.entites[mcFilsNom] :
- self.entites[mcFilsNom].append(mc)
- if mc.label == 'BLOC' or mc.label == 'BlocAmbigu':
+ def __init__(self,nom,listeDeCreation,pere, debug=False):
+ #if nom == 'blocFormatFichierMed_blocFormatFichierAll' : debug = True
+ # import traceback
+ # traceback.print_stack()
+ if debug :
+ for (i) in listeDeCreation : print (i.nom)
+ self.label='BlocAmbigu'
+ self.nom=nom
+ self.pere=pere
+ self.statut='f'
+ self.entites={}
+ self.mcXSD=[]
+ self.ordre_mc=[]
+ for mc in listeDeCreation :
+ self.mcXSD.append(mc)
+ self.ordre_mc.append(mc.nom)
+
+ if debug : print (self.mcXSD)
+ if debug : print (self.ordre_mc)
+ self.construitEntites(self.mcXSD)
+ self.constructionArbrePossibles()
+ lesPossibles=deepcopy(self.arbrePossibles)
+
+ self.getNomDuCodeDumpe()
+ self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+ if debug : print (self.nomDuTypePyxb)
+ self.texteSimple = ''
+ self.texteComplexeVenantDesFils = ''
+ self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb)
+ # on enleve [] des possibles puisque l elt sera optionnel
+ lesPossibles.remove([])
+ if debug : print ('________________ init de compoAmbigu',self.nom, lesPossibles)
+ if debug : print ('self.entites', self.entites)
+ self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root')
+ if debug : print ('self.mcXSD',self.mcXSD)
+ self.texteComplexe += finTypeSubstDsBlocFactorise
+ self.texteComplexe +=self.texteComplexeVenantDesFils
+ #print ('fin pour prepareDumpXSD pour', self.nom)
+
+ def compare(self,autreMC):
+ if self.label != autreMC.label : return False
+ #PN : le bug est la
+ # arbre des possibles identiques mais les types different
+ # comment faire ?
+ #print (self.arbrePossibles)
+ #print (autreMC.arbrePossibles)
+ #if self.arbrePossibles== autreMC.arbrePossibles : return True
+ return False
+
+ def construitEntites(self, laListe):
+ for mc in laListe :
+ if mc.nom in self.entites.keys() : self.entites[mc.nom].append(mc)
+ else : self.entites[mc.nom] = [mc,]
+ if mc.label == 'BLOC' or mc.label == 'BlocAmbigu':
self.ajouteLesMCFilsAEntite(mc)
- else :
- self.entites[mcFilsNom].append(blocMc.entites[mcFilsNom])
- if blocMc.entites[mcFilsNom].label == 'BLOC' or blocMc.entites[mcFilsNom].label == 'BlocAmbigu':
- self.ajouteLesMCFilsAEntite(blocMc.entites[mcFilsNom])
-
-
-
-
- def constructionArbrePossibles(self, debug = False):
- if debug : print ('construction pour FACT ambigu _______________', self.nom)
- toutesLesLignes=[[]]
- for child in self.mcXSD :
- if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
- if child.label != 'BLOC' :
- toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, child.arbrePossibles))
- else :
- toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, [child.nom, []]))
-
- lignesAGarder=[]
- for ligne in toutesLesLignes:
- blocContenus=[]
- aAjouter=True
- for mc in ligne :
- objMC=self.entites[mc][0]
- if objMC.label == 'BLOC' :
- blocContenus.append(objMC)
- for b in blocContenus :
- for frere in blocContenus[blocContenus.index(b)+1:]:
- if b.isDisjoint(frere) : continue
- aAjouter=False
- break
- if not aAjouter : break
- if aAjouter and ligne not in lignesAGarder :
- lignesAGarder.append(ligne)
-
- #print ("______________________________________")
- #for l in lignesAGarder : print (l)
- #print (len(lignesAGarder))
- #print ("______________________________________")
- self.arbrePossibles=[]
- for ligne in lignesAGarder :
- #print ('lignesAGarder', ligne)
- for newLigne in self.deploye(ligne):
- #print (newLigne)
- if newLigne not in self.arbrePossibles : self.arbrePossibles.append(newLigne)
- #for l in self.arbrePossibles : print (l)
- #print ("______________________________________")
-
-
- def deploye (self, ligne):
- toutesLesLignes=[[]]
- for mc in ligne :
- #print ( 'mc in deploye', mc)
- objMC=self.entites[mc][0]
- #print ( 'nom', objMC.nom, objMC.label)
- if objMC.label == 'BLOC' or objMC.label == 'BlocAmbigu':
- toutesLesLignes = deepcopy(self.remplaceListeParContenuEtVide(toutesLesLignes, objMC.arbrePossibles))
- else :
- toutesLesLignes = deepcopy(self.adjointUnMot(toutesLesLignes,mc ))
- return toutesLesLignes
-
- def construitArbrePossibles(self):
- # inutile car on a deja l arbre mais appele parfois
- #print ('dans X_factCompoAmbigu ne fait rien', self.nom, self.arbrePossibles)
- pass
-
- def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
- # on ne fait rien, tout a ete fait dans le init
- self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
-
- def nomComplet(self) :
- print ('dans nomComplet pourquoi ?',self, self.nom)
-
-
- def factoriseEtCreeDump(self, laListe, indent=2 ,nomAppel=None, debug=False):
- if debug : print ('_______________________________ factoriseEtCreeDump')
- if debug : print(self.nom, laListe, indent, nomAppel)
- maListeRetour=[]
- aReduire={}
-
- if [] in laListe :
- declencheChoiceAvecSeqVid=True
- while [] in laListe : laListe.remove([])
- #min=0
- else :
- declencheChoiceAvecSeqVid=False
- #min=1
-
-
- for ligne in laListe :
- if ligne[0] in aReduire.keys():
- if len(ligne) == 1 :aReduire[ligne[0]].append([])
- else : aReduire[ligne[0]].append(ligne[1:])
- else :
- if len(ligne) == 1 : aReduire[ligne[0]]=[[]]
- else : aReduire[ligne[0]]=[ligne[1:],]
-
-
- if len(aReduire.keys()) == 1 :
- if declencheChoiceAvecSeqVid == False :
- creeChoice=False
- creeSequence=True
- self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1
- else :
- creeChoice=True
- creeSequence=False
- # pour regler le souci du 1er Niveau
- self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
- #if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
- #else : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
- else :
- #self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
- self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
- creeChoice=True
- creeSequence=False
-
- for nomMC in aReduire.keys():
- listeSuivante=aReduire[nomMC]
- if creeChoice and listeSuivante != [[]] :
- self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1
- self.ajouteAuxTextes(nomMC,indent)
- if listeSuivante == [[]] : continue # Est-ce toujours vrai ?
- if len(listeSuivante) == 1 : print (listeSuivante[0]) ;self.ajouteAuxTextes(listeSuivante[0],indent)
- else : self.factoriseEtCreeDump(listeSuivante, indent+int(creeSequence),nomMC)
- if creeChoice : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
-
- if declencheChoiceAvecSeqVid :
- self.texteComplexe += '\t'*indent + debSequenceDsBloc
- self.texteComplexe += '\t'*indent + finSequenceDsBloc
- if creeChoice : indent=indent -1 ; self.texteComplexe += '\t'*indent + finChoiceDsBloc
- if creeSequence : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
-
- #if doitFermerSequence : indent=indent-1;self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
- #print (self.texteSimple)
- #print ('______',' self.texteComplexe')
- #print (self.texteComplexe)
- #print ('_____', 'self.texteComplexeVenantDesFils')
- #print (self.texteComplexeVenantDesFils)
- #print ('fin pour _______________________________', self.nom)
- return (maListeRetour)
-
-
- def ajouteAuxTextes(self,nomMC,indent,debug=False) :
- if debug : print ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
- #if debug :
- # traceback.print_stack()
- #for i in self.entites.keys() : print (self.entites[i][0].nom)
- if (indent > 3) : indent = indent - 3
-
- # PN change le 17 fevrier . Est-ce normal d arriver la ?
- # if faut traiter les Blocs exclusifs qui donnent des choices de sequences
- # mais celles-ci risquent d etre ambigues
- while (isinstance(nomMC,list)) :
- nomMC=nomMC[0]
-
- if nomMC == 'Consigne' or nomMC == 'blocConsigne' : return
- if len(self.entites[nomMC]) == 1:
- mc=self.entites[nomMC][0]
- mc.dumpXsd(dansFactorisation=True)
- self.texteComplexe += '\t'*(indent) + mc.texteElt
- if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
- if mc.aCreer : self.texteSimple += mc.texteSimple
- if mc.aCreer : mc.aCreer=False
- return
-
- leType=type(self.entites[nomMC][0])
- for e in (self.entites[nomMC][1:]) :
- if type(e) != leType:
- print ('Projection XSD impossible, changez un des ', nomMC)
- exit()
-
- # cette boucle ne fonctionne que pour des SIMP
- resteATraiter=copy(self.entites[nomMC])
- #print ('________resteATraiter', resteATraiter)
- listePourUnion=[]
- first=1
- while resteATraiter != [] :
- nvlListeATraiter=[]
- mc=resteATraiter[0]
- listePourUnion.append(mc)
- for autre in resteATraiter[1:]:
- if not (mc.compare(autre)) : nvlListeATraiter.append(autre)
- resteATraiter=copy(nvlListeATraiter)
-
- if len(listePourUnion) == 1:
- mc=listePourUnion[0]
- mc.dumpXsd(dansFactorisation=True,multiple=False,first=first)
- self.texteComplexe += '\t'*(indent) + mc.texteElt
- if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
- if mc.aCreer : self.texteSimple += mc.texteSimple
- for mcIdent in self.entites[nomMC][1:]: mcIdent.metAJourPyxb(mc.nomDuTypePyxb)
- if mc.aCreer : mc.aCreer=False
- return
-
- # on ajoute le nom de l element
- # PN : attention on dumpe 2 fois
- self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
- if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) :
- print ('2 blocs freres ont le meme nom et pas le meme type : pas encore traite')
- print ('Projection XSD impossible, changez un des ', nomMC)
- exit()
- self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
- nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb
- texteSimpleUnion=debutSimpleType.format(nomTypePyxbUnion)
- texteSimpleUnion+=debutUnion
- #if len(listePourUnion) == 1 :
- #PN 29 septembre 20. Est ce que ce if a un sens
- # si len(listePourUnion==1) on est deja sorti non ?
- # mc=self.entites[nomMC][0]
- # mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
- # inutile - deja fait plus haut
- # if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
- # if mc.aCreer : self.texteSimple += mc.texteSimple
- #else :
- texteSimpleUnion += '\t'*(indent)+self.entites[nomMC][0].texteSimplePart2
- texteSimplePart1= self.entites[nomMC][0].texteSimplePart1
- for e in listePourUnion[1:] :
- e.dumpXsd(dansFactorisation=True,multiple=True,first=False)
- # si on ext un mc simple la ligne suivante est inutile
- # en revanche on ajoute le texte a tous les coups
- #self.texteComplexeVenantDesFils += e.texteComplexe
- e.metAJourPyxb(nomTypePyxbUnion)
- texteSimpleUnion += '\t'*(indent) + e.texteSimplePart2
- texteSimplePart1 += e.texteSimplePart1
- texteSimpleUnion += finUnion
- texteSimpleUnion+=fermeSimpleType
- self.texteSimple += texteSimplePart1 + texteSimpleUnion
- #print ('self.texteSimple', self.texteSimple)
-
+
+
+ def ajouteLesMCFilsAEntite(self,blocMc):
+ for mcFilsNom in blocMc.entites.keys():
+ if mcFilsNom == 'Consigne' or mcFilsNom == 'blocConsigne' : continue
+ if mcFilsNom not in self.entites.keys(): self.entites[mcFilsNom]=[]
+ if blocMc.label == 'BlocAmbigu' :
+ for mc in blocMc.entites[mcFilsNom] :
+ self.entites[mcFilsNom].append(mc)
+ if mc.label == 'BLOC' or mc.label == 'BlocAmbigu':
+ self.ajouteLesMCFilsAEntite(mc)
+ else :
+ self.entites[mcFilsNom].append(blocMc.entites[mcFilsNom])
+ if blocMc.entites[mcFilsNom].label == 'BLOC' or blocMc.entites[mcFilsNom].label == 'BlocAmbigu':
+ self.ajouteLesMCFilsAEntite(blocMc.entites[mcFilsNom])
+
+
+
+
+ def constructionArbrePossibles(self, debug = False):
+ if debug : print ('construction pour FACT ambigu _______________', self.nom)
+ toutesLesLignes=[[]]
+ for child in self.mcXSD :
+ if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+ if child.label != 'BLOC' :
+ toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, child.arbrePossibles))
+ else :
+ toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, [child.nom, []]))
+
+ lignesAGarder=[]
+ for ligne in toutesLesLignes:
+ blocContenus=[]
+ aAjouter=True
+ for mc in ligne :
+ objMC=self.entites[mc][0]
+ if objMC.label == 'BLOC' :
+ blocContenus.append(objMC)
+ for b in blocContenus :
+ for frere in blocContenus[blocContenus.index(b)+1:]:
+ if b.isDisjoint(frere) : continue
+ aAjouter=False
+ break
+ if not aAjouter : break
+ if aAjouter and ligne not in lignesAGarder :
+ lignesAGarder.append(ligne)
+
+ #print ("______________________________________")
+ #for l in lignesAGarder : print (l)
+ #print (len(lignesAGarder))
+ #print ("______________________________________")
+ self.arbrePossibles=[]
+ for ligne in lignesAGarder :
+ #print ('lignesAGarder', ligne)
+ for newLigne in self.deploye(ligne):
+ #print (newLigne)
+ if newLigne not in self.arbrePossibles : self.arbrePossibles.append(newLigne)
+ #for l in self.arbrePossibles : print (l)
+ #print ("______________________________________")
+
+
+ def deploye (self, ligne):
+ toutesLesLignes=[[]]
+ for mc in ligne :
+ #print ( 'mc in deploye', mc)
+ objMC=self.entites[mc][0]
+ #print ( 'nom', objMC.nom, objMC.label)
+ if objMC.label == 'BLOC' or objMC.label == 'BlocAmbigu':
+ toutesLesLignes = deepcopy(self.remplaceListeParContenuEtVide(toutesLesLignes, objMC.arbrePossibles))
+ else :
+ toutesLesLignes = deepcopy(self.adjointUnMot(toutesLesLignes,mc ))
+ return toutesLesLignes
+
+ def construitArbrePossibles(self):
+ # inutile car on a deja l arbre mais appele parfois
+ #print ('dans X_factCompoAmbigu ne fait rien', self.nom, self.arbrePossibles)
+ pass
+
+ def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+ # on ne fait rien, tout a ete fait dans le init
+ self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
+
+ def nomComplet(self) :
+ print ('dans nomComplet pourquoi ?',self, self.nom)
+
+
+ def factoriseEtCreeDump(self, laListe, indent=2 ,nomAppel=None, debug=False):
+ if debug : print ('_______________________________ factoriseEtCreeDump')
+ if debug : print(self.nom, laListe, indent, nomAppel)
+ maListeRetour=[]
+ aReduire={}
+
+ if [] in laListe :
+ declencheChoiceAvecSeqVid=True
+ while [] in laListe : laListe.remove([])
+ #min=0
+ else :
+ declencheChoiceAvecSeqVid=False
+ #min=1
+
+
+ for ligne in laListe :
+ if ligne[0] in aReduire.keys():
+ if len(ligne) == 1 :aReduire[ligne[0]].append([])
+ else : aReduire[ligne[0]].append(ligne[1:])
+ else :
+ if len(ligne) == 1 : aReduire[ligne[0]]=[[]]
+ else : aReduire[ligne[0]]=[ligne[1:],]
+
+
+ if len(aReduire.keys()) == 1 :
+ if declencheChoiceAvecSeqVid == False :
+ creeChoice=False
+ creeSequence=True
+ self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1
+ else :
+ creeChoice=True
+ creeSequence=False
+ # pour regler le souci du 1er Niveau
+ self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+ #if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+ #else : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+ else :
+ #self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+ self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+ creeChoice=True
+ creeSequence=False
+
+ for nomMC in aReduire.keys():
+ listeSuivante=aReduire[nomMC]
+ if creeChoice and listeSuivante != [[]] :
+ self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1
+ self.ajouteAuxTextes(nomMC,indent)
+ if listeSuivante == [[]] : continue # Est-ce toujours vrai ?
+ if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0],indent)
+ else : self.factoriseEtCreeDump(listeSuivante, indent+int(creeSequence),nomMC)
+ if creeChoice : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+ if declencheChoiceAvecSeqVid :
+ self.texteComplexe += '\t'*indent + debSequenceDsBloc
+ self.texteComplexe += '\t'*indent + finSequenceDsBloc
+ if creeChoice : indent=indent -1 ; self.texteComplexe += '\t'*indent + finChoiceDsBloc
+ if creeSequence : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+ #if doitFermerSequence : indent=indent-1;self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+ #print (self.texteSimple)
+ #print ('______',' self.texteComplexe')
+ #print (self.texteComplexe)
+ #print ('_____', 'self.texteComplexeVenantDesFils')
+ #print (self.texteComplexeVenantDesFils)
+ #print ('fin pour _______________________________', self.nom)
+ return (maListeRetour)
+
+
+ def ajouteAuxTextes(self,nomMC,indent,debug=False) :
+ if debug : print ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
+ #if debug :
+ # traceback.print_stack()
+ #for i in self.entites.keys() : print (self.entites[i][0].nom)
+ if (indent > 3) : indent = indent - 3
+
+ # PN change le 17 fevrier . Est-ce normal d arriver la ?
+ # if faut traiter les Blocs exclusifs qui donnent des choices de sequences
+ # mais celles-ci risquent d etre ambigues
+ while (isinstance(nomMC,list)) :
+ nomMC=nomMC[0]
+
+ if nomMC == 'Consigne' or nomMC == 'blocConsigne' : return
+ if len(self.entites[nomMC]) == 1:
+ mc=self.entites[nomMC][0]
+ mc.dumpXsd(dansFactorisation=True)
+ self.texteComplexe += '\t'*(indent) + mc.texteElt
+ if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+ if mc.aCreer : self.texteSimple += mc.texteSimple
+ if mc.aCreer : mc.aCreer=False
+ return
+
+ leType=type(self.entites[nomMC][0])
+ for e in (self.entites[nomMC][1:]) :
+ if type(e) != leType:
+ print ('Projection XSD impossible, changez un des ', nomMC)
+ exit()
+
+ # cette boucle ne fonctionne que pour des SIMP
+ resteATraiter=copy(self.entites[nomMC])
+ #print ('________resteATraiter', resteATraiter)
+ listePourUnion=[]
+ first=1
+ while resteATraiter != [] :
+ nvlListeATraiter=[]
+ mc=resteATraiter[0]
+ listePourUnion.append(mc)
+ for autre in resteATraiter[1:]:
+ if not (mc.compare(autre)) : nvlListeATraiter.append(autre)
+ resteATraiter=copy(nvlListeATraiter)
+
+ if len(listePourUnion) == 1:
+ mc=listePourUnion[0]
+ mc.dumpXsd(dansFactorisation=True,multiple=False,first=first)
+ self.texteComplexe += '\t'*(indent) + mc.texteElt
+ if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+ if mc.aCreer : self.texteSimple += mc.texteSimple
+ for mcIdent in self.entites[nomMC][1:]: mcIdent.metAJourPyxb(mc.nomDuTypePyxb)
+ if mc.aCreer : mc.aCreer=False
+ return
+
+ # on ajoute le nom de l element
+ # PN : attention on dumpe 2 fois
+ self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
+ if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) :
+ print ('2 blocs freres ont le meme nom et pas le meme type : pas encore traite')
+ print ('Projection XSD impossible, changez un des ', nomMC)
+ exit()
+ self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
+ nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb
+ texteSimpleUnion=debutSimpleType.format(nomTypePyxbUnion)
+ texteSimpleUnion+=debutUnion
+ #if len(listePourUnion) == 1 :
+ #PN 29 septembre 20. Est ce que ce if a un sens
+ # si len(listePourUnion==1) on est deja sorti non ?
+ # mc=self.entites[nomMC][0]
+ # mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
+ # inutile - deja fait plus haut
+ # if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+ # if mc.aCreer : self.texteSimple += mc.texteSimple
+ #else :
+ texteSimpleUnion += '\t'*(indent)+self.entites[nomMC][0].texteSimplePart2
+ texteSimplePart1= self.entites[nomMC][0].texteSimplePart1
+ for e in listePourUnion[1:] :
+ e.dumpXsd(dansFactorisation=True,multiple=True,first=False)
+ # si on ext un mc simple la ligne suivante est inutile
+ # en revanche on ajoute le texte a tous les coups
+ #self.texteComplexeVenantDesFils += e.texteComplexe
+ e.metAJourPyxb(nomTypePyxbUnion)
+ texteSimpleUnion += '\t'*(indent) + e.texteSimplePart2
+ texteSimplePart1 += e.texteSimplePart1
+ texteSimpleUnion += finUnion
+ texteSimpleUnion+=fermeSimpleType
+ self.texteSimple += texteSimplePart1 + texteSimpleUnion
+ #print ('self.texteSimple', self.texteSimple)
+
# ----------------------------------------
class X_definitionComposee (X_definition):
# ------------------------------------------
-
- def creeTexteComplexeVenantDesFils(self,dansFactorisation=False,debug=False):
- texteComplexeVenantDesFils=""
- blocsDejaDumpes=set()
- #for nom in self.ordre_mc:
- # mcFils = self.entites[nom]
- if debug : print ('creeTexteComplexeVenantDesFils', self.nom)
- for mcFils in self.mcXSD :
- if not (isinstance(mcFils, Accas.BLOC)) :
- mcFils.dumpXsd(dansFactorisation)
- #print (mcFils.texteSimple)
- self.texteComplexe += mcFils.texteElt
- if mcFils.aCreer : self.texteSimple += mcFils.texteSimple
- if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
- else :
- if hasattr(mcFils,'nomXML') and mcFils.nomXML in blocsDejaDumpes and mcFils.nomXML != None : continue
- if hasattr(mcFils,'nomXML') and mcFils.nomXML != None: blocsDejaDumpes.add(mcFils.nomXML)
- mcFils.dumpXsd(dansFactorisation)
- self.texteComplexe += mcFils.texteElt
- if mcFils.aCreer : self.texteSimple += mcFils.texteSimple
- if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
- return texteComplexeVenantDesFils
-
- def dumpXsd(self, dansFactorisation=False, multiple = False, first=True):
- #print ('_________ dumpXsd___________', self.nom)
- if PourTraduction : print (self.nom)
- # le prepareDump est appele sur les fils
- if not (self.dejaPrepareDump) : self.prepareDumpXSD()
-
- self.getNomDuCodeDumpe()
- if first :
- if multiple : self.nomDuTypePyxb = self.definitNomDuTypePyxb(forceACreer=True)
- else : self.nomDuTypePyxb = self.definitNomDuTypePyxb()
- self.texteSimple = "" # on n ajoute pas de type simple
-
- self.traduitMinMax()
- # pour accepter les PROC et ...
- #
- if self.aCreer :
- self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
- if isinstance(self,X_OPER) or isinstance(self,X_PROC) :
- self.texteComplexe += debutTypeCompoEtape.format(self.code)
- self.texteComplexe += debutTypeCompoSeq
- texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
- self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe
- # la fin de l oper est traitee dans le dumpXSD de X_OPER
- if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompoSeq
- if isinstance(self,X_PROC) : self.texteComplexe += finTypeCompoEtape
- if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompo
- else :
- self.texteComplexe = ""
-
- self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
- #print (self.texteComplexe)
- #print ('------------------------------------------------',self.nom)
-
- def traduitMinMax(self):
- # ______________________
- # valable pour PROC et OPER
- self.minOccurs = 0
- self.maxOccurs = 1
-
- def compare(self,autreMC):
- if self.label != autreMC.label : return False
- if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
- for attr in ( 'regles', 'fr', 'defaut', 'min' ,'max', 'position' , 'docu' ) :
- val1=getattr(self,attr)
- val2=getattr(autreMC,attr)
- if val1 != val2 : return False
- if len(self.entites) != len(autreMC.entites) : return False
- for defFille in self.entites.keys():
- if defFille not in autreMC.entites.keys() : return False
- if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
- return True
-
- def prepareDumpXSD(self):
- self.dejaPrepareDump=True
- self.inUnion=False
- self.tousLesFils=[]
- self.mcXSD=[]
- for nomMC in self.ordre_mc:
- mc=self.entites[nomMC]
- self.mcXSD.append(mc)
- mc.prepareDumpXSD()
- self.chercheListesDeBlocsNonDisjoints()
- for l in list(self.listeDesBlocsNonDisjoints) :
- if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjoints.remove(l)
- else : self.factorise(l)
-
- def chercheListesDeBlocsNonDisjoints(self):
- self.listeDesBlocsNonDisjoints=[]
- for nomChild in self.ordre_mc :
- child=self.entites[nomChild]
- if child.label != 'BLOC' : continue
- if self.listeDesBlocsNonDisjoints == [] :
- self.listeDesBlocsNonDisjoints.append([child])
- continue
- vraimentIndependant=True
- for liste in list(self.listeDesBlocsNonDisjoints):
- independant=True
- for bloc in liste :
- if bloc.isDisjoint(child) : continue
- if bloc.estLeMemeQue(child) : continue
- independant=False
- vraimentIndependant=False
- if not (independant) :
- liste.append(child)
- if vraimentIndependant:
- self.listeDesBlocsNonDisjoints.append([child])
- # on nettoye la liste des blocs tous seuls
- for l in list(self.listeDesBlocsNonDisjoints) :
- if len(l) ==1 : self.listeDesBlocsNonDisjoints.remove(l)
-
- def estLeMemeQue(self,autreMC):
- if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None: return True
- return False
-
- def aUnPremierCommunDansLesPossibles(self, laListe) :
- # fonctionne avec liste de mc ou une liste(mc,index)
- import types
- mesPremiers=set()
- for elt,index in laListe :
- if not type(e) == types.ListType :
- if elt.nom in mesPremiers : return True
- mesPremiers.add(elt.nom)
- else :
- if elt[0].nom in mesPremiers : return True
- mesPremiers.add(elt[0].nom)
- return False
-
- def besoinDeFactoriserTrivial(self,laListe):
- besoin=False
- lesPremiers=set()
- for mcBloc in laListe :
- mc=mcBloc.mcXSD[0]
- if mc.label == 'BLOC' : return True
- if not(mc.statut=='o') : return True
- if mc.nom in lesPremiers : return True
- lesPremiers.add(mc.nom)
- return False
-
- def factorise(self,liste,debug=False):
- self.listeConstruction=liste
- nomDebut=liste[0].nom
- indexDebut=self.mcXSD.index(liste[0])
- nomFin=liste[-1].nom
- indexFin=self.mcXSD.index(liste[-1]) + 1
- nom=nomDebut+'_'+nomFin
- if debug : print ('___________ dans factorise', nom)
- listeAFactoriser=[]
- for i in range(indexDebut, indexFin) :
- listeAFactoriser.append(self.mcXSD[i])
-
- newListe=self.mcXSD[0:indexDebut]
-
- monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self)
- newListe.append(monEltFacteur)
- newListe=newListe+self.mcXSD[indexFin:]
- self.mcXSD=newListe
- if debug :print ('___________ fin fin factorise', nom)
-
- def construitTousLesFils(self):
- for nomChild in self.ordre_mc :
- if nomChild == 'Consigne' or nomChild == 'blocConsigne' : continue
- child=self.entites[nomChild]
- if child.label != 'BLOC' :
- self.tousLesFils.append(child.nom)
- else:
- if child.tousLesFils == [] : child.construitTousLesFils()
- for nomPetitFils in child.tousLesFils : self.tousLesFils.append(nomPetitFils)
- #print ('construitArbreEntier pour ', self.nom, self.tousLesFils)
-
-
- def isDisjoint(self, mc1) :
- if self.tousLesFils == [] : self.construitTousLesFils()
- if not (hasattr(mc1, 'tousLesFils')) : mc1.tousLesFils = []
- if mc1.tousLesFils == [] : mc1.construitTousLesFils()
- for fils in mc1.tousLesFils :
- if fils in self.tousLesFils : return False
- return True
+
+ def creeTexteComplexeVenantDesFils(self,dansFactorisation=False,debug=False):
+ texteComplexeVenantDesFils=""
+ blocsDejaDumpes=set()
+ #for nom in self.ordre_mc:
+ # mcFils = self.entites[nom]
+ if debug : print ('creeTexteComplexeVenantDesFils', self.nom)
+ for mcFils in self.mcXSD :
+ if not (isinstance(mcFils, Accas.BLOC)) :
+ mcFils.dumpXsd(dansFactorisation)
+ #print (mcFils.texteSimple)
+ self.texteComplexe += mcFils.texteElt
+ if mcFils.aCreer : self.texteSimple += mcFils.texteSimple
+ if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
+ else :
+ if hasattr(mcFils,'nomXML') and mcFils.nomXML in blocsDejaDumpes and mcFils.nomXML != None : continue
+ if hasattr(mcFils,'nomXML') and mcFils.nomXML != None: blocsDejaDumpes.add(mcFils.nomXML)
+ mcFils.dumpXsd(dansFactorisation)
+ self.texteComplexe += mcFils.texteElt
+ if mcFils.aCreer : self.texteSimple += mcFils.texteSimple
+ if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
+ return texteComplexeVenantDesFils
+
+ def dumpXsd(self, dansFactorisation=False, multiple = False, first=True):
+ #print ('_________ dumpXsd___________', self.nom)
+ if PourTraduction : print (self.nom)
+ # le prepareDump est appele sur les fils
+ if not (self.dejaPrepareDump) : self.prepareDumpXSD()
+
+ self.getNomDuCodeDumpe()
+ if first :
+ if multiple : self.nomDuTypePyxb = self.definitNomDuTypePyxb(forceACreer=True)
+ else : self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+ self.texteSimple = "" # on n ajoute pas de type simple
+
+ self.traduitMinMax()
+ # pour accepter les PROC et ...
+ #
+ if self.aCreer :
+ self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
+ if isinstance(self,X_OPER) or isinstance(self,X_PROC) :
+ self.texteComplexe += debutTypeCompoEtape.format(self.code)
+ self.texteComplexe += debutTypeCompoSeq
+ texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
+ self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe
+ # la fin de l oper est traitee dans le dumpXSD de X_OPER
+ if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompoSeq
+ if isinstance(self,X_PROC) : self.texteComplexe += finTypeCompoEtape
+ if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompo
+ else :
+ self.texteComplexe = ""
+
+ self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
+ #print (self.texteComplexe)
+ #print ('------------------------------------------------',self.nom)
+
+ def traduitMinMax(self):
+ # ______________________
+ # valable pour PROC et OPER
+ self.minOccurs = 0
+ self.maxOccurs = 1
+
+ def compare(self,autreMC):
+ if self.label != autreMC.label : return False
+ if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+ for attr in ( 'regles', 'fr', 'defaut', 'min' ,'max', 'position' , 'docu' ) :
+ val1=getattr(self,attr)
+ val2=getattr(autreMC,attr)
+ if val1 != val2 : return False
+ if len(self.entites) != len(autreMC.entites) : return False
+ for defFille in self.entites.keys():
+ if defFille not in autreMC.entites.keys() : return False
+ if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
+ return True
+
+ def prepareDumpXSD(self):
+ self.dejaPrepareDump=True
+ self.inUnion=False
+ self.tousLesFils=[]
+ self.mcXSD=[]
+ for nomMC in self.ordre_mc:
+ mc=self.entites[nomMC]
+ self.mcXSD.append(mc)
+ mc.prepareDumpXSD()
+ self.chercheListesDeBlocsNonDisjoints()
+ for l in list(self.listeDesBlocsNonDisjoints) :
+ if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjoints.remove(l)
+ else : self.factorise(l)
+
+ def chercheListesDeBlocsNonDisjoints(self):
+ self.listeDesBlocsNonDisjoints=[]
+ for nomChild in self.ordre_mc :
+ child=self.entites[nomChild]
+ if child.label != 'BLOC' : continue
+ if self.listeDesBlocsNonDisjoints == [] :
+ self.listeDesBlocsNonDisjoints.append([child])
+ continue
+ vraimentIndependant=True
+ for liste in list(self.listeDesBlocsNonDisjoints):
+ independant=True
+ for bloc in liste :
+ if bloc.isDisjoint(child) : continue
+ if bloc.estLeMemeQue(child) : continue
+ independant=False
+ vraimentIndependant=False
+ if not (independant) :
+ liste.append(child)
+ if vraimentIndependant:
+ self.listeDesBlocsNonDisjoints.append([child])
+ # on nettoye la liste des blocs tous seuls
+ for l in list(self.listeDesBlocsNonDisjoints) :
+ if len(l) ==1 : self.listeDesBlocsNonDisjoints.remove(l)
+
+ def estLeMemeQue(self,autreMC):
+ if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None: return True
+ return False
+
+ def aUnPremierCommunDansLesPossibles(self, laListe) :
+ # fonctionne avec liste de mc ou une liste(mc,index)
+ import types
+ mesPremiers=set()
+ for elt,index in laListe :
+ if not type(e) == types.ListType :
+ if elt.nom in mesPremiers : return True
+ mesPremiers.add(elt.nom)
+ else :
+ if elt[0].nom in mesPremiers : return True
+ mesPremiers.add(elt[0].nom)
+ return False
+
+ def besoinDeFactoriserTrivial(self,laListe):
+ besoin=False
+ lesPremiers=set()
+ for mcBloc in laListe :
+ mc=mcBloc.mcXSD[0]
+ if mc.label == 'BLOC' : return True
+ if not(mc.statut=='o') : return True
+ if mc.nom in lesPremiers : return True
+ lesPremiers.add(mc.nom)
+ return False
+
+ def factorise(self,liste,debug=False):
+ self.listeConstruction=liste
+ nomDebut=liste[0].nom
+ indexDebut=self.mcXSD.index(liste[0])
+ nomFin=liste[-1].nom
+ indexFin=self.mcXSD.index(liste[-1]) + 1
+ nom=nomDebut+'_'+nomFin
+ if debug : print ('___________ dans factorise', nom)
+ listeAFactoriser=[]
+ for i in range(indexDebut, indexFin) :
+ listeAFactoriser.append(self.mcXSD[i])
+
+ newListe=self.mcXSD[0:indexDebut]
+
+ monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self)
+ newListe.append(monEltFacteur)
+ newListe=newListe+self.mcXSD[indexFin:]
+ self.mcXSD=newListe
+ if debug :print ('___________ fin fin factorise', nom)
+
+ def construitTousLesFils(self):
+ for nomChild in self.ordre_mc :
+ if nomChild == 'Consigne' or nomChild == 'blocConsigne' : continue
+ child=self.entites[nomChild]
+ if child.label != 'BLOC' :
+ self.tousLesFils.append(child.nom)
+ else:
+ if child.tousLesFils == [] : child.construitTousLesFils()
+ for nomPetitFils in child.tousLesFils : self.tousLesFils.append(nomPetitFils)
+ #print ('construitArbreEntier pour ', self.nom, self.tousLesFils)
+
+
+ def isDisjoint(self, mc1) :
+ if self.tousLesFils == [] : self.construitTousLesFils()
+ if not (hasattr(mc1, 'tousLesFils')) : mc1.tousLesFils = []
+ if mc1.tousLesFils == [] : mc1.construitTousLesFils()
+ for fils in mc1.tousLesFils :
+ if fils in self.tousLesFils : return False
+ return True
class X_FACT (X_definitionComposee):
#--------- ------------------------
#Un FACT avec max=** doit se projeter en XSD sous forme d'une sequence a cardinalite 1 et
-# l'element qui porte la repetition du FACT
- def traduitMinMax(self):
- if self.max == '**' or self.max == float('inf') : self.maxOccurs="unbounded"
- else : self.maxOccurs = self.max
- self.minOccurs = self.min
- if self.statut =='f' : self.minOccurs=0
-
- def construitArbrePossibles(self):
- if self.statut == 'f' :
- self.arbrePossibles = (self.nom,[])
- self.arbreMCPossibles = (self,None)
- else :
- self.arbrePossibles = (self.nom,)
- self.arbreMCPossibles = (self,)
- #print ('XFACT arbre des possibles de ' ,self.nom, self.arbrePossibles)
+# l'element qui porte la repetition du FACT
+ def traduitMinMax(self):
+ if self.max == '**' or self.max == float('inf') : self.maxOccurs="unbounded"
+ else : self.maxOccurs = self.max
+ self.minOccurs = self.min
+ if self.statut =='f' : self.minOccurs=0
+
+ def construitArbrePossibles(self):
+ if self.statut == 'f' :
+ self.arbrePossibles = (self.nom,[])
+ self.arbreMCPossibles = (self,None)
+ else :
+ self.arbrePossibles = (self.nom,)
+ self.arbreMCPossibles = (self,)
+ #print ('XFACT arbre des possibles de ' ,self.nom, self.arbrePossibles)
# ---------------------------------
class X_OPER (X_definitionComposee):
# ---------------------------------
- def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
- X_definitionComposee.dumpXsd(self,dansFactorisation)
- self.texteComplexe += finTypeCompoSeq
- self.texteComplexe += attributeNameName
- self.texteComplexe += attributeTypeForASSD
- self.texteComplexe += attributeTypeUtilisateurName.format(self.sd_prod.__name__)
- self.texteComplexe += finTypeCompoEtape
- self.texteComplexe += finTypeCompo
-
-
- cata = CONTEXT.getCurrentCata()
- if self.sd_prod.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
- cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__]=[self,]
- else :
- cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__].append(self)
+ def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+ X_definitionComposee.dumpXsd(self,dansFactorisation)
+ self.texteComplexe += finTypeCompoSeq
+ self.texteComplexe += attributeNameName
+ self.texteComplexe += attributeTypeForASSD
+ self.texteComplexe += attributeTypeUtilisateurName.format(self.sd_prod.__name__)
+ self.texteComplexe += finTypeCompoEtape
+ self.texteComplexe += finTypeCompo
+
+
+ cata = CONTEXT.getCurrentCata()
+ if self.sd_prod.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+ cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__]=[self,]
+ else :
+ cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__].append(self)
# ----------------------------------
#-----------------------------------
class X_BLOC (X_definitionComposee):
#-----------------------------------
- def dumpXsd(self, dansFactorisation=False, multiple = False, first=False, debug = False):
- if debug : print ('X_BLOC dumpXsd', self.nom)
- self.tousLesFils=[]
- if self.nom == 'blocConsigne' :
- self.texteComplexe = ""
- self.texteSimple = ""
- self.nomDuTypePyxb = "NonTraiteConsigne"
- self.texteSimpleVenantDesFils = ""
- self.aCreer = False
- self.texteElt = ""
-
- return
- self.getNomDuCodeDumpe()
- # dans ce cas les blocs successifs sont identiques et on ne dumpe que le 1er
-
- self.nomDuTypePyxb = self.definitNomDuTypePyxb()
- self.texteSimple = "" # on n ajoute pas de type simple
-
- # Pour les blocs le minOccurs vaut 0 et le max 1
- if self.aCreer :
- self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb)
- texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
- self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe
- self.texteComplexe += finTypeSubst
-
- else :
- self.texteComplexe = ""
-
- self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
-
- #print ('------------------------------------------------')
-
- def compare(self,autreMC):
- if self.label != autreMC.label : return False
- if self.inUnion == True or autreMC.inUnion == True : return False
- if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
- for attr in ( 'condition', 'regles', ):
- val1=getattr(self,attr)
- val2=getattr(autreMC,attr)
- if val1 != val2 : return False
- if len(self.entites) != len(autreMC.entites) : return False
- for defFille in self.entites.keys():
- if defFille not in autreMC.entites.keys() : return False
- if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
- return True
-
- def construitArbrePossibles(self):
- self.arbrePossibles=[[],]
- #print ('X_BLOC je construis l arbre des possibles pour ', self.nom)
- for child in self.mcXSD :
- if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
- #print (child.nom, child.label, child.arbrePossibles)
- if child.label == 'BLOC' :
- self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
- elif child.label == 'BlocAmbigu':
- #print ("je passe par la pour", self.nom, child.nom, self.arbrePossibles, child.arbrePossibles)
- self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
- #print ('resultat', self.arbrePossibles)
- else :
- self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles))
- self.arbrePossibles.append([]) # un bloc n est pas obligatoire
- #print ('arbre des possibles de ' ,self.nom, self.arbrePossibles)
+ def dumpXsd(self, dansFactorisation=False, multiple = False, first=False, debug = False):
+ if debug : print ('X_BLOC dumpXsd', self.nom)
+ self.tousLesFils=[]
+ if self.nom == 'blocConsigne' :
+ self.texteComplexe = ""
+ self.texteSimple = ""
+ self.nomDuTypePyxb = "NonTraiteConsigne"
+ self.texteSimpleVenantDesFils = ""
+ self.aCreer = False
+ self.texteElt = ""
+
+ return
+ self.getNomDuCodeDumpe()
+ # dans ce cas les blocs successifs sont identiques et on ne dumpe que le 1er
+
+ self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+ self.texteSimple = "" # on n ajoute pas de type simple
+
+ # Pour les blocs le minOccurs vaut 0 et le max 1
+ if self.aCreer :
+ self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb)
+ texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
+ self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe
+ self.texteComplexe += finTypeSubst
+
+ else :
+ self.texteComplexe = ""
+
+ self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
+
+ #print ('------------------------------------------------')
+
+ def compare(self,autreMC):
+ if self.label != autreMC.label : return False
+ if self.inUnion == True or autreMC.inUnion == True : return False
+ if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+ for attr in ( 'condition', 'regles', ):
+ val1=getattr(self,attr)
+ val2=getattr(autreMC,attr)
+ if val1 != val2 : return False
+ if len(self.entites) != len(autreMC.entites) : return False
+ for defFille in self.entites.keys():
+ if defFille not in autreMC.entites.keys() : return False
+ if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
+ return True
+
+ def construitArbrePossibles(self):
+ self.arbrePossibles=[[],]
+ #print ('X_BLOC je construis l arbre des possibles pour ', self.nom)
+ for child in self.mcXSD :
+ if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+ #print (child.nom, child.label, child.arbrePossibles)
+ if child.label == 'BLOC' :
+ self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+ elif child.label == 'BlocAmbigu':
+ #print ("je passe par la pour", self.nom, child.nom, self.arbrePossibles, child.arbrePossibles)
+ self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+ #print ('resultat', self.arbrePossibles)
+ else :
+ self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles))
+ self.arbrePossibles.append([]) # un bloc n est pas obligatoire
+ #print ('arbre des possibles de ' ,self.nom, self.arbrePossibles)
#--------------------------------
class X_SIMP (X_definition):
#--------------------------------
- def dumpXsd(self, dansFactorisation=False, multiple=False, first=False, debug=False):
- #if PourTraduction : print (self.nom)
- if debug : print ('X_SIMP dumpXsd pour', self.nom, '___________________________')
- self.prepareDumpXSD()
- # si inUnion la comparaison est fausse : on cree le nomDuType
- if multiple : self.inUnion=True
- #print ('exploreObjet SIMP')
- self.getNomDuCodeDumpe()
- self.aCreer = True
- self.texteComplexe = ""
- self.texteSimple = ""
- self.texteElt = ""
- if self.nom =='Consigne' : return
-
- # --> homonymie on peut utiliser genealogie ?
- self.nomDuTypeDeBase = self.traduitType()
- if debug : print ('nomDuTypeDeBase', self.nomDuTypeDeBase)
- if debug : print ('multiple', multiple, 'first', first)
- if not multiple :
- self.nomDuTypePyxb = self.definitNomDuTypePyxb()
- else :
- if first :
- # on force la creation
- self.nomDuTypePyxb = self.definitNomDuTypePyxb()
- self.aCreer = True
- else :
- self.nomDuTypePyxb='NonDetermine'
-
- if debug : print ('nomDuTypePyxb', self.nomDuTypePyxb)
- if debug : print ('aCreer', self.aCreer)
- # on se sert des listes ou non pour la gestion des minOccurs /maxOccurs est > 0
- if self.statut =='f' : minOccurs = 0
- else : minOccurs = 1
- if dansFactorisation : minOccurs = 1
-
- #print ('minOccurs',minOccurs)
- # le defaut est dans l elt Name -> tester la coherence d existence avec Accas
- # regles Accas
-
- # pas d elt si on est dans multiple
- # sauf si on est le '1er' dans un element ambigu
- if not multiple :
- #print ('je passe la pas multiple')
- if self.defaut :
- if self.max > 1 or self.max == '**' or self.max == float('inf') :
- # a revoir pour les tuples avec defaut
- txtDefaut=""
- for val in self.defaut : txtDefaut+=str(val) +" "
- self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
- else :
- if str(self.defaut) == 'True' : txtDefaut = 'true'
- elif str(self.defaut) == 'False' : txtDefaut = 'false'
- else : txtDefaut = str(self.defaut)
- self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
- else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
- elif first:
- self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,1,1)
-
- # self.aCreer est mis a jour ds definitNomDuTypePyxb
- # ou si elt est le 1er d une liste identique
- if debug : print ('je suis aCreer', self.aCreer)
- if not self.aCreer : return
-
- typeATraduire=self.type[0]
-
- self.texteSimplePart1=""
- if not(isinstance(typeATraduire,str)) and not(isinstance(typeATraduire,Accas.Tuple)) and issubclass(typeATraduire, Accas.UserASSD) :
- self.isAtypeUserASSD = True
- cata = CONTEXT.getCurrentCata()
- if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C'
- else : suffixe = 'U'
- if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes :
- self.texteSimplePart1 = defUserAssd.format(typeATraduire.__name__, suffixe)
- cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe)
-
- if cata.definitUserASSD ==False :
- cata.definitUserASSD = True
- cata.texteSimple = cata.texteSimple + defBaseXSDUserAssd
-
-
- if not multiple : self.texteSimple += debutSimpleType.format(self.nomDuTypePyxb)
- else : self.texteSimple += debutSimpleTypeSsNom
- # On est dans une liste
- if self.max > 1 or self.max == '**' or self.max == float('inf') or hasattr(self.type[0], 'ntuple') :
- self.texteSimple += debutTypeSimpleListe
- self.texteSimple += "\t\t\t\t"+debutRestrictionBase.format(self.nomDuTypeDeBase)
- if self.val_min != float('-inf') : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
- if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max)
- if self.into != None:
- # PN --> traduction des into
- into=self.into
- if self.intoXML != None : into = self.intoXML
- for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
- if PourTraduction :
- for val in into : print (str(val))
- self.texteSimple += fermeBalisesMileu
- if self.max !=1 and self.max != '**' and self.max != float('inf') : self.texteSimple += maxLengthTypeSimple.format(self.max)
- if self.min !=1 and self.min != float('-inf') : self.texteSimple += minLengthTypeSimple.format(self.min)
- self.texteSimple += fermeRestrictionBase
- else :
- # ou pas
- self.texteSimple += debutRestrictionBase.format(self.nomDuTypeDeBase)
- if self.val_min != float('-inf') : self.texteSimple += minInclusiveBorne.format(self.val_min)
- if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple += maxInclusiveBorne.format(self.val_max)
- if self.into != None:
- into=self.into
- if self.intoXML != None : into = self.intoXML
- for val in into : self.texteSimple += enumeration.format(val)
- if PourTraduction :
- for val in into : print (str(val))
- self.texteSimple += fermeRestrictionBase
- self.texteSimple += fermeSimpleType
- self.texteSimplePart2 = self.texteSimple
- self.texteSimple = self.texteSimplePart1 + self.texteSimplePart2
-
-
- def prepareDumpXSD(self):
- self.inUnion=False
- if self.statut == 'f' : self.arbrePossibles = (self.nom,[])
- else : self.arbrePossibles = (self.nom,)
- self.mcXSD=[]
-
-
-
- def traduitType(self):
- # il faut traduire le min et le max
- # il faut ajouter les regles
- # il faut gerer les types tuple et fichier
- if hasattr(self.type[0], 'ntuple') :
- try :
- leType=self.validators.typeDesTuples[0]
- for i in range(self.type[0].ntuple):
- if self.validators.typeDesTuples[i] != leType : return ('XXXXXXXX')
- typeATraduire=leType
- except :
- return ('XXXXXXXX')
- else :
- typeATraduire=self.type[0]
- if not (typeATraduire in list(dictNomsDesTypes.keys())) :
- #if (isinstance(typeATraduire, Accas.ASSD) or issubclass(typeATraduire, Accas.ASSD)) :
- if (not(isinstance(typeATraduire,str)) and issubclass(typeATraduire, Accas.ASSD)) :
- # cas d une creation
- cata = CONTEXT.getCurrentCata()
- # PNPNPN a Revoir pour la creation des keyrefs
- if len(self.type) == 2 and self.type[1]=='createObject' :
- if typeATraduire.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
- cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__]=[self,]
+ def dumpXsd(self, dansFactorisation=False, multiple=False, first=False, debug=False):
+ #if PourTraduction : print (self.nom)
+ if debug : print ('X_SIMP dumpXsd pour', self.nom, '___________________________')
+ self.prepareDumpXSD()
+ # si inUnion la comparaison est fausse : on cree le nomDuType
+ if multiple : self.inUnion=True
+ #print ('exploreObjet SIMP')
+ self.getNomDuCodeDumpe()
+ self.aCreer = True
+ self.texteComplexe = ""
+ self.texteSimple = ""
+ self.texteElt = ""
+ if self.nom =='Consigne' : return
+
+ # --> homonymie on peut utiliser genealogie ?
+ self.nomDuTypeDeBase = self.traduitType()
+ if debug : print ('nomDuTypeDeBase', self.nomDuTypeDeBase)
+ if debug : print ('multiple', multiple, 'first', first)
+ if not multiple :
+ self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+ else :
+ if first :
+ # on force la creation
+ self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+ self.aCreer = True
+ else :
+ self.nomDuTypePyxb='NonDetermine'
+
+ if debug : print ('nomDuTypePyxb', self.nomDuTypePyxb)
+ if debug : print ('aCreer', self.aCreer)
+ # on se sert des listes ou non pour la gestion des minOccurs /maxOccurs est > 0
+ if self.statut =='f' : minOccurs = 0
+ else : minOccurs = 1
+ if dansFactorisation : minOccurs = 1
+
+ #print ('minOccurs',minOccurs)
+ # le defaut est dans l elt Name -> tester la coherence d existence avec Accas
+ # regles Accas
+
+ # pas d elt si on est dans multiple
+ # sauf si on est le '1er' dans un element ambigu
+ if not multiple :
+ #print ('je passe la pas multiple')
+ if self.defaut :
+ if self.max > 1 or self.max == '**' or self.max == float('inf') :
+ # a revoir pour les tuples avec defaut
+ txtDefaut=""
+ for val in self.defaut : txtDefaut+=str(val) +" "
+ self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
else :
- cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__].append(self)
- if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_C'
+ if str(self.defaut) == 'True' : txtDefaut = 'true'
+ elif str(self.defaut) == 'False' : txtDefaut = 'false'
+ else : txtDefaut = str(self.defaut)
+ self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+ else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+ elif first:
+ self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,1,1)
+
+ # self.aCreer est mis a jour ds definitNomDuTypePyxb
+ # ou si elt est le 1er d une liste identique
+ if debug : print ('je suis aCreer', self.aCreer)
+ if not self.aCreer : return
+
+ typeATraduire=self.type[0]
+
+ self.texteSimplePart1=""
+ if not(isinstance(typeATraduire,str)) and not(isinstance(typeATraduire,Accas.Tuple)) and issubclass(typeATraduire, Accas.UserASSD) :
+ self.isAtypeUserASSD = True
+ cata = CONTEXT.getCurrentCata()
+ if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C'
+ else : suffixe = 'U'
+ if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes :
+ self.texteSimplePart1 = defUserAssd.format(typeATraduire.__name__, suffixe)
+ cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe)
+
+ if cata.definitUserASSD ==False :
+ cata.definitUserASSD = True
+ cata.texteSimple = cata.texteSimple + defBaseXSDUserAssd
+
+
+ if not multiple : self.texteSimple += debutSimpleType.format(self.nomDuTypePyxb)
+ else : self.texteSimple += debutSimpleTypeSsNom
+ # On est dans une liste
+ if self.max > 1 or self.max == '**' or self.max == float('inf') or hasattr(self.type[0], 'ntuple') :
+ self.texteSimple += debutTypeSimpleListe
+ self.texteSimple += "\t\t\t\t"+debutRestrictionBase.format(self.nomDuTypeDeBase)
+ if self.val_min != float('-inf') : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
+ if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max)
+ if self.into != None:
+ # PN --> traduction des into
+ into=self.into
+ if self.intoXML != None : into = self.intoXML
+ for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
+ if PourTraduction :
+ for val in into : print (str(val))
+ self.texteSimple += fermeBalisesMileu
+ if self.max !=1 and self.max != '**' and self.max != float('inf') : self.texteSimple += maxLengthTypeSimple.format(self.max)
+ if self.min !=1 and self.min != float('-inf') : self.texteSimple += minLengthTypeSimple.format(self.min)
+ self.texteSimple += fermeRestrictionBase
+ else :
+ # ou pas
+ self.texteSimple += debutRestrictionBase.format(self.nomDuTypeDeBase)
+ if self.val_min != float('-inf') : self.texteSimple += minInclusiveBorne.format(self.val_min)
+ if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple += maxInclusiveBorne.format(self.val_max)
+ if self.into != None:
+ into=self.into
+ if self.intoXML != None : into = self.intoXML
+ for val in into : self.texteSimple += enumeration.format(val)
+ if PourTraduction :
+ for val in into : print (str(val))
+ self.texteSimple += fermeRestrictionBase
+ self.texteSimple += fermeSimpleType
+ self.texteSimplePart2 = self.texteSimple
+ self.texteSimple = self.texteSimplePart1 + self.texteSimplePart2
+
+
+ def prepareDumpXSD(self):
+ self.inUnion=False
+ if self.statut == 'f' : self.arbrePossibles = (self.nom,[])
+ else : self.arbrePossibles = (self.nom,)
+ self.mcXSD=[]
+
+
+
+ def traduitType(self):
+ # il faut traduire le min et le max
+ # il faut ajouter les regles
+ # il faut gerer les types tuple et fichier
+ if hasattr(self.type[0], 'ntuple') :
+ try :
+ leType=self.validators.typeDesTuples[0]
+ for i in range(self.type[0].ntuple):
+ if self.validators.typeDesTuples[i] != leType : return ('XXXXXXXX')
+ typeATraduire=leType
+ except :
+ return ('XXXXXXXX')
+ else :
+ typeATraduire=self.type[0]
+ if not (typeATraduire in list(dictNomsDesTypes.keys())) :
+ #if (isinstance(typeATraduire, Accas.ASSD) or issubclass(typeATraduire, Accas.ASSD)) :
+ if (not(isinstance(typeATraduire,str)) and issubclass(typeATraduire, Accas.ASSD)) :
+ # cas d une creation
+ cata = CONTEXT.getCurrentCata()
+ # PNPNPN a Revoir pour la creation des keyrefs
+ if len(self.type) == 2 and self.type[1]=='createObject' :
+ if typeATraduire.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+ cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__]=[self,]
+ else :
+ cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__].append(self)
+ if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_C'
+ else : return 'xs:string'
+
+ # cas d une consommation
+ if typeATraduire not in list(cata.dictTypesASSDorUserASSDUtilises) :
+ cata.dictTypesASSDorUserASSDUtilises[typeATraduire]=[self,]
+ else :
+ cata.dictTypesASSDorUserASSDUtilises[typeATraduire].append(self,)
+ if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_U'
else : return 'xs:string'
-
- # cas d une consommation
- if typeATraduire not in list(cata.dictTypesASSDorUserASSDUtilises) :
- cata.dictTypesASSDorUserASSDUtilises[typeATraduire]=[self,]
- else :
- cata.dictTypesASSDorUserASSDUtilises[typeATraduire].append(self,)
- if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_U'
- else : return 'xs:string'
- else : return ('YYYYY')
- return dictNomsDesTypes[typeATraduire]
-
- def traduitValMinValMax(self):
- self.maxInclusive=self.val_max
- self.minInclusive=self.val_min
- if self.val_min == float('-inf') and val_max== float('inf') : return
- #print ('il faut affiner le type du SIMP ', self.nom)
- if self.val_max == '**' or self.val_max == float('inf') : self.maxInclusive=None
- else : self.maxInclusive = self.val_max
- if self.val_min == '**' or self.val_max == float('-inf') : self.maxInclusive=None
- else : self.minInclusive = self.val_min
-
- def traduitMinMax(self):
- if self.min == 1 and self.max == 1 : return
- #print ('il faut creer une liste ' , self.nom)
-
- def compare(self,autreMC):
- if self.label != autreMC.label : return False
- if self.inUnion == True or autreMC.inUnion == True : return False
- if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
- listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ]
- if self.intoXML != None : listeAComparer.append('intoXML')
- else : listeAComparer.append('into')
- if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
- for attr in listeAComparer :
- val1=getattr(self,attr)
- val2=getattr(autreMC,attr)
- if val1 != val2 : return False
- return True
-
- def construitArbrePossibles(self):
- if self.statut == 'f' :
- self.arbrePossibles = (self.nom,[])
- else :
- self.arbrePossibles = (self.nom,)
- #print ('SIMP arbre des possibles de ' ,self.nom, self.arbrePossibles)
+ else : return ('YYYYY')
+ return dictNomsDesTypes[typeATraduire]
+
+ def traduitValMinValMax(self):
+ self.maxInclusive=self.val_max
+ self.minInclusive=self.val_min
+ if self.val_min == float('-inf') and val_max== float('inf') : return
+ #print ('il faut affiner le type du SIMP ', self.nom)
+ if self.val_max == '**' or self.val_max == float('inf') : self.maxInclusive=None
+ else : self.maxInclusive = self.val_max
+ if self.val_min == '**' or self.val_max == float('-inf') : self.maxInclusive=None
+ else : self.minInclusive = self.val_min
+
+ def traduitMinMax(self):
+ if self.min == 1 and self.max == 1 : return
+ #print ('il faut creer une liste ' , self.nom)
+
+ def compare(self,autreMC):
+ if self.label != autreMC.label : return False
+ if self.inUnion == True or autreMC.inUnion == True : return False
+ if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+ listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ]
+ if self.intoXML != None : listeAComparer.append('intoXML')
+ else : listeAComparer.append('into')
+ if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
+ for attr in listeAComparer :
+ val1=getattr(self,attr)
+ val2=getattr(autreMC,attr)
+ if val1 != val2 : return False
+ return True
+
+ def construitArbrePossibles(self):
+ if self.statut == 'f' :
+ self.arbrePossibles = (self.nom,[])
+ else :
+ self.arbrePossibles = (self.nom,)
+ #print ('SIMP arbre des possibles de ' ,self.nom, self.arbrePossibles)
#-----------------
#-----------------
def dumpXsd(self, avecEltAbstrait, debug = True):
- cata = CONTEXT.getCurrentCata()
+ cata = CONTEXT.getCurrentCata()
if debug : print ('avecEltAbstrait -------------------', avecEltAbstrait)
if debug : print ('self.importedBy -------------------', self.importedBy)
self.texteSimple = ""
self.texteComplexe = ""
- self.texteCata = ""
+ self.texteCata = ""
self.texteDeclaration = ""
self.texteInclusion = ""
self.texteElt = ""
self.texteTypeAbstrait = ""
if self.implement == "" :
- self.nomDuCodeDumpe = self.code
- self.implement = self.code
- self.nomDuXsdPere = self.code
+ self.nomDuCodeDumpe = self.code
+ self.implement = self.code
+ self.nomDuXsdPere = self.code
else :
- self.implement,self.nomDuXsdPere=self.implement.split(':')
- self.nomDuCodeDumpe = self.implement
+ self.implement,self.nomDuXsdPere=self.implement.split(':')
+ self.nomDuCodeDumpe = self.implement
if debug : print ('self.implement -------------------', self.implement)
if debug : print ('self.nomDuCodeDumpe -------------------', self.nomDuCodeDumpe)
self.dumpLesCommandes()
if self.implement == self.code :
- self.texteCata += eltAbstraitCataPPal.format(self.code)
- self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
+ self.texteCata += eltAbstraitCataPPal.format(self.code)
+ self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
else :
- self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
- self.texteCata += eltCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere,self.nomDuXsdPere)
- self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+ self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
+ self.texteCata += eltCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere,self.nomDuXsdPere)
+ self.texteInclusion += includeCata.format(self.nomDuXsdPere)
self.texteCata += eltCata.format(self.implement,self.implement,self.implement,self.implement,self.nomDuXsdPere)
#if self.implement == self.code :
- #for codeHeritant in self.importedBy:
+ #for codeHeritant in self.importedBy:
# self.texteCata += eltCodeSpecDsCata.format(codeHeritant)
# self.texteTypeAbstrait += eltAbstrait.format(codeHeritant,codeHeritant,self.code,codeHeritant)
# self.texteElt = eltCata.format(self.nomDuCodeDumpe,self.code, self.nomDuTypePyxb)
if self.implement == self.code :
- self.texteXSD = texteDebut.format(self.code,self.code,self.code,self.code,self.code,self.code)
+ self.texteXSD = texteDebut.format(self.code,self.code,self.code,self.code,self.code,self.code)
elif self.nomDuXsdPere == self.code :
- self.texteXSD = texteDebutNiveau2.format(self.code,self.implement,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
- else :
- self.texteXSD = texteDebutNiveau3.format(self.code,self.implement,self.code,self.nomDuXsdPere,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+ self.texteXSD = texteDebutNiveau2.format(self.code,self.implement,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+ else :
+ self.texteXSD = texteDebutNiveau3.format(self.code,self.implement,self.code,self.nomDuXsdPere,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
if self.texteInclusion != "" : self.texteXSD += self.texteInclusion
self.texteXSD += self.texteSimple
#if self.texteTypeAbstrait != "" : self.texteXSD += self.texteTypeAbstrait
self.texteXSD += self.texteCata
#self.texteXSD += self.texteElt
-
+
toutesLesKeys=set()
texteKeyRef = ""
- # Pour le nom des key_ref en creation : le type ( une seule key-ref par type. facile a retrouver)
+ # Pour le nom des key_ref en creation : le type ( une seule key-ref par type. facile a retrouver)
for clef in self.dictTypesASSDorUserASSDCrees:
existeASSD=0
texteDesFields=""
- for unOper in self.dictTypesASSDorUserASSDCrees[clef]:
+ for unOper in self.dictTypesASSDorUserASSDCrees[clef]:
if not(isinstance(unOper, Accas.OPER)) : continue
existeASSD=1
texteDesFields+=texteFieldUnitaire.format(self.code, unOper.nom)
if existeASSD : texteDesFields=texteDesFields[0:-2]
texteDesUserASSD=''
existeunUserASSD=0
- for unSimp in self.dictTypesASSDorUserASSDCrees[clef]:
+ for unSimp in self.dictTypesASSDorUserASSDCrees[clef]:
if not (isinstance(unSimp, Accas.SIMP)) : continue
texteDesUserASSD += unSimp.getXPathSansSelf() + " | "
#print (unSimp.getXPathSansSelf())
#texteFieldUnitaire='/'+self.code+":"+unSimp.nom
existeunUserASSD=1
if existeunUserASSD:
- if existeASSD : texteDesFields = texteDesFields + texteDesUserASSD[0:-2] +"/>\n\t\t"
- else: texteDesFields = texteDesUserASSD[0:-2]
+ if existeASSD : texteDesFields = texteDesFields + texteDesUserASSD[0:-2] +"/>\n\t\t"
+ else: texteDesFields = texteDesUserASSD[0:-2]
#print (texteDesUserASSD)
#print (texteDesFields)
if texteDesFields != "" :
- texteKeyRef += producingASSDkeyRefDeclaration.format( clef ,texteDesFields)
+ texteKeyRef += producingASSDkeyRefDeclaration.format( clef ,texteDesFields)
- # Pour le nom des key-ref en utilisation : la genealogie complete ( une key-ref par utilisation et on retrouve facilement la )
+ # Pour le nom des key-ref en utilisation : la genealogie complete ( une key-ref par utilisation et on retrouve facilement la )
for clef in self.dictTypesASSDorUserASSDUtilises:
- for unSimp in self.dictTypesASSDorUserASSDUtilises[clef]:
- # il faut la genealogie
- texteKeyRef += UsingASSDkeyRefDeclaration.format(unSimp.getNomCompletAvecBloc(), unSimp.type[0].__name__,self.code, unSimp.type[0].__name__,unSimp.getXPathComplet() )
+ for unSimp in self.dictTypesASSDorUserASSDUtilises[clef]:
+ # il faut la genealogie
+ texteKeyRef += UsingASSDkeyRefDeclaration.format(unSimp.getNomCompletAvecBloc(), unSimp.type[0].__name__,self.code, unSimp.type[0].__name__,unSimp.getXPathComplet() )
#PNPN on debranche les keyref le temps de bien reflechir a leur forme
- #if texteKeyRef != '' :
+ #if texteKeyRef != '' :
# self.texteXSD = self.texteXSD[0:-3]+'>\n'
# self.texteXSD += texteKeyRef
- # self.texteXSD += fermeEltCata
+ # self.texteXSD += fermeEltCata
#if not PourTraduction : print (self.texteXSD)
-
+
import pprint
#pprint.pprint (cata.dictTypesXSDJumeaux)
#for k in cata.dictTypesXSDJumeaux:
dico = {}
for k in list(cata.dictTypesXSD.keys()):
- dico[k]={}
- different=False
- for definition in cata.dictTypesXSD[k] :
- if definition.label == 'BLOC' or definition.label == 'BlocAmbigu':continue
- if definition.nomDuTypePyxb != 'T_'+definition.nom : different=True
- listeATraiter=[definition.geneaCompleteSousFormeDeListe(),]
- while listeATraiter != [] :
- listeGenea=listeATraiter[0]
- listeATraiter=listeATraiter[1:]
- txtNomComplet=''
- indexMC=0
- for MC in listeGenea:
- txtNomComplet=txtNomComplet+'_'+MC.nom
- if MC in list(cata.dictTypesXSDJumeaux.keys()) :
+ dico[k]={}
+ different=False
+ for definition in cata.dictTypesXSD[k] :
+ if definition.label == 'BLOC' or definition.label == 'BlocAmbigu':continue
+ if definition.nomDuTypePyxb != 'T_'+definition.nom : different=True
+ listeATraiter=[definition.geneaCompleteSousFormeDeListe(),]
+ while listeATraiter != [] :
+ listeGenea=listeATraiter[0]
+ listeATraiter=listeATraiter[1:]
+ txtNomComplet=''
+ indexMC=0
+ for MC in listeGenea:
+ txtNomComplet=txtNomComplet+'_'+MC.nom
+ if MC in list(cata.dictTypesXSDJumeaux.keys()) :
for MCJumeau in cata.dictTypesXSDJumeaux[MC]:
# attention nvlleGenalogie n a pas de sens en Accas
nvlleGenalogie=listeGenea[:indexMC]+MCJumeau.geneaCompleteSousFormeDeListe()
listeATraiter.append(nvlleGenalogie)
- indexMC=indexMC+1
- dico[k][txtNomComplet]=definition.nomDuTypePyxb
- if dico[k]== {} or (not different) : del dico[k]
+ indexMC=indexMC+1
+ dico[k][txtNomComplet]=definition.nomDuTypePyxb
+ if dico[k]== {} or (not different) : del dico[k]
import pprint
#pprint.pprint(dico)
if dico != {} : self.texteXSD += texteAnnotation.format(self.nomDuCodeDumpe,str(dico))
-
+
#import pprint
#if (not PourTraduction) and (dico != {}) : pprint.pprint(dico)
print ('__________________________ decommenter pour le texteXSD________________________')
self.texteXSD += texteFin
return self.texteXSD
-
+
def dumpLesCommandes(self):
- cata = CONTEXT.getCurrentCata()
+ cata = CONTEXT.getCurrentCata()
fichierCataSourceExt=os.path.basename(cata.cata.__file__)
fichierCataSource, extension=os.path.splitext(fichierCataSourceExt)
importCataSource=__import__(fichierCataSource,{},{})
texte=""
for m in sys.modules:
- monModule=sys.modules[m]
- try :
- if m in ('os', 'sys', 'inspect', 'six', 'pickle', 'codecs') : continue
- if m in ('cPickle', 'pprint', 'dis', '_sre', 'encodings.aliases'): continue
- if m in ('numbers', 'optparse', 'binascii', 'posixpath') : continue
- if m in ('_locale', '_sysconfigdata_nd', 'gc', 'functools') : continue
- if m in ('posixpath', 'types', 'posix', 'prefs') : continue
- if m in ('warnings', 'types', 'posix', 'prefs') : continue
- if monModule.__name__[0:15] == '_sysconfigdata_' : continue
- if monModule.__name__ == '__future__' : continue
- if monModule.__name__[0:3] == 'Ihm' : continue
- if monModule.__name__[0:5] == 'numpy' : continue
- if monModule.__name__[0:5] == 'Noyau' : continue
- if monModule.__name__[0:5] == 'Accas' : continue
- if monModule.__name__[0:7] == 'convert' : continue
- if monModule.__name__[0:7] == 'Efi2Xsd' : continue
- if monModule.__name__[0:7] == 'Editeur' : continue
- if monModule.__name__[0:9] == 'generator' : continue
- if monModule.__name__[0:10] == 'Validation' : continue
- if monModule.__name__[0:10] == 'Extensions' : continue
- if monModule.__name__[0:12] == 'InterfaceQT4' : continue
- if monModule.__name__ == fichierCataSource : continue
- texte= texte + "try : import "+ monModule.__name__ + " \n"
- texte= texte + "except : pass \n"
- texte= texte + "try : from "+ monModule.__name__ + ' import * \n'
- texte= texte + "except : pass \n"
- except :
- pass
+ monModule=sys.modules[m]
+ try :
+ if m in ('os', 'sys', 'inspect', 'six', 'pickle', 'codecs') : continue
+ if m in ('cPickle', 'pprint', 'dis', '_sre', 'encodings.aliases'): continue
+ if m in ('numbers', 'optparse', 'binascii', 'posixpath') : continue
+ if m in ('_locale', '_sysconfigdata_nd', 'gc', 'functools') : continue
+ if m in ('posixpath', 'types', 'posix', 'prefs') : continue
+ if m in ('warnings', 'types', 'posix', 'prefs') : continue
+ if monModule.__name__[0:15] == '_sysconfigdata_' : continue
+ if monModule.__name__ == '__future__' : continue
+ if monModule.__name__[0:3] == 'Ihm' : continue
+ if monModule.__name__[0:5] == 'numpy' : continue
+ if monModule.__name__[0:5] == 'Noyau' : continue
+ if monModule.__name__[0:5] == 'Accas' : continue
+ if monModule.__name__[0:7] == 'convert' : continue
+ if monModule.__name__[0:7] == 'Efi2Xsd' : continue
+ if monModule.__name__[0:7] == 'Editeur' : continue
+ if monModule.__name__[0:9] == 'generator' : continue
+ if monModule.__name__[0:10] == 'Validation' : continue
+ if monModule.__name__[0:10] == 'Extensions' : continue
+ if monModule.__name__[0:12] == 'InterfaceQT4' : continue
+ if monModule.__name__ == fichierCataSource : continue
+ texte= texte + "try : import "+ monModule.__name__ + " \n"
+ texte= texte + "except : pass \n"
+ texte= texte + "try : from "+ monModule.__name__ + ' import * \n'
+ texte= texte + "except : pass \n"
+ except :
+ pass
newModule=imp.new_module('__main__')
exec (texte, newModule.__dict__)
allClassToDump=[]
for i in dir(importCataSource):
- if i not in dir(newModule):
+ if i not in dir(newModule):
allClassToDump.append(importCataSource.__dict__[i])
-
+
self.texteSimple = ''
self.texteComplexe = ''
c.nomDuCodeDumpe=self.nomDuCodeDumpe
c.code=self.implement
c.dumpXsd()
-
+
self.texteSimple += c.texteSimple
self.texteComplexe += c.texteComplexe
#c.texteElt=eltCompoDsSequenceInExtension.format(c.nom,self.code,c.nomDuTypePyxb)
import inspect
import traceback
def trace():
- traceback.print_stack()
+ traceback.print_stack()
#import raw.efficas as efficas
import types
sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
try :
- import pyxb
- import pyxb.binding
- import pyxb.binding.basis
- #import pyxb.utils.utility
- #import pyxb.utils.domutils
+ import pyxb
+ import pyxb.binding
+ import pyxb.binding.basis
+ #import pyxb.utils.utility
+ #import pyxb.utils.domutils
except : pass
from Accas import A_ASSD
class X_OBJECT:
# -------------
- def delObjPyxb(self, debug=True):
- if not self.cata or not self.cata.modeleMetier : return
- if self.nom == 'Consigne' : return None
- trouve = False
-
- if debug : print ('--------------- in delObjPyxb pour ' , self.nom)
- if debug : print (self.perePyxb.objPyxb.orderedContent())
- if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
-
- elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
- if debug : print ('element moi = ', elt, 'id de moi = ', id(self.objPyxb), self.objPyxb)
- if (elt.elementDeclaration.isPlural()):
- if debug : print ('je suis Plural')
- # monIndexInOrderedContent=0
- # for c in self.perePyxb.objPyxb.orderedContent():
- # if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(self.objPyxb)): monIndexInOrderedContent += 1
- # listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
- # if len(listeObjetsAccas) == 1 : monIndex=0
- # else : monIndex=listeObjetsAccas.index(self)
- # listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
- # listeObjetsPyxb.pop(monIndex)
- # self.perePyxb.objPyxb.orderedContent().pop(monIndexInOrderedContent)
- for c in self.perePyxb.objPyxb.orderedContent():
- trouve=False
- if isinstance(c._Content__value,list) and isinstance(c._Content__value[0],type(self.objPyxb)):
- monIndex=c.value.index(self.objPyxb)
- trouve = True
- if trouve : break
- if not trouve : print ("************ pas trouve au delete"); return
- listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
- listeObjetsPyxb.pop(monIndex)
- # si dernier ?
- else :
- newOrderedContent = []
- for i in self.perePyxb.objPyxb.orderedContent():
- if id(self.objPyxb) == id(i._Content__value) : trouve = True ;continue
- newOrderedContent.append(i)
- if not trouve : print ('elt a supprimer ', self.nom, 'non trouve')
- for i in range(len(newOrderedContent)):
- self.perePyxb.objPyxb.orderedContent()[i]=newOrderedContent[i]
- self.perePyxb.objPyxb.orderedContent().pop(len(newOrderedContent))
-
- setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,None)
+ def delObjPyxb(self, debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if self.nom == 'Consigne' : return None
+ trouve = False
+
+ if debug : print ('--------------- in delObjPyxb pour ' , self.nom)
+ if debug : print (self.perePyxb.objPyxb.orderedContent())
+ if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+
+ elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+ if debug : print ('element moi = ', elt, 'id de moi = ', id(self.objPyxb), self.objPyxb)
+ if (elt.elementDeclaration.isPlural()):
+ if debug : print ('je suis Plural')
+ # monIndexInOrderedContent=0
+ # for c in self.perePyxb.objPyxb.orderedContent():
+ # if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(self.objPyxb)): monIndexInOrderedContent += 1
+ # listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+ # if len(listeObjetsAccas) == 1 : monIndex=0
+ # else : monIndex=listeObjetsAccas.index(self)
+ # listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+ # listeObjetsPyxb.pop(monIndex)
+ # self.perePyxb.objPyxb.orderedContent().pop(monIndexInOrderedContent)
+ for c in self.perePyxb.objPyxb.orderedContent():
+ trouve=False
+ if isinstance(c._Content__value,list) and isinstance(c._Content__value[0],type(self.objPyxb)):
+ monIndex=c.value.index(self.objPyxb)
+ trouve = True
+ if trouve : break
+ if not trouve : print ("************ pas trouve au delete"); return
+ listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+ listeObjetsPyxb.pop(monIndex)
+ # si dernier ?
+ else :
+ newOrderedContent = []
+ for i in self.perePyxb.objPyxb.orderedContent():
+ if id(self.objPyxb) == id(i._Content__value) : trouve = True ;continue
+ newOrderedContent.append(i)
+ if not trouve : print ('elt a supprimer ', self.nom, 'non trouve')
+ for i in range(len(newOrderedContent)):
+ self.perePyxb.objPyxb.orderedContent()[i]=newOrderedContent[i]
+ self.perePyxb.objPyxb.orderedContent().pop(len(newOrderedContent))
+
+ setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,None)
+ if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+
+
+
+ def addObjPyxb(self,indiceDsLeContenu,debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug :print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+ # adherence Accas sur le parent
+ parent=self.parent
+ while (parent.isBLOC()):
+ if parent != self.parent : indiceDsLeContenu += parent.rangDsPyxb()
+ parent=parent.parent
+ self.perePyxb=parent
+
+ if debug :print ('indiceDsLeContenu',indiceDsLeContenu)
+ if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+
+ #if self.objPyxb ! = None : self.objPyxb.objAccas=self
+ elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+ self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt)
+ if (elt.elementDeclaration.isPlural()):
+ # je suis donc un MCList
+ listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+ if len(listeObjetsAccas) == 1 : monIndex=1
+ else : monIndex=listeObjetsAccas.index(self)
+ listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+ listeObjetsPyxb.insert(monIndex,self.objPyxb)
+ else :
+ setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+ if debug : print ('fin _____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+
+
+ def rangDsPyxb(self):
+ monRangEnAccas=self.parent.mcListe.index(self)
+ rangEnPyxb=0
+ for frere in self.parent.mcListe[0: monRangEnAccas] :
+ rangEnPyxb += frere.longueurDsArbre()
+ return rangEnPyxb
-
-
- def addObjPyxb(self,indiceDsLeContenu,debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug :print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
- # adherence Accas sur le parent
- parent=self.parent
- while (parent.isBLOC()):
- if parent != self.parent : indiceDsLeContenu += parent.rangDsPyxb()
- parent=parent.parent
- self.perePyxb=parent
-
- if debug :print ('indiceDsLeConten',indiceDsLeContenu)
- if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
-
- #if self.objPyxb ! = None : self.objPyxb.objAccas=self
- elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
- self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt)
- if (elt.elementDeclaration.isPlural()):
- # je suis donc un MCList
- listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
- if len(listeObjetsAccas) == 1 : monIndex=1
- else : monIndex=listeObjetsAccas.index(self)
- listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
- listeObjetsPyxb.insert(monIndex,self.objPyxb)
- else :
- setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
- if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
- print ('fin _____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
-
-
- def rangDsPyxb(self):
- monRangEnAccas=self.parent.mcListe.index(self)
- rangEnPyxb=0
- for frere in self.parent.mcListe[0: monRangEnAccas] :
- rangEnPyxb += frere.longueurDsArbre()
- return rangEnPyxb
-
class X_MCSIMP(X_OBJECT):
# -----------------------
-
- def buildObjPyxb(self, debug=False) :
- if not self.cata or not self.cata.modeleMetier : return
- if self.nom == 'Consigne' : return None
- if debug : print (self.definition.nomComplet())
- if debug : print ('_______________ X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
- if debug and self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
- elif debug : print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
-
- if self.objPyxbDeConstruction != None :
- self.objPyxb = self.objPyxbDeConstruction
+
+ def buildObjPyxb(self, debug=False) :
+ if not self.cata or not self.cata.modeleMetier : return
+ if self.nom == 'Consigne' : return None
+ if debug : print (self.definition.nomComplet())
+ if debug : print ('_______________ X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
+ if debug and self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
+ elif debug : print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
+
+ if self.objPyxbDeConstruction != None :
+ self.objPyxb = self.objPyxbDeConstruction
+ #self.objPyxb.objAccas=self
+ self.maClasseModeleMetier =type(self.objPyxb)
+ self.objPyxbDeConstruction = None
+ if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
+ self.needFactory=True
+ self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+ else : self.needFactory=False
+ else :
+ self.monNomClasseModeleMetier ='T_'+self.nom
+ if hasattr(self.definition,'nomXML') and self.definition.nomXML != None : self.monNomClasseModeleMetier='T_'+self.definition.nomXML
+ if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
+ nomComplet=self.definition.nomComplet()
+ if nomComplet in list(self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier].keys()):
+ self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][nomComplet]
+ if debug : print ('Pour', self.nom, ' le type est ', self.monNomClasseModeleMetier)
+ self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+ if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
+ if debug : print ('needFactory')
+ self.needFactory=True
+ self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+ else : self.needFactory=False
+
+ if self.valeur != None :
+ if self.needFactory :
+ if self.definition.max > 1 :
+ self.objPyxb=self.maClasseModeleMetier(self.valeur)
+ else : self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
+ else : self.objPyxb=self.maClasseModeleMetier(self.valeur)
+ else :
+ if self.needFactory : self.objPyxb=None
+ else : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False)
+
+
+ #if self.objPyxb !=None : self.objPyxb.objAccas=self
+ if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
+ if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
+
+
+ def setValeurObjPyxb(self,newVal, debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print (' ___________________________ dans setValeurObjPyxb MCSIMP ', self.nom, newVal)
+ if debug : print (' self.perePyxb = ', self.perePyxb.nom)
+ if debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
+ if debug : print ('debut du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+ #if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
+ if newVal != None :
+ if self.needFactory : nvlObj=self.maClasseModeleMetierFactory(newVal)
+ else : nvlObj=self.maClasseModeleMetier(newVal)
+ else :
+ if self.needFactory : nvlObj =None
+ else : nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
+ self.val=newVal
+ if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+ if inspect.isclass(newVal) and issubclass(newVal,A_ASSD) :
+ newVal = newVal.nom
+ setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
+ trouve=False
+ indice=0
+ for i in self.perePyxb.objPyxb.orderedContent():
+ if i.elementDeclaration.id() == self.nom:
+ #if isinstance(i._Content__value, self.maClasseModeleMetier) :
+ self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
+ del(self.perePyxb.objPyxb.orderedContent()[-1])
+ trouve=True
+ break
+ indice+=1
+ if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
+ self.objPyxb=nvlObj
#self.objPyxb.objAccas=self
- self.maClasseModeleMetier =type(self.objPyxb)
- self.objPyxbDeConstruction = None
- if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
- self.needFactory=True
- self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
- print ('self.maClasseModeleMetierFactory', self.maClasseModeleMetierFactory)
- else : self.needFactory=False
- else :
- self.monNomClasseModeleMetier ='T_'+self.nom
- if hasattr(self.definition,'nomXML') and self.definition.nomXML != None : self.monNomClasseModeleMetier='T_'+self.definition.nomXML
- if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
- nomComplet=self.definition.nomComplet()
- if nomComplet in list(self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier].keys()):
- self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][nomComplet]
- if debug : print ('Pour', self.nom, ' le type est ', self.monNomClasseModeleMetier)
- self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
- if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
- if debug : print ('needFactory')
- self.needFactory=True
- self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
- else : self.needFactory=False
-
- if self.valeur != None :
- if self.needFactory :
- if self.definition.max > 1 :
- self.objPyxb=self.maClasseModeleMetier(self.valeur)
- else : self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
- else : self.objPyxb=self.maClasseModeleMetier(self.valeur)
- else :
- if self.needFactory : self.objPyxb=None
- else : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False)
-
-
- #if self.objPyxb !=None : self.objPyxb.objAccas=self
- debug=1
- if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
- if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
-
-
- def setValeurObjPyxb(self,newVal, debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print (' ___________________________ dans setValeurObjPyxb MCSIMP ', self.nom, newVal)
- if debug : print (' self.perePyxb = ', self.perePyxb.nom)
- if debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
- if debug : print ('debut du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
-
- #if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
- if newVal != None :
- if self.needFactory : nvlObj=self.maClasseModeleMetierFactory(newVal)
- else : nvlObj=self.maClasseModeleMetier(newVal)
- else :
- if self.needFactory : nvlObj =None
- else : nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
- self.val=newVal
- if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
-
- if inspect.isclass(newVal) and issubclass(newVal,A_ASSD) :
- newVal = newVal.nom
- setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
- trouve=False
- indice=0
- for i in self.perePyxb.objPyxb.orderedContent():
- if i.elementDeclaration.id() == self.nom:
- #if isinstance(i._Content__value, self.maClasseModeleMetier) :
- self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
- del(self.perePyxb.objPyxb.orderedContent()[-1])
- trouve=True
- break
- indice+=1
- if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
- self.objPyxb=nvlObj
- #self.objPyxb.objAccas=self
- if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
-
-
-
+ if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+
+
class X_MCCOMPO(X_OBJECT) :
# -------------------------
-#
- def buildObjPyxb(self,mc_list, debug=True) :
- if not self.cata or not self.cata.modeleMetier : return
-
- if debug : print ('X_MCCOMPO', self.nom)
- self.listArg=[]
- self.dicoArg={}
- for objAccas in mc_list :
- if objAccas.nature == 'MCBLOC' :
- self.exploreBLOC(objAccas)
- elif objAccas.nature == 'MCList' :
- if objAccas[0].definition.max > 1 :
- self.listArg.append(objAccas) # les MCList n ont pas objPyxb
- self.dicoArg[objAccas.nom]=[]
- for fils in objAccas :
- fils.perePyxb=self
- self.dicoArg[objAccas.nom].append(fils.objPyxb)
- else :
- objAccas[0].perePyxb=self
- self.dicoArg[objAccas.nom]=objAccas[0].objPyxb
- self.listArg.append(objAccas[0].objPyxb)
- else :
- if objAccas.nom == 'Consigne' : continue
- self.listArg.append(objAccas.objPyxb)
- self.dicoArg[objAccas.nom]=objAccas.objPyxb
- objAccas.perePyxb=self
-
- if debug : print('X_MCCOMPO -- listArg ---',self.nom,self.listArg)
- if debug : print('X_MCCOMPO -- dicoArg ---',self.nom,self.dicoArg)
-
- self.monNomClasseModeleMetier='T_'+self.nom
- if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
- self.nomComplet=self.definition.nomComplet()
- self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][self.nomComplet]
- print ('monNomClasseModeleMetier', self.monNomClasseModeleMetier)
- self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
-
- # PN : Ne doit-on pas tester avant
- if self.objPyxbDeConstruction != None :
- print ('avec objPyxbDeConstruction', self.objPyxbDeConstruction)
- self.objPyxb = self.objPyxbDeConstruction
- self.objPyxbDeConstruction = None
- if debug : print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
- if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,self.objPyxb.orderedContent())
- else :
- if debug : print (self.listArg)
- if debug : print (self.maClasseModeleMetier)
- # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
- self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
- if debug :
- print ('ordered content __________________ ')
- for o in self.objPyxb.orderedContent():
- print ('o', o)
- print ('value', o.value)
- print ('type', type(o.value))
- print ('id', id(o.value))
- print ('fin __________ ordered content')
- newOrderedContent=[]
- if debug : print ('list Arg')
- for obj in self.listArg:
- if debug :
- print ('obj',obj)
- print ('type obj', type(obj))
- print ('id(obj)', id(obj))
-
- # on teste le caractere pluriel
- if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb
- max=obj[0].definition.max
- else : max = 1
- if max == 1 :
- #if not(issubclass(type(obj), pyxb.binding.basis.enumeration_mixin) ):
- # newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
- #else :
- # newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] )
- # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum
- newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
- else : # element Pural
- for c in self.objPyxb.orderedContent() :
- if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c)
-
- for i in range(len(self.listArg)):
- self.objPyxb.orderedContent()[i]=newOrderedContent[i]
- if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,newOrderedContent,self.objPyxb.orderedContent())
- #self.objPyxb.objAccas=self
- if debug : print ('fin buildObjetPyxb _______________________________________')
- # assert(self.objPyxb.validateBinding())
-
-
- def exploreBLOC(self,objAccas,debug=True):
- if debug : print (' ds exploreBLOC', objAccas.nom)
- laListeSsLesBlocs=[]
- for fils in objAccas.mcListe:
- if fils.nature == 'MCBLOC' :
- self.exploreBLOC(fils)
- elif fils.nature == 'MCList' :
- #print ('exploreBLOC des MCList', fils.nom)
- self.dicoArg[fils.nom]=[]
- if fils[0].definition.max > 1 :
- #print ('ajout de ', fils)
- self.listArg.append(fils) # les MCList n ont pas objPyxb
- for objFils in fils :
- objFils.perePyxb=self
- self.dicoArg[fils.nom].append(objFils.objPyxb)
- else:
- fils[0].perePyxb=self
- self.dicoArg[fils.nom]=fils[0].objPyxb
- self.listArg.append(fils[0].objPyxb)
+#
+ def buildObjPyxb(self,mc_list, debug=False) :
+ if not self.cata or not self.cata.modeleMetier : return
+
+ if debug : print ('X_MCCOMPO', self.nom)
+ self.listArg=[]
+ self.dicoArg={}
+ for objAccas in mc_list :
+ if objAccas.nature == 'MCBLOC' :
+ self.exploreBLOC(objAccas)
+ elif objAccas.nature == 'MCList' :
+ if objAccas[0].definition.max > 1 :
+ self.listArg.append(objAccas) # les MCList n ont pas objPyxb
+ self.dicoArg[objAccas.nom]=[]
+ for fils in objAccas :
+ fils.perePyxb=self
+ self.dicoArg[objAccas.nom].append(fils.objPyxb)
+ else :
+ objAccas[0].perePyxb=self
+ self.dicoArg[objAccas.nom]=objAccas[0].objPyxb
+ self.listArg.append(objAccas[0].objPyxb)
+ else :
+ if objAccas.nom == 'Consigne' : continue
+ self.listArg.append(objAccas.objPyxb)
+ self.dicoArg[objAccas.nom]=objAccas.objPyxb
+ objAccas.perePyxb=self
+
+ if debug : print('X_MCCOMPO -- listArg ---',self.nom,self.listArg)
+ if debug : print('X_MCCOMPO -- dicoArg ---',self.nom,self.dicoArg)
+
+ self.monNomClasseModeleMetier='T_'+self.nom
+ if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
+ self.nomComplet=self.definition.nomComplet()
+ self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][self.nomComplet]
+ self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+
+ # PN : Ne doit-on pas tester avant
+ if self.objPyxbDeConstruction != None :
+ self.objPyxb = self.objPyxbDeConstruction
+ self.objPyxbDeConstruction = None
+ if debug : print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
+ if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,self.objPyxb.orderedContent())
else :
- if fils.nom == "Consigne" : continue
- self.listArg.append(fils.objPyxb)
- self.dicoArg[fils.nom]=fils.objPyxb
- fils.perePyxb=self
- if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom)
- print (self.listArg)
- if debug : print ('fin ds exploreBLOC', objAccas .nom)
-
-
-
-
+ if debug : print (self.listArg)
+ if debug : print (self.maClasseModeleMetier)
+ # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
+ self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
+ if debug :
+ for o in self.objPyxb.orderedContent():
+ print ('o', o)
+ print ('value', o.value)
+ print ('type', type(o.value))
+ print ('id', id(o.value))
+ print ('fin __________ ordered content')
+ newOrderedContent=[]
+ if debug : print ('list Arg')
+ for obj in self.listArg:
+ if debug :
+ print ('obj',obj)
+ print ('type obj', type(obj))
+ print ('id(obj)', id(obj))
+
+ # on teste le caractere pluriel
+ if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb
+ max=obj[0].definition.max
+ else : max = 1
+ if max == 1 :
+ #if not(issubclass(type(obj), pyxb.binding.basis.enumeration_mixin) ):
+ # newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
+ #else :
+ # newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] )
+ # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum
+ newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
+ else : # element Pural
+ for c in self.objPyxb.orderedContent() :
+ if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c)
+
+ for i in range(len(self.listArg)):
+ self.objPyxb.orderedContent()[i]=newOrderedContent[i]
+ if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,newOrderedContent,self.objPyxb.orderedContent())
+ #self.objPyxb.objAccas=self
+ if debug : print ('fin buildObjetPyxb _______________________________________')
+ # assert(self.objPyxb.validateBinding())
+
+
+ def exploreBLOC(self,objAccas,debug=False):
+ if debug : print (' ds exploreBLOC', objAccas.nom)
+ laListeSsLesBlocs=[]
+ for fils in objAccas.mcListe:
+ if fils.nature == 'MCBLOC' :
+ self.exploreBLOC(fils)
+ elif fils.nature == 'MCList' :
+ #print ('exploreBLOC des MCList', fils.nom)
+ self.dicoArg[fils.nom]=[]
+ if fils[0].definition.max > 1 :
+ #print ('ajout de ', fils)
+ self.listArg.append(fils) # les MCList n ont pas objPyxb
+ for objFils in fils :
+ objFils.perePyxb=self
+ self.dicoArg[fils.nom].append(objFils.objPyxb)
+ else:
+ fils[0].perePyxb=self
+ self.dicoArg[fils.nom]=fils[0].objPyxb
+ self.listArg.append(fils[0].objPyxb)
+ else :
+ if fils.nom == "Consigne" : continue
+ self.listArg.append(fils.objPyxb)
+ self.dicoArg[fils.nom]=fils.objPyxb
+ fils.perePyxb=self
+ if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom)
+ if debug : print ('fin ds exploreBLOC', objAccas .nom)
+
+
+
+
class X_MCBLOC (X_MCCOMPO):
# --------------------------
- def buildObjPyxb(self,mc_list,debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list, 'ne fait rien')
- self.perePyxb=None
- self.objPyxb=None
-
- def addObjPyxb(self, indiceDsLeContenu, debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print ('X_MCBLOC addObjPyxb', self.nom, self, self.mcListe, indiceDsLeContenu)
- rangDeLObjet=indiceDsLeContenu
- for obj in self.mcListe:
- obj.addObjPyxb( rangDeLObjet)
- rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
-
- def delObjPyxb(self, debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print ('X_MCBLOC delObjPyxb', self.nom, ' --------------------------')
- for obj in self.mcListe:
- obj.delObjPyxb()
- if debug : print ('fin X_MCBLOC delObjPyxb --------------------------')
+ def buildObjPyxb(self,mc_list,debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list, 'ne fait rien')
+ self.perePyxb=None
+ self.objPyxb=None
+
+ def addObjPyxb(self, indiceDsLeContenu, debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print ('X_MCBLOC addObjPyxb', self.nom, self, self.mcListe, indiceDsLeContenu)
+ rangDeLObjet=indiceDsLeContenu
+ for obj in self.mcListe:
+ obj.addObjPyxb( rangDeLObjet)
+ rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
+
+ def delObjPyxb(self, debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print ('X_MCBLOC delObjPyxb', self.nom, ' --------------------------')
+ for obj in self.mcListe:
+ obj.delObjPyxb()
+ if debug : print ('fin X_MCBLOC delObjPyxb --------------------------')
class X_MCLIST (X_MCCOMPO):
# --------------------------
-
- def buildObjPyxb(self,mc_list, debug=False):
- if debug : print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
- pass
-
- def addObjPyxb(self,indiceDsLeContenu, debug=False):
- if debug : print ('X_MCLIST addObjPyxb', self.nom, indiceDsLeContenu)
- rangDeLObjet=indiceDsLeContenu
- for objFils in self :
- objFils.addObjPyxb(rangDeLObjet)
- rangDeLObjet= rangDeLObjet + 1
-
- def delObjPyxb(self, debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------')
- for obj in self:
- obj.delObjPyxb()
- if debug : print ('fin X_MCLIST delObjPyxb --------------------------')
+
+ def buildObjPyxb(self,mc_list, debug=False):
+ if debug : print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
+ pass
+
+ def addObjPyxb(self,indiceDsLeContenu, debug=False):
+ if debug : print ('X_MCLIST addObjPyxb', self.nom, indiceDsLeContenu)
+ rangDeLObjet=indiceDsLeContenu
+ for objFils in self :
+ objFils.addObjPyxb(rangDeLObjet)
+ rangDeLObjet= rangDeLObjet + 1
+
+ def delObjPyxb(self, debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------')
+ for obj in self:
+ obj.delObjPyxb()
+ if debug : print ('fin X_MCLIST delObjPyxb --------------------------')
class X_MCFACT (X_MCCOMPO):
# -------------------------
- pass
+ pass
class X_ETAPE(X_MCCOMPO) :
# -------------------------
- def metAJourNomASSD(self, nom,debug=False):
- if not self.cata or not self.cata.modeleMetier : return
- if debug : print ('X_ETAPE metAJourLesAttributs', self.nom, nom,' --------------------------')
- self.objPyxb.sdName=nom
+ def metAJourNomASSD(self, nom,debug=False):
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print ('X_ETAPE metAJourLesAttributs', self.nom, nom,' --------------------------')
+ self.objPyxb.sdName=nom
class X_JDC (X_MCCOMPO):
# ---------------------
-
- def __init__(self):
- self.perePyxb=None
- if not self.cata or not self.cata.modeleMetier : return
- #if hasattr(self.cata,'DicoNomTypeDifferentNomElt') : print ('jkllllllllllllllll')
- if not(hasattr(self.cata,'DicoNomTypeDifferentNomElt')) : self.cata.DicoNomTypeDifferentNomElt={}
- self.monNomClasseModeleMetier=self.code
- self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
- self.objPyxb=self.maClasseModeleMetier()
- #self.objPyxb.objAccas=self
- pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER)
- pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
- pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
-
-
-
- def enregistreEtapePyxb(self,etape,indice=0):
- # ne fonctionne pas : a reecrire avec les fonctions addObjPyxb et ReconstruitPerePyxb
- # ne contient pas indice pour l insant
- # print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
- # print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
- if not self.cata.modeleMetier : return
- self.objPyxb.append(etape.objPyxb)
- etape.perePyxb = self
-
- #print (self.objPyxb.orderedContent())
- #if indice != (len(self.objPyxb.orderedContent()) ) :
- # tampon=self.objPyxb.orderedContent()[-1]
- # for i in reversed(range(len(self.objPyxb.orderedContent()))):
- # self.objPyxb.orderedContent()[i]=self.objPyxb.orderedContent()[i-1]
- # if i == indice + 1 : break
- # self.objPyxb.orderedContent()[indice]=tampon
-
- #print (self.objPyxb.orderedContent())
- #try:
- # self.objPyxb.validateBinding()
- #except pyxb.ValidationError as e:
- # print(e.details())
-
- def toXml(self,fichier=None):
- print ('ds to XML')
- if not self.cata or not self.cata.modeleMetier : return
- print (' to xml ***************',self.objPyxb,'***************',)
- print (' to xml ***************',self,'***************',)
- print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
- print(self.objPyxb.toDOM().toprettyxml())
- print(self.objPyxb.toxml())
- return (self.objPyxb.toDOM().toprettyxml())
-
-
- def analyseFromXML(self,debug=False):
- print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py")
- print (self.procedure)
- if self.procedure == "" : return
- self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
- if not hasattr(self.cata.modeleMetier,'AccasUserAssd'):
- from Accas import UserASSD
- self.cata.modeleMetier.AccasUserAssd=UserASSD
- for contentObjEtape in self.objPyxb.orderedContent():
- objEtape=contentObjEtape.value
- objEtape.dictArgs=(self.pyxbToDict(objEtape))
- objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
- objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
- # doute sur les 2 lignes suivantes : objEtape peut etre contentObjEtape 2juin20
- objEtape.dictPyxb['objEnPyxb']=objEtape
- objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
- if debug : print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction'])
- maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
- if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
- if debug : print ('maClasseAccas ', maClasseAccas)
- if debug : print ('objEtape ', objEtape , type(objEtape))
- if debug : print ('nomClasseAccas ',objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
- if debug : print ('_ExpandedName ', objEtape._ExpandedName, type(objEtape._ExpandedName))
- if debug : print ('dictArgs ',objEtape.dictArgs)
- if debug : print ('dictPyxb ',objEtape.dictPyxb)
- # attention au call d Oper qui renomme l objet pyxb
- if hasattr(objEtape,'sdName') :
- if debug and hasattr(objEtape,'sdName') :print ('sdName',objEtape.sdName)
- objAccasEtape=maClasseAccas(nomXML=objEtape.sdName, **(objEtape.dictArgs))
- else : objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
- if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
-
-
- def pyxbToDict(self,objAAnalyser, debug=False):
- # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
- # faudrait - il travailler sur les types des objets ?
- # c est a revoir -> fonction cast a prevoir ds les 2 sens
- if objAAnalyser is None: return
- if debug : print ('debut pour_____________________________ ',objAAnalyser)
- dictArgs = {}
- # traitement SIMP
- # ---------------
- if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition):
- if debug : print ('je suis un MCSimple')
- # traitement scalaire
- objAAnalyser.dictPyxb=objAAnalyser
- if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
- # print ('je suis un scalaire')
- #try : # python 3
- if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd):
- import inspect
- laClassePyxbUserAssd=inspect.getmro(objAAnalyser.__class__)[1]
- return self.creeUserAssd(objAAnalyser,laClassePyxbUserAssd)
- if isinstance(objAAnalyser, pyxb.binding.datatypes.boolean) : return bool(objAAnalyser)
- if isinstance(objAAnalyser, str) : return str(objAAnalyser)
- if isinstance(objAAnalyser, int) : return int(objAAnalyser)
- if isinstance(objAAnalyser, float): return float(objAAnalyser)
- if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin): return str(objAAnalyser)
- #except : # python 2
- #if isinstance(objAAnalyser, types.StringTypes): return str(objAAnalyser)
- #if isinstance(objAAnalyser, types.FloatType): return float(objAAnalyser)
- #if isinstance(objAAnalyser, (types.IntType, types.LongType)): return int(objAAnalyser)
- #print ('________ fin pour ', objAAnalyser, 'retour', repr(objAAnalyser))
- return objAAnalyser
- else :
- #print ('je suis une liste')
- laListe=[]
- for obj in objAAnalyser :
- if isinstance(obj, str): laListe.append (str(obj))
- elif isinstance(obj, int): laListe.append (int(obj))
- elif isinstance(obj, float): laListe.append (float(obj))
- elif isinstance(obj, pyxb.binding.basis.enumeration_mixin): laListe.append(str(obj))
- else : laListe.append(obj)
- return (laListe)
- # if debug : print ('je suis Plural')
- # ou ? return objAAnalyser
- #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
- #pour une enum getattr(value dans le type)
- # return pythonLiteral(ReferenceFacet(facet=value, **kw))
- #print ('je suis un mot complexe')
- # traitement FACT ou BLOC
- # ------------------------
- # il faut traiter les fact multiples
- objAAnalyser.dictPyxb = {}
- objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
- #for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
- # objPyxbName = expandedName.localName()
- # objPyxbValue = getattr(objAAnalyser, objPyxbName)
- for objEltContentFils in objAAnalyser.orderedContent():
- objPyxbValue = objEltContentFils.value
- objPyxbName = objEltContentFils.elementDeclaration.id()
- elementDeclaration = objEltContentFils.elementDeclaration
- #if objPyxbValue == None or objPyxbValue == [] : continue
- if elementDeclaration.isPlural():
- if objPyxbName not in list(dictArgs.keys()) : dictArgs[objPyxbName]=[]
- if objPyxbName not in list(objAAnalyser.dictPyxb.keys()) : objAAnalyser.dictPyxb[objPyxbName]=[]
- dictArgs[objPyxbName].append(self.pyxbToDict(objPyxbValue))
- objAAnalyser.dictPyxb[objPyxbName].append(objPyxbValue.dictPyxb)
- else:
- dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
- objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
- # print ('ajout dans dictPyxb', objPyxbName, objPyxbValue.dictPyxb)
- #print ('avec la valeur', 'de', objAAnalyser.dictPyxb[objPyxbName])
-
- #print ("***********************************")
- #print ('pyxbToDict fin pour ********** ', objAAnalyser)
- #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
- #print ('pyxbToDict fin pour ********** ', objAAnalyser)
- #print ("***********************************")
- #print (dictArgs)
- #print (dictPyxb)
- #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
- #print ('fin pour ',objAAnalyser)
- return dictArgs
-
- def creeUserAssd(self,objAAnalyser,laClassePyxbUserAssd):
-
+
+ def __init__(self):
+ self.perePyxb=None
+ if not self.cata or not self.cata.modeleMetier : return
+ #if hasattr(self.cata,'DicoNomTypeDifferentNomElt') : print ('jkllllllllllllllll')
+ if not(hasattr(self.cata,'DicoNomTypeDifferentNomElt')) : self.cata.DicoNomTypeDifferentNomElt={}
+ self.monNomClasseModeleMetier=self.code
+ self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+ self.objPyxb=self.maClasseModeleMetier()
+ #self.objPyxb.objAccas=self
+ pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER)
+ pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+ pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+
+
+
+ def enregistreEtapePyxb(self,etape,indice=0):
+ # ne fonctionne pas : a reecrire avec les fonctions addObjPyxb et ReconstruitPerePyxb
+ # ne contient pas indice pour l insant
+ # print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
+ # print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
+ if not self.cata.modeleMetier : return
+ self.objPyxb.append(etape.objPyxb)
+ etape.perePyxb = self
+
+ #print (self.objPyxb.orderedContent())
+ #if indice != (len(self.objPyxb.orderedContent()) ) :
+ # tampon=self.objPyxb.orderedContent()[-1]
+ # for i in reversed(range(len(self.objPyxb.orderedContent()))):
+ # self.objPyxb.orderedContent()[i]=self.objPyxb.orderedContent()[i-1]
+ # if i == indice + 1 : break
+ # self.objPyxb.orderedContent()[indice]=tampon
+
+ #print (self.objPyxb.orderedContent())
+ #try:
+ # self.objPyxb.validateBinding()
+ #except pyxb.ValidationError as e:
+ # print(e.details())
+
+ def toXml(self,fichier=None, debug=False):
+ if debug : print ('ds to XML')
+ if not self.cata or not self.cata.modeleMetier : return
+ if debug : print (' to xml ***************',self.objPyxb,'***************',)
+ if debug : print (' to xml ***************',self,'***************',)
+ if debug : print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
+ if debug : print(self.objPyxb.toDOM().toprettyxml())
+ if debug : print(self.objPyxb.toxml())
+ return (self.objPyxb.toDOM().toprettyxml())
+
+
+ def analyseFromXML(self,debug=False):
+ print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py")
+ if self.procedure == "" : return
+ self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
+ if not hasattr(self.cata.modeleMetier,'AccasUserAssd'):
+ from Accas import UserASSD
+ self.cata.modeleMetier.AccasUserAssd=UserASSD
+ for contentObjEtape in self.objPyxb.orderedContent():
+ objEtape=contentObjEtape.value
+ objEtape.dictArgs=(self.pyxbToDict(objEtape))
+ objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
+ objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
+ # doute sur les 2 lignes suivantes : objEtape peut etre contentObjEtape 2juin20
+ objEtape.dictPyxb['objEnPyxb']=objEtape
+ objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
+ if debug : print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction'])
+ maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
+ if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+ if debug : print ('maClasseAccas ', maClasseAccas)
+ if debug : print ('objEtape ', objEtape , type(objEtape))
+ if debug : print ('nomClasseAccas ',objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
+ if debug : print ('_ExpandedName ', objEtape._ExpandedName, type(objEtape._ExpandedName))
+ if debug : print ('dictArgs ',objEtape.dictArgs)
+ if debug : print ('dictPyxb ',objEtape.dictPyxb)
+ # attention au call d Oper qui renomme l objet pyxb
+ if hasattr(objEtape,'sdName') :
+ if debug and hasattr(objEtape,'sdName') :print ('sdName',objEtape.sdName)
+ objAccasEtape=maClasseAccas(nomXML=objEtape.sdName, **(objEtape.dictArgs))
+ else : objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
+ if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+
+
+ def pyxbToDict(self,objAAnalyser, debug=False):
+ # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
+ # faudrait - il travailler sur les types des objets ?
+ # c est a revoir -> fonction cast a prevoir ds les 2 sens
+ if objAAnalyser is None: return
+ if debug : print ('debut pour_____________________________ ',objAAnalyser)
+ dictArgs = {}
+ # traitement SIMP
+ # ---------------
+ if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition):
+ if debug : print ('je suis un MCSimple')
+ # traitement scalaire
+ objAAnalyser.dictPyxb=objAAnalyser
+ if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
+ # print ('je suis un scalaire')
+ #try : # python 3
+ if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd):
+ import inspect
+ laClassePyxbUserAssd=inspect.getmro(objAAnalyser.__class__)[1]
+ return self.creeUserAssd(objAAnalyser,laClassePyxbUserAssd)
+ if isinstance(objAAnalyser, pyxb.binding.datatypes.boolean) : return bool(objAAnalyser)
+ if isinstance(objAAnalyser, str) : return str(objAAnalyser)
+ if isinstance(objAAnalyser, int) : return int(objAAnalyser)
+ if isinstance(objAAnalyser, float): return float(objAAnalyser)
+ if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin): return str(objAAnalyser)
+ #except : # python 2
+ #if isinstance(objAAnalyser, types.StringTypes): return str(objAAnalyser)
+ #if isinstance(objAAnalyser, types.FloatType): return float(objAAnalyser)
+ #if isinstance(objAAnalyser, (types.IntType, types.LongType)): return int(objAAnalyser)
+ #print ('________ fin pour ', objAAnalyser, 'retour', repr(objAAnalyser))
+ return objAAnalyser
+ else :
+ #print ('je suis une liste')
+ laListe=[]
+ for obj in objAAnalyser :
+ if isinstance(obj, str): laListe.append (str(obj))
+ elif isinstance(obj, int): laListe.append (int(obj))
+ elif isinstance(obj, float): laListe.append (float(obj))
+ elif isinstance(obj, pyxb.binding.basis.enumeration_mixin): laListe.append(str(obj))
+ else : laListe.append(obj)
+ return (laListe)
+ # if debug : print ('je suis Plural')
+ # ou ? return objAAnalyser
+ #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
+ #pour une enum getattr(value dans le type)
+ # return pythonLiteral(ReferenceFacet(facet=value, **kw))
+ #print ('je suis un mot complexe')
+ # traitement FACT ou BLOC
+ # ------------------------
+ # il faut traiter les fact multiples
+ objAAnalyser.dictPyxb = {}
+ objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
+ #for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
+ # objPyxbName = expandedName.localName()
+ # objPyxbValue = getattr(objAAnalyser, objPyxbName)
+ for objEltContentFils in objAAnalyser.orderedContent():
+ objPyxbValue = objEltContentFils.value
+ objPyxbName = objEltContentFils.elementDeclaration.id()
+ elementDeclaration = objEltContentFils.elementDeclaration
+ #if objPyxbValue == None or objPyxbValue == [] : continue
+ if elementDeclaration.isPlural():
+ if objPyxbName not in list(dictArgs.keys()) : dictArgs[objPyxbName]=[]
+ if objPyxbName not in list(objAAnalyser.dictPyxb.keys()) : objAAnalyser.dictPyxb[objPyxbName]=[]
+ dictArgs[objPyxbName].append(self.pyxbToDict(objPyxbValue))
+ objAAnalyser.dictPyxb[objPyxbName].append(objPyxbValue.dictPyxb)
+ else:
+ dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
+ objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
+ # print ('ajout dans dictPyxb', objPyxbName, objPyxbValue.dictPyxb)
+ #print ('avec la valeur', 'de', objAAnalyser.dictPyxb[objPyxbName])
+
+ #print ("***********************************")
+ #print ('pyxbToDict fin pour ********** ', objAAnalyser)
+ #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
+ #print ('pyxbToDict fin pour ********** ', objAAnalyser)
+ #print ("***********************************")
+ #print (dictArgs)
+ #print (dictPyxb)
+ #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
+ #print ('fin pour ',objAAnalyser)
+ return dictArgs
+
+ def creeUserAssd(self,objAAnalyser,laClassePyxbUserAssd):
+
nomClasseAccasUserAssd=laClassePyxbUserAssd.__name__[:-2]
enCreation=False
if laClassePyxbUserAssd.__name__[-2:]== '_C' : enCreation = True
elif laClassePyxbUserAssd.__name__[-2:] != '_U' : print ('pb avec', laClassePyxbUserAssd); exit()
laClasseAccas=getattr(self.cata,nomClasseAccasUserAssd)
- if not(enCreation):
- if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)]
- else :
+ if not(enCreation):
+ if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)]
+ else :
obj=laClasseAccas()
self.g_context[str(objAAnalyser)]=obj
return obj
if str(objAAnalyser) in self.g_context.keys():
- if isinstance(self.g_context[str(objAAnalyser)],laClasseAccas):
- return self.g_context[str(objAAnalyser)]
- else :
+ if isinstance(self.g_context[str(objAAnalyser)],laClasseAccas):
+ return self.g_context[str(objAAnalyser)]
+ else :
nvlObj=laClasseAccas()
oldObj=self.g_context[str(objAAnalyser)]
nvlObj.transfere(oldObj)
self.g_context[str(objAAnalyser)]=nvlObj
return nvlObj
else :
- obj=laClasseAccas()
- self.g_context[str(objAAnalyser)]=obj
- return obj
-
+ obj=laClasseAccas()
+ self.g_context[str(objAAnalyser)]=obj
+ return obj
+
# def analyseContent(self,objAAnalyser):
# objAAnalyser.dictArgs={}
# for objContenu in objAAnalyser.content():
# else :
# self.analyseContent(objContenu)
# objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.dictArgs
- #print ( '________________')
- #print (objAAnalyser.monNomClasseAccas)
- #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
- #print ( '________________')
-
-
+ #print ( '________________')
+ #print (objAAnalyser.monNomClasseAccas)
+ #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
+ #print ( '________________')
+
+
if __name__ == "__main__":
- print ('a faire')
+ print ('a faire')