- Add possibility to customize the calculation of port direction
- Remove SBlock/SPort attributes from property view.

Signed-off-by: Ansgar Radermacher <ansgar.radermacher@cea.fr>
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/META-INF/MANIFEST.MF b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/META-INF/MANIFEST.MF
index 803f530..27764a5 100644
--- a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/META-INF/MANIFEST.MF
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.polarsys.esf.localanalysis.profile;singleton:=true
 Bundle-Version: 0.7.0.qualifier
 Bundle-ClassPath: .
-Bundle-Activator: org.polarsys.esf.localanalysis.profile.ESFLocalAnalysisPorfileActivator$Implementation
+Bundle-Activator: org.polarsys.esf.localanalysis.profile.ESFLocalAnalysisProfileActivator$Implementation
 Bundle-Vendor: %Bundle-Vendor
 Bundle-Localization: src/main/resources/properties/plugin
 Require-Bundle: org.eclipse.uml2.uml;bundle-version="5.1.0";visibility:=reexport,
@@ -24,5 +24,6 @@
 Export-Package: org.polarsys.esf.esflocalanalysis,
  org.polarsys.esf.esflocalanalysis.impl,
  org.polarsys.esf.esflocalanalysis.util,
+ org.polarsys.esf.localanalysis.profile,
  org.polarsys.esf.localanalysis.profile.set
 Bundle-ActivationPolicy: lazy
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/plugin.xml b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/plugin.xml
index c6665cb..38d6ad8 100644
--- a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/plugin.xml
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/plugin.xml
@@ -18,6 +18,7 @@
 -->
 
 <plugin>
+   <extension-point id="portdirection" name="Port Direction" schema="schema/portdirection.exsd"/>
    <extension point="org.eclipse.emf.ecore.generated_package">
       <!-- @generated esflocalanalysis -->
       <package
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/schema/portdirection.exsd b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/schema/portdirection.exsd
new file mode 100644
index 0000000..176ba88
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/schema/portdirection.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.polarsys.esf.localanalysis.profile" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.polarsys.esf.localanalysis.profile" id="portdirection" name="Port Direction"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <choice>
+            <element ref="portDirection" minOccurs="0" maxOccurs="unbounded"/>
+         </choice>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="portDirection">
+      <complexType>
+         <attribute name="class" type="string">
+            <annotation>
+               <documentation>
+                  A class that provides access to the code generator. It must implement the ILangCodegen interface.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.polarsys.esf.localanalysis.profile.IGetPortDirection"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src-gen/main/java/org/polarsys/esf/esflocalanalysis/impl/SPortLAnalysis.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src-gen/main/java/org/polarsys/esf/esflocalanalysis/impl/SPortLAnalysis.java
index d978f35..1481499 100644
--- a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src-gen/main/java/org/polarsys/esf/esflocalanalysis/impl/SPortLAnalysis.java
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src-gen/main/java/org/polarsys/esf/esflocalanalysis/impl/SPortLAnalysis.java
@@ -13,19 +13,16 @@
 package org.polarsys.esf.esflocalanalysis.impl;
 
 import org.eclipse.emf.common.notify.Notification;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.eclipse.uml2.uml.Port;
-
 import org.polarsys.esf.esfarchitectureconcepts.ISPort;
 import org.polarsys.esf.esflocalanalysis.IESFLocalAnalysisPackage;
 import org.polarsys.esf.esflocalanalysis.ISBlockLAnalysis;
 import org.polarsys.esf.esflocalanalysis.ISPortLAnalysis;
 import org.polarsys.esf.esflocalanalysis.SDirectionLAnalysis;
