From: zworkb <svn...@pl...> - 2005-05-31 01:17:40
|
Author: zworkb Date: Mon May 30 21:10:09 2005 New Revision: 4336 Modified: ArchGenXML/trunk/ArchetypesGenerator.py ArchGenXML/trunk/XMIParser.py ArchGenXML/trunk/templates/field.py Log: compound field support Modified: ArchGenXML/trunk/ArchetypesGenerator.py ============================================================================== --- ArchGenXML/trunk/ArchetypesGenerator.py (original) +++ ArchGenXML/trunk/ArchetypesGenerator.py Mon May 30 21:10:09 2005 @@ -137,6 +137,7 @@ method_preservation=1 #should the method bodies be preserved? defaults now to 0 will change to 1 i18n_content_support=0 i18n_at=['i18n-archetypes','i18n', 'i18n-at'] + generate_datatypes=['field','compound_field'] build_msgcatalog=1 @@ -998,9 +999,10 @@ return res # Generate get/set/add member functions. - def generateArcheSchema(self, outfile, element, base_schema): + def generateArcheSchema(self, element, base_schema): """ generates the Schema """ # first copy fields from other schemas if neccessary. + outfile=StringIO() startmarker=True for attr in element.getAttributeDefs(): if str(attr.type)=='copy': @@ -1081,6 +1083,8 @@ print >> outfile, 'marshall='+marshaller print >> outfile,')\n' + + return outfile.getvalue() def generateMethods(self, outfile, element, mode='class'): print >> outfile @@ -1280,11 +1284,16 @@ parent=element.getGenParents()[0] parentname=parent.getCleanName() else: - parent=None - parentname='ObjectField' + if element.getAttributeDefs(): + parent=None + parentname='CompoundField' + else: + parent=None + parentname='ObjectField' - if element.getClientDependencyClasses(): - widget=element.getClientDependencyClasses()[0] + widgets=element.getClientDependencyClasses(targetStereotypes=['widget']) + if widgets: + widget=widgets[0] widgetname=widget.getCleanName() else: widget=None @@ -1479,7 +1488,7 @@ self.generateProtectedSection(outfile,element,'module-header') # here comes the schema - self.generateArcheSchema(outfile,element,baseschema) + print >> outfile, self.generateArcheSchema(element,baseschema) # protected section self.generateProtectedSection(outfile,element,'after-schema') @@ -2064,6 +2073,10 @@ if element.isInternal() or element.getName() in self.hide_classes \ or element.getName().lower().startswith('java::'): # Enterprise Architect fix! print indent('Ignore unnecessary class: '+element.getName(),self.infoind) + if element.getName() == 'XPointField': + print 'hide_classes:',self.hide_classes + import pdb;pdb.set_trace() + continue if element.hasStereoType(self.stub_stereotypes): print indent('Ignore stub class: '+element.getName(),self.infoind) @@ -2404,14 +2417,19 @@ if not self.noclass: if suff.lower() in ('.xmi','.xml'): print 'opening xmi' - self.root=root=XMIParser.parse(self.xschemaFileName,packages=self.parse_packages,generator=self) + self.root=root=XMIParser.parse(self.xschemaFileName, + packages=self.parse_packages,generator=self, + generate_datatypes=self.generate_datatypes) + elif suff.lower() in ('.zargo','.zuml','.zip'): print 'opening zargo' zf=ZipFile(self.xschemaFileName) xmis=[n for n in zf.namelist() if os.path.splitext(n)[1].lower()in ['.xmi','.xml']] assert(len(xmis)==1) buf=zf.read(xmis[0]) - self.root=root=XMIParser.parse(xschema=buf,packages=self.parse_packages, generator=self) + self.root=root=XMIParser.parse(xschema=buf, + packages=self.parse_packages, generator=self, + generate_datatypes=self.generate_datatypes) elif suff.lower() == '.xsd': self.root=root=XSDParser.parse(self.xschemaFileName) else: Modified: ArchGenXML/trunk/XMIParser.py ============================================================================== --- ArchGenXML/trunk/XMIParser.py (original) +++ ArchGenXML/trunk/XMIParser.py Mon May 30 21:10:09 2005 @@ -138,6 +138,11 @@ aggregates = ['composite', 'aggregate'] +# generate_datatypes=['field','compound_field'] + + def __init__(self,**kw): + self.__dict__.update(kw) + def getName(self, domElement): try: return str(getAttributeValue(domElement, self.NAME)).strip() @@ -553,7 +558,6 @@ else: mult_max = -1 - #import pdb;pdb.set_trace() return (mult_min, mult_max) def getTaggedValue(self, el): @@ -618,7 +622,6 @@ #print 'attribute:'+self.getName(), typeid, self.type -XMI = XMI1_0() class NoObject: pass @@ -1003,7 +1006,7 @@ def addClientDependency(self, dep): self.clientDependencies.append(dep) - def getClientDependencies(self, includeParents=False): + def getClientDependencies(self, includeParents=False, dependencyStereotypes=None): res = self.clientDependencies if includeParents: @@ -1013,11 +1016,23 @@ res.reverse() + if dependencyStereotypes: + res=[r for r in res if r.hasStereoType(dependencyStereotypes)] + return res - def getClientDependencyClasses(self, includeParents=False): - return [dep.getSupplier() for dep in self.getClientDependencies(includeParents=includeParents) if + def getClientDependencyClasses(self, includeParents=False, + dependencyStereotypes=None, targetStereotypes=None): + + res=[dep.getSupplier() for dep in self.getClientDependencies( + includeParents=includeParents, dependencyStereotypes=dependencyStereotypes) if dep.getSupplier() and dep.getSupplier().__class__.__name__ in ('XMIClass', 'XMIInterface')] + + if targetStereotypes: + res=[r for r in res if r.hasStereoType(targetStereotypes)] + + + return res class StateMachineContainer: def __init__(self): @@ -2394,7 +2409,7 @@ #pure datatype classes should not be generated! #print 'datatypenames:', datatypenames for c in res.getClasses(recursive=1): - if c.getName() in datatypenames: + if c.getName() in datatypenames and not c.hasStereoType(XMI.generate_datatypes): c.internalOnly = 1 print 'internal class (not generated):', c.getName() @@ -2406,10 +2421,9 @@ return res -def parse(xschemaFileName=None, xschema=None, packages=[], generator=None): +def parse(xschemaFileName=None, xschema=None, packages=[], generator=None,**kw): """ """ global XMI - if xschemaFileName: doc = minidom.parse(xschemaFileName) else: @@ -2421,10 +2435,13 @@ print 'XMI version:', xmiver if xmiver >= "1.2": print 'using xmi 1.2+ parser' - XMI = XMI1_2() + XMI = XMI1_2(**kw) elif xmiver >= "1.1": print 'using xmi 1.1+ parser' - XMI = XMI1_1() + XMI = XMI1_1(**kw) + else: + print 'using xmi 1.1+ parser' + XMI = XMI1_0(**kw) except: print 'no version info found, taking XMI1_0' Modified: ArchGenXML/trunk/templates/field.py ============================================================================== --- ArchGenXML/trunk/templates/field.py (original) +++ ArchGenXML/trunk/templates/field.py Mon May 30 21:10:09 2005 @@ -9,30 +9,46 @@ from Products.Archetypes.utils import DisplayList from Products.Archetypes import config as atconfig from Products.Archetypes.Widget import * +from Products.Archetypes.Field import * +from Products.Archetypes.Schema import Schema from Products.generator import i18n -from Products.<dtml-var "klass.getPackage().getCleanName()"> import config +from Products.<dtml-var "klass.getPackage().getProduct().getCleanName()"> import config + <dtml-var "generator.getProtectedSection(parsed_class,'module-header')"> <dtml-var "generator.generateDependentImports(klass)"> -class <dtml-var "klass.getCleanName()">(<dtml-if "klass.getGenParents()"><dtml-var "','.join([p.getCleanName() for p in klass.getGenParents()])"><dtml-else>ObjectField</dtml-if>): + +<dtml-if "parentname=='CompoundField'"> +from Products.CompoundField.CompoundField import CompoundField +<dtml-var "generator.generateArcheSchema(klass,None)" > +</dtml-if> + +class <dtml-var "klass.getCleanName()">(<dtml-if "klass.getGenParents()"><dtml-var "','.join([p.getCleanName() for p in klass.getGenParents()])"><dtml-else><dtml-var parentname></dtml-if>): ''' <dtml-var "klass.getDocumentation()">''' <dtml-var "generator.getProtectedSection(parsed_class,'class-header',1)"> -<dtml-var "generator.generateImplements(klass,['ObjectField']+[p.getCleanName() for p in klass.getGenParents()])"> +<dtml-var "generator.generateImplements(klass,[parentname]+[p.getCleanName() for p in klass.getGenParents()])" > _properties = <dtml-var parentname>._properties.copy() _properties.update({ 'type': '<dtml-var "klass.getCleanName().lower()">', +<dtml-if "klass.getCleanName()=='CompoundField'"> 'widget':<dtml-var widgetname> +</dtml-if> }) security = ClassSecurityInfo() +<dtml-if "parentname=='CompoundField'"> + schema=schema +</dtml-if> + security.declarePrivate('set') security.declarePrivate('get') + -<dtml-if "not parsed_class"> +<dtml-if "not parsed_class and parentname != 'ObjectField'"> def get(self, instance, **kwargs): value = ObjectField.get(self, instance, **kwargs) return encode(value, instance, **kwargs) |