Bug 477828 - [Extra Plugin][Req] ID must be compute and adding by using
Service Type component

Change-Id: Ia388c461be15c8da54091db5b378757610d43f89
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirement.architecture/resources/papyrusreq.architecture b/plugins/sysml14/org.eclipse.papyrus.requirement.architecture/resources/papyrusreq.architecture
index b188429..dac4c3f 100644
--- a/plugins/sysml14/org.eclipse.papyrus.requirement.architecture/resources/papyrusreq.architecture
+++ b/plugins/sysml14/org.eclipse.papyrus.requirement.architecture/resources/papyrusreq.architecture
@@ -13,6 +13,7 @@
       <representationKinds xsi:type="nattablerepresentation:PapyrusTable" href="#_zDnG8JI1EeeIi5L9EZAlzw"/>
       <representationKinds xsi:type="nattablerepresentation:PapyrusTable" href="#_Cfnr8LP2EeeLo8Gu4FwO3w"/>
     </viewpoints>
+    <elementTypes href="platform:/plugin/org.eclipse.papyrus.requirements.sysml14.common/resource/Requirement.elementtypesconfigurations#org.eclipse.papyrus.requirements.sysml.common.elementTypeSet"/>
     <representationKinds xsi:type="nattablerepresentation:PapyrusTable" xmi:id="_WdWhUI85EeeoX5z29mN4Kg" id="SysMLSatisfactionRequirementMatrix" name="Satisfaction Requirement Matrix" description="This table is a matrix that shows if the element satisfies a requirement" icon="platform:/plugin/org.eclipse.papyrus.sysml14.nattable.requirement/icons/table_SysML_Requirement.png" concerns="_hhXXgIv7EeeNBcglvVZtOQ" implementationID="SysMLSatisfactionRequirementMatrix">
       <modelRules xmi:id="_-v9pgI85EeeoX5z29mN4Kg">
         <element href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/META-INF/MANIFEST.MF b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/META-INF/MANIFEST.MF
index 04e2018..47c2817 100644
--- a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/META-INF/MANIFEST.MF
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/META-INF/MANIFEST.MF
@@ -1,15 +1,23 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.papyrus.requirements.sysml14.common
+Bundle-SymbolicName: org.eclipse.papyrus.requirements.sysml14.common;singleton:=true
 Bundle-Version: 0.7.0.qualifier
 Bundle-Activator: org.eclipse.papyrus.requirements.sysml14.common.Activator
 Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.gmf.runtime.diagram.ui;bundle-version="1.8.0",
+Require-Bundle: org.eclipse.papyrus.uml.service.types;bundle-version="3.1.0",
+ org.eclipse.papyrus.sysml14;bundle-version="0.9.1",
+ org.eclipse.gmf.runtime.emf.type.core,
+ org.eclipse.papyrus.infra.types.core,
+ org.eclipse.papyrus.infra.services.edit,
+  org.eclipse.papyrus.uml.tools.utils,
+ org.eclipse.gmf.runtime.diagram.ui;bundle-version="1.8.0",
  org.eclipse.papyrus.infra.ui,
  org.eclipse.papyrus.requirements.sysml14.preferences,
- org.eclipse.papyrus.sysml14;bundle-version="0.9.1"
+ org.eclipse.papyrus.uml.types.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: bundle
-Export-Package: org.eclipse.papyrus.requirements.sysml14.common
+Export-Package: org.eclipse.papyrus.requirements.sysml.common.advices,
+ org.eclipse.papyrus.requirements.sysml.common.command,
+ org.eclipse.papyrus.requirements.sysml14.common
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/build.properties b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/build.properties
index 4279aa9..32b96f3 100644
--- a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/build.properties
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/build.properties
@@ -3,5 +3,7 @@
 bin.includes = .,\
                about.html,\
                bundle.properties,\