+import org.polarsys.esf.localanalysis.profile.PortDirection;
 
 /**
  * <!-- begin-user-doc -->
@@ -235,14 +232,7 @@
 	public SDirectionLAnalysis getSDirectionLAnalysis() {
 		Port port = getBase_Port();
 		if (port != null) {
-			// TODO: obtain direction by taking other (domain-specific) profiles into account
-			if (port.getProvideds().size() > 0 && port.getRequireds().size() > 0) {
-				return SDirectionLAnalysis.INOUT;
-			} else if (port.getProvideds().size() > 0) {
-				return SDirectionLAnalysis.IN;
-			} else if (port.getRequireds().size() > 0) {
-				return SDirectionLAnalysis.OUT;
-			}
+			return PortDirection.getSDirectionLAnalysis(port);	
 		}
 		return SDirectionLAnalysis.UNDEFINED;
 	}
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisPorfileActivator.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisProfileActivator.java
similarity index 88%
rename from analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisPorfileActivator.java
rename to analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisProfileActivator.java
index 01b1a29..03c2ebb 100644
--- a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisPorfileActivator.java
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/ESFLocalAnalysisProfileActivator.java
@@ -24,12 +24,15 @@
  * @author $Author: jdumont $
  * @version $Revision: 183 $
  */
