import types
import Accas
import imp
-from copy import deepcopy
+from copy import deepcopy, copy
+import traceback
# CONTEXT est accessible (__init__.py de Noyau)
return texteNom
- def definitNomDuTypePyxb(self):
+ def definitNomDuTypePyxb(self,forceACreer=False):
self.aCreer = True
cata = CONTEXT.getCurrentCata()
nom='T_'+self.nom
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
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 :
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
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
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
+
# ----------------------------------------
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)
#--------------------------------
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()
# --> 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
# 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
def prepareDumpXSD(self):
+ self.inUnion=False
if self.statut == 'f' :
self.arbrePossibles = (self.nom,[])
else :
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')