Bug 519943 - [SysML 1.4] Add constraint to check missing
NestedConnectorEnd

 - add NestedConnectorEndMissingConstraintModelConstraint rule
 - add description in categories 

Change-Id: I73abd50f04df39f23faaf3463868103d173a1917
Signed-off-by: Benoit Maggi <benoit.maggi@cea.fr>
diff --git a/core/org.eclipse.papyrus.sysml14.validation/META-INF/MANIFEST.MF b/core/org.eclipse.papyrus.sysml14.validation/META-INF/MANIFEST.MF
index af43da7..9db861f 100644
--- a/core/org.eclipse.papyrus.sysml14.validation/META-INF/MANIFEST.MF
+++ b/core/org.eclipse.papyrus.sysml14.validation/META-INF/MANIFEST.MF
@@ -26,6 +26,7 @@
  org.eclipse.papyrus.sysml14.validation.rules.allocations,
  org.eclipse.papyrus.sysml14.validation.rules.blocks,
  org.eclipse.papyrus.sysml14.validation.rules.modelelements,
+ org.eclipse.papyrus.sysml14.validation.rules.nonnormative,
  org.eclipse.papyrus.sysml14.validation.rules.portsandflows,
  org.eclipse.papyrus.sysml14.validation.rules.requirements,
  org.eclipse.papyrus.sysml14.validation.selectors
diff --git a/core/org.eclipse.papyrus.sysml14.validation/plugin.properties b/core/org.eclipse.papyrus.sysml14.validation/plugin.properties
index f1c5912..f340c3b 100644
--- a/core/org.eclipse.papyrus.sysml14.validation/plugin.properties
+++ b/core/org.eclipse.papyrus.sysml14.validation/plugin.properties
@@ -18,6 +18,10 @@
 inv_RequirementText=Requirement is missing a text
 ocl_RequirementText=text <> ''
 # FIXME : there seems to be no constraint in the norm for Requirement id and text
+
+inv_NestedConnectorEndMissing=NestedConnectorEnd stereotype should be applied to the <Connector end> {0}.
+
+
 ##### End Non normative #####
 
 #7.3.2.1 Conform
diff --git a/core/org.eclipse.papyrus.sysml14.validation/plugin.xml b/core/org.eclipse.papyrus.sysml14.validation/plugin.xml
index 60d42e9..0a113d5 100644
--- a/core/org.eclipse.papyrus.sysml14.validation/plugin.xml
+++ b/core/org.eclipse.papyrus.sysml14.validation/plugin.xml
@@ -2,8 +2,12 @@
 <?eclipse version="3.4"?>
 <plugin>
   <extension name="org.eclipse.papyrus.sysml14.validation.constraintProviders" point="org.eclipse.emf.validation.constraintProviders">
-     <category id="org.eclipse.papyrus.sysml14.validation.category.normative" mandatory="false" name="SysML 1.4 normative constraints"/>
-     <category id="org.eclipse.papyrus.sysml14.validation.category.optional" mandatory="false" name="SysML 1.4 optional constraints"/>
+     <category id="org.eclipse.papyrus.sysml14.validation.category.normative" mandatory="false" name="SysML 1.4 normative constraints">
+     	Constraints listed in SysML 1.4 norm.
+     </category>
+     <category id="org.eclipse.papyrus.sysml14.validation.category.optional" mandatory="false" name="SysML 1.4 optional constraints">
+     	Constraints provided to help the modeler but not required by the norm.  
+     </category>
 
      <!-- Constraints on UML elements -->
 	 <constraintProvider cache="false" mode="Batch">
@@ -34,6 +38,16 @@
             </constraint>
 
          </constraints>
+         <constraints categories="org.eclipse.papyrus.sysml14.validation.category.optional">   
+            <constraint id="constraint.nestedConnectorEnd.missing" isEnabledByDefault="true" lang="Java" mode="Batch" severity="ERROR" statusCode="3" name="nestedConnectorEnd.missing"
+            class="org.eclipse.papyrus.sysml14.validation.rules.nonnormative.NestedConnectorEndMissingConstraintModelConstraint">
+               <message>%inv_NestedConnectorEndMissing</message>
+               <description>%inv_NestedConnectorEndMissing</description>
+            </constraint>
+         </constraints>         
+         
+         
+         
       </constraintProvider>
           
       <constraintProvider cache="false" mode="Batch">
@@ -581,6 +595,7 @@
          <constraint ref="org.eclipse.papyrus.sysml14.validation.constraint.block.associationBlock"/>
          <constraint ref="org.eclipse.papyrus.sysml14.validation.constraint.block.specialization"/>
          <constraint ref="org.eclipse.papyrus.sysml14.validation.constraint.block.propertynoname"/>
+         <constraint ref="org.eclipse.papyrus.sysml14.validation.constraint.nestedConnectorEnd.missing"/>
       </binding>  
        
       <!-- Requirement Context -->
diff --git a/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/rules/nonnormative/NestedConnectorEndMissingConstraintModelConstraint.java b/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/rules/nonnormative/NestedConnectorEndMissingConstraintModelConstraint.java
new file mode 100644
index 0000000..b29c254
--- /dev/null
+++ b/core/org.eclipse.papyrus.sysml14.validation/src/org/eclipse/papyrus/sysml14/validation/rules/nonnormative/NestedConnectorEndMissingConstraintModelConstraint.java
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ * Copyright (c) 2017 CEA LIST and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Benoit Maggi (CEA LIST) benoit.maggi@cea.fr - Initial API and implementation
+ *   
+ *****************************************************************************/
+package org.eclipse.papyrus.sysml14.validation.rules.nonnormative;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.validation.AbstractModelConstraint;
+import org.eclipse.emf.validation.IValidationContext;
+import org.eclipse.papyrus.sysml14.blocks.Block;
+import org.eclipse.papyrus.sysml14.blocks.NestedConnectorEnd;
+import org.eclipse.papyrus.sysml14.constraintblocks.ConstraintBlock;
+import org.eclipse.uml2.uml.ConnectableElement;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.ConnectorEnd;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ * 
+ */
+public class NestedConnectorEndMissingConstraintModelConstraint extends AbstractModelConstraint {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.
+	 * emf.validation.IValidationContext)
+	 */
+	@Override
+	public IStatus validate(IValidationContext context) {
+		EObject target = context.getTarget();
+		if (target instanceof ConnectorEnd) {
+			ConnectorEnd connectorEnd = (ConnectorEnd) target;
+			Element owner = connectorEnd.getOwner();
+			if (owner instanceof Connector) {
+				Connector connector = (Connector) owner;
+				ConnectableElement role = connectorEnd.getRole();
+				Element connectorOwner = connector.getOwner();
+				if (role != null && !role.getOwner().equals(connectorOwner)) {
+					if (UMLUtil.getStereotypeApplication(connectorOwner, Block.class) != null || UMLUtil.getStereotypeApplication(connectorOwner, ConstraintBlock.class) != null) {
+						if (UMLUtil.getStereotypeApplication(connectorEnd, NestedConnectorEnd.class) == null) {
+							return context.createFailureStatus(role.getName());
+						}
+					}
+				}
+			}
+		}
+		return context.createSuccessStatus();
+	}
+
+}