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(); + } + +}