Bug 534852 - [SysML 1.4] Quick fix for part missing association
- add quick fixes:
- create missing association for a part
- create missing view operation in viewpoint
- remove Requirements used as type
- remove type using Requirement
Change-Id: Id1a54b07e9c9ce95f505ed18515f0ab7f040ed17
Signed-off-by: Benoit Maggi <benoit.maggi@cea.fr>
diff --git a/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/quickfix/SysMLMarkerResolutionGenerator.java b/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/quickfix/SysMLMarkerResolutionGenerator.java
index af34c41..92ea817 100644
--- a/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/quickfix/SysMLMarkerResolutionGenerator.java
+++ b/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/quickfix/SysMLMarkerResolutionGenerator.java
@@ -13,16 +13,24 @@
package org.eclipse.papyrus.sysml14.validation.quickfix;
import java.util.Optional;
+import java.util.Set;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator;
+import org.eclipse.uml2.uml.AggregationKind;
+import org.eclipse.uml2.uml.Association;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Parameter;
import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.UMLFactory;
+import org.eclipse.uml2.uml.UMLPackage;
/**
* Provide the list of specific solutions for problems related to SysML 1.4
@@ -43,31 +51,47 @@
case "org.eclipse.papyrus.sysml14.validation.constraint.requirement.emptyownedattribute":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Element>("Remove all attributes from Requirement", element -> element.getOwnedElements().forEach(Element::destroy)),
- };
- case "org.eclipse.papyrus.sysml14.validation.constraint.verify.supplier":
+ }; case "org.eclipse.papyrus.sysml14.validation.constraint.verify.supplier":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Element>("Delete element", Element::destroy),
};
case "org.eclipse.papyrus.sysml14.validation.constraint.rate.parameterisstream":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Parameter>("Set stream to true", parameter -> parameter.setIsStream(true)),
- };
+ };
case "org.eclipse.papyrus.sysml14.validation.constraint.block.specialization":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Element>("Apply Block stereotype", element -> element.applyStereotype(element.getApplicableStereotype("SysML::Blocks::Block"))),
- };
+ };
case "org.eclipse.papyrus.sysml14.validation.constraint.propertyspecifictype.missingname":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Classifier>("Empty classifier name", classifier -> classifier.setName(null)),
- };
+ };
case "org.eclipse.papyrus.sysml14.validation.constraint.requirement.nogeneralization":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Class>("Destroy the generalisation", clazz -> clazz.getGeneralizations().forEach(Element::destroy)),
- };
+ };
case "org.eclipse.papyrus.sysml14.validation.constraint.connectorproperty.onlyonblock":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Property>("Apply Block stereotype on owner", property -> property.getOwner().applyStereotype(property.getOwner().getApplicableStereotype("SysML::Blocks::Block"))),
- };
+ };
+
+ case "org.eclipse.papyrus.sysml14.validation.constraint.requirement.notype":
+ return new IMarkerResolution[] {
+ new ConsumerElementMarkerResolution<org.eclipse.uml2.uml.Class>("Remove type",
+ clazz ->{
+ CrossReferenceAdapter crossReferenceAdapter = CrossReferenceAdapter.getCrossReferenceAdapter(TransactionUtil.getEditingDomain(clazz).getResourceSet());
+ Set inverseReferencers = crossReferenceAdapter.getInverseReferencers(clazz, UMLPackage.eINSTANCE.getTypedElement_Type(), null);
+ if (inverseReferencers != null && !inverseReferencers.isEmpty()) {
+ for (Object object : inverseReferencers) {
+ if (object instanceof Property) {
+ ((Property) object).setType(null);
+ }
+ }
+ }
+ }),
+ new ConsumerElementMarkerResolution<org.eclipse.uml2.uml.Class>("Unapply stereotype Requirement", clazz -> clazz.unapplyStereotype(clazz.getAppliedStereotype("SysML::Requirements::Requirement"))),
+ };
case "org.eclipse.papyrus.sysml14.validation.constraint.distributedproperty.typedby":
return new IMarkerResolution[] {
new ConsumerElementMarkerResolution<Property>("Apply Block stereotype on owner",
@@ -75,7 +99,29 @@
new ConsumerElementMarkerResolution<Property>("Apply ValueType stereotype on owner",
property -> Optional.ofNullable(property.getOwner().getApplicableStereotype("SysML::Blocks::ValueType")).ifPresent(applicableStereotype -> property.getOwner().applyStereotype(applicableStereotype))),
};
+ case "org.eclipse.papyrus.sysml14.validation.constraint.viewpoint.ownedview":
+ return new IMarkerResolution[] {
+ new ConsumerElementMarkerResolution<org.eclipse.uml2.uml.Class>("Create View operation", clazz ->{
+ Operation operation = clazz.createOwnedOperation("View", null, null);
+ operation.applyStereotype(operation.getApplicableStereotype("StandardProfile::Create")) ;
+ }),
+ };
+ case "org.eclipse.papyrus.sysml14.validation.constraint.block.property.asssociationend":
+ return new IMarkerResolution[] {
+ new ConsumerElementMarkerResolution<Property>("Create association for Property",
+ property ->{
+ Association association = UMLFactory.eINSTANCE.createAssociation();
+ association.setPackage(property.getNearestPackage());
+ association.getMemberEnds().add(property);
+ Property targetProperty = UMLFactory.eINSTANCE.createProperty();
+ targetProperty.setType(property.getClass_());
+ association.getOwnedEnds().add(targetProperty);
+ association.getMemberEnds().add(targetProperty);
+ property.setAggregation(AggregationKind.COMPOSITE_LITERAL);
+ }),
+ };
default:
+ //TODO: when most quick fixes are done set a logger
// mk.getAttributes().forEach((k, v) -> System.out.println("(" + k + " , " + v + ")"));
break;
}