def toXML(self, package, filters, ignore): lines=[] lines.extend(self.beginPackage(package.name)) if len(package.elements)>0: lines.append(self.indent("<ELEMENTS>",1)) for elem in package.elements: elemRef = elem.ref ignoreElem=True if (isinstance(ignore, collections.abc.Iterable) and elemRef in ignore) else False #if SWC was ignored by user, also ignore its InternalBehavior and SwcImplementation elements in case they are in the same package if not ignoreElem and isinstance(elem, autosar.behavior.InternalBehavior): if (isinstance(ignore, collections.abc.Iterable) and elem.componentRef in ignore): ignoreElem = True if not ignoreElem and isinstance(elem, autosar.component.SwcImplementation): behavior = package.rootWS().find(elem.behaviorRef) if behavior is not None: if (isinstance(ignore, collections.abc.Iterable) and behavior.componentRef in ignore): ignoreElem = True if not ignoreElem and applyFilter(elemRef, filters): elementName = elem.__class__.__name__ elementWriter = self.xmlSwitcher.get(elementName) if elementWriter is not None: result = elementWriter.writeElementXML(elem) if result is None: print("[PackageWriter] No return value: %s"%elementName) continue else: lines.extend(self.indent(result,2)) else: print("[PackageWriter] Unhandled: %s"%elementName) lines.append(self.indent("</ELEMENTS>",1)) else: if self.version<4.0: lines.append(self.indent("<ELEMENTS/>",1)) if len(package.subPackages)>0: numPackets = 0 if self.version >= 3.0 and self.version < 4.0: for subPackage in package.subPackages: if applyFilter(subPackage.ref, filters): if numPackets == 0: lines.append(self.indent("<SUB-PACKAGES>",1)) lines.extend(self.indent(self.toXML(subPackage, filters, ignore),2)) numPackets += 1 if numPackets > 0: lines.append(self.indent("</SUB-PACKAGES>",1)) elif self.version >= 4.0: for subPackage in package.subPackages: if applyFilter(subPackage.ref, filters): if numPackets == 0: lines.append(self.indent("<AR-PACKAGES>",1)) lines.extend(self.indent(self.toXML(subPackage, filters, ignore),2)) numPackets += 1 if numPackets > 0: lines.append(self.indent("</AR-PACKAGES>",1)) lines.extend(self.endPackage()) return lines
def toCode(self, package, filters, ignore, localvars, isTemplate): lines = [] if not isTemplate: if package.role is not None: lines.append('package=ws.createPackage("%s", role="%s")' % (package.name, package.role)) else: lines.append('package=ws.createPackage("%s")' % (package.name)) localvars['package'] = package for subPackage in package.subPackages: if subPackage.role is not None: lines.append('package.createSubPackage("%s", role="%s")' % (subPackage.name, subPackage.role)) else: lines.append('package.createSubPackage("%s")' % (subPackage.name)) for elem in package.elements: elemRef = elem.ref ignoreElem = True if (isinstance(ignore, str) and ignore == elemRef) or ( isinstance(ignore, collections.Iterable) and elemRef in ignore) else False #if SWC was ignored by user, also ignore its InternalBehavior and SwcImplementation elements in case they are in the same package if not ignoreElem and isinstance( elem, autosar.behavior.InternalBehavior): if (isinstance(ignore, str) and ignore == elem.componentRef ) or (isinstance(ignore, collections.Iterable) and elem.componentRef in ignore): ignoreElem = True if not ignoreElem and isinstance( elem, autosar.component.SwcImplementation): behavior = package.rootWS().find(elem.behaviorRef) if behavior is not None: if (isinstance(ignore, str) and ignore == behavior.componentRef) or ( isinstance(ignore, collections.Iterable) and behavior.componentRef in ignore): ignoreElem = True if not ignoreElem and applyFilter(elemRef, filters): elementName = elem.__class__.__name__ elementWriter = self.codeSwitcher.get(elementName) if elementWriter is not None: result = elementWriter.writeElementCode(elem, localvars) if result is None: print("[PackageWriter] No return value: %s" % elementName) continue else: lines.extend(result) else: print("[PackageWriter] Unhandled: %s" % elementName) else: pass return lines
def toXML(self, ws, filters, ignore): lines=self.beginFile() result='\n'.join(lines)+'\n' for package in ws.packages: if applyFilter(package.ref, filters): lines=self.packageWriter.toXML(package, filters, ignore) if len(lines)>0: lines=self.indent(lines,2) result+='\n'.join(lines)+'\n' lines=self.endFile() return result+'\n'.join(lines)+'\n'
def toCode(self, ws, filters=None, ignore=None, head=None, tail=None, isModule=False, isTemplate=False, indent=3): localvars = collections.OrderedDict() localvars['ws'] = ws indentStr = indent * ' ' if isModule == False: #head if head is None: lines = ['import autosar'] if not isTemplate: lines.append('ws=autosar.workspace()') result = '\n'.join(lines) + '\n\n' else: if isinstance(head, list): head = '\n'.join(head) assert (isinstance(head, str)) result = head + '\n\n' #body for package in ws.packages: if applyFilter(package.ref, filters): lines = self.packageWriter.toCode(package, filters, ignore, localvars, isTemplate) if len(lines) > 0: result += '\n'.join(lines) + '\n' #tail if not isTemplate: if tail is None: result += '\n' + 'print(ws.toXML())\n' else: if isinstance(tail, list): tail = '\n'.join(tail) assert (isinstance(tail, str)) result += '\n' + tail return result else: if head is None: head = [['import autosar'], ['ws = autosar.workspace()']] if len(head) != 2: raise ValueError( 'when module=True then head must have exactly two elements (list of lists)' ) if isinstance(head[0], collections.Iterable): head[0] = '\n'.join(head[0]) assert (isinstance(head[0], str)) result = head[0] + '\n\n' #body result += 'def apply(ws):\n' for package in ws.packages: if applyFilter(package.ref, filters): lines = self.packageWriter.toCode(package, filters, ignore, localvars, isTemplate) if len(lines) > 0: lines = [indentStr + x for x in lines] result += '\n'.join(lines) + '\n' #tail result += "\nif __name__=='__main__':\n" if isinstance(head[1], collections.Iterable): head[1] = '\n'.join([indentStr + x for x in head[1]]) else: head[1] = '\n'.join( [indentStr + x for x in head[1].split('\n')]) assert (isinstance(head[1], str)) result += head[1] + '\n' result += indentStr + 'apply(ws)\n' if not isTemplate: if tail is None: result += indentStr + 'print(ws.toXML())\n' else: if isinstance(tail, list): tail = '\n'.join([indentStr + x for x in tail]) else: tail = '\n'.join( [indentStr + x for x in tail.split('\n')]) assert (isinstance(tail, str)) result += tail + '\n' return result
def toCode(self, ws, filters=None, ignore=None, head=None, tail=None, module=False, indent=3): localvars = collections.OrderedDict() localvars['ws']=ws indentStr=indent*' ' if module == False: #head if head is None: lines=['import autosar', 'ws=autosar.workspace()'] result='\n'.join(lines)+'\n\n' else: if isinstance(head,list): head = '\n'.join(head) assert(isinstance(head,str)) result = head+'\n\n' #body for package in ws.packages: if applyFilter(package.ref, filters): lines=self.packageWriter.toCode(package, filters, ignore, localvars) if len(lines)>0: result+='\n'.join(lines)+'\n' #tail if tail is None: result+='\n'+'print(ws.toXML())\n' else: if isinstance(tail,list): tail = '\n'.join(tail) assert(isinstance(tail,str)) result+='\n'+tail return result else: if head is None: head=[ ['import autosar'], ['ws = autosar.workspace()'] ] if len(head)!=2: raise ValueError('when module=True then head must have exactly two elements (list of lists)') if isinstance(head[0], collections.Iterable): head[0] = '\n'.join(head[0]) assert(isinstance(head[0],str)) result = head[0]+'\n\n' #body result+='def apply(ws):\n' for package in ws.packages: if applyFilter(package.ref, filters): lines=self.packageWriter.toCode(package, filters, ignore, localvars) if len(lines)>0: lines=[indentStr+x for x in lines] result+='\n'.join(lines)+'\n' #tail result+="\nif __name__=='__main__':\n" if isinstance(head[1], collections.Iterable): head[1] = '\n'.join([indentStr+x for x in head[1]]) else: head[1] = '\n'.join([indentStr+x for x in head[1].split('\n')]) assert(isinstance(head[1],str)) result+=head[1]+'\n' result+=indentStr+'apply(ws)\n' if tail is None: result+=indentStr+'print(ws.toXML())\n' else: if isinstance(tail,list): tail = '\n'.join([indentStr+x for x in tail]) else: tail = '\n'.join([indentStr+x for x in tail.split('\n')]) assert(isinstance(tail,str)) result+=tail+'\n' return result