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;
 				}