-               META-INF/
+               META-INF/,\
+               plugin.xml,\
+               resource/
 src.includes = about.html
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/plugin.xml b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/plugin.xml
new file mode 100644
index 0000000..9d95006
--- /dev/null
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/plugin.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.papyrus.infra.types.core.elementTypeSetConfiguration">
+      <elementTypeSet
+            clientContextID="org.eclipse.papyrus.infra.services.edit.TypeContext"
+            path="resource/Requirement.elementtypesconfigurations">
+      </elementTypeSet>
+   </extension>
+
+</plugin>
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/resource/Requirement.elementtypesconfigurations b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/resource/Requirement.elementtypesconfigurations
new file mode 100644
index 0000000..32ced0c
--- /dev/null
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/resource/Requirement.elementtypesconfigurations
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elementtypesconfigurations:ElementTypeSetConfiguration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:elementtypesconfigurations="http://www.eclipse.org/papyrus/infra/elementtypesconfigurations/1.2" xmi:id="org.eclipse.papyrus.requirements.sysml.common.elementTypeSet" identifier="org.eclipse.papyrus.requirements.sysml.common.elementTypesconfiguration" name="org.eclipse.papyrus.requirements.sysml.common.elementTypesconfiguration" metamodelNsURI="http://www.eclipse.org/uml2/5.0.0/UML">
+  <adviceBindingsConfigurations xsi:type="elementtypesconfigurations:AdviceBindingConfiguration" xmi:id="_iEqC8HeQEeesoqsNSRk13w" identifier="org.eclipse.papyrus.requirements.sysml.common.advices.RequirementEditHelperAdvice" editHelperAdviceClassName="org.eclipse.papyrus.requirements.sysml.common.advices.RequirementEditHelperAdvice">
+    <target xsi:type="elementtypesconfigurations:MetamodelTypeConfiguration" href="../../../plugin/org.eclipse.papyrus.uml.service.types/model/uml.elementtypesconfigurations#org.eclipse.papyrus.uml.Class"/>
+  </adviceBindingsConfigurations>
+</elementtypesconfigurations:ElementTypeSetConfiguration>
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/advices/RequirementEditHelperAdvice.java b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/advices/RequirementEditHelperAdvice.java
new file mode 100644
index 0000000..8d24a36
--- /dev/null
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/advices/RequirementEditHelperAdvice.java
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ * Copyright (c) 2018 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:
+ *   CEA LIST - Initial API and implementation
+ *   
+ *****************************************************************************/
+
+package org.eclipse.papyrus.requirements.sysml.common.advices;
+
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.papyrus.infra.emf.gmf.command.EMFtoGMFCommandWrapper;
+import org.eclipse.papyrus.requirements.sysml.common.command.SetRequirementIdCommand;
+import org.eclipse.papyrus.requirements.sysml14.common.Utils;
+import org.eclipse.papyrus.uml.types.core.requests.ApplyStereotypeRequest;
+import org.eclipse.uml2.uml.Stereotype;
+
+/**
+ * This advice has in charge to update the id of the requirement.
+ *
+ */
+public class RequirementEditHelperAdvice extends org.eclipse.papyrus.uml.types.core.edithelper.DefaultUMLEditHelperAdvice{// org.eclipse.papyrus.uml.types.core.edithelper.DefaultUMLEditHelperAdvice{//org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice{//
+
+		/**
+		 * @see org.eclipse.papyrus.uml.types.core.edithelper.DefaultUMLEditHelperAdvice#getAfterApplyStereotypeCommand(org.eclipse.papyrus.uml.types.core.requests.ApplyStereotypeRequest)
+		 *
+		 * @param req
+		 * @return
+		 */
+		@Override
+		protected ICommand getAfterApplyStereotypeCommand(ApplyStereotypeRequest req) {
+			 Stereotype appliedStereotype=req.getStereotype();
+			 if(Utils.isRequirementStereotype(appliedStereotype)) {
+		            return new EMFtoGMFCommandWrapper(new SetRequirementIdCommand(req.getEditingDomain(),  req.getUmlElement()));
+		        }
+		        return super.getAfterApplyStereotypeCommand(req);
+		}
+}
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/command/SetRequirementIdCommand.java b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/command/SetRequirementIdCommand.java
new file mode 100644
index 0000000..97b1b74
--- /dev/null
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml/common/command/SetRequirementIdCommand.java
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ *
+ * 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:
+ * 
+ * 		Mauricio Alferez (mauricio.alferez@cea.fr) CEA LIST - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.requirements.sysml.common.command;
+
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.requirements.sysml14.common.I_SysMLStereotype;
+import org.eclipse.papyrus.requirements.sysml14.common.Utils;
+import org.eclipse.uml2.uml.Class;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Stereotype;
+
+/**
+ * Set Id to all sub requirement from a package by taking as prefix the name of the package
+ *
+ */
+public class SetRequirementIdCommand extends RecordingCommand {
+	protected org.eclipse.uml2.uml.Element selectedElement;
+	protected TransactionalEditingDomain domain;
+
+
+	public SetRequirementIdCommand(TransactionalEditingDomain domain, Element selectedElement) {
+		super(domain, "PapyrusReqSysMLRequirementCreateCommand");
+		this.selectedElement = selectedElement;
+	}
+
+	protected void setID(org.eclipse.uml2.uml.Class  reqclass, String text) {
+		Stereotype reqStereotype = reqclass.getApplicableStereotype(I_SysMLStereotype.REQUIREMENT_STEREOTYPE);
+		String id = Utils.getNewRequirementID(reqclass.getOwner());
+		reqclass.setName(id);
+		reqclass.setValue(reqStereotype, I_SysMLStereotype.REQUIREMENT_ID_ATT, id);
+	}
+
+	@Override
+	protected void doExecute() {
+		if (selectedElement instanceof Class) {
+			setID((Class) selectedElement, "");
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml14/common/Utils.java b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml14/common/Utils.java
index 6ff5bb8..a1be73e 100644
--- a/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml14/common/Utils.java
+++ b/plugins/sysml14/org.eclipse.papyrus.requirements.sysml14.common/src/org/eclipse/papyrus/requirements/sysml14/common/Utils.java
@@ -28,6 +28,7 @@
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Package;
 import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.Stereotype;
 import org.eclipse.uml2.uml.util.UMLUtil;
 
 public class Utils {
@@ -36,6 +37,24 @@
 	}
 
 	/**
+	 * test if the stereotype is a SysML Requirement Stereotype
+	 * @param stereotype a given stereotype
+	 * @return return true if this is a SysML stereotype or inherits directly or indirectly from requirement
+	 */
+	public static boolean isRequirementStereotype(Stereotype stereotype) {
+		if( I_SysMLStereotype.REQUIREMENT_STEREOTYPE.equals(stereotype.getQualifiedName())){
+			return true;
+		}
+		for(org.eclipse.uml2.uml.Class superStereotype : stereotype.getSuperClasses()) {
+			if( superStereotype instanceof Stereotype){
+				if(isRequirementStereotype((Stereotype)superStereotype)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	/**
 	 * @param elem
 	 *            UML model element
 	 * @return the highest level Package of the element