def getMissing(A, B): missing =[] nameMatch = {} metaMismatch=[] applyMismatch=[] for a in A: aName = a.getName() if isinstance(a, Property): aName = propertyCheck(a) elif isinstance(a, Stereotype) and StereotypesHelper.getBaseClassesAsClasses(a)[0] == Property: aGens = filter(lambda element: isinstance(element, Generalization), a.get_directedRelationshipOfSource()) if len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "ConstraintProperty"), aGens))!=0: if a.getName().find("constraint property")==-1: aName = a.getName() + " constraint property" elif len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "SharedProperty"), aGens))!=0: if a.getName().find("shared property")==-1: aName = a.getName() + " shared property" elif len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "DistributedProperty"), aGens))!=0: if a.getName().find("distributed property")==-1: aName = a.getName() + " distributed property" elif len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "FlowProperty"), aGens))!=0: if a.getName().find("flow property")==-1: aName = a.getName() + " flow property" elif len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "ValueProperty"), aGens))!=0: if a.getName().find("value property")==-1: aName = a.getName() + " value property" elif len(filter(lambda element: element.getGeneral() == StereotypesHelper.getStereotype(project, "ReferenceProperty"), aGens))!=0: if a.getName().find("reference property")==-1: aName = a.getName() + " reference property" else: if a.getName().find("part property")==-1: aName=a.getName() + " part property" elif isinstance(a, Stereotype) and StereotypesHelper.getBaseClassAsClasses(a)[0] == Port: if a.getName().find("port")==-1: aName = a.getName() + " port" bExist = 0 for b in B: if aName == b.getName(): nameMatch[a]=b bExist = 1 if b not in StereotypesHelper.getAllAssignedStereotypes([a]): noApply[a]=b if bExist == 0: missing.append(a) for n in nameMatch: ###get generalizations of stereotype stereotype = nameMatch[n] nGeneral = filter(lambda element: isinstance(element, Generalization), stereotype.get_directedRelationshipOfSource()) general = [] for g in nGeneral: general.append(g.getGeneral()) ###keep only SysML generalizations gSys = filter(lambda element: StereotypesHelper.getProfileForStereotype(element) == StereotypesHelper.getProfile(project, "SysML"), general) if gSys and not StereotypesHelper.checkForAllDerivedStereotypes(n, gSys[0]): applyMismatch.append(n) ###check if same if n.getName() != "_Unused Stereotypes": if not isinstance(n, StereotypesHelper.getClassOfMetaClass(StereotypesHelper.getBaseClasses(nameMatch[n])[0])): metaMismatch.append(n) return [missing, applyMismatch, metaMismatch]
def stereotypesForElements(modelPackage, validateOnly, elementType, stereotypesIgnore, packagesIgnore): if not stereotypesIgnore: stereotypesIgnore=[] profilePackage = profilePackCheck(modelPackage) if not profilePackage: return ['no Profile Package', 'no Profile Package', 'no Profile Package', 'no Profile Package'] infraPack = filter(lambda element: isinstance(element, Package) and "_"==element.getName(), profilePackage.getOwnedElement()) if len(infraPack)>0: infraPack = infraPack[0] else: return['no underscore pacakage, no underscore pacakage,no underscore pacakage,no underscore pacakage'] stereotypePackage=packageCheck(profilePackage, infraPack, validateOnly, "_Stereotypes") if not stereotypePackage: return ['no Stereotype Package', 'no Stereotype Package', 'no Stereotype Package', 'no Stereotype Package'] baseClass = getElements(getEverything(modelPackage), profilePackage) baseClass = filter(lambda element: "_" not in element.getName(), baseClass) if not isinstance(modelPackage, Profile): baseClass.append(modelPackage) ###intialize counts sterCreate = 0 nameChange = 0 unapply = 0 apply = 0 ### if elementType != 'Misc': baseClass = filter(lambda element: isinstance(element, elementType), baseClass) for s in stereotypesIgnore: baseClass = filter(lambda element: StereotypesHelper.hasStereotypeOrDerived(element, s) == False, baseClass) ignoredPackEls = [] for i in packagesIgnore: baseClass = filter(lambda element: element not in getEverything(i), baseClass) result = getMissing(baseClass, filter(lambda element: isinstance(element, NamedElement),stereotypePackage.getOwnedElement())) bNoSter = result[0] bWrongSter = result[1] bWrongMeta = result[2] applySter = [] for n in noApply: if n not in bWrongSter and n not in bWrongMeta and n in baseClass: applySter.append(n) if validateOnly!=True: ('[FIXING]:' + str(elementType)) successful = [] bWS = [] bWM=[] noFix=[] for b in bNoSter: bStillMissing = getMissing([b], filter(lambda element: isinstance(element, NamedElement), stereotypePackage.getOwnedElement())) bWS = bStillMissing[1] bWM = bStillMissing[2] if bStillMissing[0]: ###check if any local stereotype is applied bLocalSter = filter(lambda element: element.getOwner() == stereotypePackage, StereotypesHelper.getStereotypes(b)) if len(bLocalSter)>0: for bL in bLocalSter: localSterApply = filter(lambda element: bL in StereotypesHelper.getStereotypes(element), getElements(getEverything(profilePackage), profilePackage)) if len(localSterApply)==1: ###if local stereotype is applied to only this element in the base class then change the name of stereotype. Otherwise create new ster and unapply this one. bL.setName(propertyCheck(b)) gl.log('[FIX]:Stereotype name was changed to match applied element name: ' + b.getQualifiedName()) nameChange+=1 elif filter(lambda element: propertyCheck(element) == bL.getName(), getElements(getEverything(profilePackage), profilePackage)): createStereotype(stereotypePackage, b, stereotypePackage) unapplyStereotypes([b]) gl.log('[FIX]:Stereotype Created ' +b.getName()) gl.log('\t\t Location = ' + b.getQualifiedName()) sterCreate+=1 else: ###get sysml extension, unapply stereotype and apply sysml extension bLgeneralizations = getGeneralizationTree(bL) bLSysGen = filter(lambda element: StereotypesHelper.getProfileForStereotype(element) == StereotypesHelper.getProfile(project, "SysML") or StereotypesHelper.getProfileForStereotype(element) == StereotypesHelper.getProfile(project, "additional_stereotypes"), bLgeneralizations) unapplyStereotypes([b]) if bLSysGen: StereotypesHelper.addStereotype(b, bLSysGen[0]) gl.log('[FIX]:Stereotype applied to multiple elements, none with matching name. Unapplied stereotype:' + bL.getName()) unapply+=1 createStereotype(stereotypePackage, b, stereotypePackage) unapplyStereotypes([b]) gl.log('[FIX]:Stereotype Created ' +b.getName()) gl.log('\t\t Location = ' + b.getQualifiedName()) sterCreate+=1 else: createStereotype(stereotypePackage, b, stereotypePackage) unapplyStereotypes([b]) gl.log('[FIX]:Stereotype Created ' +b.getName()) gl.log('\t\t Location = ' + b.getQualifiedName()) sterCreate+=1 for b in bWS: if not isinstance(b, Interface) and StereotypesHelper.getBaseClassAsClasses(b)[0] == Port: if b.getName().find("part property")==0: bPort = filter(lambda element: element.getName() == b.getName() + " port", filter(lambda element: isinstance(element, NamedElement), stereotypePackage.getOwnedElement())) if len(bPort)!=0: bApplied = filter(lambda element: StereotypesHelper.isElementStereotypedBy(element, b.getName())==True, baseClass) for f in bApplied: StereotypesHelper.removeStereotypes(f, [b]) StereotypesHelper.addStereotype(f, bPort) ###Apply applicable stereotypes for b in noApply: if b not in bWrongSter and b not in bWrongMeta and b not in bWS and b not in bWM and b in baseClass: if StereotypesHelper.getBaseClasses(noApply[b])[0].getName() != 'Element': StereotypesHelper.addStereotype(b, noApply[b]) unapplyStereotypes([b]) gl.log('[FIX]: Stereotype Applied ' + b.getName()) gl.log('\t\t Location = '+b.getQualifiedName()) apply+=1 if len(bWrongSter)>0: gl.log('[UNFIXABLE]: Inheritance Mismatch (see validation log for details)') for b in bWrongMeta: gl.log('[UNFIXABLE]: Metaclass Mismatch: '+ b.getQualifiedName()) # if elementType == Classifier and validateOnly!=True: localGeneralizations(modelPackage, validateOnly, True) ###Messages Log if apply!=0 or sterCreate!=0 or nameChange !=0 or unapply!=0: gl.log('[FIX SUMMARY]:') gl.log(str(apply) + " existing stereotype(s) applied") gl.log(str(sterCreate) + " stereotypes created") gl.log(str(nameChange) + " stereotype names changed") gl.log(str(unapply) + " stereotypes unapplied") else: gl.log('No Fixes Needed') if len(bWrongSter)!=0 or bWrongMeta!=0: gl.log('[UNFIXABLE SUMMARY]:') if len(bWrongSter)>0: gl.log(str(len(bWrongSter))+ " stereotype inheritance mismatch") if len(bWrongMeta)>0: gl.log(str(len(bWrongMeta))+ " stereotype metaclasses and element types not matching") else: gl.log('No modeler fixes needed') ################ return [bNoSter, bWrongSter, bWrongMeta, applySter] else: baseClass = filter(lambda element: not isinstance(element, Class), baseClass) baseClass = filter(lambda element: not isinstance(element, Package), baseClass) baseClass = filter(lambda element: not isinstance(element, Property), baseClass) baseClass = filter(lambda element: not isinstance(element, Operation), baseClass) baseClass = filter(lambda element: not isinstance(element, Diagram), baseClass) baseClass = filter(lambda element: not isinstance(element, Dependency), baseClass) for s in stereotypesIgnore: baseClass = filter(lambda element: StereotypesHelper.hasStereotypeOrDerived(element, s) == False, baseClass) ignoredPackEls = [] for i in packagesIgnore: baseClass = filter(lambda element: element not in getEverything(i), baseClass) resultMisc = getMissing(baseClass, stereotypePackage.getOwnedElement()) mNoSter = resultMisc[0] mWrongSter = resultMisc[1] mWrongMeta = resultMisc[2] applySter = [] for n in noApply: if n not in mWrongSter and n not in mWrongMeta and n in baseClass: applySter.append(n) if validateOnly!=True: gl.log('[FIX]:' + str(elementType)) successful = [] for b in mNoSter: mStillMissing = getMissing([b], stereotypePackage.getOwnedElement()) if mStillMissing[0]: createStereotype(stereotypePackage, b, stereotypePackage) unapplyStereotypes([b]) gl.log('\t Stereotype Created ' +b.getName()) gl.log('\t\t Location = ' + b.getQualifiedName()) for b in noApply: if b not in mWrongSter and b not in mWrongMeta and n in baseClass: StereotypesHelper.addStereotype(b, noApply[b]) unapplyStereotypes([b]) gl.log('\t Stereotype Applied ' + b.getName()) gl.log('\t\t Location = '+b.getQualifiedName()) if len(mWrongSter)>0: gl.log('UNFIXABLE: Inheritance Mismatch (see validation log for details)') if len(mWrongMeta)>0: gl.log('UNFIXABLE: Metaclass Mismatch (see validation log for details)') return [mNoSter, mWrongSter, mWrongMeta, applySter]