-public final class ESFLocalAnalysisPorfileActivator
+public final class ESFLocalAnalysisProfileActivator
 	extends EMFPlugin
 	implements BundleActivator {
 
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.polarsys.esf.localanalysis.profile"; //$NON-NLS-1$
+
 	/** Keep track of the encapsulating singleton. */
-	public static final ESFLocalAnalysisPorfileActivator INSTANCE = new ESFLocalAnalysisPorfileActivator();
+	public static final ESFLocalAnalysisProfileActivator INSTANCE = new ESFLocalAnalysisProfileActivator();
 
 	/** Execution context for the bundle. */
 	private static BundleContext sBundleContext = null;
@@ -40,7 +43,7 @@
 	/**
 	 * Create the instance.
 	 */
-	public ESFLocalAnalysisPorfileActivator() {
+	public ESFLocalAnalysisProfileActivator() {
 		super(new ResourceLocator[] {});
 	}
 
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/IGetPortDirection.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/IGetPortDirection.java
new file mode 100644
index 0000000..64027b8
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/IGetPortDirection.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+
+package org.polarsys.esf.localanalysis.profile;
+
+import org.eclipse.uml2.uml.Port;
+import org.polarsys.esf.esflocalanalysis.SDirectionLAnalysis;
+
+public interface IGetPortDirection {
+	/**
+	 * Returns the direction of a port
+	 * Domain-specific implementations should return UNDEFINED, if the port
+	 * does not apply a stereotype from which the direction can be deferred.
+	 */
+	SDirectionLAnalysis getSDirectionLAnalysis(Port port);
+}
diff --git a/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/PortDirection.java b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/PortDirection.java
new file mode 100644
index 0000000..1050c7f
--- /dev/null
+++ b/analysis/localanalysis/profile/org.polarsys.esf.localanalysis.profile/src/main/java/org/polarsys/esf/localanalysis/profile/PortDirection.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2016 ALL4TEC & CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     ALL4TEC & CEA LIST - initial API and implementation
+ ******************************************************************************/
+
+package org.polarsys.esf.localanalysis.profile;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.uml2.uml.Port;
+import org.polarsys.esf.esflocalanalysis.SDirectionLAnalysis;
+
+/**
+ * Handle calculation of port direction based on extension points
+ */
+public class PortDirection {
+
+	private static final String CLASS = "class"; //$NON-NLS-1$
+
+	public static final String IPORT_DIRECTION_ID = ESFLocalAnalysisProfileActivator.PLUGIN_ID + ".portdirection"; //$NON-NLS-1$
+
+	/**
+	 * Retrieve a direction from a port. The first extension returning a
+	 * defined value (in, out, inout) is returned
+	 * 
+	 * @param port a UML port for which the direction should be determined
+	 * @return the direction of the passed port
+	 */
+	public static SDirectionLAnalysis getSDirectionLAnalysis(Port port) {
+		IExtensionRegistry reg = Platform.getExtensionRegistry();
+		IConfigurationElement[] configElements = reg.getConfigurationElementsFor(IPORT_DIRECTION_ID);
+
+		for (IConfigurationElement configElement : configElements) {
+			try {
+				final Object obj = configElement.createExecutableExtension(CLASS);
+				if (obj instanceof IGetPortDirection) {
+					IGetPortDirection calcDirection = (IGetPortDirection) obj;
+					SDirectionLAnalysis direction = calcDirection.getSDirectionLAnalysis(port);
+					if (direction != SDirectionLAnalysis.UNDEFINED) {
+						return direction;
+					}
+				}
+			} catch (CoreException exception) {
+				exception.printStackTrace();
+			}
+		}
+		// No value via extension point, return default calculation
+		if (port.getProvideds().size() > 0 && port.getRequireds().size() > 0) {
+			return SDirectionLAnalysis.INOUT;
+		} else if (port.getProvideds().size() > 0) {
+			return SDirectionLAnalysis.IN;
+		} else if (port.getRequireds().size() > 0) {
+			return SDirectionLAnalysis.OUT;
+		}
+		return  SDirectionLAnalysis.UNDEFINED;
+	}
+}
diff --git a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/esflocalanalysis.ctx b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/esflocalanalysis.ctx
index 438e6e0..e3b2896 100644
--- a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/esflocalanalysis.ctx
+++ b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/esflocalanalysis.ctx
@@ -2,7 +2,7 @@
 <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9">
   <contexts:Context xmi:id="_bokhUK2SEeaML4zug24PgQ" name="ESFLocalAnalysis">
     <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
-    <tabs xmi:id="_iB4MwK2SEeaML4zug24PgQ" label="ESFLocalAnalysis" id="esflocalanalysis" priority="10">
+    <tabs xmi:id="_iB4MwK2SEeaML4zug24PgQ" label="Component analysis" id="esflocalanalysis" priority="10">
       <afterTab href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkaDJEeSZxfCXzZz3-w"/>
       <sections xmi:id="_iB4z0K2SEeaML4zug24PgQ" name="Single AbstractSLogicalGateLAnalysis" sectionFile="ui/SingleAbstractSLogicalGateLAnalysis.xwt">
         <widget href="ui/SingleAbstractSLogicalGateLAnalysis.xwt#/"/>
diff --git a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSBlockLAnalysis.xwt b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSBlockLAnalysis.xwt
index c2241ec..489cd5a 100644
--- a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSBlockLAnalysis.xwt
+++ b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSBlockLAnalysis.xwt
@@ -21,13 +21,6 @@
 		<Composite.layout>
 			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
 		</Composite.layout>
-		<ppe:ReferenceDialog input="{Binding}"
-			property="ESFLocalAnalysis:SBlockLAnalysis:sBlock" readOnly="true" customLabel="SBlock"></ppe:ReferenceDialog>
-	</Composite>
-	<Composite>
-		<Composite.layout>
-			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
-		</Composite.layout>
 		<ppe:MultiReference input="{Binding}"
 			property="ESFLocalAnalysis:SBlockLAnalysis:sPropagationLinksList" readOnly="true" customLabel="Propagation Links List"></ppe:MultiReference>
 	</Composite>
diff --git a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSPortLAnalysis.xwt b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSPortLAnalysis.xwt
index 78ac8e8..598c22a 100644
--- a/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSPortLAnalysis.xwt
+++ b/analysis/localanalysis/ui/org.polarsys.esf.localanalysis.ui/src/main/resources/properties_view/ui/SingleSPortLAnalysis.xwt
@@ -22,14 +22,12 @@
 			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
 		</Composite.layout>
 		<ppe:EnumCombo input="{Binding}"
-			property="ESFLocalAnalysis:SPortLAnalysis:sDirectionLAnalysis" customLabel="Direction"></ppe:EnumCombo>
+			property="ESFLocalAnalysis:SPortLAnalysis:sDirectionLAnalysis" readOnly="true" customLabel="Direction"></ppe:EnumCombo>
 	</Composite>
 	<Composite>
 		<Composite.layout>
 			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
 		</Composite.layout>
-		<ppe:ReferenceDialog input="{Binding}"
-			property="ESFLocalAnalysis:SPortLAnalysis:sPort" customLabel="SPort"></ppe:ReferenceDialog>
 		<ppe:MultiReference input="{Binding}"
             property="ESFLocalAnalysis:SPortLAnalysis:sFailureModesLAnalysisList" readOnly="true" customLabel="Failure Mode"></ppe:MultiReference>
 	</Composite>