Exemplo n.º 1
0
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]
Exemplo n.º 2
0
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]