From e134469b82253fb22beb4ffbc77643e6aa40c880 Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Fri, 3 Apr 2020 11:37:52 +0200 Subject: [PATCH] simp meme nom types differents --- Efi2Xsd/AccasXsd.py | 112 +++++++++++++++++++++++++++++++----------- Efi2Xsd/balisesXSD.py | 4 ++ 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index a0e89553..679842de 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -7,7 +7,8 @@ import sys,os import types import Accas import imp -from copy import deepcopy +from copy import deepcopy, copy +import traceback # CONTEXT est accessible (__init__.py de Noyau) @@ -100,7 +101,7 @@ class X_definition: return texteNom - def definitNomDuTypePyxb(self): + def definitNomDuTypePyxb(self,forceACreer=False): self.aCreer = True cata = CONTEXT.getCurrentCata() nom='T_'+self.nom @@ -121,8 +122,10 @@ class X_definition: indice += 1 self.aCreer = True cata.dictTypesXSD[nom].append(self) + if self.nom == 'SimpK' : print (cata.dictTypesXSD) nomAlter='T_'+self.nom+'_'+str(indice) if (hasattr (self, 'nomXML')) and self.nomXML != None : nomAlter='T_'+self.nomXML+'_'+str(indice) + traceback.print_stack() return nomAlter @@ -244,10 +247,10 @@ class X_compoFactoriseAmbigu(X_definition): if [] in laListe : declencheChoiceAvecSeqVid=True while [] in laListe : laListe.remove([]) - min=0 + #min=0 else : declencheChoiceAvecSeqVid=False - min=1 + #min=1 for ligne in laListe : @@ -268,10 +271,12 @@ class X_compoFactoriseAmbigu(X_definition): creeChoice=True creeSequence=False # pour regler le souci du 1er Niveau - if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1 - else : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1 + 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 + debutChoiceDsBlocAvecMin.format(min); indent=indent+1 + self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1 creeChoice=True creeSequence=False @@ -281,13 +286,13 @@ class X_compoFactoriseAmbigu(X_definition): 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]) + if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0],indent) else : self.factoriseEtCreeDump(listeSuivante,creeSequence, 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 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 @@ -298,15 +303,50 @@ class X_compoFactoriseAmbigu(X_definition): def ajouteAuxTextes(self,nomMC,indent) : if (indent > 3) : indent = indent - 3 else : indent = 0 - # if len(self.entites[nomMC]]) == 1: - if (1 == 1): + if len(self.entites[nomMC]) == 1: mc=self.entites[nomMC][0] mc.dumpXsd(dansFactorisation=True) self.texteComplexe += '\t'*(indent) + mc.texteElt self.texteComplexeVenantDesFils += mc.texteComplexe self.texteSimple += mc.texteSimple + 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() + print (self.entites[nomMC][0]) + resteATraiter=copy(self.entites[nomMC]) + listePourUnion=[] + first=1 + while resteATraiter != [] : + nvlListeATraiter=[] + mc=resteATraiter[0] + mc.dumpXsd(dansFactorisation=True,multiple=True,first=first) + first=first * 0 + listePourUnion.append(mc) + for autre in resteATraiter[1:]: + if not (mc.compare(autre)) : nvlListeATraiter.append(autre) + resteATraiter=copy(nvlListeATraiter) + + # on ajoute le nom de l element + self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt + texteSimpleUnion=debutSimpleType.format(self.entites[nomMC][0].nomDuTypePyxb) + texteSimpleUnion+=debutUnion + if len(listePourUnion) == 1 : + self.texteComplexeVenantDesFils += mc.texteComplexe + self.texteSimple += mc.texteSimple + else : + self.texteComplexeVenantDesFils += mc.texteComplexe + for e in listePourUnion : + texteSimpleUnion += '\t'+e.texteSimple + texteSimpleUnion += finUnion + texteSimpleUnion+=fermeSimpleType + self.texteSimple += texteSimpleUnion + # ---------------------------------------- @@ -562,6 +602,7 @@ class X_BLOC (X_definitionComposee): def compare(self,autreMC): if self.label != autreMC.label : return False + if self.inUnion == True or autre.inUnion == True : return False if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML : return True for attr in ( 'condition', 'regles', ): val1=getattr(self,attr) @@ -585,9 +626,11 @@ class X_BLOC (X_definitionComposee): #-------------------------------- class X_SIMP (X_definition): #-------------------------------- - def dumpXsd(self, dansFactorisation=False): + def dumpXsd(self, dansFactorisation=False, multiple = False, first=False): + print ('_______________' , '*******************', 'je passe la dans dumpXsd SIMP', self.nom, multiple, first) if PourTraduction : print (self.nom) self.prepareDumpXSD() + if multiple : self.inUnion=True #if self.nom == 'Fichier' : import traceback; traceback.print_stack() #print ('exploreObjet SIMP') self.getNomDuCodeDumpe() @@ -599,7 +642,13 @@ class X_SIMP (X_definition): # --> homonymie on peut utiliser genealogie ? self.nomDuTypeDeBase = self.traduitType() - self.nomDuTypePyxb = self.definitNomDuTypePyxb() + if not multiple : + self.nomDuTypePyxb = self.definitNomDuTypePyxb() + self.aCreer = True + elif first : + self.nomDuTypePyxb = self.definitNomDuTypePyxb(forceACreer=1) + self.aCreer = True + # on se sert des listes ou non pour la gestion des minOccurs /maxOccurs est > 0 if self.statut =='f' : minOccurs = 0 @@ -609,23 +658,28 @@ class X_SIMP (X_definition): # regles Accas if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML else : nomUtil = self.nom - 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(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) - else : - if str(self.defaut) == 'True' : txtDefaut = 'true' - else : txtDefaut = str(self.defaut) - self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) - - else : self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1) + if not multiple : + # pas d elt si on est dans 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(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) + else : + if str(self.defaut) == 'True' : txtDefaut = 'true' + else : txtDefaut = str(self.defaut) + self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) + else : self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1) + elif first: + # sauf si on est le '1er' dans un element ambigu + self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,1,1) # self.aCreer est mis a jour ds definitNomDuTypePyxb if not self.aCreer : return - self.texteSimple += debutSimpleType.format(self.nomDuTypePyxb) + 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 @@ -659,6 +713,7 @@ class X_SIMP (X_definition): def prepareDumpXSD(self): + self.inUnion=False if self.statut == 'f' : self.arbrePossibles = (self.nom,[]) else : @@ -717,6 +772,7 @@ class X_SIMP (X_definition): def compare(self,autreMC): if self.label != autreMC.label : return False + if self.inUnion == True or autreMC.inUnion == True : return False listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ] if self.intoXML != None : listeAComparer.append('intoXML') else : listeAComparer.append('into') diff --git a/Efi2Xsd/balisesXSD.py b/Efi2Xsd/balisesXSD.py index 346ae227..28efab6d 100644 --- a/Efi2Xsd/balisesXSD.py +++ b/Efi2Xsd/balisesXSD.py @@ -6,6 +6,7 @@ texteDebutCataSpecifique='\n