From ba9d0f90b6a67c9ccd5b21baded08970cc7bf2c7 Mon Sep 17 00:00:00 2001
From: Alberto Debiasi <adebiasi@fbk.eu>
Date: Wed, 22 Apr 2020 10:02:14 +0200
Subject: [PATCH] Replace Set to List in EntityUtil.

Change-Id: I67bb6927a90d8121390571be338beff3c146b5e9
---
 .../chesscontract/util/EntityUtil.java        | 8371 +++++++++--------
 1 file changed, 4318 insertions(+), 4053 deletions(-)

diff --git a/plugins/contracts/org.polarsys.chess.contracts.profile/src/org/polarsys/chess/contracts/profile/chesscontract/util/EntityUtil.java b/plugins/contracts/org.polarsys.chess.contracts.profile/src/org/polarsys/chess/contracts/profile/chesscontract/util/EntityUtil.java
index 1f72d3090..8f778488f 100644
--- a/plugins/contracts/org.polarsys.chess.contracts.profile/src/org/polarsys/chess/contracts/profile/chesscontract/util/EntityUtil.java
+++ b/plugins/contracts/org.polarsys.chess.contracts.profile/src/org/polarsys/chess/contracts/profile/chesscontract/util/EntityUtil.java
@@ -1,4054 +1,4319 @@
-/*******************************************************************************
- * Copyright (C) 2017 Fondazione Bruno Kessler.
- * 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:
- *     Alberto Debiasi - initial API and implementation
- ******************************************************************************/
-package org.polarsys.chess.contracts.profile.chesscontract.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.StringJoiner;
-import java.util.TreeSet;
-
-import org.eclipse.uml2.uml.Package;
-import org.eclipse.uml2.uml.PackageableElement;
-import org.eclipse.uml2.uml.Parameter;
-import org.eclipse.uml2.uml.ParameterDirectionKind;
-import org.apache.log4j.Logger;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.uml2.uml.NamedElement;
-import org.eclipse.uml2.uml.Namespace;
-//import org.eclipse.emf.ecore.EObject;
-import org.eclipse.papyrus.MARTE.MARTE_Annexes.VSL.DataTypes.BoundedSubtype;
-import org.eclipse.papyrus.sysml.portandflows.FlowDirection;
-import org.eclipse.papyrus.sysml.portandflows.FlowPort;
-import org.eclipse.papyrus.sysml.service.types.element.SysMLElementTypes;
-import org.eclipse.papyrus.uml.service.types.utils.ElementUtil;
-import org.eclipse.papyrus.uml.tools.model.UmlModel;
-import org.eclipse.papyrus.uml.tools.model.UmlUtils;
-import org.eclipse.papyrus.uml.tools.utils.UMLUtil;
-import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPage;
-import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
-import org.eclipse.papyrus.views.modelexplorer.ModelExplorerView;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.uml2.uml.AggregationKind;
-import org.eclipse.uml2.uml.Association;
-import org.eclipse.uml2.uml.Behavior;
-import org.eclipse.uml2.uml.BodyOwner;
-import org.eclipse.uml2.uml.CallEvent;
-import org.eclipse.uml2.uml.Class;
-import org.eclipse.uml2.uml.Classifier;
-import org.eclipse.uml2.uml.Comment;
-import org.eclipse.uml2.uml.Component;
-import org.eclipse.uml2.uml.ConnectableElement;
-import org.eclipse.uml2.uml.Connector;
-import org.eclipse.uml2.uml.ConnectorEnd;
-import org.eclipse.uml2.uml.Constraint;
-import org.eclipse.uml2.uml.DataType;
-import org.eclipse.uml2.uml.Dependency;
-import org.eclipse.uml2.uml.Element;
-import org.eclipse.uml2.uml.Enumeration;
-import org.eclipse.uml2.uml.EnumerationLiteral;
-import org.eclipse.uml2.uml.FunctionBehavior;
-import org.eclipse.uml2.uml.LiteralInteger;
-import org.eclipse.uml2.uml.LiteralString;
-import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
-import org.eclipse.uml2.uml.Model;
-import org.eclipse.uml2.uml.MultiplicityElement;
-import org.eclipse.uml2.uml.OpaqueBehavior;
-import org.eclipse.uml2.uml.OpaqueExpression;
-import org.eclipse.uml2.uml.Operation;
-import org.eclipse.uml2.uml.Port;
-import org.eclipse.uml2.uml.Profile;
-import org.eclipse.uml2.uml.Property;
-import org.eclipse.uml2.uml.Pseudostate;
-import org.eclipse.uml2.uml.PseudostateKind;
-import org.eclipse.uml2.uml.RedefinableTemplateSignature;
-import org.eclipse.uml2.uml.Region;
-import org.eclipse.uml2.uml.Signal;
-import org.eclipse.uml2.uml.SignalEvent;
-import org.eclipse.uml2.uml.StateMachine;
-import org.eclipse.uml2.uml.Stereotype;
-import org.eclipse.uml2.uml.TemplateParameter;
-import org.eclipse.uml2.uml.Transition;
-import org.eclipse.uml2.uml.Trigger;
-import org.eclipse.uml2.uml.Type;
-import org.eclipse.uml2.uml.UMLFactory;
-//import org.polarsys.chess.contracts.profile.chesscontract.util.ContractEntityUtil;
-import org.eclipse.uml2.uml.UMLPackage;
-import org.eclipse.uml2.uml.ValueSpecification;
-import org.eclipse.uml2.uml.Vertex;
-import org.eclipse.uml2.uml.VisibilityKind;
-import org.eclipse.uml2.uml.resource.UMLResource;
-import org.polarsys.chess.chessmlprofile.ParameterizedArchitecture.InstantiatedArchitectureConfiguration;
-import org.polarsys.chess.chessmlprofile.StateMachines.PrioritizedTransition;
-import org.polarsys.chess.contracts.profile.chesscontract.FormalProperty;
-import org.polarsys.chess.core.util.uml.ResourceUtils;
-import org.polarsys.chess.core.util.uml.UMLUtils;
-
-/**
- * Util class that provides methods to manage SysML/CHESS/MARTE objects.
- *
- */
-public class EntityUtil {
-
-	private static final Logger logger = Logger.getLogger(EntityUtil.class);
-
-	public static final String BLOCK = "SysML::Blocks::Block";
-	public static final String SYSTEM = "CHESSContract::System";
-	public static final String FLOW_Port = "SysML::PortAndFlows::FlowPort";
-	private static final String FLOW_Port_MARTE = "MARTE::MARTE_DesignModel::GCM::FlowPort";
-	public static final String BOUNDED_TYPE = "MARTE::MARTE_Annexes::VSL::DataTypes::BoundedSubtype";
-	private static final String COMP_TYPE = "CHESS::ComponentModel::ComponentType";
-	private static final String COMP_IMPL = "CHESS::ComponentModel::ComponentImplementation";
-	private static final String SYSVIEW = "CHESS::Core::CHESSViews::SystemView";
-
-	public static final String INSTANTIATED_ARCHITECTURE_CONFIGURATION = "CHESS::ParameterizedArchitecture::InstantiatedArchitectureConfiguration";
-
-	private static final String INTEGER_TYPE = "PrimitiveTypes::Integer";
-	private static final String STRING_TYPE = "PrimitiveTypes::String";
-	private static final String REAL_TYPE = "PrimitiveTypes::Real";
-	private static final String BOOLEAN_TYPE = "PrimitiveTypes::Boolean";
-
-	private static final String CHESS_CONTINUOUS_TYPE = "CHESSContract::DataTypes::Continuous";
-
-	private static final String MARTE_BOOLEAN_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Boolean";
-	private static final String MARTE_REAL_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Real";
-	private static final String MARTE_INTEGER_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Integer";
-	private static final String FORMAL_PROP = "CHESSContract::FormalProperty";
-	private static final String FAULTY_STATE_MACHINE = "CHESS::Dependability::ThreatsPropagation::ErrorModel";
-	public static final String DELEGATION_CONST = "CHESSContract::DelegationConstraint";
-
-	public static final String PRIORITIZED_TRANSITION = "CHESS::StateMachines::PrioritizedTransition";
-
-	public static final String MACRO_DEFINITION = "CHESS::Expressions::MacroDefinition";
-	public static final String PARAMETER_ASSUMPTIONS = "CHESS::Expressions::ParameterAssumptions";
-
-	// default names of created objects
-	private static final String DEFAULT_DELEGATION_PREFIX = "DelegConstr_";
-	private static final String DEFAULT_PAR_ASSUMPTION_PREFIX = "ParamAssumption";
-	private static final String DEFAULT_ASSOCIATION_NAME = "association";
-	private static final String DEFAULT_ENUMERATION_NAME = "Enumeration";
-	private static final String DEFAULT_SIGNAL_NAME = "Signal";
-	private static final String DEFAULT_CONNECTOR_NAME = "connector";
-	private static final String DEFAULT_DELEGATION_CONSTRAINT_LITERAL_STRING_NAME = "constraintSpec";
-	private static final String DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME = "constraintSpec";
-	private static final String DEFAULT_MACRO_DEFINITION_STRING_NAME = "constraintSpec";
-	private static final String DEFAULT_PARAMETER_IN_NAME = "parameterIn";
-	private static final String DEFAULT_PARAMETER_OUT_NAME = "parameterOut";
-	private static final String DEFAULT_BOUNDEDTYPE_NAME = "BoundedInteger_";
-
-	// Library for UML primitive types
-	private Model umlLibrary = null;
-	// Library for CHESS types like continuous
-	private Profile chessContractLibrary = null;
-
-	private static EntityUtil entityUtilInstance;
-
-	public static EntityUtil getInstance() {
-		if (entityUtilInstance == null) {
-			entityUtilInstance = new EntityUtil();
-		}
-		return entityUtilInstance;
-	}
-
-	public Model loadModel(String projectName, String fileName) {
-		IWorkspaceRoot wRoot = ResourcesPlugin.getWorkspace().getRoot();
-		logger.debug("wRoot: " + wRoot);
-
-		IProject proj = wRoot.getProject(projectName);
-
-		return loadModel(proj, fileName);
-	}
-
-	public Model loadModel(IProject proj, String fileName) {
-		IFile file = proj.getFile(fileName);
-		IPath loc = file.getLocation();
-		logger.debug("loc: " + loc);
-		ResourceSet resSet = new ResourceSetImpl();
-		Resource resource = resSet.getResource(URI.createFileURI(loc.toString()), true);
-		Model model = ResourceUtils.getModel(resource);
-		return model;
-	}
-
-	/**
-	 * Loads a package from the given resource.
-	 * 
-	 * @param uri
-	 *            the URI of the resource to load
-	 * @return the retrieved package
-	 */
-	public Package loadPackage(URI uri) {
-		Package package_ = null;
-
-		try {
-			final ResourceSet resourceSet = new ResourceSetImpl();
-			final Resource resource = resourceSet.getResource(uri, true);
-			package_ = (Package) EcoreUtil.getObjectByType(resource.getContents(), UMLPackage.Literals.PACKAGE);
-		} catch (WrappedException we) {
-			logger.error(we.getMessage());
-			System.exit(1);
-		}
-		return package_;
-	}
-
-	/**
-	 * Returns the Type Continuous.
-	 * 
-	 * @return the requested Type
-	 */
-	public Type getContinuousType() {
-
-		if (chessContractLibrary == null) {
-			chessContractLibrary = (Profile) loadPackage(
-					URI.createURI("pathmap://CHESSContract/CHESSContract.profile.uml"));
-		}
-
-		// The Continuous type is defined here:
-		// CHESSContract::DataTypes::Continuous
-		// Get the correct package inside the profile
-		final Package dataTypes = chessContractLibrary.getNestedPackage("DataTypes");
-
-		// Get the correct type
-		final Type type = dataTypes.getOwnedType("Continuous");
-
-		if (type != null) {
-			logger.debug("Type '" + type.getQualifiedName() + "' found.");
-			return type;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the primitive type from the standard primitive library.
-	 * 
-	 * @param name
-	 *            the name of the Type
-	 * @return the requested primitive type
-	 */
-	public Type getPrimitiveType(String name) {
-
-		if (umlLibrary == null) {
-			umlLibrary = (Model) loadPackage(URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI));
-		}
-
-		// Get the correct type from the library
-		final Type type = umlLibrary.getOwnedType(name);
-
-		if (type != null) {
-			logger.debug("Type '" + type.getQualifiedName() + "' found.");
-			logger.debug("Type object'" + type + "' found.");
-			return type;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the delegation constraint with the given specs from a list
-	 * 
-	 * @param delegationConstraints
-	 *            the list of delegation constraints to scan
-	 * @param variable
-	 *            variable part
-	 * @param constraint
-	 *            costraint part
-	 * @return the delegation constraint, if found
-	 */
-	public Constraint getExistingDelegationConstraint(EList<Constraint> delegationConstraints, String variableIdText,
-			String constraintText, String iterConditionText) {
-
-		// Text of the delegation constraint
-		final String formalPropertyText = createDelegationConstraintText(variableIdText, constraintText,
-				iterConditionText);
-
-		// Loop on all the delegation constraints to find one with same text
-		for (Constraint delegationConstraint : delegationConstraints) {
-			final LiteralString specification = (LiteralString) delegationConstraint.getSpecification();
-			if (specification.getValue().equals(formalPropertyText)) {
-				return delegationConstraint;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return the Parameter with the given speccs if present among a list of
-	 * Parameters
-	 * 
-	 * @param parameters
-	 *            the list of Parameters to scan
-	 * @param type
-	 *            the type of the Parameter
-	 * @param isInput
-	 *            the direction of the Parameter
-	 * @return the Parameter, if found
-	 */
-	public Parameter getExistingFunctionBehaviorParameter(EList<Parameter> parameters, Type functionBehaviourType,
-			boolean isInput) {
-		for (Parameter parameter : parameters) {
-			if (parameter.getType() == functionBehaviourType) {
-				if ((isInput && parameter.getDirection() == ParameterDirectionKind.IN_LITERAL)
-						|| (!isInput && parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL)) {
-					return parameter;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the list of contract refinements associated to a Class
-	 * 
-	 * @param owner
-	 *            the owner Class
-	 * @return the list of contract refinements
-	 */
-	public EList<DataType> getDataTypes(Class owner) {
-		EList<DataType> contractRefinements = new BasicEList<DataType>();
-
-		for (Classifier classifier : owner.getNestedClassifiers()) {
-			if (classifier instanceof DataType) {
-				contractRefinements.add((DataType) classifier);
-			}
-		}
-		return contractRefinements;
-	}
-
-	public org.eclipse.uml2.uml.Port getExistingUmlPort(String portName, EList<NamedElement> existingPorts) {
-		for (Object object : existingPorts) {
-			final org.eclipse.uml2.uml.Port tmpPort = (org.eclipse.uml2.uml.Port) object;
-			if (tmpPort.getName().equals(portName)) {
-				return (org.eclipse.uml2.uml.Port) tmpPort;
-			}
-		}
-		return null;
-	}
-
-	public org.eclipse.uml2.uml.Port getExistingUmlPort(String portName, String typeName,
-			EList<NamedElement> existingPorts) {
-		for (Object object : existingPorts) {
-			final org.eclipse.uml2.uml.Port tmpPort = (org.eclipse.uml2.uml.Port) object;
-			if (tmpPort.getName().equals(portName) && tmpPort.getType().getName().equals(typeName)) {
-				return tmpPort;
-				// Port found
-			}
-		}
-		return null;
-	}
-
-	public Stereotype findStereotype(Package pkg, String stereotypeName) {
-
-		for (Stereotype sub : UMLUtil.findSubstereotypes(pkg, stereotypeName)) {
-			if (sub.getQualifiedName().equals(stereotypeName)) {
-				return sub;
-			}
-		}
-		return null;
-	}
-
-	public void updateUmlStaticPort(org.eclipse.uml2.uml.Port port, String[] newMultiplicityRange) {
-		final String[] multiplicityRange = getAttributeMultiplicity(port);
-
-		// Update its multiplicity if needed
-		if (!equalMultiplicityBoundaries(newMultiplicityRange, multiplicityRange)) {
-			setAttributeMultiplicity(port, newMultiplicityRange);
-		}
-	}
-
-	public void updateUmlNonStaticPort(Port port, Type newType, String[] newMultiplicityRange) {
-		if (!port.getType().getName().equals(newType.getName())) {
-			port.setType(newType);
-		}
-
-		// Update its multiplicity if needed
-		final String[] multiplicityRange = getAttributeMultiplicity(port);
-		if (!equalMultiplicityBoundaries(newMultiplicityRange, multiplicityRange)) {
-			setAttributeMultiplicity(port, newMultiplicityRange);
-		}
-
-	}
-
-	public FunctionBehavior createUmlFunctionBehaviour(String functionBehaviourName, EList<Type> inputTypes,
-			EList<String[]> inputMultiplicities, Type outputType, String[] outputMultiplicity, Class owner) {
-
-		// Create an empty functionBehavior
-		FunctionBehavior functionBehavior = createFunctionBehavior(owner, functionBehaviourName);
-
-		createUmlFunctionBehaviorParameters(functionBehavior, inputTypes, inputMultiplicities, outputType,
-				outputMultiplicity);
-
-		return functionBehavior;
-
-	}
-
-	public void createUmlFunctionBehaviorParameters(FunctionBehavior functionBehavior, EList<Type> inputTypes,
-			EList<String[]> inputMultiplicities, Type outputType, String[] outputMultiplicity) {
-		// Create the input parameters
-		for (int i = 0; i < inputTypes.size(); i++) {
-			Type parameterType = inputTypes.get(i);
-			String[] parameterMultiplicity = inputMultiplicities.get(i);
-			createFunctionBehaviorParameter(functionBehavior, parameterType, parameterMultiplicity, true);
-		}
-
-		// Create the output parameter
-		createFunctionBehaviorParameter(functionBehavior, outputType, outputMultiplicity, false);
-	}
-
-	public Constraint createDelegationConstraint(Class owner, String variableIdText, String constraintText,
-			String iterConditionText, Stereotype delegationConstraintStereotype) {
-
-		String delegationName = DEFAULT_DELEGATION_PREFIX + variableIdText;
-
-		logger.debug("\n\n\n Creating delegation constraint " + delegationName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final Constraint newUMLConstraint = owner.createOwnedRule(delegationName.toString());
-		newUMLConstraint.applyStereotype(delegationConstraintStereotype);
-
-		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
-		literalString.setName(DEFAULT_DELEGATION_CONSTRAINT_LITERAL_STRING_NAME);
-
-		final String formalPropertyText = createDelegationConstraintText(variableIdText, constraintText,
-				iterConditionText);
-		literalString.setValue(formalPropertyText);
-		newUMLConstraint.setSpecification(literalString);
-
-		logger.debug("\n\nCreated " + delegationName + " Delegation Constraint\n\n");
-		return newUMLConstraint;
-	}
-
-	public Connector createUmlConnector(String constraintName, Property partWithPortOfConstraint,
-			Class portOwnerOfConstraint, String variableName, Property partWithPortOfVariable,
-			Class portOwnerOfVariable, Class owner) {
-		// Create the source end
-
-		// Create the name using an incremental value
-		final String connectorName = DEFAULT_CONNECTOR_NAME + (owner.getOwnedConnectors().size() + 1);
-		// Create a connector, but only after I'm sure it isn't
-		// a delegation constraint
-
-		logger.debug("\n\n\n Creating connector " + connectorName + " for owner " + owner);
-		logger.debug("\n\n\n");
-		Connector connector = createConnector(connectorName);
-		logger.debug("Creating source end :" + constraintName);
-		createUmlConnectorEnd(connector, constraintName, partWithPortOfConstraint, portOwnerOfConstraint);
-
-		// Create the target end
-		logger.debug("Creating source end :" + variableName);
-		createUmlConnectorEnd(connector, variableName, partWithPortOfVariable, portOwnerOfVariable);
-
-		// At last, add the connector to the owner
-		entityUtilInstance.addConnector(owner, connector);
-
-		return connector;
-
-	}
-
-	public Package createPackage(Package owner, final String elementName) {
-		return owner.createNestedPackage(elementName);
-	}
-
-	public Comment createComment(Package owner, String content) {
-		Comment comment = owner.createOwnedComment();
-		comment.setBody(content);
-		return comment;
-	}
-
-	public Dependency createDependency(Package owner, NamedElement supplierElement, NamedElement clientElement) {
-		Dependency dependency = owner.createDependency(supplierElement);
-		dependency.getClients().add(clientElement);
-		return dependency;
-	}
-
-	public Property createInstantiatedArchitecture(Class paramRootComponent, Class instantiatedRootComponent,
-			ArrayList<String> parameters) {
-
-		int numInstantiatedArchitecures = getInstantiatedArchitecureConfigurations(paramRootComponent).size();
-
-		Property property = paramRootComponent
-				.createOwnedAttribute("InstantiateArc_" + (numInstantiatedArchitecures + 1), null);
-		UMLUtils.applyStereotype(property, INSTANTIATED_ARCHITECTURE_CONFIGURATION);
-		InstantiatedArchitectureConfiguration instantiatedArchitecture = getInstantiatedArchitectureConfiguration(
-				property);
-		if (instantiatedRootComponent != null) {
-			instantiatedArchitecture.setInstantiatedRootComponent(instantiatedRootComponent);
-		}
-		instantiatedArchitecture.getParameterList().addAll(parameters);
-		return property;
-	}
-
-	public InstantiatedArchitectureConfiguration getInstantiatedArchitectureConfiguration(Property umlProperty) {
-		Stereotype instantiatedArchitectureStereotype = UMLUtil.getAppliedStereotype(umlProperty,
-				INSTANTIATED_ARCHITECTURE_CONFIGURATION, false);
-		return (InstantiatedArchitectureConfiguration) umlProperty
-				.getStereotypeApplication(instantiatedArchitectureStereotype);
-	}
-
-	public String getInstantiatedArchitectureConfigurationName(
-			InstantiatedArchitectureConfiguration instantiatedArchitecture) {
-		return instantiatedArchitecture.getBase_Property().getName();
-	}
-
-	/**
-	 * Creates a Block element in the given package.
-	 * 
-	 * @param owner
-	 *            the Package that will contain the element
-	 * @param elementName
-	 *            the name of the new Block
-	 * @param blockStereotype
-	 *            the stereotype of the Block element
-	 * @return the newly created Class
-	 */
-	public Class createBlock(Package owner, final String elementName, Stereotype blockStereotype) {
-
-		Class umlClass = owner.createOwnedClass(elementName, false);
-		umlClass.applyStereotype(blockStereotype);
-
-		// owner.createPackagedElement(elementName, newUMLClass.eClass()); This
-		// also works...
-		// owner.getPackagedElements().add(newUMLClass); // This works too!
-
-		logger.debug("\n\nCreated " + elementName + " Block\n\n");
-		return umlClass;
-	}
-
-	public Class createSystemBlock(Package owner, final String elementName, Stereotype blockStereotype,
-			Stereotype sytemblockStereotype) {
-		Class umlClass = createBlock(owner, elementName, blockStereotype);
-		umlClass.applyStereotype(sytemblockStereotype);
-		return umlClass;
-	}
-
-	private ConnectorEnd createUmlConnectorEnd(Connector connector, String sourcePort, Property partWithPort,
-			Class portOwner) {
-
-		// Get the port and set it
-		ConnectableElement role = portOwner.getOwnedPort(sourcePort, null);
-
-		if (role != null) {
-			return entityUtilInstance.createConnectorEnd(connector, partWithPort, role);
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new BoundedSubType as requested.
-	 * 
-	 * @param pkg
-	 *            the package where to create the Enumeration
-	 * @param typeName
-	 *            the name of the type
-	 * @param lowerBound
-	 *            the lower bound
-	 * @param upperBound
-	 *            the upper bound
-	 * @return the created type
-	 */
-	public Type createBoundedSubType(Package pkg, String typeName, String lowerBoundValue, String upperBoundValue,
-			Stereotype boundedTypeStereotype) {
-
-		// Create a data type to the component view and apply the stereotype
-		final Type dataType = pkg.createOwnedType(typeName, UMLPackage.Literals.DATA_TYPE);
-		// Stereotype stereotype = UMLUtils.applyStereotype(dataType,
-		// BOUNDED_TYPE);
-		dataType.applyStereotype(boundedTypeStereotype);
-
-		// Extract the stereotiped type and configure it
-		// BoundedSubtype boundedType = (BoundedSubtype)
-		// dataType.getStereotypeApplication(stereotype);
-		final BoundedSubtype boundedType = (BoundedSubtype) dataType.getStereotypeApplication(boundedTypeStereotype);
-		boundedType.setMinValue(lowerBoundValue);
-		boundedType.setMaxValue(upperBoundValue);
-		boundedType.setBaseType((DataType) getPrimitiveType("Integer"));
-		// boundedType.setBaseType((DataType) getUMLPrimitiveType("Integer"));
-		// // Alternative version
-
-		logger.debug("Type '" + dataType.getQualifiedName() + "' created.");
-		return dataType;
-	}
-
-	/**
-	 * Creates a new Enumeration as requested.
-	 * 
-	 * @param pkg
-	 *            the package where to create the Enumeration
-	 * @param enumType
-	 *            the type specifying the values
-	 * @return the created Enumeration
-	 */
-	public Enumeration createEnumerationFromEnumType(Package pkg, Set<String> enumValues) {
-
-		// Create the name using an incremental value
-		final String enumerationName = DEFAULT_ENUMERATION_NAME + (getEnumerations(pkg).size() + 1);
-
-		final Enumeration enumeration = pkg.createOwnedEnumeration(enumerationName);
-		// final Set<String> values = getListValuesForEnumType(enumType);
-		for (String string : enumValues) {
-			enumeration.createOwnedLiteral(string);
-		}
-
-		logger.debug("Type '" + enumeration.getQualifiedName() + "' created.");
-		return enumeration;
-	}
-
-	/**
-	 * Retrieves all the Enumerations owned by the package.
-	 * 
-	 * @param pkg
-	 *            the package to be searched
-	 * @return
-	 */
-	public EList<Enumeration> getEnumerations(Package pkg) {
-		final EList<Enumeration> enumerations = new BasicEList<Enumeration>();
-
-		final EList<Type> types = pkg.getOwnedTypes();
-		for (Type type : types) {
-			if (type instanceof Enumeration) {
-				enumerations.add((Enumeration) type);
-			}
-		}
-		return enumerations;
-	}
-
-	public EList<Enumeration> getEnumerationsInOrder(Package pkg) {
-		final EList<Enumeration> enumerations = getEnumerations(pkg);
-
-		Collections.sort(enumerations, new Comparator<Enumeration>() {
-
-			@Override
-			public int compare(Enumeration o1, Enumeration o2) {
-				return o1.getName().compareTo(o2.getName());
-			}
-		});
-
-		return enumerations;
-	}
-
-	/**
-	 * Creates a Signal type in the given package.
-	 * 
-	 * @param pkg
-	 *            the package where to create the Enumeration
-	 * @return the newly created type
-	 */
-	public Signal createSignalType(Package pkg) {
-		final String signalName = DEFAULT_SIGNAL_NAME;
-
-		final Type type = pkg.createOwnedType(signalName, UMLPackage.Literals.SIGNAL);
-
-		logger.debug("Type '" + type.getQualifiedName() + "' created.");
-		return (Signal) type;
-	}
-
-	/**
-	 * Looks for a Signal already defined in the package.
-	 * 
-	 * @param pkg
-	 *            the package in which look for the Signal
-	 * @return the Signal already defined
-	 */
-	public Signal getExistingSignalType(Package pkg) {
-		final EList<Type> types = pkg.getOwnedTypes();
-
-		for (Type type : types) {
-			if (type instanceof Signal) {
-				return (Signal) type;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Looks for a specific enumeration among existing enumerations of the given
-	 * package.
-	 * 
-	 * @param pkg
-	 *            the package in which look for the Enumeration
-	 * @param enumType
-	 *            the enumeration to match
-	 * @return the enumeration already defined
-	 */
-	public Enumeration getExistingEnumerationForEnumType(Package pkg, Set<String> enumValues) {
-		final EList<Enumeration> enumerations = getEnumerations(pkg);
-
-		if (enumerations.size() > 0) {
-
-			for (Enumeration enumeration : enumerations) {
-				if (enumValues.equals(getListValuesForEnumeration(enumeration))) {
-					return enumeration;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns a Signal as requested (Only a Signal can be defined in the
-	 * package).
-	 * 
-	 * @param pkg
-	 *            the package where to look for or create the new type
-	 * @return the requested type
-	 */
-	public Type getOrCreateSignalType(Package pkg) {
-
-		// Look for existing Signal Type in the package
-		final Type type = getExistingSignalType(pkg);
-
-		if (type != null) {
-
-			// The type has been found in the package, use it
-			logger.debug("Type '" + type.getQualifiedName() + "' found.");
-			return type;
-		} else {
-			return createSignalType(pkg);
-		}
-	}
-
-	public Type getOrCreateEnumerationType(Set<String> enumValues, Package pkg) {
-
-		// Look for existing Enumerations in the package
-		final Type type = getExistingEnumerationForEnumType(pkg, enumValues);
-
-		if (type != null) {
-
-			// The type has been found in the package, use it
-			logger.debug("Type '" + type.getQualifiedName() + "' found.");
-			return type;
-		} else {
-			return createEnumerationFromEnumType(pkg, enumValues);
-		}
-	}
-
-	public Type getOrCreateBoundedSubType(String[] boundaries, Package pkg, Stereotype boundedTypeStereotype) {
-
-		String lowerBound = boundaries[0];
-		String upperBound = boundaries[1];
-		// Generate a suitable type name
-		final String typeName = DEFAULT_BOUNDEDTYPE_NAME + lowerBound + "_" + upperBound;
-
-		return getOrCreateBoundedSubType(typeName, pkg, lowerBound, upperBound, boundedTypeStereotype);
-	}
-
-	public Type getOrCreateBoundedSubType(String typeName, Package pkg, String lowerBoundValue, String upperBoundValue,
-			Stereotype boundedTypeStereotype) {
-		// Look for that type in the ComponentView
-		Type type = pkg.getOwnedType(typeName);
-		if (type != null) {
-
-			// The type has been found in the package, use it
-			logger.debug("Type '" + type.getQualifiedName() + "' found.");
-			return type;
-		} else {
-			return (Type) createBoundedSubType(pkg, typeName, lowerBoundValue, upperBoundValue, boundedTypeStereotype);
-		}
-	}
-
-	/**
-	 * Returns the list of the values inside a given Enumeration.
-	 * 
-	 * @param enumeration
-	 *            the Enumeration to be analysed
-	 * @return the list of contained values
-	 */
-	private Set<String> getListValuesForEnumeration(Enumeration enumeration) {
-		final Set<String> enumValuesNames = new TreeSet<String>(); // Ordered
-																	// list of
-																	// values
-		// Set<String> enumValuesNames = new HashSet<String>(); // Original
-		// order of values
-
-		for (EnumerationLiteral enumLit : enumeration.getOwnedLiterals()) {
-			enumValuesNames.add(enumLit.getName());
-		}
-		return enumValuesNames;
-	}
-
-	public String getFormalPropertyStr(FormalProperty formalProperty, String language) {
-
-		String str = null;
-		if (formalProperty != null) {
-			str = getConstraintBodyStr(formalProperty.getBase_Constraint(), language);
-		}
-		return str;
-	}
-
-	public void updateUmlAssociation(Property componentInstance, Type newType, String[] newMultiplicity)
-			throws Exception {
-		// The component instance is already present, update its
-		// type if needed
-		if (!componentInstance.getType().equals(newType)) {
-			componentInstance.setType(newType);
-
-			// Add the association to the list of changes, it
-			// needs to be redrawn
-			// addedElements.add(componentInstance.getAssociation());
-		}
-
-		String[] componentInstanceMultiplicity = getComponentInstanceMultiplicity(componentInstance);
-
-		if (!equalMultiplicityBoundaries(componentInstanceMultiplicity, newMultiplicity)) {
-			setAttributeMultiplicity(componentInstance, newMultiplicity);
-		}
-
-	}
-
-	public void updateUmlConstraint(Constraint umlConstraint, String updatedText, String language) {
-		final String formalPropertyText = getConstraintBodyStr(umlConstraint, language);
-
-		// If the expression is different, save it,
-		// otherwise go on
-		if (!updatedText.equals(formalPropertyText)) {
-			setTextInUMLConstraint(umlConstraint, updatedText, language);
-		}
-	}
-
-	public String getConstraintBodyStr(Constraint formalProperty, String language) {
-
-		String str = null;
-		if (formalProperty != null) {
-			if (formalProperty.getSpecification() != null) {
-				if (formalProperty.getSpecification() instanceof LiteralString) {
-					str = formalProperty.getSpecification().stringValue();
-				} else if (formalProperty.getSpecification() instanceof OpaqueExpression) {
-					str = getBodyForLanguageOfBodyOwner((OpaqueExpression) formalProperty.getSpecification(), language);
-				}
-
-			}
-		}
-		// logger.debug("getFormalPropertyStr: "+str);
-
-		return str;
-	}
-
-	/**
-	 * Returns the component instance with the given name.
-	 * 
-	 * @param owner
-	 *            the class owning the instance
-	 * @param componentName
-	 *            the name of the instance
-	 * @return the UML property representing the component instance
-	 */
-	public Property getSubComponentInstance(Class owner, String componentName) {
-		// logger.debug("getSubComponentInstance");
-		for (Property umlProperty : (owner.getAttributes())) {
-			// logger.debug("umlProperty: " + umlProperty);
-			// logger.debug("umlProperty.getname: " + umlProperty.getName());
-			if (umlProperty.getName().equals(componentName)
-					&& EntityUtil.getInstance().isComponentInstance(umlProperty)) {
-				return umlProperty;
-			}
-		}
-		return null;
-	}
-
-	public String getSystemElementURIFragment(Model model) throws Exception {
-
-		if (model != null) {
-			TreeIterator<EObject> allElements = model.eResource().getAllContents();
-			if (allElements != null) {
-				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
-						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
-
-				for (Class c : classes) {
-					if (isSystem(c)) {
-						return c.eResource().getURIFragment(c);
-					}
-				}
-			}
-		}
-		throw new Exception("Element does not exist.");
-	}
-
-	public String getSystemViewPackageURIFragment(Model model) throws Exception {
-
-		Package p = getSystemViewPackage(model);
-		return p.eResource().getURIFragment(p);
-
-	}
-
-	public Package getSystemViewPackage(Model model) throws Exception {
-
-		if (model != null) {
-			TreeIterator<EObject> allElements = model.eResource().getAllContents();
-			if (allElements != null) {
-				Collection<org.eclipse.uml2.uml.Package> packages = EcoreUtil
-						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getPackage());
-
-				for (Package p : packages) {
-					if (isSystemViewPackage(p)) {
-						return p;
-					}
-				}
-			}
-		}
-		throw new Exception("Element does not exist.");
-	}
-
-	public EObject getElement(String projectName, String umlFileModelName, String elementID) throws Exception {
-
-		Model model = loadModel(projectName, umlFileModelName);
-		return getElement(model, elementID);
-
-	}
-
-	public EObject getElement(Model model, String elementURI) throws Exception {
-
-		if (model != null) {
-			/*
-			 * TreeIterator<EObject> allElements =
-			 * model.eResource().getAllContents(); while(allElements.hasNext()){
-			 * logger.debug("URI  fragment: "+allElements.next().eResource().
-			 * getURI().fragment()); }
-			 */
-			EObject umlElement = model.eResource().getEObject(elementURI.trim());
-			return umlElement;
-		}
-
-		return null;
-
-	}
-
-	public String getUmlElementName(String projectName, String fileModelPath, String elementID) throws Exception {
-
-		Model model = loadModel(projectName, fileModelPath);
-
-		if (model != null) {
-			EObject umlElement = model.eResource().getEObject(elementID.trim());
-			return ((Class) umlElement).getName();
-		}
-
-		return null;
-
-	}
-
-	public EList<Element> getSubComponentsOfOwner(Constraint constraint) {
-		Element element = constraint.getOwner();
-		EList<Element> subComponents = new BasicEList<Element>();
-
-		for (Property umlProperty : getSubComponentsInstances((Class) element)) {
-			subComponents.add(getUmlType(umlProperty));
-		}
-
-		return subComponents;
-	}
-
-	public Element getSubComponent(Element element, String componentName) {
-
-		for (Property umlProperty : getSubComponentsInstances((Class) element)) {
-			if (umlProperty.getName().compareTo(componentName) == 0) {
-				return getUmlType(umlProperty);
-			}
-		}
-
-		return null;
-	}
-
-	public String[] getSubComponentsNameOfConstraintOwner(Constraint constraint) {
-		Element umlElement = constraint.getOwner();
-		Set<String> subCompArr = getSubComponentsNames((Class) umlElement);
-		return toArray(subCompArr);
-	}
-
-	private String[] toArray(Set<String> set) {
-		String[] strArray = new String[set.size()];
-		return set.toArray(strArray);
-	}
-
-	private String[] toArray(EList<String> eList) {
-		String[] strArray = new String[eList.size()];
-		return eList.toArray(strArray);
-	}
-
-	public String getComponentID(Element umlComponent) {
-
-		if ((isBlock(umlComponent))) {
-			return ((Class) umlComponent).getName();
-		}
-
-		if (isComponentInstance((Element) umlComponent)) {
-			return (((Property) umlComponent).getName());
-		}
-
-		return null;
-	}
-
-	public String getQualifiedName(NamedElement element) {
-		return ((NamedElement) element).getQualifiedName();
-	}
-
-	public String getComponentName(Element umlComponent) {
-
-		if ((isBlock(umlComponent))) {
-			return ((Class) umlComponent).getName();
-		}
-
-		if (isComponentInstance((Element) umlComponent)) {
-			return (((Property) umlComponent).getName());
-		}
-
-		return null;
-	}
-
-	public EList<Property> getInstantiatedArchitecureElementsAsProperties(Class umlComponent) {
-		EList<Property> instantiatedArchitecureList = new BasicEList<Property>();
-		for (Property umlProperty : ((Class) umlComponent).getAttributes()) {
-			if (isInstantiatedArchitecuture(umlProperty)) {
-				instantiatedArchitecureList.add(umlProperty);
-			}
-		}
-		return instantiatedArchitecureList;
-	}
-
-	public EList<InstantiatedArchitectureConfiguration> getInstantiatedArchitecureConfigurations(Class umlComponent) {
-		EList<InstantiatedArchitectureConfiguration> instantiatedArchitecureList = new BasicEList<InstantiatedArchitectureConfiguration>();
-		for (Property umlProperty : ((Class) umlComponent).getAttributes()) {
-			if (isInstantiatedArchitecuture(umlProperty)) {
-				instantiatedArchitecureList.add(getInstantiatedArchitectureConfiguration(umlProperty));
-			}
-		}
-		return instantiatedArchitecureList;
-	}
-
-	public Set<Property> getSubComponentsInstances(Class umlComponent) {
-		Set<Property> subComponents = new HashSet<Property>();
-		EList<Property> umlProperties = ((Class) umlComponent).getAttributes();
-		if (umlProperties != null) {
-			for (Property umlProperty : umlProperties) {
-				if (isComponentInstance(umlProperty)) {
-					subComponents.add(umlProperty);
-				}
-			}
-		}
-		return subComponents;
-	}
-
-	/**
-	 * Returns the component instance with the given name.
-	 * 
-	 * @param umlComponent
-	 *            the class owning the instance
-	 * @param componentName
-	 *            the name of the instance
-	 * @return the UML property representing the component instance
-	 */
-	public Property getUmlComponentInstance(Class umlComponent, String componentName) {
-
-		for (Property umlProperty : (umlComponent.getAttributes())) {
-			if (umlProperty.getName().equals(componentName) && isComponentInstance(umlProperty)) {
-				return umlProperty;
-			}
-		}
-		return null;
-	}
-
-	public String[] getEnumValuesFromComponentPorts(Class umlComponent) {
-		EList<String> enumValuesEList = new BasicEList<String>();
-
-		for (Port port : getUmlPortsFromClass(umlComponent)) {
-			if (isEnumerationAttribute(port)) {
-				Set<String> currValues = getListValuesForEnumeratorType(port.getType());
-				enumValuesEList.addAll(currValues);
-			}
-		}
-
-		return toArray(enumValuesEList);
-	}
-
-	public EList<String> getEnumValuesFromComponentAttributes(Element umlComponent) {
-		EList<String> enumValuesEList = new BasicEList<String>();
-
-		if (isComponentInstance(umlComponent)) {
-			umlComponent = getUmlType((Property) umlComponent);
-		}
-
-		if (isBlock(umlComponent) || (isCompType(umlComponent) || (isComponentImplementation(umlComponent)))) {
-			Class umlClass = (Class) umlComponent;
-
-			for (Property umlProperty : umlClass.getOwnedAttributes()) {
-
-				if (isEnumerationAttribute(umlProperty)) {
-					Set<String> currValues = getListValuesForEnumeratorType(umlProperty.getType());
-					if (currValues != null) {
-						enumValuesEList.addAll(currValues);
-					}
-				}
-			}
-
-			EList<FunctionBehavior> functionBehaviors = getUmlFunctionBehaviors(umlClass);
-			if (functionBehaviors != null) {
-				for (FunctionBehavior functionBehavior : functionBehaviors) {
-					for (Parameter parameter : functionBehavior.inputParameters()) {
-						Set<String> currValues = getListValuesForEnumeratorType(parameter.getType());
-						if (currValues != null) {
-							enumValuesEList.addAll(currValues);
-						}
-					}
-					for (Parameter parameter : functionBehavior.outputParameters()) {
-						Set<String> currValues = getListValuesForEnumeratorType(parameter.getType());
-						if (currValues != null) {
-							enumValuesEList.addAll(currValues);
-						}
-					}
-				}
-			}
-		}
-
-		return enumValuesEList;
-		// return toArray(enumValuesEList);
-	}
-
-	public ArrayList<Class> getBlocks(Package umlSelectedPackage) {
-		final EList<Element> packageChildren = umlSelectedPackage.getOwnedElements();
-
-		ArrayList<Class> blocksAsClasses = new ArrayList<Class>();
-
-		if (!packageChildren.isEmpty()) {
-			// logger.debug("getBlocks: "+packageChildren.size());
-			blocksAsClasses = new ArrayList<Class>();
-			for (Element element : packageChildren) {
-
-				if (EntityUtil.getInstance().isBlock(element)
-						&& !ContractEntityUtil.getInstance().isContract(element)) {
-					blocksAsClasses.add((Class) element);
-				}
-			}
-		}
-
-		return blocksAsClasses;
-	};
-
-	public Set<String> getSubComponentsNames(Class umlComponent) {
-
-		Set<String> subComponentsNames = new HashSet<String>();
-		for (Property umlProperty : getSubComponentsInstances(umlComponent)) {
-			subComponentsNames.add((umlProperty).getName());
-		}
-		return subComponentsNames;
-	}
-
-	public String[] getSubComponentsName(Class umlComponent) {
-		return toArray(getSubComponentsNames(umlComponent));
-	}
-
-	public EList<Port> getUmlPorts(Element umlElement, boolean isStaticPort) {
-		EList<Port> portsArr = new BasicEList<Port>();
-		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
-			portsArr.addAll(getUmlPortsFromClass((Class) umlElement, isStaticPort));
-		}
-
-		if (isComponentInstance(umlElement)) {
-			portsArr.addAll(getUmlPortsFromProperty((Property) umlElement, isStaticPort));
-		}
-		return portsArr;
-
-	}
-
-	private EList<Port> getUmlPortsFromProperty(Property umlElement, boolean isStaticPort) {
-		return getUmlPortsFromClass((Class) getUmlType((Property) umlElement), isStaticPort);
-	}
-
-	/*
-	 * private EList<Port> getUMLPortsFromProperty(Element umlElement, int
-	 * portDirection, boolean isStaticPort) { return
-	 * getUMLPortsFromClass((Class)getUMLType((Property)
-	 * umlElement),portDirection,isStaticPort); }
-	 */
-
-	public EList<Port> getUmlPorts(Element umlElement, int portDirection, boolean isStaticPort) {
-		EList<Port> portsArr = new BasicEList<Port>();
-		if (isBlock(umlElement)) {
-			portsArr.addAll(getUmlPortsFromClass((Class) umlElement, portDirection, isStaticPort));
-		}
-
-		if (isCompType(umlElement) || (isComponentImplementation(umlElement))) {
-			portsArr.addAll(getUmlPortsFromComponent((Component) umlElement, portDirection, isStaticPort));
-		}
-
-		if (isComponentInstance(umlElement)) {
-			portsArr.addAll(getUmlPorts(getUmlType((Property) umlElement), portDirection, isStaticPort));
-		}
-		return portsArr;
-
-	}
-
-	private EList<Port> getUmlPortsFromClass(Class umlComponent, int portDirection, boolean isStatic) {
-		EList<Port> ports = new BasicEList<Port>();
-		for (Port umlPort : umlComponent.getOwnedPorts()) {
-			FlowPort fp = getFlowPort(umlPort);
-			if ((fp.getDirection().getValue() == portDirection) && (umlPort.isStatic() == isStatic)) {
-				ports.add(umlPort);
-			}
-		}
-		return ports;
-	}
-
-	public boolean isInputPort(Element umlPort) {
-		return (umlPort instanceof Property && getPortDirection(umlPort) != null
-				&& getPortDirection(umlPort) == FlowDirection.IN_VALUE);
-	}
-
-	public boolean isInOutPort(Element umlPort) {
-		return (umlPort instanceof Property && getPortDirection(umlPort) != null
-				&& getPortDirection(umlPort) == FlowDirection.INOUT_VALUE);
-	}
-
-	public boolean isOutputPort(Element umlPort) {
-		return (umlPort instanceof Property && getPortDirection(umlPort) != null
-				&& getPortDirection(umlPort) == FlowDirection.OUT_VALUE);
-	}
-
-	public Integer getPortDirection(Element umlPort) {
-		if (isFlowPort(umlPort)) {
-			return ((FlowPort) getFlowPort((Port) umlPort)).getDirection().getValue();
-		} else if (isFlowPortMarte(umlPort)) {
-			return ((org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort) getFlowPortMarte((Port) umlPort))
-					.getDirection().getValue();
-		} else {
-			return null;
-		}
-	}
-
-	private Set<Port> getUmlPortsFromComponent(Component umlComponent, int portDirection, boolean isStaticPort) {
-		Set<Port> ports = new HashSet<Port>();
-
-		for (Port umlPort : umlComponent.getOwnedPorts()) {
-			org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort fp = getFlowPortMarte(umlPort);
-			if ((fp.getDirection().getValue() == portDirection) && (umlPort.isStatic() == isStaticPort)) {
-				ports.add(umlPort);
-			}
-		}
-		return ports;
-	}
-
-	private EList<Port> getUmlPortsFromClass(Class umlComponent, boolean isStaticPort) {
-		EList<Port> ports = new BasicEList<Port>();
-		for (Port umlPort : umlComponent.getOwnedPorts()) {
-			if (umlPort.isStatic() == isStaticPort) {
-				ports.add(umlPort);
-			}
-		}
-		return ports;
-	}
-
-	private Set<Port> getUmlPortsFromClass(Class umlComponent) {
-		Set<Port> ports = new HashSet<Port>();
-		for (Port umlPort : umlComponent.getOwnedPorts()) {
-			ports.add(umlPort);
-		}
-		return ports;
-	}
-
-	/*
-	 * private Set<Port> getUmlPortsFromComponent(Component umlComponent) {
-	 * Set<Port> ports = new HashSet<Port>();
-	 * 
-	 * for (Port umlPort : umlComponent.getOwnedPorts()) { ports.add(umlPort); }
-	 * return ports; }
-	 */
-
-	public Package getToPackage(org.eclipse.uml2.uml.Element umlElememt) {
-
-		Package tmp = umlElememt.getNearestPackage();
-		while (tmp.getOwner() != null && (tmp.getOwner() instanceof Package)) {
-			tmp = (Package) tmp.getOwner();
-		}
-		return tmp;
-	}
-
-	private FlowPort getFlowPort(Port umlPort) {
-		Stereotype contrStereo = UMLUtil.getAppliedStereotype(umlPort, FLOW_Port, false);
-		return (FlowPort) umlPort.getStereotypeApplication(contrStereo);
-
-	}
-
-	private org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort getFlowPortMarte(Port umlPort) {
-		Stereotype flowPortStereo = UMLUtil.getAppliedStereotype(umlPort, FLOW_Port_MARTE, false);
-		return (org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort) umlPort
-				.getStereotypeApplication(flowPortStereo);
-	}
-
-	public boolean isPort(Element umlElement) {
-		return ((umlElement instanceof Property) && (isFlowPort(umlElement) || isFlowPortMarte(umlElement)));
-	}
-
-	private boolean isFlowPort(Element umlElement) {
-		return (umlElement instanceof Property && UMLUtil.getAppliedStereotype(umlElement, FLOW_Port, false) != null);
-	}
-
-	private boolean isFlowPortMarte(Element umlElement) {
-		return (umlElement instanceof Property
-				&& UMLUtil.getAppliedStereotype(umlElement, FLOW_Port_MARTE, false) != null);
-	}
-
-	public void deleteComponentContract(Class clazz) {
-		clazz.destroy();
-	}
-
-	public boolean isComponentImplementation(Element umlElement) {
-		return (umlElement instanceof Class && UMLUtil.getAppliedStereotype(umlElement, COMP_IMPL, false) != null);
-	}
-
-	public boolean isInstantiatedArchitecuture(Element umlElement) {
-		return (umlElement instanceof Property
-				&& UMLUtil.getAppliedStereotype(umlElement, INSTANTIATED_ARCHITECTURE_CONFIGURATION, false) != null);
-	}
-
-	// modified method!!
-	public boolean isComponentInstance(Element umlProperty) {
-		// return UMLUtil.getAppliedStereotype(umlProperty, COMP_INST, false) !=
-		// null;
-		if (!(umlProperty instanceof Property)) {
-			return false;
-		}
-
-		Property property = (Property) umlProperty;
-
-		if (property.getAssociation() == null) {
-			return false;
-		}
-
-		if (ContractEntityUtil.getInstance().isContractProperty(property)) {
-			return false;
-		}
-
-		if (isInstantiatedArchitecuture(property)) {
-			return false;
-		}
-
-		Element owner = (getOwner(umlProperty));
-		Association association = property.getAssociation();
-		int associationEndsSize = association.getEndTypes().size();
-		if (associationEndsSize != 2) {
-			return false;
-		}
-		boolean End1TypeIsOwner = association.getEndTypes().get(0).equals(owner);
-		boolean End2TypeIsOwner = association.getEndTypes().get(1).equals(owner);
-
-		return (associationEndsSize == 2) && ((End1TypeIsOwner) || (End2TypeIsOwner));
-
-		// Type umlPropertyType = ((Property) umlProperty).getType();
-		// return (isBlock(umlPropertyType) ||
-		// isComponentImplementation(umlPropertyType));
-	}
-
-	public boolean isBooleanAttribute(Property umlProperty) {
-		return isBooleanType(umlProperty.getType());
-	}
-
-	public boolean isBooleanType(Type type) {
-		if (type != null) {
-			return ((type.getQualifiedName().compareTo(BOOLEAN_TYPE) == 0)
-					|| (type.getQualifiedName().compareTo(MARTE_BOOLEAN_TYPE) == 0));
-		}
-		return false;
-	}
-
-	/*
-	 * public String[] getLowerUpperBoundsForRangeType(Property umlProperty) {
-	 * return getLowerUpperBoundsForRangeType(umlProperty.getType()); }
-	 */
-
-	public String[] getLowerUpperBoundsForRangeType(Type umlType) {
-		BoundedSubtype boundedSubtype = getRangeAttribute(umlType);
-		String[] bounds = { boundedSubtype.getMinValue(), boundedSubtype.getMaxValue() };
-
-		return bounds;
-	}
-
-	private BoundedSubtype getRangeAttribute(Type umlType) {
-		Stereotype boundedStereo = UMLUtil.getAppliedStereotype(umlType, BOUNDED_TYPE, false);
-		return (BoundedSubtype) umlType.getStereotypeApplication(boundedStereo);
-	}
-
-	public boolean isRangeAttribute(Property umlProperty) {
-		return isRangeType(umlProperty.getType());
-	}
-
-	public boolean isRangeType(Type umlType) {
-		if (umlType != null) {
-			if (UMLUtil.getAppliedStereotype(umlType, BOUNDED_TYPE, false) != null) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public boolean isDoubleAttribute(Property umlProperty) {
-		if (umlProperty.getType() != null) {
-			return (umlProperty.getType().getName().compareTo("Double") == 0);
-		}
-		return false;
-	}
-
-	public boolean isStringAttribute(Property umlProperty) {
-		return isStringType(umlProperty.getType());
-	}
-
-	public boolean isRealAttribute(Property umlProperty) {
-		return isRealType(umlProperty.getType());
-	}
-
-	public boolean isIntegerAttribute(Property umlProperty) {
-		return isIntegerType(umlProperty.getType());
-	}
-
-	public boolean isContinuousAttribute(Property umlProperty) {
-		if (umlProperty.getType() != null) {
-			return isContinuousType(umlProperty.getType());
-		}
-		return false;
-	}
-
-	public boolean isContinuousType(Type type) {
-		if (type != null) {
-			return type.getQualifiedName().compareTo(CHESS_CONTINUOUS_TYPE) == 0;
-		} else
-			return false;
-	}
-
-	public Type getAttributeType(Property umlProperty) {
-		return (umlProperty.getType());
-	}
-
-	public boolean isEnumerationAttribute(Property umlProperty) {
-		return isEnumerationType(umlProperty.getType());
-	}
-
-	public boolean isEnumerationType(Type umlType) {
-		if (umlType != null) {
-			return (umlType instanceof Enumeration);
-		}
-		return false;
-	}
-
-	public Set<String> getListValuesForEnumeratorType(Type umlType) {
-		Set<String> enumValuesNames = new HashSet<String>();
-		if (umlType instanceof Enumeration) {
-			for (EnumerationLiteral enumLit : ((Enumeration) umlType).getOwnedLiterals()) {
-				enumValuesNames.add(enumLit.getName());
-			}
-			return enumValuesNames;
-
-		}
-		return null;
-	}
-
-	public boolean isEnumValue(String value, Type umlType) {
-
-		if (umlType instanceof Enumeration) {
-			return getListValuesForEnumeratorType(umlType).contains(value);
-		}
-		return false;
-	}
-
-	public String[] getValuesForEnumeratorType(Type umlType) {
-		Set<String> enumValuesNames = getListValuesForEnumeratorType(umlType);
-		if (enumValuesNames != null) {
-			return toArray(enumValuesNames);
-		}
-		return null;
-	}
-
-	public Element getUmlType(Property umlProperty) {
-		return ((Element) umlProperty.getType());
-	}
-
-	public boolean isBlock(Element umlClass) {
-		return (umlClass instanceof Class && UMLUtil.getAppliedStereotype(umlClass, BLOCK, false) != null);
-	}
-
-	public boolean isCompType(Element umlComponent) {
-		return (umlComponent instanceof Class && UMLUtil.getAppliedStereotype(umlComponent, COMP_TYPE, false) != null);
-	}
-
-	public boolean isSystem(Element umlElement) {
-		return (umlElement instanceof Class && UMLUtil.getAppliedStereotype(umlElement, SYSTEM, false) != null);
-	}
-
-	public boolean isFaultyStateMachine(Element umlElement) {
-		return (umlElement instanceof StateMachine
-				&& UMLUtil.getAppliedStereotype(umlElement, FAULTY_STATE_MACHINE, false) != null);
-	}
-
-	public boolean isNominalStateMachine(Element umlElement) {
-		return (umlElement instanceof StateMachine
-				&& UMLUtil.getAppliedStereotype(umlElement, FAULTY_STATE_MACHINE, false) == null);
-	}
-
-	public boolean isPrioritizedTransition(Element umlElement) {
-		return (umlElement instanceof Transition
-				&& UMLUtil.getAppliedStereotype(umlElement, PRIORITIZED_TRANSITION, false) != null);
-	}
-
-	/*
-	 * public void saveConstraint(final Constraint constraint, final String
-	 * text) {
-	 * 
-	 * TransactionalEditingDomain domain =
-	 * TransactionUtil.getEditingDomain(constraint);
-	 * domain.getCommandStack().execute(new RecordingCommand(domain) {
-	 * 
-	 * @Override protected void doExecute() {
-	 * 
-	 * LiteralString litString = (LiteralString) constraint.getSpecification();
-	 * litString.setValue(text); constraint.setSpecification(litString); } }); }
-	 */
-
-	public Element getOwner(Element umlElement) {
-		return umlElement.getOwner();
-	}
-
-	public String getName(Class umlClass) {
-		return umlClass.getName();
-	}
-
-	public String[] getPortsNames(Element umlElement, int portDirection, boolean isStaticPort) {
-		EList<String> portsNames = new BasicEList<String>();
-
-		for (Port umlPort : getUmlPorts(umlElement, portDirection, isStaticPort)) {
-			portsNames.add(umlPort.getName());
-		}
-
-		return toArray(portsNames);
-	}
-
-	public EList<String> getPortsName(EList<Port> ports) {
-		EList<String> portsNames = new BasicEList<String>();
-
-		for (Port umlPort : ports) {
-			portsNames.add(umlPort.getName());
-		}
-		return portsNames;
-	}
-
-	public String[] getInputPortsNames(Element umlElement, boolean isStaticPort) {
-		return getPortsNames(umlElement, FlowDirection.IN_VALUE, isStaticPort);
-	}
-
-	public String[] getOutputPortsNames(Element umlElement, boolean isStaticPort) {
-		return getPortsNames(umlElement, FlowDirection.OUT_VALUE, isStaticPort);
-	}
-
-	public String[] getInputOutputPortsNames(Element umlElement, boolean isStaticPort) {
-		return getPortsNames(umlElement, FlowDirection.INOUT_VALUE, isStaticPort);
-	}
-
-	public Set<Property> getSupportedAttributes(Element umlElement, Boolean isStaticAttribute) {
-		Set<Property> simpleAttributes = new HashSet<Property>();
-
-		if (isComponentInstance(umlElement)) {
-			umlElement = getUmlType((Property) umlElement);
-		}
-
-		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
-			Class umlClass = (Class) umlElement;
-			for (Property umlProperty : umlClass.getOwnedAttributes()) {
-				if ((isStaticAttribute == null) || (umlProperty.isStatic() == isStaticAttribute)) {
-					if (isBooleanAttribute(umlProperty) || isContinuousAttribute(umlProperty)
-							|| isDoubleAttribute(umlProperty) || isRangeAttribute(umlProperty)
-							|| isEnumerationAttribute(umlProperty) || isIntegerAttribute(umlProperty)
-							|| isRealAttribute(umlProperty) || isStringAttribute(umlProperty)) {
-						simpleAttributes.add(umlProperty);
-					} /*
-						 * else if (isContinuousAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isDoubleAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isRangeAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isEnumerationAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isIntegerAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isRealAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }else if
-						 * (isStringAttribute(umlProperty)) {
-						 * simpleAttributes.add(umlProperty); }
-						 */
-				}
-			}
-		}
-
-		return simpleAttributes;
-	}
-
-	private Set<Property> getIntegerAttributes(Element umlElement) {
-		Set<Property> integerAttributes = new HashSet<Property>();
-
-		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
-			Class umlClass = (Class) umlElement;
-			EList<Property> attributes = umlClass.getOwnedAttributes();
-			for (Property umlProperty : attributes) {
-				if (isIntegerAttribute(umlProperty)) {
-					integerAttributes.add(umlProperty);
-				}
-			}
-		}
-
-		if (isComponentInstance(umlElement)) {
-			integerAttributes.addAll(getIntegerAttributes(getUmlType((Property) umlElement)));
-		}
-		return integerAttributes;
-	}
-
-	public Set<Property> getAttributesExceptPorts(Element umlElement, Boolean isStaticAttribute) {
-		Set<Property> attributes = new HashSet<Property>();
-		for (Property umlProperty : getSupportedAttributes(umlElement, isStaticAttribute)) {
-			if (!isPort(umlProperty)) {
-				attributes.add(umlProperty);
-			}
-		}
-		return attributes;
-	}
-
-	public Set<Property> getIntegerAttributesExceptPorts(Element umlElement) {
-		Set<Property> integerAttributes = new HashSet<Property>();
-		for (Property umlProperty : getIntegerAttributes(umlElement)) {
-			if (!isPort(umlProperty)) {
-				integerAttributes.add(umlProperty);
-			}
-		}
-		return integerAttributes;
-	}
-
-	public Collection<StateMachine> getNominalStateMachines() {
-
-		UmlModel umlModel = UmlUtils.getUmlModel();
-		Set<StateMachine> stateMachines = getNominalStateMachines(umlModel);
-		return stateMachines;
-
-	}
-
-	public Set<StateMachine> getNominalStateMachines(UmlModel umlModel) {
-
-		Set<StateMachine> stateMachines = new HashSet<StateMachine>();
-
-		if (umlModel != null) {
-			TreeIterator<EObject> allElements = umlModel.getResource().getAllContents();
-			if (allElements != null) {
-				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
-						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
-				for (Class c : classes) {
-					if (isNominalStateMachine(c)) {
-						stateMachines.add((StateMachine) c);
-					}
-				}
-			}
-		}
-
-		return stateMachines;
-	}
-
-	public Set<StateMachine> getNominalStateMachines(Class umlSelectedComponent, boolean fromSubComponent) {
-
-		Set<StateMachine> stateMachines = getNominalStateMachines(umlSelectedComponent);
-		if (fromSubComponent) {
-			for (Property subComponentInstance : getSubComponentsInstances(umlSelectedComponent)) {
-				stateMachines.addAll(getNominalStateMachines((Class) subComponentInstance.getType(), true));
-			}
-		}
-		return stateMachines;
-	}
-
-	public StateMachine getFirstNominalStateMachine(Class umlSelectedComponent) {
-		Set<StateMachine> stateMachines = getNominalStateMachines(umlSelectedComponent);
-		if ((stateMachines != null) && (stateMachines.size() > 0)) {
-			return stateMachines.iterator().next();
-		} else
-			return null;
-	}
-
-	public Set<StateMachine> getNominalStateMachines(Class umlSelectedComponent) {
-
-		Set<StateMachine> stateMachines = new HashSet<StateMachine>();
-
-		if (umlSelectedComponent != null) {
-			EList<Behavior> behaviours = umlSelectedComponent.getOwnedBehaviors();
-			if (behaviours != null) {
-				for (Class c : behaviours) {
-					if (isNominalStateMachine(c)) {
-						stateMachines.add((StateMachine) c);
-					}
-				}
-			}
-		}
-
-		return stateMachines;
-	}
-
-	/**
-	 * Returns the state machine with the given name inside the given element.
-	 * 
-	 * @param umlSelectedComponent
-	 *            the owner component
-	 * @param stateMachineName
-	 *            the name of the state machine
-	 * @return
-	 */
-	public StateMachine getNominalStateMachine(Class umlSelectedComponent, String stateMachineName) {
-		for (StateMachine stateMachine : getNominalStateMachines(umlSelectedComponent)) {
-			if (stateMachine.getName().equals(stateMachineName)) {
-				return stateMachine;
-			}
-		}
-		return null;
-	}
-
-	private <T> Collection<T> iterator2Collection(final Iterator<T> iter) {
-		ArrayList<T> list = new ArrayList<T>();
-		for (; iter.hasNext();) {
-			T item = iter.next();
-			list.add(item);
-		}
-		return list;
-	}
-
-	public EList<Transition> getTranstitions(StateMachine stateMachine) {
-		Region region = stateMachine.getRegions().get(0);
-		return region.getTransitions();
-	}
-
-	public EList<Vertex> getStates(StateMachine stateMachine) {
-		Region region = stateMachine.getRegions().get(0);
-		return region.getSubvertices();
-	}
-
-	public Vertex getState(StateMachine stateMachine, String stateName) {
-		Region region = stateMachine.getRegions().get(0);
-		return region.getSubvertex(stateName);
-	}
-
-	public boolean isInitialState(Vertex state) {
-		return (state instanceof Pseudostate)
-				&& ((Pseudostate) state).getKind().equals(PseudostateKind.INITIAL_LITERAL);
-	}
-
-	public boolean isFinalState(Vertex state) {
-		return ((state instanceof Pseudostate)
-				&& ((Pseudostate) state).getKind().getName().compareTo("Terminate") == 0);
-	}
-
-	public EList<Vertex> getIntermediateStates(StateMachine stateMachine) {
-		EList<Vertex> intermediateStates = new BasicEList<Vertex>();
-		for (Vertex state : getStates(stateMachine)) {
-			if (!isInitialState(state) && !isFinalState(state)) {
-				intermediateStates.add(state);
-			}
-		}
-		return intermediateStates;
-	}
-
-	public EList<String> getStatesNameList(EList<Vertex> states) {
-		EList<String> names = new BasicEList<String>();
-		for (Vertex state : states) {
-			names.add(state.getName());
-		}
-		return names;
-	}
-
-	public EList<String> getTransitionNameList(EList<Transition> transitions) throws Exception {
-		// logger.debug("getTransitionNameList");
-		EList<String> transNames = new BasicEList<String>();
-		for (Transition trans : transitions) {
-			if (trans.getName() == null) {
-				throw new Exception("In " + trans.containingStateMachine().getQualifiedName()
-						+ ", one transition has name == null.");
-			}
-			// logger.debug("transition Name: " + trans.getName());
-			transNames.add(trans.getName());
-		}
-
-		return transNames;
-	}
-
-	public String getStateMachineName(StateMachine stateMachine) {
-		return stateMachine.getName();
-	}
-
-	public String getTransitionName(Transition transition) {
-		return transition.getName();
-	}
-
-	public Vertex getInitialState(StateMachine stateMachine) {
-		for (Vertex state : getStates(stateMachine)) {
-			if (isInitialState(state)) {
-				return state;
-			}
-		}
-		return null;
-	}
-
-	public EList<Transition> getInitialTransitions(StateMachine stateMachine) throws Exception {
-		Vertex initialState = getInitialState(stateMachine);
-		if (initialState != null) {
-			return initialState.getOutgoings();
-		} else {
-			throw new Exception("The state machine of "+((Class) (stateMachine.getOwner())).getName() + " does not have the initial state.");
-		}
-
-	}
-
-	public EList<Transition> getNonInitialTransitions(StateMachine stateMachine) {
-		EList<Vertex> states = getIntermediateStates(stateMachine);
-		EList<Transition> transitions = new BasicEList<Transition>();
-		for (Vertex state : states) {
-			if (!isInitialState(state)) {
-				transitions.addAll(state.getOutgoings());
-			}
-		}
-		return transitions;
-	}
-
-	public EList<Transition> getOutgoingTransitions(Vertex state) {
-		return state.getOutgoings();
-	}
-		
-	public EList<Transition> getIncomingTransitions(Vertex state) {
-		return state.getIncomings();
-	}
-	
-	public String getSignalEventName(Trigger trigger) {
-
-		if (trigger.getEvent() instanceof SignalEvent) {
-			return ((SignalEvent) trigger.getEvent()).getSignal().getName();
-		}
-
-		return null;
-	}
-
-	public Vertex getTransitionNextState(Transition transition) {
-		return transition.getTarget();
-	}
-
-	public Vertex getTransitionSourceState(Transition transition) {
-		return transition.getSource();
-	}
-
-	public Constraint getTransitionGuard(Transition transition) {
-		return transition.getGuard();
-	}
-
-	public String getTransitionGuardText(Transition transition, String language) {
-		Constraint condition = getTransitionGuard((Transition) transition);
-		if (condition != null) {
-			return getConditionExpression(condition, language);
-		}
-		return null;
-	}
-
-	public OpaqueBehavior getTransitionEffect(Transition transition) {
-		if (transition.getEffect() instanceof OpaqueBehavior) {
-			return (OpaqueBehavior) transition.getEffect();
-		}
-		return null;
-	}
-
-	public EList<String> getTransitionEffectParameters(Transition transition) {
-		OpaqueBehavior effect = getTransitionEffect(transition);
-		EList<String> paramsNames = new BasicEList<String>();
-		for(Parameter par: effect.getOwnedParameters()){
-			paramsNames.add(par.getName());
-		}
-		return paramsNames;
-	}
-	
-	public String getTransitionEffectText(Transition transition, String language) {
-		OpaqueBehavior effect = getTransitionEffect(transition);
-		if (effect != null) {
-			return getBodyForLanguageOfBodyOwner(getTransitionEffect(transition), language);
-		}
-		return null;
-	}
-
-	public Integer getTransitionPriority(Transition transition) {
-		if (isPrioritizedTransition(transition)) {
-			Stereotype prioritizedTransitionStereotype = UMLUtil.getAppliedStereotype(transition,
-					PRIORITIZED_TRANSITION, false);
-			PrioritizedTransition prioritizedTransition = (PrioritizedTransition) transition
-					.getStereotypeApplication(prioritizedTransitionStereotype);
-			return prioritizedTransition.getPriority();
-		}
-		return null;
-	}
-
-	public void setTransitionEffectText(Transition transition, String effectText, String language) {
-		OpaqueBehavior effect = getTransitionEffect(transition);
-		if (effect != null) {
-			effect.getLanguages().add(0, language);
-			effect.getBodies().add(0, effectText);
-		}
-	}
-
-	public String getGuardName(Constraint guard) {
-		return guard.getName();
-	}
-
-	public String getStateName(Vertex state) {
-		return state.getName();
-	}
-
-	public String getEffectName(Behavior effect) {
-		return effect.getName();
-	}
-
-	public boolean isFinalTransition(Transition transition) {
-		return isFinalState(transition.getTarget());
-	}
-
-	public EList<Port> getEvents(StateMachine stateMachine) {
-		EList<Port> eventsPort = getEventPorts(getOwner(stateMachine));
-		return eventsPort;
-	}
-
-	public Constraint createTransitionGuard(Transition transition, String guardName, String guardText,
-			String language) {
-
-		// Create an empty guard for the transition
-		final Constraint guard = transition.createGuard(guardName);
-
-		// Create an opaque expression and assign it to the guard
-		final OpaqueExpression opaqueExpression = UMLFactory.eINSTANCE.createOpaqueExpression();
-		guard.createSpecification(null, null, opaqueExpression.eClass());
-
-		// Fill the opaque expression
-		setOpaqueExpressionTextInUMLConstraint(guard, guardText, language);
-
-		return guard;
-	}
-
-	public OpaqueBehavior createTransitionEffect(Transition transition, String effectName, String effectText,
-			String language) {
-
-		// Create an empty behavior for the transition
-		final OpaqueBehavior opaqueBehavior = (OpaqueBehavior) transition.createEffect(effectName,
-				UMLPackage.eINSTANCE.getOpaqueBehavior());
-
-		// Fill the effect
-		setTransitionEffectText(transition, effectText, language);
-
-		return opaqueBehavior;
-	}
-
-	public EList<Port> getEventPorts(Element umlElement) {
-
-		EList<Port> eventPorts = new BasicEList<Port>();
-
-		if (isComponentInstance(umlElement)) {
-			umlElement = getUmlType((Property) umlElement);
-		}
-
-		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
-			Class umlClass = (Class) umlElement;
-			for (Property umlProperty : umlClass.getOwnedAttributes()) {
-				if (isEventPortAttribute(umlProperty)) {
-					eventPorts.add((Port) umlProperty);
-				}
-			}
-		}
-
-		return eventPorts;
-	}
-
-	public boolean isEventPortAttribute(Property umlProperty) {
-		return ((umlProperty.getType() != null) && (isEventType(umlProperty.getType())));
-	}
-
-	public boolean isEventType(Type type) {
-		return (type instanceof Signal);
-	}
-
-	public EList<Port> getTransitionEvents(Transition transition) {
-		if (!isTransitionWithNoEvent(transition)) {
-			return transition.getTriggers().get(0).getPorts();
-		}
-		return null;
-	}
-
-	public String getPortName(Port port) {
-		return port.getName();
-	}
-
-	public String getAttributeName(Property attribute) {
-		return attribute.getName();
-	}
-
-	/**
-	 * Returns the name of the given parameter
-	 * 
-	 * @param parameter
-	 *            the parameter
-	 * @return the requested name
-	 */
-	public String getParameterName(Parameter parameter) {
-		return parameter.getName();
-	}
-
-	/**
-	 * Returns the owner of the given parameter
-	 * 
-	 * @param parameter
-	 *            the parameter
-	 * @return the owner of the parameter
-	 */
-	public Element getParameterOwner(Parameter parameter) {
-		return parameter.getOwner();
-	}
-
-	/**
-	 * Returns the owner of the given function behavior
-	 * 
-	 * @param function
-	 *            the function behavior
-	 * @return the owner of the function behavior
-	 */
-	public Element getUmlFunctionBehaviorOwner(FunctionBehavior function) {
-		return function.getOwner();
-	}
-
-	public boolean isTransitionWithNoEvent(Transition transition) {
-		return !((transition.getTriggers() != null) && (transition.getTriggers().size() != 0)
-				&& (transition.getTriggers().get(0).getPorts() != null)
-				&& transition.getTriggers().get(0).getPorts().size() != 0);
-
-	}
-
-	public boolean isRealType(Type type) {
-		if (type != null) {
-			return ((type.getQualifiedName().compareTo(REAL_TYPE) == 0)
-					|| (type.getQualifiedName().compareTo(MARTE_REAL_TYPE) == 0));
-		}
-		return false;
-	}
-
-	public boolean isIntegerType(Type type) {
-		if (type != null) {
-			return ((type.getQualifiedName().compareTo(INTEGER_TYPE) == 0)
-					|| (type.getQualifiedName().compareTo(MARTE_INTEGER_TYPE) == 0));
-		}
-		return false;
-	}
-
-	public boolean isStringType(Type type) {
-		if (type != null) {
-			return (type.getQualifiedName().compareTo(STRING_TYPE) == 0);
-		}
-		return false;
-	}
-
-	public Collection<? extends Port> getUmlPortsExceptEvents(Element umlElement, int portDirection) {
-
-		if (isComponentInstance(umlElement)) {
-			umlElement = getUmlType((Property) umlElement);
-		}
-
-		Set<Port> portsArr = new HashSet<Port>();
-		if (isBlock(umlElement)) {
-			portsArr.addAll(getUmlPortsExceptEventsFromClass((Class) umlElement, portDirection));
-		}
-
-		if (isCompType(umlElement) || (isComponentImplementation(umlElement))) {
-			portsArr.addAll(getUmlPortsExceptEventsFromComponent((Component) umlElement, portDirection));
-		}
-
-		return portsArr;
-	}
-
-	private Collection<? extends Port> getUmlPortsExceptEventsFromComponent(Component umlComponent, int portDirection) {
-		Set<Port> ports = new HashSet<Port>();
-
-		for (Port umlPort : umlComponent.getOwnedPorts()) {
-			org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort fp = getFlowPortMarte(umlPort);
-			if ((fp.getDirection().getValue() == portDirection) && (!isEventPortAttribute(umlPort))) {
-				ports.add(umlPort);
-			}
-		}
-		return ports;
-	}
-
-	private Collection<? extends Port> getUmlPortsExceptEventsFromClass(Class umlElement, int portDirection) {
-		Set<Port> ports = new HashSet<Port>();
-		for (Port umlPort : umlElement.getOwnedPorts()) {
-			FlowPort fp = getFlowPort(umlPort);
-			if ((fp.getDirection().getValue() == portDirection) && (!isEventPortAttribute(umlPort))) {
-				ports.add(umlPort);
-			}
-		}
-		return ports;
-	}
-
-	public String getConditionExpression(Constraint condition, String language) {
-		if ((condition.getSpecification() != null) && (condition.getSpecification() instanceof OpaqueExpression)
-				&& ((OpaqueExpression) condition.getSpecification()).getBodies() != null) {
-			return getBodyForLanguageOfBodyOwner((OpaqueExpression) condition.getSpecification(), language);
-		}
-		return null;
-	}
-
-	/**
-	 * Checks if the selected object is a package in the <<SystemView>> branch.
-	 * 
-	 * @param pkg
-	 *            the selected element
-	 * @return true if the package is valid
-	 */
-	public boolean isSystemViewPackage(Element obj) {
-		if (obj instanceof Package) {
-			final Package pkg = (Package) obj;
-			if (pkg.getAppliedStereotype(SYSVIEW) != null) {
-				return true;
-			} else {
-				EList<Package> owningPackages = pkg.allOwningPackages();
-				for (Package owningPackage : owningPackages) {
-					if (owningPackage.getAppliedStereotype(SYSVIEW) != null) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	public EList<Constraint> getRefinementFormalPropertiesAsConstraints(Element component) {
-
-		if (component instanceof Class) {
-			return getRefinementFormalPropertiesAsConstraintsFromClass((Class) component);
-		} else if (component instanceof Property) {
-			return getRefinementFormalPropertiesAsConstraintsFromProperty((Property) component);
-		}
-
-		return null;
-	}
-
-	private EList<Constraint> getRefinementFormalPropertiesAsConstraintsFromClass(Class component) {
-
-		EList<Constraint> formalProperties = new BasicEList<Constraint>();
-
-		for (Constraint umlConstraint : ((Class) component).getOwnedRules()) {
-			if (isRefinementFormalProperty(umlConstraint)) {
-				formalProperties.add(umlConstraint);
-			}
-		}
-
-		return formalProperties;
-	}
-
-	private EList<Constraint> getRefinementFormalPropertiesAsConstraintsFromProperty(Property componentInstance) {
-
-		return getRefinementFormalPropertiesAsConstraintsFromClass((Class) componentInstance.getType());
-	}
-
-	public EList<Constraint> getInterfaceFormalPropertiesAsConstraints(Element component) {
-
-		if (component instanceof Class) {
-			return getInterfaceFormalPropertiesAsConstraintsFromClass((Class) component);
-		} else if (component instanceof Property) {
-			return getInterfaceFormalPropertiesAsConstraintsFromProperty((Property) component);
-		}
-
-		return null;
-	}
-
-	private EList<Constraint> getInterfaceFormalPropertiesAsConstraintsFromClass(Class component) {
-
-		EList<Constraint> formalProperties = new BasicEList<Constraint>();
-
-		for (Constraint umlConstraint : ((Class) component).getOwnedRules()) {
-			if (isInterfaceFormalProperty(umlConstraint)) {
-				formalProperties.add(umlConstraint);
-			}
-		}
-
-		return formalProperties;
-	}
-
-	private EList<Constraint> getInterfaceFormalPropertiesAsConstraintsFromProperty(Property componentInstance) {
-
-		return getInterfaceFormalPropertiesAsConstraintsFromClass((Class) componentInstance.getType());
-	}
-
-	public boolean isFormalProperty(Element umlConstraint) {
-		if (umlConstraint instanceof Constraint) {
-			return UMLUtil.getAppliedStereotype(umlConstraint, FORMAL_PROP, false) != null;
-		}
-		return false;
-	}
-
-	public boolean isInterfaceFormalProperty(Element umlConstraint) {
-		return (isFormalProperty(umlConstraint)
-				&& (((Constraint) umlConstraint).getVisibility() == VisibilityKind.PUBLIC_LITERAL));
-	}
-
-	public boolean isRefinementFormalProperty(Element umlConstraint) {
-		return (isFormalProperty(umlConstraint)
-				&& (((Constraint) umlConstraint).getVisibility() == VisibilityKind.PRIVATE_LITERAL));
-	}
-
-	/**
-	 * Returns the list of Macro Definitions in the given element, as UML
-	 * Constraints.
-	 * 
-	 * @param umlElement
-	 *            the Element to analyze
-	 * @return the list of Macro Definitions as UML Constraints
-	 */
-	public EList<Constraint> getMacroDefinitionsAsUMLConstraints(Element umlElement) {
-		EList<Constraint> constraints = new BasicEList<Constraint>();
-
-		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
-			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
-				if (isMacroDefinition(umlConstraint)) {
-					constraints.add((Constraint) umlConstraint);
-				}
-			}
-		}
-
-		if (isComponentInstance(umlElement)) {
-			constraints.addAll(getMacroDefinitionsAsUMLConstraints(getUmlType((Property) umlElement)));
-		}
-
-		return constraints;
-	}
-
-	/**
-	 * Checks if the given element is a Macro Definition.
-	 * 
-	 * @param umlConstraint
-	 *            the constraint
-	 * @return true if the given element is a Macro Definition
-	 */
-	public boolean isMacroDefinition(Element umlConstraint) {
-		if (umlConstraint instanceof Constraint) {
-			return UMLUtil.getAppliedStereotype(umlConstraint, MACRO_DEFINITION, false) != null;
-		}
-		return false;
-	}
-
-	public String getConstraintQualifiedName(Constraint formalProperty) {
-		if (formalProperty != null) {
-			return ((Constraint) formalProperty).getQualifiedName();
-		}
-		return null;
-	}
-
-	public String getConstraintName(Constraint constraint) {
-		if (constraint != null) {
-			return ((Constraint) constraint).getName();
-		}
-		return null;
-	}
-
-	public FormalProperty getFormalProperty(Constraint umlConstraint) {
-		Stereotype formalPropertyStereotype = UMLUtil.getAppliedStereotype(umlConstraint, FORMAL_PROP, false);
-		return (FormalProperty) umlConstraint.getStereotypeApplication(formalPropertyStereotype);
-	}
-
-	public boolean isDelegationConstraint(Element umlProperty) {
-		return ((umlProperty instanceof Constraint)
-				&& (UMLUtil.getAppliedStereotype(umlProperty, DELEGATION_CONST, false) != null));
-	}
-
-	public EList<Constraint> getDelegationConstraintsAsUMLConstraints(Element umlElement) {
-		EList<Constraint> constraints = new BasicEList<Constraint>();
-
-		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
-			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
-				if (isDelegationConstraint(umlConstraint)) {
-					constraints.add((Constraint) umlConstraint);
-				}
-			}
-		}
-
-		if (isComponentInstance(umlElement)) {
-			constraints.addAll(getDelegationConstraintsAsUMLConstraints(getUmlType((Property) umlElement)));
-		}
-
-		return constraints;
-	}
-
-	public EList<FunctionBehavior> getUmlFunctionBehaviors(Element umlElement) {
-
-		EList<FunctionBehavior> functionBehaviours = null;
-
-		if (isComponentInstance((Element) umlElement)) {
-			umlElement = ((Property) umlElement).getType();
-		}
-
-		if (umlElement instanceof Class) {
-			Class umlClass = (Class) umlElement;
-			EList<Behavior> behaviours = umlClass.getOwnedBehaviors();
-			for (Behavior behavior : behaviours) {
-				if (behavior instanceof FunctionBehavior) {
-					if (functionBehaviours == null) {
-						functionBehaviours = new BasicEList<FunctionBehavior>();
-					}
-					functionBehaviours.add((FunctionBehavior) behavior);
-				}
-			}
-		}
-
-		return functionBehaviours;
-	}
-
-	/**
-	 * Returns the name of the given function behavior
-	 * 
-	 * @param function
-	 *            the function behavior
-	 * @return the requested name
-	 */
-	public String getUmlFunctionBehaviorName(FunctionBehavior uninterpretedFunction) {
-		return uninterpretedFunction.getName();
-	}
-
-	public Type getUmlFunctionBehaviorOutputType(FunctionBehavior uninterpretedFunction) {
-		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
-				return parameter.getType();
-			}
-		}
-		return null;
-	}
-
-	public EList<Type> getUmlFunctionBehaviorInputTypes(FunctionBehavior uninterpretedFunction) {
-
-		EList<Type> inputTypes = new BasicEList<Type>();
-
-		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
-				inputTypes.add(parameter.getType());
-			}
-		}
-		return inputTypes;
-	}
-
-	/**
-	 * Returns the input parameters of the given function behavior
-	 * 
-	 * @param function
-	 *            the function behavior
-	 * @return the input parameters
-	 */
-	public EList<Parameter> getUmlFunctionBehaviorInputParameters(FunctionBehavior function) {
-		final EList<Parameter> inputParameters = new BasicEList<Parameter>();
-
-		// Loop on all the parameters to find the input ones
-		final EList<Parameter> parameters = function.getOwnedParameters();
-		for (Parameter parameter : parameters) {
-			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
-				inputParameters.add(parameter);
-			}
-		}
-		return inputParameters;
-	}
-
-	public Parameter getUmlFunctionBehaviorOutputParameter(FunctionBehavior function) {
-		// Loop on all the parameters to find the input ones
-		final EList<Parameter> parameters = function.getOwnedParameters();
-		for (Parameter parameter : parameters) {
-			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
-				return (parameter);
-			}
-		}
-		return null;
-	}
-
-	public Object getParameterType(Parameter parameter) {
-		return parameter.getType();
-	}
-
-	public String[] getComponentInstanceMultiplicity(Property component) throws Exception {
-		if (isComponentInstance(component)) {
-			return getAttributeMultiplicity(component);
-		}
-
-		throw new Exception("" + component.getName() + " is not a component instance");
-
-	}
-
-	public String[] getAttributeMultiplicity(MultiplicityElement attribute) {
-		// logger.debug("getAttributeMultiplicity");
-
-		ValueSpecification upperValueSpecification = attribute.getUpperValue();
-		ValueSpecification lowerValueSpecification = attribute.getLowerValue();
-
-		String upperValue = getValueSpecificationValue(upperValueSpecification);
-		String lowerValue = getValueSpecificationValue(lowerValueSpecification);
-
-		String[] boundaries = { lowerValue, upperValue };
-		return boundaries;
-	}
-
-	public String getValueSpecificationValue(ValueSpecification valueSpecification) {
-
-		String strValue = null;
-		Object value = null;
-		if (valueSpecification instanceof LiteralInteger) {
-			// logger.debug("instanceof LiteralInteger");
-			value = ((LiteralInteger) valueSpecification).getValue();
-
-		} else if (valueSpecification instanceof LiteralUnlimitedNatural) {
-			// logger.debug("instanceof LiteralUnlimitedNatural");
-			value = ((LiteralUnlimitedNatural) valueSpecification).getValue();
-
-		} else if (valueSpecification instanceof LiteralString) {
-			// logger.debug("instanceof LiteralString");
-			value = ((LiteralString) valueSpecification).getValue();
-		}
-
-		logger.debug("value: " + value);
-
-		strValue = String.valueOf(value);
-
-		if (strValue == "null") {
-			strValue = null;
-		}
-
-		// logger.debug("getValueSpecificationValue: " + strValue);
-		return strValue;
-	}
-
-	/**
-	 * Adds a connector to the given element.
-	 * 
-	 * @param owner
-	 *            the owner element
-	 * @param connector
-	 *            the conne
-	 */
-	public void addConnector(Class owner, Connector connector) {
-
-		// Add the new connector to the list
-		owner.getOwnedConnectors().add(connector);
-	}
-
-	/**
-	 * Creates a connector, but doesn't add it to the owner.
-	 * 
-	 * @param owner
-	 *            the owner element
-	 * @return the created Connector
-	 */
-	public Connector createConnector(String connectorName) {
-
-		Connector connector = UMLFactory.eINSTANCE.createConnector();
-		connector.setName(connectorName);
-
-		logger.debug("\n\nCreated " + connectorName + " Connector\n\n");
-		return connector;
-	}
-
-	/**
-	 * Creates an end to the given connector.
-	 * 
-	 * @param connector
-	 *            the owner Connector
-	 * @param sourceOwner
-	 *            the component instance owning the port
-	 * @param sourcePort
-	 *            the port to be connected
-	 * @return
-	 */
-	public ConnectorEnd createConnectorEnd(Connector connector, Property sourceOwner, ConnectableElement sourcePort) {
-		final ConnectorEnd end = connector.createEnd();
-
-		end.setRole(sourcePort);
-		end.setPartWithPort(sourceOwner);
-		return end;
-	}
-
-	public Parameter createFunctionBehaviorParameter(FunctionBehavior owner, String parameterName, Type parameterType,
-			String[] multiplicity, boolean isInput) {
-
-		logger.debug("\n\n\n Creating functionBehaviorParameter " + parameterName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final Parameter parameter = owner.createOwnedParameter(parameterName, parameterType);
-		parameter.setDirection(isInput ? ParameterDirectionKind.IN_LITERAL : ParameterDirectionKind.OUT_LITERAL);
-
-		setAttributeMultiplicity(parameter, multiplicity);
-
-		logger.debug("\n\nCreated " + parameterName + " functionBehaviorParameter\n\n");
-		return parameter;
-	}
-
-	public Object clone(Object original) {
-		EObject context = (EObject) original;
-		EcoreUtil.Copier copier = new EcoreUtil.Copier();
-		EObject copy = copier.copy(context);
-		copier.copyReferences();
-		return copy;
-	}
-
-	public Constraint createFormalProperty(final Namespace formalPropertyOwner, String formalPropertyName) {
-
-		// Contract contract = getContract(umlContract);
-		// final String formalPropertyName = prefix_name + "_" +
-		// umlContract.getName();
-		final String propertyName = formalPropertyName;
-
-		/*
-		 * TransactionalEditingDomain domain =
-		 * TransactionUtil.getEditingDomain(formalPropertyOwner);
-		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
-		 * 
-		 * @Override protected void doExecute() {
-		 */
-		Constraint umlNewConstraint = formalPropertyOwner.createOwnedRule(propertyName);
-		UMLUtils.applyStereotype(umlNewConstraint, FORMAL_PROP);
-		/*
-		 * } });
-		 */
-		return formalPropertyOwner.getOwnedRule(propertyName);
-
-	}
-
-	/**
-	 * Creates an empty FunctionBehavior belonging to the given owner
-	 * 
-	 * @param owner
-	 *            the owner class of the functionBehavior
-	 * @param functionBehaviorName
-	 *            the name of the functionBehavior
-	 * @return the newly created FunctionBehavior
-	 */
-	public FunctionBehavior createFunctionBehavior(Class owner, String functionBehaviorName) {
-
-		logger.debug("\n\n\n Creating functionBehavior " + functionBehaviorName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final FunctionBehavior functionBehavior = (FunctionBehavior) owner.createOwnedBehavior(functionBehaviorName,
-				UMLPackage.eINSTANCE.getFunctionBehavior());
-
-		logger.debug("\n\nCreated " + functionBehaviorName + " FunctionBehavior\n\n");
-		return functionBehavior;
-	}
-
-	/**
-	 * Creates a PrioritizedTransition and sets it the given priority.
-	 * 
-	 * @param transition
-	 *            the Transition to be stereotyped
-	 * @param priority
-	 *            the priority to assign
-	 */
-	public void createPrioritizedTransition(Transition transition, Integer priority) {
-		final Stereotype prioritizedTransitionStereotype = findStereotype(transition.getNearestPackage(),
-				PRIORITIZED_TRANSITION);
-		if (prioritizedTransitionStereotype != null) {
-			if (!transition.isStereotypeApplied(prioritizedTransitionStereotype)) {
-				transition.applyStereotype(prioritizedTransitionStereotype);
-			}
-			final PrioritizedTransition prioritizedTransition = (PrioritizedTransition) transition
-					.getStereotypeApplication(prioritizedTransitionStereotype);
-			prioritizedTransition.setPriority(priority);
-		}
-	}
-
-	/**
-	 * Returns the input Parameters of the given FunctionBehavior
-	 * 
-	 * @param owner
-	 *            the FunctionBehavior to analyze
-	 * @return the list of input Parameters
-	 */
-	public EList<Parameter> getOwnedInputParameters(FunctionBehavior owner) {
-		EList<Parameter> inputParameters = new BasicEList<Parameter>();
-
-		for (Parameter parameter : owner.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
-				inputParameters.add(parameter);
-			}
-		}
-		return inputParameters;
-	}
-
-	public Parameter createFunctionBehaviorParameter(FunctionBehavior owner, Type parameterType, String[] multiplicity,
-			boolean isInput) {
-
-		// Create the name
-		String parameterName = null;
-		if (isInput) {
-			parameterName = DEFAULT_PARAMETER_IN_NAME + (getOwnedInputParameters(owner).size() + 1); // Incremental
-			// name
-		} else {
-			parameterName = DEFAULT_PARAMETER_OUT_NAME; // There could be only
-														// one
-			// output
-		}
-
-		return createFunctionBehaviorParameter(owner, parameterName, parameterType, multiplicity, isInput);
-	}
-
-	public org.eclipse.uml2.uml.Port createNonStaticPort(Class owner, String portName, Type portType,
-			String[] multiplicityBounds, boolean isInput, Stereotype flowportStereotype) {
-		org.eclipse.uml2.uml.Port umlPort = UMLFactory.eINSTANCE.createPort();
-		umlPort.setName(portName);
-		umlPort.setType(portType);
-		owner.getOwnedPorts().add(umlPort);
-		umlPort.applyStereotype(flowportStereotype);
-		umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
-		FlowPort flowPort = (FlowPort) umlPort.getStereotypeApplication(flowportStereotype);
-		flowPort.setDirection(isInput ? FlowDirection.IN : FlowDirection.OUT);
-
-		setAttributeMultiplicity(umlPort, multiplicityBounds);
-
-		// This version is nicer but a little slower
-		// org.eclipse.uml2.uml.Port umlPort = owner.createOwnedPort(portName,
-		// portType);
-		// Stereotype stereotype = UMLUtils.applyStereotype(umlPort, FLOWPORT);
-		// umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
-		// FlowPort flowPort = (FlowPort)
-		// umlPort.getStereotypeApplication(stereotype);
-		// flowPort.setDirection(isInput? FlowDirection.IN: FlowDirection.OUT);
-		logger.debug("\n\nCreated " + portName + " Port\n\n");
-		return umlPort;
-	}
-
-	public org.eclipse.uml2.uml.Port createStaticPort(Class owner, String portName, Type portType,
-			String[] multiplicityBounds, Stereotype flowPortStereotype) {
-
-		org.eclipse.uml2.uml.Port umlPort = UMLFactory.eINSTANCE.createPort();
-		umlPort.setName(portName);
-		umlPort.setType(portType);
-		owner.getOwnedPorts().add(umlPort);
-		umlPort.applyStereotype(flowPortStereotype);
-		umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
-		FlowPort flowPort = (FlowPort) umlPort.getStereotypeApplication(flowPortStereotype);
-		flowPort.setDirection(FlowDirection.INOUT);
-		umlPort.setIsStatic(true);
-
-		setAttributeMultiplicity(umlPort, multiplicityBounds);
-
-		return umlPort;
-	}
-
-	public RedefinableTemplateSignature createRedefinableTemplateSignature(Class owner, String parameterName) {
-		RedefinableTemplateSignature redefinableTemplateSignature = UMLFactory.eINSTANCE
-				.createRedefinableTemplateSignature();
-		redefinableTemplateSignature.setName("redefinableTemplateSignature");
-
-		TemplateParameter templateParameter = UMLFactory.eINSTANCE.createTemplateParameter();
-		redefinableTemplateSignature.getOwnedParameters().add(templateParameter);
-
-		LiteralString stringParameter = UMLFactory.eINSTANCE.createLiteralString();
-		stringParameter.setName(parameterName);
-		stringParameter.setOwningTemplateParameter(templateParameter);
-		stringParameter.setTemplateParameter(templateParameter);
-		stringParameter.setValue("0");
-		templateParameter.setDefault(stringParameter);
-		templateParameter.setParameteredElement(stringParameter);
-
-		owner.setOwnedTemplateSignature(redefinableTemplateSignature);
-
-		return redefinableTemplateSignature;
-	}
-
-	public String createDelegationConstraintText(String variableIdTextName, String constraintText,
-			String iterConditionText) {
-
-		final StringBuffer delegationText = new StringBuffer();
-
-		delegationText.append(variableIdTextName + " := " + constraintText);
-		if (iterConditionText != null && iterConditionText.length() > 0) {
-			delegationText.append(" " + iterConditionText);
-		}
-		return delegationText.toString();
-	}
-
-	public Connector getExistingConnector(EList<Connector> connectors, String variablePortOwner,
-			String variablePortName, String constraintPortOwner, String constraintPortName) {
-
-		// Loop on all the connectors to find one with same values
-		for (Connector connector : connectors) {
-			final EList<ConnectorEnd> ends = connector.getEnds();
-			if (ends.size() == 2) {
-
-				// Check the first end
-				final Property sourceOwner = ends.get(0).getPartWithPort(); // Should
-																			// be
-																			// the
-																			// owner
-																			// of
-																			// the
-																			// port
-				final org.eclipse.uml2.uml.Port sourcePort = (org.eclipse.uml2.uml.Port) ends.get(0).getRole(); // Should
-																												// be
-																												// the
-																												// port
-
-				if (sourcePort.getName().equals(constraintPortName)) {
-					if (sourceOwner != null && sourceOwner.getName().equals(constraintPortOwner)) {
-					} else if (sourceOwner == null && constraintPortOwner == null) {
-					} else {
-						continue;
-					}
-				} else {
-					continue;
-				}
-
-				// One end is correct, go on with the second
-				final Property targetOwner = ends.get(1).getPartWithPort(); // Should
-																			// be
-																			// the
-																			// owner
-																			// of
-																			// the
-																			// port
-				final org.eclipse.uml2.uml.Port targetPort = (org.eclipse.uml2.uml.Port) ends.get(1).getRole(); // Should
-																												// be
-																												// the
-																												// port
-
-				if (targetPort.getName().equals(variablePortName)) {
-					if (targetOwner != null && targetOwner.getName().equals(variablePortOwner)) {
-					} else if (targetOwner == null && variablePortOwner == null) {
-					} else {
-						continue;
-					}
-				} else {
-					continue;
-				}
-
-				// Connector found
-				return connector;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create a public formal property
-	 * 
-	 * @param owner
-	 *            the owner of the property
-	 * @param assertionName
-	 *            the name of the formal property
-	 * @param assertionText
-	 *            the text of the formal property
-	 * @return the newly created formal property
-	 */
-	public Constraint createInterfaceFormalProperty(Class owner, String assertionName, String assertionText) {
-
-		final Constraint umlConstraint = createFormalProperty(owner, assertionName);
-		final LiteralString newLs = UMLFactory.eINSTANCE.createLiteralString();
-		final ValueSpecification vs = umlConstraint.createSpecification("ConstraintSpec", null, newLs.eClass());
-		umlConstraint.setSpecification(vs);
-
-		setLiteralStringTextInUMLConstraint(umlConstraint, assertionText);
-
-		return umlConstraint;
-	}
-
-	/**
-	 * Create a private formal property
-	 * 
-	 * @param owner
-	 *            the owner of the property
-	 * @param assertionName
-	 *            the name of the formal property
-	 * @param assertionText
-	 *            the text of the formal property
-	 * @return the newly created formal property
-	 */
-	public Constraint createRefinementFormalProperty(Class owner, String assertionName, String assertionText) {
-
-		final Constraint umlConstraint = createFormalProperty(owner, assertionName);
-		final LiteralString newLs = UMLFactory.eINSTANCE.createLiteralString();
-		final ValueSpecification vs = umlConstraint.createSpecification("ConstraintSpec", null, newLs.eClass());
-		umlConstraint.setSpecification(vs);
-		umlConstraint.setVisibility(VisibilityKind.PRIVATE_LITERAL);
-
-		setLiteralStringTextInUMLConstraint(umlConstraint, assertionText);
-
-		return umlConstraint;
-	}
-
-	public void setTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText,
-			final String language) {
-
-		logger.debug("saveFormalProperty: " + formalPropertyText);
-		// Constraint umlConstraint =
-		// formalProperty.getBase_Constraint();
-		if (umlConstraint.getSpecification() instanceof LiteralString) {
-			setLiteralStringTextInUMLConstraint(umlConstraint, formalPropertyText);
-		} else if (umlConstraint.getSpecification() instanceof OpaqueExpression) {
-			setOpaqueExpressionTextInUMLConstraint(umlConstraint, formalPropertyText, language);
-
-		}
-	}
-
-	public void setLiteralStringTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText) {
-		/*
-		 * TransactionalEditingDomain domain =
-		 * TransactionUtil.getEditingDomain(umlConstraint);
-		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
-		 * 
-		 * @Override protected void doExecute() {
-		 */
-		if (umlConstraint.getSpecification() instanceof LiteralString) {
-			LiteralString litString = (LiteralString) umlConstraint.getSpecification();
-			litString.setValue(formalPropertyText);
-			umlConstraint.setSpecification(litString);
-		}
-		/*
-		 * } });
-		 */
-	}
-
-	public void setOpaqueExpressionTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText,
-			final String language) {
-		/*
-		 * TransactionalEditingDomain domain =
-		 * TransactionUtil.getEditingDomain(umlConstraint);
-		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
-		 * 
-		 * @Override protected void doExecute() {
-		 */
-		if (umlConstraint.getSpecification() instanceof OpaqueExpression) {
-			// logger.debug("saveFormalProperty OpaqueExpression");
-			OpaqueExpression opaqueExpr = (OpaqueExpression) umlConstraint.getSpecification();
-			// opaqueExpr.getLanguages().
-			setOpaqueExpressionBodyForLanguage(opaqueExpr, language, formalPropertyText);
-
-		}
-		/*
-		 * } });
-		 */
-	}
-
-	private void setOpaqueExpressionBodyForLanguage(org.eclipse.uml2.uml.OpaqueExpression opaqueExpression,
-			String language, String body) {
-		// checks both lists by size
-		checkAndCorrectListsOfBodyOwner(opaqueExpression);
-		// checks if language exists, if not, creates one
-		if (!opaqueExpression.getLanguages().contains(language)) {
-			// opaqueExpression.getLanguages().add(0, language);
-			// opaqueExpression.getBodies().add(0, body);
-			opaqueExpression.getLanguages().add(language);
-			opaqueExpression.getBodies().add(body);
-		} else {
-			// retrieve the index of the given language in the opaque Expression
-			int index = opaqueExpression.getLanguages().indexOf(language);
-			// sets the body at the given index in the list of bodies.
-			opaqueExpression.getBodies().set(index, body);
-		}
-	}
-
-	/**
-	 * Deletes an element from the model.
-	 * 
-	 * @param element
-	 *            the element to remove
-	 * @throws Exception
-	 */
-	public void deleteElementInTheModel(NamedElement element) throws Exception {
-
-		// Give the focus to the ModelExplorerView
-		ModelExplorerView modelExplorerView = getModelExplorerView();
-		modelExplorerView.setFocus();
-
-		// Select the requested element
-		List<Object> elements = new ArrayList<Object>();
-		elements.add(element);
-		modelExplorerView.revealSemanticElement(elements);
-
-		IHandler deleteHandler = getActiveHandlerFor(IWorkbenchCommandConstants.EDIT_DELETE);
-		deleteHandler.execute(new ExecutionEvent());
-	}
-
-	/**
-	 * Returns the handler for the given command.
-	 * 
-	 * @param commandId
-	 *            the command
-	 * @return the handler
-	 */
-	private IHandler getActiveHandlerFor(final String commandId) {
-		final ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-				.getService(ICommandService.class);
-		commandService.refreshElements(commandId, null);
-		final Command cmd = commandService.getCommand(commandId);
-		return cmd.getHandler();
-	}
-
-	// Needed to bring out a reference from the inner class...
-	ModelExplorerView modelExplorerView;
-
-	/**
-	 * Returns the ModelExplorerView.
-	 * 
-	 * @return
-	 */
-	private ModelExplorerView getModelExplorerView() {
-
-		Display.getDefault().syncExec(new Runnable() {
-
-			public void run() {
-				final IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-
-				// we look for the modelexplorer
-				IViewPart modelexplorer;
-				try {
-					modelexplorer = activeWorkbenchWindow.getActivePage().showView(ModelExplorerPageBookView.VIEW_ID);
-				} catch (PartInitException ex) {
-					ex.printStackTrace(System.out);
-					return;
-				}
-				final ModelExplorerPageBookView view = (ModelExplorerPageBookView) modelexplorer;
-				final ModelExplorerPage page = (ModelExplorerPage) view.getCurrentPage();
-				final IViewPart viewer = page.getViewer();
-				modelExplorerView = (ModelExplorerView) viewer;
-			}
-		});
-		return modelExplorerView;
-	}
-
-	/**
-	 * Removes an element from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the element to remove
-	 */
-	public void removeElement(EList<Class> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a function behavior from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the function behavior to remove
-	 */
-	public void removeFunctionBehavior(EList<Behavior> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a FunctionBehavior parameter from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the function behavior parameter to
-	 *            remove
-	 */
-	public void removeFunctionBehaviorParameter(EList<Parameter> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a formal property from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the formal property to remove
-	 */
-	public void removeFormalProperty(EList<Constraint> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a named element from the given list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the element to remove
-	 */
-	public void removeNamedElement(EList<?> members, String qualifiedElement) {
-		for (Object object : members) {
-			NamedElement element = (NamedElement) object;
-			if (element.getQualifiedName().equals(qualifiedElement)) {
-				try {
-					// ((Element) element).destroy(); //TODO: investigate this
-					// line!
-					deleteElementInTheModel(element);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-				members.remove(element);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Removes a property from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the property to remove
-	 */
-	public void removeProperty(EList<Property> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a property from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the property to remove
-	 */
-	public void removeConnector(EList<Connector> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a port from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the port to remove
-	 */
-	public void removePort(EList<NamedElement> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	/**
-	 * Removes a Macro Definition from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the macro to remove
-	 */
-	public void removeMacroDefinition(EList<Constraint> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	public Association createUmlAssociation(String subComponentName, Type type, String[] multiplicity, Class owner) {
-
-		final String associationName = DEFAULT_ASSOCIATION_NAME
-				+ (countPackageAssociations(owner.getNearestPackage()) + 1);
-		// I should create an Association between the elements
-		// and not a Component Instance!
-
-		return createAssociation(owner, associationName, subComponentName, type, multiplicity);
-
-	}
-
-	/**
-	 * Returns the number or defined associations for the given package.
-	 * 
-	 * @param pkg
-	 *            the package to analyze
-	 * @return the number of associations found in package
-	 */
-	private int countPackageAssociations(Package pkg) {
-		int counter = 0;
-
-		EList<NamedElement> namedList = pkg.getOwnedMembers();
-		for (NamedElement namedElement : namedList) {
-			if (namedElement instanceof Association) {
-				counter++;
-			}
-		}
-		return counter;
-	}
-
-	/**
-	 * Creates an association between the given owner and element. It will also
-	 * create the relative component instance inside the owner element.
-	 * 
-	 * @param owner
-	 *            the parent Class
-	 * @param elementName
-	 *            the name of the end element
-	 * @param elementType
-	 *            the type of the end element
-	 * @return the created Association
-	 */
-	public Association createAssociation(Class owner, String associationName, String elementName, Type elementType,
-			String[] multiplicity) {
-		logger.debug("createAssociation");
-
-		logger.debug("\n\n\n Creating association " + associationName + " for owner " + owner);
-		logger.debug("elementName = " + elementName + " with type " + elementType.getName() + " [" + multiplicity[0]
-				+ "," + multiplicity[1] + "]");
-		logger.debug("\n\n\n");
-
-		org.eclipse.uml2.uml.Package package_ = owner.getNearestPackage();
-		Association association = (Association) package_.createOwnedType(null, UMLPackage.Literals.ASSOCIATION);
-		Property subComponentInstance = buildAssociationEndInternal(association, elementName, elementType, null, true,
-				(AggregationKind) AggregationKind.get(AggregationKind.COMPOSITE));
-		buildAssociationEndInternal(association, owner.getName().toLowerCase(), owner, null, false,
-				(AggregationKind) AggregationKind.get(AggregationKind.NONE));
-		if (associationName != null) {
-			association.setName(associationName);
-		}
-
-		owner.getOwnedAttributes().add(subComponentInstance);
-
-		// Create the association and adds it to the owning package
-		// the method owner.createAssociation does not allow to set multiplicity
-		// equal to null
-		/*
-		 * final Association association = owner.createAssociation( true,
-		 * AggregationKind.get(AggregationKind.COMPOSITE), elementName, 1, 1,
-		 * elementType, false, AggregationKind.get(AggregationKind.NONE),
-		 * owner.getName().toLowerCase(), 1, 1);
-		 * association.setName(associationName);
-		 */
-		logger.debug("createAssociation done");
-
-		if (!isOneInstance(multiplicity)) {
-			logger.debug("!isOneInstance");
-			setAttributeMultiplicity(subComponentInstance, multiplicity);
-		}
-		// Add SysML Nature on the new Association
-		ElementUtil.addNature(association, SysMLElementTypes.SYSML_NATURE);
-
-		logger.debug("\n\nCreated " + associationName + " Association\n\n");
-		return association;
-	}
-
-	/*
-	 * public static Association createAssociation(Type type, boolean
-	 * end1IsNavigable, AggregationKind end1Aggregation, String end1Name, int
-	 * end1Lower, int end1Upper, Type end1Type, boolean end2IsNavigable,
-	 * AggregationKind end2Aggregation, String end2Name, int end2Lower, int
-	 * end2Upper) { org.eclipse.uml2.uml.Package package_ =
-	 * type.getNearestPackage(); if (package_ == null) { throw new
-	 * IllegalStateException(); } if (end1Aggregation == null) { throw new
-	 * IllegalArgumentException(String.valueOf(end1Aggregation)); } if
-	 * (end2Aggregation == null) { throw new
-	 * IllegalArgumentException(String.valueOf(end2Aggregation)); } Association
-	 * association = (Association) package_.createOwnedType(null,
-	 * UMLPackage.Literals.ASSOCIATION); createAssociationEnd(type, association,
-	 * end1IsNavigable, end1Aggregation, end1Name, end1Lower, end1Upper,
-	 * end1Type); createAssociationEnd(end1Type, association, end2IsNavigable,
-	 * end2Aggregation, end2Name, end2Lower, end2Upper, type); return
-	 * association; }
-	 * 
-	 * protected static Property createAssociationEnd(Class type, Association
-	 * association, boolean isNavigable, AggregationKind aggregation, String
-	 * name, int lower, int upper, Type endType) { EList<Property>
-	 * ownedAttributes = type.getOwnedAttributes(); Property associationEnd =
-	 * type.createOwnedProperty(ownedAttributes == null || !isNavigable ?
-	 * association : type, name, endType, lower, upper);
-	 * associationEnd.setAggregation(aggregation); if (isNavigable) { if
-	 * (ownedAttributes == null) {
-	 * association.getNavigableOwnedEnds().add(associationEnd); } else {
-	 * association.getMemberEnds().add(associationEnd); } } return
-	 * associationEnd; }
-	 */
-
-	private Property buildAssociationEndInternal(final Association assoc, final String name, final Type type,
-			final Integer[] multi, final Boolean navigable, final AggregationKind aggregation) {
-		// The attribute 'targetScope' of an AssociationEnd in UML1.x is no
-		// longer supported in UML2.x
-
-		Property property = UMLFactory.eINSTANCE.createProperty();
-		property.setType((Type) type);
-		property.setAssociation((Association) assoc);
-		if (name != null) {
-			property.setName(name);
-		}
-		if (navigable != null) {
-			property.setIsNavigable(navigable);
-			if (!(Boolean) navigable) {
-				((Association) assoc).getOwnedEnds().add(property);
-			}
-		}
-		if (aggregation != null) {
-			property.setAggregation((AggregationKind) aggregation);
-		}
-
-		if (multi != null) {
-			if (multi[0] != null) {
-				property.setLower(multi[0]);
-			}
-			if (multi[1] != null) {
-				property.setUpper(multi[1]);
-			}
-		}
-
-		return property;
-	}
-
-	private boolean isOneInstance(String[] multiplicityBoundariesAsExpressons) {
-		logger.debug("isOneInstance");
-		return (((multiplicityBoundariesAsExpressons[0] == null) && (multiplicityBoundariesAsExpressons[1] == null))
-				|| (multiplicityBoundariesAsExpressons[0] == "") && (multiplicityBoundariesAsExpressons[1] == ""))
-				|| (isEqualToOne(multiplicityBoundariesAsExpressons[0])
-						&& isEqualToOne(multiplicityBoundariesAsExpressons[1]));
-	}
-
-	private boolean isEqualToOne(String expression) {
-		return isInteger(expression) && (Integer.valueOf(expression) == 1);
-	}
-
-	public static boolean isInteger(String s) {
-		try {
-			Integer.parseInt(s);
-		} catch (NumberFormatException e) {
-			return false;
-		} catch (NullPointerException e) {
-			return false;
-		}
-		// only got here if we didn't return false
-		return true;
-	}
-
-	/**
-	 * Removes a delegation constraint from the list.
-	 * 
-	 * @param members
-	 *            the list of members
-	 * @param qualifiedElement
-	 *            the qualified name of the delegation constraint to remove
-	 */
-	public void removeDelegationConstraint(EList<Constraint> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	public boolean equalMultiplicityBoundaries(String[] newMultiplicityRange, String[] multiplicityRange) {
-		logger.debug("equalMultiplicityBoundaries [0]: " + newMultiplicityRange[0] + " " + multiplicityRange[0]);
-		logger.debug("equalMultiplicityBoundaries [1]: " + newMultiplicityRange[1] + " " + multiplicityRange[1]);
-		boolean equalLowerValue = equals(newMultiplicityRange[0], multiplicityRange[0]);
-		boolean equalUpperValue = equals(newMultiplicityRange[1], multiplicityRange[1]);
-		logger.debug(equalLowerValue + " - " + equalUpperValue);
-		return (equalLowerValue && equalUpperValue);
-
-	}
-
-	private boolean equals(String text1, String text2) {
-		// logger.debug("(text1 == text2): " + (text1 == text2));
-		// logger.debug("text1.equals(text2): "+text1.equals(text2) );
-		return ((text1 == text2) && (text2 == null)) || ((text1 != null) && (text2 != null) && text1.equals(text2));
-	}
-
-	public void setAttributeMultiplicity(MultiplicityElement property, String[] newMultiplicityRange) {
-		logger.debug("setAttributeMultiplicity: " + newMultiplicityRange[0] + " " + newMultiplicityRange[1]);
-		if (newMultiplicityRange[0] != null) {
-			property.setLowerValue(createLiteralStringWithValue(newMultiplicityRange[0]));
-		} else {
-			property.setLowerValue(null);
-		}
-
-		if (newMultiplicityRange[1] != null) {
-			property.setUpperValue(createLiteralStringWithValue(newMultiplicityRange[1]));
-		} else {
-			property.setUpperValue(null);
-		}
-	}
-
-	private LiteralString createLiteralStringWithValue(String value) {
-		LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
-		literalString.setValue(value);
-		return literalString;
-	}
-
-	/**
-	 * Returns the list of Parameter Assumptions of the given element.
-	 * 
-	 * @param umlElement
-	 *            the element to analyze
-	 * @return the list of Parameter Assumptions as Constraints
-	 */
-	public EList<Constraint> getParameterAssumptionsAsConstraintsUml(Element umlElement) {
-		EList<Constraint> constraints = new BasicEList<Constraint>();
-
-		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
-			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
-				if (isParameterAssumptions(umlConstraint)) {
-					constraints.add((Constraint) umlConstraint);
-				}
-			}
-		}
-
-		if (isComponentInstance(umlElement)) {
-			constraints.addAll(getParameterAssumptionsAsConstraintsUml(getUmlType((Property) umlElement)));
-		}
-
-		return constraints;
-	}
-
-	/**
-	 * Checks if the given element is a Parameter Assumptions.
-	 * 
-	 * @param umlConstraint
-	 *            the constraint
-	 * @return true if the given element is a Parameter Assumptions.
-	 */
-	public boolean isParameterAssumptions(Element umlConstraint) {
-		if (umlConstraint instanceof Constraint) {
-			return UMLUtil.getAppliedStereotype(umlConstraint, PARAMETER_ASSUMPTIONS, false) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * Creates a new Parameter Assumptions element.
-	 * 
-	 * @param parameterAssumptionsExpression
-	 *            the expression
-	 * @param owner
-	 *            the owning element
-	 * @param parameterAssumptionsStereotype
-	 *            the stereotype to apply
-	 * @return
-	 */
-	public Constraint createParameterAssumptions(String parameterAssumptionsExpression, Class owner,
-			Stereotype parameterAssumptionsStereotype) {
-		final int numParameterAssumptions = getParameterAssumptionsAsConstraintsUml(owner).size();
-		final String parameterAssumptionsName = DEFAULT_PAR_ASSUMPTION_PREFIX + (numParameterAssumptions + 1);
-
-		logger.debug("\n\n\n Creating Parameter Assumption " + parameterAssumptionsName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final Constraint newUMLConstraint = owner.createOwnedRule(parameterAssumptionsName);
-		newUMLConstraint.applyStereotype(parameterAssumptionsStereotype);
-
-		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
-		literalString.setName(DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME);
-		literalString.setValue(parameterAssumptionsExpression);
-		newUMLConstraint.setSpecification(literalString);
-
-		logger.debug("\n\nCreated " + parameterAssumptionsName + " Parameter Assumption\n\n");
-		return newUMLConstraint;
-	}
-
-	/* Should be no more used */
-	public Element createUmlConstraint(Class owner, String parameterAssumptionsText) {
-		int numParameterAssumptions = getParameterAssumptionsAsConstraintsUml(owner).size();
-		String parameterAssumptionsName = DEFAULT_PAR_ASSUMPTION_PREFIX + (numParameterAssumptions + 1);
-
-		logger.debug("\n\n\n Creating constraint " + parameterAssumptionsName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final Constraint newUMLConstraint = owner.createOwnedRule(parameterAssumptionsName);
-		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
-		literalString.setName(DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME);
-		literalString.setValue(parameterAssumptionsText);
-		newUMLConstraint.setSpecification(literalString);
-
-		logger.debug("\n\nCreated " + parameterAssumptionsName + " Constraint\n\n");
-		return newUMLConstraint;
-	}
-
-	/**
-	 * Returns the Constraint associated to the ParameterAssumptions with the
-	 * given expression
-	 * 
-	 * @param parameterAssumptionsExpression
-	 *            the expression to find
-	 * @param owner
-	 *            the owning element
-	 * @return the UML Constraint found
-	 */
-	public Constraint getParameterAssumptionsFromExpression(String parameterAssumptionsExpression, Class owner) {
-		for (Constraint umlConstraint : ((Class) owner).getOwnedRules()) {
-			if (isParameterAssumptions(umlConstraint)
-					&& getConstraintBodyStr(umlConstraint, null).equals(parameterAssumptionsExpression)) {
-				return umlConstraint;
-			}
-		}
-		return null;
-	}
-
-	public void removeParameterAssumptions(EList<Constraint> members, String qualifiedElement) {
-		removeNamedElement(members, qualifiedElement);
-	}
-
-	public String[] getUmlFunctionBehaviorOutputMultiplicity(FunctionBehavior uninterpretedFunction) {
-		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
-				return getAttributeMultiplicity(parameter);
-			}
-		}
-		return null;
-	}
-
-	public EList<String[]> getUmlFunctionBehaviorInputMultiplicities(FunctionBehavior uninterpretedFunction) {
-		EList<String[]> inputMultiplicities = new BasicEList<String[]>();
-
-		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
-				inputMultiplicities.add(getAttributeMultiplicity(parameter));
-			}
-		}
-		return inputMultiplicities;
-	}
-
-	/**
-	 * Returns the properties of the component that are only local to it.
-	 * 
-	 * @param component
-	 * @return
-	 */
-	public EList<Property> getLocalProperties(Element component) {
-		final EList<Property> localProperties = new BasicEList<Property>();
-
-		if (isComponentInstance(component)) {
-			component = getUmlType((Property) component);
-		}
-
-		if (isBlock(component) || (isCompType(component) || (isComponentImplementation(component)))) {
-			final Class umlClass = (Class) component;
-			final EList<Property> attributes = umlClass.getOwnedAttributes();
-			for (final Property umlProperty : attributes) {
-				if (umlProperty != null && !isComponentInstance(umlProperty) && !isPort(umlProperty)
-						&& !ContractEntityUtil.getInstance().isContractProperty(umlProperty)) {
-					localProperties.add(umlProperty);
-				}
-			}
-		}
-		return localProperties;
-	}
-
-	/**
-	 * Returns the name of a local property.
-	 * 
-	 * @param property
-	 *            the property
-	 * @return the property name
-	 */
-	public String getLocalPropertyName(Property property) {
-		if (property != null) {
-			return property.getName();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the list of enumerations as a single string.
-	 * 
-	 * @param enumeration
-	 *            the enumeration
-	 * @return the list of values
-	 */
-	private String getEnumTypeValuesAsStr(Enumeration enumeration) {
-		final StringJoiner enumValues = new StringJoiner(", ", "[", "]");
-
-		for (final String value : getListValuesForEnumeratorType(enumeration)) {
-			enumValues.add(value);
-		}
-		return enumValues.toString();
-	}
-
-	/**
-	 * Returns the type of a local property, taking care of range and
-	 * enumerations.
-	 * 
-	 * @param property
-	 *            the property
-	 * @return the property type
-	 */
-	public String getLocalPropertyType(Property property) {
-		if (property != null) {
-			final Type propertyType = property.getType();
-
-			if (propertyType != null) {
-				if (isRangeType(propertyType)) {
-					String[] range = getLowerUpperBoundsForRangeType(propertyType);
-					return propertyType.getName() + " - Range [" + range[0] + " .. " + range[1] + "]";
-				} else if (isEnumerationType(propertyType)) {
-
-					return propertyType.getName() + " - Enum " + getEnumTypeValuesAsStr((Enumeration) propertyType);
-				} else {
-					return propertyType.getName();
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new Macro Definition element.
-	 * 
-	 * @param macroDefinitionName
-	 *            the name of the macro
-	 * @param macroDefinitionExpression
-	 *            the expression
-	 * @param owner
-	 *            the owning element
-	 * @param macroDefinitionStereotype
-	 *            the stereotype to apply
-	 * @return the Constraint element
-	 */
-	public Constraint createMacroDefinition(String macroDefinitionName, String macroDefinitionExpression, Class owner,
-			Stereotype macroDefinitionStereotype) {
-		logger.debug("\n\n\n Creating Macro Definition " + macroDefinitionName + " for owner " + owner);
-		logger.debug("\n\n\n");
-
-		final Constraint newUMLConstraint = owner.createOwnedRule(macroDefinitionName);
-		newUMLConstraint.applyStereotype(macroDefinitionStereotype);
-
-		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
-		literalString.setName(DEFAULT_MACRO_DEFINITION_STRING_NAME);
-		literalString.setValue(macroDefinitionExpression);
-		newUMLConstraint.setSpecification(literalString);
-
-		logger.debug("\n\nCreated " + macroDefinitionName + " Macro Definition\n\n");
-		return newUMLConstraint;
-	}
-
-	/**
-	 * Updates the expression of the given Macro Definition, if needed.
-	 * 
-	 * @param umlConstraint
-	 *            the Macro Definition as Constraint
-	 * @param macroDefinitionExpression
-	 *            the new expression
-	 * @param mapMacroDefinitionsToKeep
-	 *            the map of existing Macro Definitions
-	 */
-	public void updateMacroDefinition(Constraint umlConstraint, String macroDefinitionExpression, String language) {
-
-		// Get the current expression
-		final String constraintExpression = getConstraintBodyStr(umlConstraint, language);
-
-		// If the expression is different, save it, otherwise go on
-		if (!macroDefinitionExpression.equals(constraintExpression)) {
-			setLiteralStringTextInUMLConstraint(umlConstraint, macroDefinitionExpression);
-		}
-	}
-
-	/**
-	 * Returns the System component of the given package, if any.
-	 * 
-	 * @param pkg
-	 *            the package containing the architecture
-	 * @return the System component, or null if any or more than one are found
-	 */
-	public Class getSystemComponent(Package pkg) {
-		boolean found = false;
-		Element systemElement = null;
-
-		if (pkg != null) {
-			final EList<Element> ownedElements = pkg.getOwnedElements();
-			for (Element element : ownedElements) {
-				if (isSystem(element)) {
-					if (!found) {
-						systemElement = element;
-						found = true;
-					} else {
-						return null;
-					}
-				}
-			}
-		}
-		if (found) {
-			return (Class) systemElement;
-		} else {
-			return null;
-		}
-	}
-
-	public EList<String> getParametersListFromInstantiatedArchitectureConfiguration(
-			InstantiatedArchitectureConfiguration instantiatedArchitectureConfiguration) {
-		return instantiatedArchitectureConfiguration.getParameterList();
-	}
-
-	public EList<Operation> getUmlOperations(Element umlElement) {
-
-		if (isComponentInstance((Element) umlElement)) {
-			umlElement = ((Property) umlElement).getType();
-		}
-
-		if (umlElement instanceof Class) {
-			Class umlClass = (Class) umlElement;
-			return umlClass.getOwnedOperations();
-		}
-
-		return null;
-	}
-
-	public EList<Operation> getUmlOperations(Element umlElement, String language) {
-
-		EList<Operation> operations = null;
-
-		if (isComponentInstance((Element) umlElement)) {
-			umlElement = ((Property) umlElement).getType();
-		}
-
-		if (umlElement instanceof Class) {
-			Class umlClass = (Class) umlElement;
-			if (!umlClass.getOwnedOperations().isEmpty()) {
-				operations = new BasicEList<Operation>();
-			}
-			for (Operation operation : umlClass.getOwnedOperations()) {
-				if (getUmlOperationBody(operation, language) != null) {
-					operations.add(operation);
-				}
-			}
-		}
-
-		return operations;
-	}
-
-	public String getUmlOperationName(Operation operation) {
-		return operation.getName();
-	}
-
-	public EList<?> getUmlOperationInputTypes(Operation operation) {
-		EList<Type> inputTypes = new BasicEList<Type>();
-
-		for (Parameter parameter : operation.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
-				inputTypes.add(parameter.getType());
-			}
-		}
-		return inputTypes;
-	}
-
-	public String getUmlOperationBody(Operation operation, String language) {
-		if (!operation.getMethods().isEmpty()) {
-			Behavior behavior = operation.getMethods().get(0);
-			if (behavior instanceof OpaqueBehavior) {
-				return getOpaqueBehaviorBody((OpaqueBehavior) behavior, language);
-			} else if (behavior instanceof FunctionBehavior) {
-				return getFunctionBehaviorBody((FunctionBehavior) behavior, language);
-			}
-		}
-		return null;
-	}
-
-	public Type getUmlOperationOutputType(Operation operation) {
-		for (Parameter parameter : operation.getOwnedParameters()) {
-			if (parameter.getDirection() == ParameterDirectionKind.RETURN_LITERAL) {
-				return parameter.getType();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the value of the 'Body' attribute for the
-	 * <code>FunctionBehavior</code> for a given language.
-	 *
-	 * @param language
-	 *            the language in which the body is written
-	 * @return the value of 'Body' at the index i
-	 */
-	public String getFunctionBehaviorBody(FunctionBehavior functionBehavior, String language) {
-		return getBodyForLanguageOfBodyOwner(functionBehavior, language);
-	}
-
-	/**
-	 * Gets the value of the 'Body' attribute for the
-	 * <code>OpaqueBehavior</code> for a given language.
-	 *
-	 * @param language
-	 *            the language in which the body is written
-	 * @return the value of 'Body' at the index i
-	 */
-	public String getOpaqueBehaviorBody(OpaqueBehavior opaqueBehavior, String language) {
-		return getBodyForLanguageOfBodyOwner(opaqueBehavior, language);
-	}
-
-	/**
-	 * Returns the body for a bodyOwner for the given language
-	 *
-	 * @param bodyOwner
-	 *            the bodyOwner to edit.
-	 * @param language
-	 *            the language in which the body is written
-	 * @return the body for the given language or the empty string if the
-	 *         language was not found
-	 */
-	public String getBodyForLanguageOfBodyOwner(BodyOwner bodyOwner, String language) {
-		String body = null;
-		if (language == null) {
-			if (!bodyOwner.getBodies().isEmpty()) {
-				body = bodyOwner.getBodies().get(0);
-			}
-		} else {
-			// retrieve the index of the given language in the opaque Expression
-			int index = bodyOwner.getLanguages().indexOf(language);
-			if (index != -1) {
-				// language found. return the corresponding body in the bodies
-				// list.
-				// List should be synchronized, ie having the same size, but be
-				// sure...
-				if (index < bodyOwner.getBodies().size()) {
-					body = bodyOwner.getBodies().get(index);
-				}
-			}
-		}
-		return body;
-	}
-
-	/**
-	 * sets the body for a bodyOwner for the given language.
-	 * <p>
-	 * If the language was already defined, it replaces the corresponding body.
-	 * If the language was not already defined, it adds it to the list of
-	 * languages and adds the corresponding body.
-	 * <p>
-	 * A utility method,
-	 * {@link OpaqueExpression#checkAndCorrectLists(org.eclipse.uml2.uml.OpaqueExpression)}
-	 * is used to correct the language and body lists.
-	 *
-	 * @param bodyOwner
-	 *            the opaque expression to edit.
-	 * @param language
-	 *            the language in which the body is written
-	 * @param body
-	 *            the body to save
-	 */
-	public void setBodyForLanguageOfBodyOwner(BodyOwner bodyOwner, String language, String body) {
-		// checks both lists by size
-		checkAndCorrectListsOfBodyOwner(bodyOwner);
-		// checks if language exists, if not, creates one
-		if (!bodyOwner.getLanguages().contains(language)) {
-			bodyOwner.getLanguages().add(language);
-			bodyOwner.getBodies().add(body);
-		} else {
-			// retrieve the index of the given language in the opaque Expression
-			int index = bodyOwner.getLanguages().indexOf(language);
-			// sets the body at the given index in the list of bodies.
-			bodyOwner.getBodies().set(index, body);
-		}
-	}
-
-	/**
-	 * Checks body and languages list of a bodyOwner.
-	 * <p>
-	 * It returns <code>true</code> if both lists have the same size. It returns
-	 * <code>false</code> if one of the list was bigger than the other one. In
-	 * this latter case, one of the list was corrected, ie enough elements where
-	 * added in the list
-	 *
-	 * @param bodyOwner
-	 *            the bodyOwner to check
-	 * @return <code>true</code> if both lists already had the same size,
-	 *         <code>false</code> in other cases.
-	 */
-	private boolean checkAndCorrectListsOfBodyOwner(BodyOwner bodyOwner) {
-		// both lists, languages and bodies, should have the same size
-		final int bodySize = bodyOwner.getBodies().size();
-		final int languageSize = bodyOwner.getLanguages().size();
-		// check both size
-		// if equals, lists are supposed synchronized, it is ok
-		// if less body than languages, add bodies
-		// if more body, add enough languages
-		if (bodySize == languageSize) {
-			return true;
-		} else {
-			final int difference = languageSize - bodySize;
-			if (difference > 0) {
-				// more languages strings than body strings, add enough bodies
-				for (int i = 0; i < difference; i++) {
-					bodyOwner.getBodies().add("");
-				}
-			} else {
-				// more body strings than language strings, add enough languages
-				for (int i = 0; i < (-difference); i++) {
-					bodyOwner.getLanguages().add("");
-				}
-			}
-			// lists had to be modified, return false...
-			return false;
-		}
-	}
-
-	public EList<Property> getBlockTypeAttributes(Class blockAsClass) {
-		EList<Property> attributes = new BasicEList<Property>();
-
-		for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
-			if (!isPort(umlProperty)) {
-				if (isBlockTypeAttribute(umlProperty)) {
-					attributes.add(umlProperty);
-				}
-			}
-		}
-
-		return attributes;
-	}
-
-	public String getAttributeVisibility(Property attribute) {
-		return attribute.getVisibility().getName();
-	}
-
-	public boolean isBlockTypeAttribute(String attributeName, Class blockAsClass) {
-		if (blockAsClass != null) {
-			for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
-				if (!isPort(umlProperty)) {
-					if (isBlockTypeAttribute(umlProperty) && (umlProperty.getName().equals(attributeName))) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	public boolean isBlockTypeAttribute(Property umlProperty) {
-		return (umlProperty.getType() != null) && (isBlock(umlProperty.getType()));
-	}
-
-	/*
-	 * public boolean isConcurrentOperation(String operationName, Class
-	 * blockType) {
-	 * 
-	 * if (blockType != null) { logger.debug("isConcurrentOperation: " +
-	 * operationName + " class: " + blockType.getName()); for (Operation
-	 * operation : blockType.getOperations()) {
-	 * 
-	 * logger.debug("operation.getName(): " + operation.getName());
-	 * logger.debug("operation.getConcurrency(): " +
-	 * operation.getConcurrency());
-	 * logger.debug("CallConcurrencyKind.CONCURRENT_LITERAL: " +
-	 * CallConcurrencyKind.CONCURRENT_LITERAL); logger.
-	 * debug("operation.getConcurrency().getLiteral().equals(CallConcurrencyKind.CONCURRENT_LITERAL) "
-	 * + operation.getConcurrency().getLiteral().equals(CallConcurrencyKind.
-	 * CONCURRENT_LITERAL));
-	 * logger.debug("operation.getName().equals(operationName)) " +
-	 * operation.getName().equals(operationName));
-	 * 
-	 * if (operation.getConcurrency().equals(CallConcurrencyKind.
-	 * CONCURRENT_LITERAL) && (operation.getName().equals(operationName))) {
-	 * logger.debug("TRUE"); return true; } } } return false; }
-	 */
-
-	public Class getBlockType(Package currPackage, String blockName) {
-		PackageableElement element = currPackage.getPackagedElement(blockName);
-
-		if (isBlock(element)) {
-			return (Class) element;
-		}
-
-		return null;
-	}
-
-	public Class getAttributeBlockType(String attributeName, Class block) {
-		// logger.debug("getAttributeBlockType: " + block + " , " +
-		// attributeName);
-		for (Property property : block.getAttributes()) {
-			// logger.debug("property.getName(): " + property.getName());
-			// logger.debug("isBlockTypeAttribute(property): " +
-			// isBlockTypeAttribute(property));
-			if (property.getName().equals(attributeName) && (isBlockTypeAttribute(property))) {
-				// logger.debug("OK!");
-				return (Class) property.getType();
-			}
-		}
-		return null;
-	}
-
-	public Type getOperationType(String operationName, Class block) {
-		final Operation operation = getOperation(operationName, block);
-		if (operation != null) {
-			return getUmlOperationOutputType(operation);
-		}
-		// // logger.debug("getOperationType: " + block + " , " +
-		// operationName);
-		// for (Operation operation : block.getOwnedOperations()) {
-		// // logger.debug("operation.getName(): " + operation.getName());
-		// if (operation.getName().equals(operationName)) {
-		// // logger.debug("OK!");
-		// return getUmlOperationOutputType(operation);
-		// }
-		// }
-		return null;
-	}
-
-	public Operation getOperation(String operationName, Class block) {
-		return block.getOwnedOperation(operationName, null, null);
-		// logger.debug("getOperationType: " + block + " , " + operationName);
-		// for (Operation operation : block.getOwnedOperations()) {
-		// logger.debug("operation.getName(): " + operation.getName());
-		// if (operation.getName().equals(operationName)) {
-		// logger.debug("OK!");
-		// return operation;
-		// }
-		// }
-		// return null;
-	}
-
-	public boolean isAttribute(String attributeName, Class blockAsClass) {
-		if (blockAsClass != null) {
-			Property umlProperty = blockAsClass.getOwnedAttribute(attributeName, null);
-			if ((umlProperty != null) && (!isPort(umlProperty))) {
-				return true;
-			}
-			/*
-			 * for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
-			 * if (umlProperty.getName().equals(attributeName)) { if
-			 * (!isPort(umlProperty)) { return true; } } }
-			 */
-		}
-		return false;
-	}
-
-	public boolean isOperation(String operationName, Class blockAsClass) {
-		if (blockAsClass != null) {
-			Operation umlOperation = blockAsClass.getOwnedOperation(operationName, null, null);
-			if (umlOperation != null) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public boolean containsEnumeration(Package currPackage, boolean searchInNestedPackages) {
-
-		final EList<Type> types = currPackage.getOwnedTypes();
-		for (Type type : types) {
-			if (type instanceof Enumeration) {
-				return true;
-			}
-		}
-
-		if (searchInNestedPackages) {
-			for (Package nestedPackage : currPackage.getNestedPackages()) {
-				if (containsEnumeration(nestedPackage, searchInNestedPackages))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	public Type getAttributeType(String attributeName, Class block) {
-		// logger.debug("getAttribute of block: " + block + " , " +
-		// attributeName);
-		for (Property property : block.getAttributes()) {
-			// logger.debug("property.getName(): " + property.getName());
-			if (property.getName().equals(attributeName)) {
-				// logger.debug("OK!");
-				return property.getType();
-			}
-		}
-		return null;
-	}
-
-	public Type getParameterType(int paramIndex, String methodName, Class retrieveBlockType) {
-		// logger.debug("getParameterType: " + retrieveBlockType + " , " +
-		// methodName + " , " + paramIndex);
-		Operation operation = getOperation(methodName, retrieveBlockType);
-		// logger.debug("getParameterType operation: " + operation);
-		if ((operation != null) //&& (operation.getMethods() != null) && (!operation.getMethods().isEmpty())
-				) {
-
-			if (operation.inputParameters() != null) {
-				EList<Parameter> params = operation.inputParameters();
-				if ((!params.isEmpty())) {
-					Parameter par = params.get(paramIndex);
-					if (par != null) {
-						// logger.debug("getParameterType par: " + par);
-						return par.getType();
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public String getCallEventOperationName(Trigger trigger) {
-		if (trigger.getEvent() instanceof CallEvent) {
-			return ((CallEvent) trigger.getEvent()).getOperation().getName();
-		}
-
-		return null;
-	}
-
-	public Collection<CallEvent> getAllCallEvent(Class currBlock) {
-		Model model = currBlock.getModel();
-		TreeIterator<EObject> allElements = model.eResource().getAllContents();
-		if (allElements != null) {
-			Collection<CallEvent> callEvents = EcoreUtil.getObjectsByType(iterator2Collection(allElements),
-					UMLPackage.eINSTANCE.getCallEvent());
-			return callEvents;
-		}
-		return null;
-	}
-
-	public String getCallEventOperationName(CallEvent callEvent) throws Exception {
-		if (callEvent.getOperation() != null) {
-			return callEvent.getOperation().getName();
-		}
-		throw new Exception("The callEvent " + callEvent.getQualifiedName() + " has no associated operation");
-	}
-
-	public EList<String> getOperationsNames(Class component) {
-		EList<String> operationsNames = new BasicEList<String>();
-		for (Operation operation : component.getOwnedOperations()) {
-			String operationName = operation.getName();
-			operationsNames.add(operationName);
-		}
-		return operationsNames;
-	}
-
-	public EList<String> getAttributesNames(Class component) {
-		EList<String> attributesNames = new BasicEList<String>();
-		for (Property attribute : component.getOwnedAttributes()) {
-			String attributeName = attribute.getName();
-			if (!isPort(attribute)) {
-				attributesNames.add(attributeName);
-			}
-		}
-		return attributesNames;
-	}
-
-	public EList<Parameter> getOperationParameters(String operationName, Class parentClass) {
-		Operation op = parentClass.getOwnedOperation(operationName, null, null);
-		if(op!=null){
-			return op.getOwnedParameters();
-		}
-		return null;
-	}
-
-	public Operation getCallEventOperation(CallEvent callEvent) throws Exception {
-		if (callEvent.getOperation() != null) {
-			return callEvent.getOperation();
-		}
-		throw new Exception("The callEvent " + callEvent.getQualifiedName() + " has no associated operation");
-	}
-
-	public EList<String> getParametersNames(Operation operation) {
-		EList<String> parametersNames = new BasicEList<String>();
-		for(Parameter par: operation.getOwnedParameters()){
-			parametersNames.add(par.getName());
-		}
-		return parametersNames;
-	}
-
+/*******************************************************************************
+ * Copyright (C) 2017 Fondazione Bruno Kessler.
+ * 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:
+ *     Alberto Debiasi - initial API and implementation
+ ******************************************************************************/
+package org.polarsys.chess.contracts.profile.chesscontract.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.TreeSet;
+
+import org.eclipse.uml2.uml.Package;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.ParameterDirectionKind;
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.Namespace;
+//import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.MARTE.MARTE_Annexes.VSL.DataTypes.BoundedSubtype;
+import org.eclipse.papyrus.sysml.portandflows.FlowDirection;
+import org.eclipse.papyrus.sysml.portandflows.FlowPort;
+import org.eclipse.papyrus.sysml.service.types.element.SysMLElementTypes;
+import org.eclipse.papyrus.uml.service.types.utils.ElementUtil;
+import org.eclipse.papyrus.uml.tools.model.UmlModel;
+import org.eclipse.papyrus.uml.tools.model.UmlUtils;
+import org.eclipse.papyrus.uml.tools.utils.UMLUtil;
+import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPage;
+import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
+import org.eclipse.papyrus.views.modelexplorer.ModelExplorerView;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchCommandConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.uml2.uml.AggregationKind;
+import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.BodyOwner;
+import org.eclipse.uml2.uml.CallEvent;
+import org.eclipse.uml2.uml.Class;
+import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Component;
+import org.eclipse.uml2.uml.ConnectableElement;
+import org.eclipse.uml2.uml.Connector;
+import org.eclipse.uml2.uml.ConnectorEnd;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Dependency;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Enumeration;
+import org.eclipse.uml2.uml.EnumerationLiteral;
+import org.eclipse.uml2.uml.FunctionBehavior;
+import org.eclipse.uml2.uml.LiteralInteger;
+import org.eclipse.uml2.uml.LiteralString;
+import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
+import org.eclipse.uml2.uml.Model;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.OpaqueBehavior;
+import org.eclipse.uml2.uml.OpaqueExpression;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Pseudostate;
+import org.eclipse.uml2.uml.PseudostateKind;
+import org.eclipse.uml2.uml.RedefinableTemplateSignature;
+import org.eclipse.uml2.uml.Region;
+import org.eclipse.uml2.uml.Signal;
+import org.eclipse.uml2.uml.SignalEvent;
+import org.eclipse.uml2.uml.StateMachine;
+import org.eclipse.uml2.uml.Stereotype;
+import org.eclipse.uml2.uml.TemplateParameter;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.Trigger;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.UMLFactory;
+//import org.polarsys.chess.contracts.profile.chesscontract.util.ContractEntityUtil;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.ValueSpecification;
+import org.eclipse.uml2.uml.Vertex;
+import org.eclipse.uml2.uml.VisibilityKind;
+import org.eclipse.uml2.uml.resource.UMLResource;
+import org.polarsys.chess.chessmlprofile.ParameterizedArchitecture.InstantiatedArchitectureConfiguration;
+import org.polarsys.chess.chessmlprofile.StateMachines.PrioritizedTransition;
+import org.polarsys.chess.contracts.profile.chesscontract.FormalProperty;
+import org.polarsys.chess.core.util.uml.ResourceUtils;
+import org.polarsys.chess.core.util.uml.UMLUtils;
+
+import eu.fbk.eclipse.standardtools.utils.core.utils.EObjectUtil;
+
+/**
+ * Util class that provides methods to manage SysML/CHESS/MARTE objects.
+ *
+ */
+public class EntityUtil {
+
+	private static final Logger logger = Logger.getLogger(EntityUtil.class);
+
+	public static final String BLOCK = "SysML::Blocks::Block";
+	public static final String SYSTEM = "CHESSContract::System";
+	public static final String FLOW_Port = "SysML::PortAndFlows::FlowPort";
+	private static final String FLOW_Port_MARTE = "MARTE::MARTE_DesignModel::GCM::FlowPort";
+	public static final String BOUNDED_TYPE = "MARTE::MARTE_Annexes::VSL::DataTypes::BoundedSubtype";
+	private static final String COMP_TYPE = "CHESS::ComponentModel::ComponentType";
+	private static final String COMP_IMPL = "CHESS::ComponentModel::ComponentImplementation";
+	private static final String SYSVIEW = "CHESS::Core::CHESSViews::SystemView";
+
+	public static final String INSTANTIATED_ARCHITECTURE_CONFIGURATION = "CHESS::ParameterizedArchitecture::InstantiatedArchitectureConfiguration";
+
+	private static final String INTEGER_TYPE = "PrimitiveTypes::Integer";
+	private static final String STRING_TYPE = "PrimitiveTypes::String";
+	private static final String REAL_TYPE = "PrimitiveTypes::Real";
+	private static final String BOOLEAN_TYPE = "PrimitiveTypes::Boolean";
+
+	private static final String CHESS_CONTINUOUS_TYPE = "CHESSContract::DataTypes::Continuous";
+
+	private static final String MARTE_BOOLEAN_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Boolean";
+	private static final String MARTE_REAL_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Real";
+	private static final String MARTE_INTEGER_TYPE = "MARTE_Library::MARTE_PrimitivesTypes::Integer";
+	private static final String FORMAL_PROP = "CHESSContract::FormalProperty";
+	private static final String FAULTY_STATE_MACHINE = "CHESS::Dependability::ThreatsPropagation::ErrorModel";
+	public static final String DELEGATION_CONST = "CHESSContract::DelegationConstraint";
+
+	public static final String PRIORITIZED_TRANSITION = "CHESS::StateMachines::PrioritizedTransition";
+
+	public static final String MACRO_DEFINITION = "CHESS::Expressions::MacroDefinition";
+	public static final String PARAMETER_ASSUMPTIONS = "CHESS::Expressions::ParameterAssumptions";
+
+	// default names of created objects
+	private static final String DEFAULT_DELEGATION_PREFIX = "DelegConstr_";
+	private static final String DEFAULT_PAR_ASSUMPTION_PREFIX = "ParamAssumption";
+	private static final String DEFAULT_ASSOCIATION_NAME = "association";
+	private static final String DEFAULT_ENUMERATION_NAME = "Enumeration";
+	private static final String DEFAULT_SIGNAL_NAME = "Signal";
+	private static final String DEFAULT_CONNECTOR_NAME = "connector";
+	private static final String DEFAULT_DELEGATION_CONSTRAINT_LITERAL_STRING_NAME = "constraintSpec";
+	private static final String DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME = "constraintSpec";
+	private static final String DEFAULT_MACRO_DEFINITION_STRING_NAME = "constraintSpec";
+	private static final String DEFAULT_PARAMETER_IN_NAME = "parameterIn";
+	private static final String DEFAULT_PARAMETER_OUT_NAME = "parameterOut";
+	private static final String DEFAULT_BOUNDEDTYPE_NAME = "BoundedInteger_";
+
+	private static final String modelExtension = ".di";
+
+	// Library for UML primitive types
+	private Model umlLibrary = null;
+	// Library for CHESS types like continuous
+	private Profile chessContractLibrary = null;
+
+	private static EntityUtil entityUtilInstance;
+
+	public static EntityUtil getInstance() {
+		if (entityUtilInstance == null) {
+			entityUtilInstance = new EntityUtil();
+		}
+		return entityUtilInstance;
+	}
+
+	public IFile getCurrentIFile() throws Exception {
+		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		if (page != null) {
+			IEditorPart editorPart = page.getActiveEditor();
+
+			if (editorPart != null) {
+				IEditorInput editorInput = editorPart.getEditorInput();
+
+				if ((editorInput != null) && (editorInput instanceof IFileEditorInput)) {
+					return ((IFileEditorInput) editorInput).getFile();
+				}
+			}
+		}
+		return null;
+	}
+
+	public void openCurrentModelIntoEditor(IFile file) throws Exception {
+
+		IProject project = file.getProject();
+
+		if (project == null) {
+			throw new Exception("No project associated to the file " + file.getName());
+		}
+
+		// Look inside the resources to find the model file. The extension of
+		// that file should be
+		// standard, but the model name could be different from the project
+		// name.
+		IFile modelFile = null;
+		try {
+			IResource[] resources = project.members();
+			for (IResource iResource : resources) {
+				if (iResource.getName().endsWith(modelExtension) && iResource.getType() == IResource.FILE) {
+					modelFile = (IFile) iResource;
+					break;
+				}
+			}
+		} catch (CoreException e1) {
+			e1.printStackTrace();
+		}
+
+		if (modelFile == null) {
+			throw new Exception("No model found in the project " + project.getName());
+
+		}
+
+		// Open the model file
+		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		try {
+			IDE.openEditor(page, modelFile, true);
+		} catch (PartInitException e) {
+		}
+
+	}
+
+	public Model loadModel(String projectName, String fileName) {
+		IWorkspaceRoot wRoot = ResourcesPlugin.getWorkspace().getRoot();
+		logger.debug("wRoot: " + wRoot);
+
+		IProject proj = wRoot.getProject(projectName);
+
+		return loadModel(proj, fileName);
+	}
+
+	public Model loadModel(IProject proj, String fileName) {
+		IFile file = proj.getFile(fileName);
+		IPath loc = file.getLocation();
+		logger.debug("loc: " + loc);
+		ResourceSet resSet = new ResourceSetImpl();
+		Resource resource = resSet.getResource(URI.createFileURI(loc.toString()), true);
+		Model model = ResourceUtils.getModel(resource);
+		return model;
+	}
+
+	/**
+	 * Loads a package from the given resource.
+	 * 
+	 * @param uri
+	 *            the URI of the resource to load
+	 * @return the retrieved package
+	 */
+	public Package loadPackage(URI uri) {
+		Package package_ = null;
+
+		try {
+			final ResourceSet resourceSet = new ResourceSetImpl();
+			final Resource resource = resourceSet.getResource(uri, true);
+			package_ = (Package) EcoreUtil.getObjectByType(resource.getContents(), UMLPackage.Literals.PACKAGE);
+		} catch (WrappedException we) {
+			logger.error(we.getMessage());
+			System.exit(1);
+		}
+		return package_;
+	}
+
+	/**
+	 * Returns the Type Continuous.
+	 * 
+	 * @return the requested Type
+	 */
+	public Type getContinuousType() {
+
+		if (chessContractLibrary == null) {
+			chessContractLibrary = (Profile) loadPackage(
+					URI.createURI("pathmap://CHESSContract/CHESSContract.profile.uml"));
+		}
+
+		// The Continuous type is defined here:
+		// CHESSContract::DataTypes::Continuous
+		// Get the correct package inside the profile
+		final Package dataTypes = chessContractLibrary.getNestedPackage("DataTypes");
+
+		// Get the correct type
+		final Type type = dataTypes.getOwnedType("Continuous");
+
+		if (type != null) {
+			logger.debug("Type '" + type.getQualifiedName() + "' found.");
+			return type;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the primitive type from the standard primitive library.
+	 * 
+	 * @param name
+	 *            the name of the Type
+	 * @return the requested primitive type
+	 */
+	public Type getPrimitiveType(String name) {
+
+		if (umlLibrary == null) {
+			umlLibrary = (Model) loadPackage(URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI));
+		}
+
+		// Get the correct type from the library
+		final Type type = umlLibrary.getOwnedType(name);
+
+		if (type != null) {
+			logger.debug("Type '" + type.getQualifiedName() + "' found.");
+			logger.debug("Type object'" + type + "' found.");
+			return type;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the delegation constraint with the given specs from a list
+	 * 
+	 * @param delegationConstraints
+	 *            the list of delegation constraints to scan
+	 * @param variable
+	 *            variable part
+	 * @param constraint
+	 *            costraint part
+	 * @return the delegation constraint, if found
+	 */
+	public Constraint getExistingDelegationConstraint(EList<Constraint> delegationConstraints, String variableIdText,
+			String constraintText, String iterConditionText) {
+
+		// Text of the delegation constraint
+		final String formalPropertyText = createDelegationConstraintText(variableIdText, constraintText,
+				iterConditionText);
+
+		// Loop on all the delegation constraints to find one with same text
+		for (Constraint delegationConstraint : delegationConstraints) {
+			final LiteralString specification = (LiteralString) delegationConstraint.getSpecification();
+			if (specification.getValue().equals(formalPropertyText)) {
+				return delegationConstraint;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Return the Parameter with the given speccs if present among a list of
+	 * Parameters
+	 * 
+	 * @param parameters
+	 *            the list of Parameters to scan
+	 * @param type
+	 *            the type of the Parameter
+	 * @param isInput
+	 *            the direction of the Parameter
+	 * @return the Parameter, if found
+	 */
+	public Parameter getExistingFunctionBehaviorParameter(EList<Parameter> parameters, Type functionBehaviourType,
+			boolean isInput) {
+		for (Parameter parameter : parameters) {
+			if (parameter.getType() == functionBehaviourType) {
+				if ((isInput && parameter.getDirection() == ParameterDirectionKind.IN_LITERAL)
+						|| (!isInput && parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL)) {
+					return parameter;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the list of contract refinements associated to a Class
+	 * 
+	 * @param owner
+	 *            the owner Class
+	 * @return the list of contract refinements
+	 */
+	public EList<DataType> getDataTypes(Class owner) {
+		EList<DataType> contractRefinements = new BasicEList<DataType>();
+
+		for (Classifier classifier : owner.getNestedClassifiers()) {
+			if (classifier instanceof DataType) {
+				contractRefinements.add((DataType) classifier);
+			}
+		}
+		return contractRefinements;
+	}
+
+	public org.eclipse.uml2.uml.Port getExistingUmlPort(String portName, EList<NamedElement> existingPorts) {
+		for (Object object : existingPorts) {
+			final org.eclipse.uml2.uml.Port tmpPort = (org.eclipse.uml2.uml.Port) object;
+			if (tmpPort.getName().equals(portName)) {
+				return (org.eclipse.uml2.uml.Port) tmpPort;
+			}
+		}
+		return null;
+	}
+
+	public org.eclipse.uml2.uml.Port getExistingUmlPort(String portName, String typeName,
+			EList<NamedElement> existingPorts) {
+		for (Object object : existingPorts) {
+			final org.eclipse.uml2.uml.Port tmpPort = (org.eclipse.uml2.uml.Port) object;
+			if (tmpPort.getName().equals(portName) && tmpPort.getType().getName().equals(typeName)) {
+				return tmpPort;
+				// Port found
+			}
+		}
+		return null;
+	}
+
+	public Stereotype findStereotype(Package pkg, String stereotypeName) {
+
+		for (Stereotype sub : UMLUtil.findSubstereotypes(pkg, stereotypeName)) {
+			if (sub.getQualifiedName().equals(stereotypeName)) {
+				return sub;
+			}
+		}
+		return null;
+	}
+
+	public void updateUmlStaticPort(org.eclipse.uml2.uml.Port port, String[] newMultiplicityRange) {
+		final String[] multiplicityRange = getAttributeMultiplicity(port);
+
+		// Update its multiplicity if needed
+		if (!equalMultiplicityBoundaries(newMultiplicityRange, multiplicityRange)) {
+			setAttributeMultiplicity(port, newMultiplicityRange);
+		}
+	}
+
+	public void updateUmlNonStaticPort(Port port, Type newType, String[] newMultiplicityRange) {
+		if (!port.getType().getName().equals(newType.getName())) {
+			port.setType(newType);
+		}
+
+		// Update its multiplicity if needed
+		final String[] multiplicityRange = getAttributeMultiplicity(port);
+		if (!equalMultiplicityBoundaries(newMultiplicityRange, multiplicityRange)) {
+			setAttributeMultiplicity(port, newMultiplicityRange);
+		}
+
+	}
+
+	public FunctionBehavior createUmlFunctionBehaviour(String functionBehaviourName, EList<Type> inputTypes,
+			EList<String[]> inputMultiplicities, Type outputType, String[] outputMultiplicity, Class owner) {
+
+		// Create an empty functionBehavior
+		FunctionBehavior functionBehavior = createFunctionBehavior(owner, functionBehaviourName);
+
+		createUmlFunctionBehaviorParameters(functionBehavior, inputTypes, inputMultiplicities, outputType,
+				outputMultiplicity);
+
+		return functionBehavior;
+
+	}
+
+	public void createUmlFunctionBehaviorParameters(FunctionBehavior functionBehavior, EList<Type> inputTypes,
+			EList<String[]> inputMultiplicities, Type outputType, String[] outputMultiplicity) {
+		// Create the input parameters
+		for (int i = 0; i < inputTypes.size(); i++) {
+			Type parameterType = inputTypes.get(i);
+			String[] parameterMultiplicity = inputMultiplicities.get(i);
+			createFunctionBehaviorParameter(functionBehavior, parameterType, parameterMultiplicity, true);
+		}
+
+		// Create the output parameter
+		createFunctionBehaviorParameter(functionBehavior, outputType, outputMultiplicity, false);
+	}
+
+	public Constraint createDelegationConstraint(Class owner, String variableIdText, String constraintText,
+			String iterConditionText, Stereotype delegationConstraintStereotype) {
+
+		String delegationName = DEFAULT_DELEGATION_PREFIX + variableIdText;
+
+		logger.debug("\n\n\n Creating delegation constraint " + delegationName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final Constraint newUMLConstraint = owner.createOwnedRule(delegationName.toString());
+		newUMLConstraint.applyStereotype(delegationConstraintStereotype);
+
+		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
+		literalString.setName(DEFAULT_DELEGATION_CONSTRAINT_LITERAL_STRING_NAME);
+
+		final String formalPropertyText = createDelegationConstraintText(variableIdText, constraintText,
+				iterConditionText);
+		literalString.setValue(formalPropertyText);
+		newUMLConstraint.setSpecification(literalString);
+
+		logger.debug("\n\nCreated " + delegationName + " Delegation Constraint\n\n");
+		return newUMLConstraint;
+	}
+
+	public Connector createUmlConnector(String constraintName, Property partWithPortOfConstraint,
+			Class portOwnerOfConstraint, String variableName, Property partWithPortOfVariable,
+			Class portOwnerOfVariable, Class owner) {
+		// Create the source end
+
+		// Create the name using an incremental value
+		final String connectorName = DEFAULT_CONNECTOR_NAME + (owner.getOwnedConnectors().size() + 1);
+		// Create a connector, but only after I'm sure it isn't
+		// a delegation constraint
+
+		logger.debug("\n\n\n Creating connector " + connectorName + " for owner " + owner);
+		logger.debug("\n\n\n");
+		Connector connector = createConnector(connectorName);
+		logger.debug("Creating source end :" + constraintName);
+		createUmlConnectorEnd(connector, constraintName, partWithPortOfConstraint, portOwnerOfConstraint);
+
+		// Create the target end
+		logger.debug("Creating source end :" + variableName);
+		createUmlConnectorEnd(connector, variableName, partWithPortOfVariable, portOwnerOfVariable);
+
+		// At last, add the connector to the owner
+		entityUtilInstance.addConnector(owner, connector);
+
+		return connector;
+
+	}
+
+	/**
+	 * Returns the System View package that is found in the given UML model.
+	 * 
+	 * @param umlModel
+	 *            the model to use
+	 * @return the package
+	 */
+	public Package getSystemView(UmlModel umlModel) {
+		if (umlModel == null) {
+			logger.error("No Models are open");
+			return null;
+		}
+
+		logger.debug("UML Model name = " + umlModel.getIdentifier());
+
+		TreeIterator<EObject> allElements = umlModel.getResource().getAllContents();
+
+		if (allElements != null) {
+			Collection<Package> packages = EcoreUtil.getObjectsByType(iterator2Collection(allElements),
+					UMLPackage.eINSTANCE.getPackage());
+
+			for (Package p : packages) {
+				if (p.getAppliedStereotype(SYSVIEW) != null) {
+					logger.debug("Found systemView!");
+					return p;
+				}
+			}
+		}
+		logger.error("SystemView not found!");
+		return null;
+	}
+
+	public Package getCurrentSystemView() {
+		return getSystemView(UmlUtils.getUmlModel());
+	}
+
+	public Package createPackage(Package owner, final String elementName) {
+		return owner.createNestedPackage(elementName);
+	}
+
+	public Comment createComment(Package owner, String content) {
+		Comment comment = owner.createOwnedComment();
+		comment.setBody(content);
+		return comment;
+	}
+
+	public Dependency createDependency(Package owner, NamedElement supplierElement, NamedElement clientElement) {
+		Dependency dependency = owner.createDependency(supplierElement);
+		dependency.getClients().add(clientElement);
+		return dependency;
+	}
+
+	public Property createInstantiatedArchitecture(Class paramRootComponent, Class instantiatedRootComponent,
+			ArrayList<String> parameters) {
+
+		int numInstantiatedArchitecures = getInstantiatedArchitecureConfigurations(paramRootComponent).size();
+
+		Property property = paramRootComponent
+				.createOwnedAttribute("InstantiateArc_" + (numInstantiatedArchitecures + 1), null);
+		UMLUtils.applyStereotype(property, INSTANTIATED_ARCHITECTURE_CONFIGURATION);
+		InstantiatedArchitectureConfiguration instantiatedArchitecture = getInstantiatedArchitectureConfiguration(
+				property);
+		if (instantiatedRootComponent != null) {
+			instantiatedArchitecture.setInstantiatedRootComponent(instantiatedRootComponent);
+		}
+		instantiatedArchitecture.getParameterList().addAll(parameters);
+		return property;
+	}
+
+	public InstantiatedArchitectureConfiguration getInstantiatedArchitectureConfiguration(Property umlProperty) {
+		Stereotype instantiatedArchitectureStereotype = UMLUtil.getAppliedStereotype(umlProperty,
+				INSTANTIATED_ARCHITECTURE_CONFIGURATION, false);
+		return (InstantiatedArchitectureConfiguration) umlProperty
+				.getStereotypeApplication(instantiatedArchitectureStereotype);
+	}
+
+	public String getInstantiatedArchitectureConfigurationName(
+			InstantiatedArchitectureConfiguration instantiatedArchitecture) {
+		return instantiatedArchitecture.getBase_Property().getName();
+	}
+
+	/**
+	 * Creates a Block element in the given package.
+	 * 
+	 * @param owner
+	 *            the Package that will contain the element
+	 * @param elementName
+	 *            the name of the new Block
+	 * @param blockStereotype
+	 *            the stereotype of the Block element
+	 * @return the newly created Class
+	 */
+	public Class createBlock(Package owner, final String elementName, Stereotype blockStereotype) {
+
+		Class umlClass = owner.createOwnedClass(elementName, false);
+		umlClass.applyStereotype(blockStereotype);
+
+		// owner.createPackagedElement(elementName, newUMLClass.eClass()); This
+		// also works...
+		// owner.getPackagedElements().add(newUMLClass); // This works too!
+
+		logger.debug("\n\nCreated " + elementName + " Block\n\n");
+		return umlClass;
+	}
+
+	public Class createSystemBlock(Package owner, final String elementName, Stereotype blockStereotype,
+			Stereotype sytemblockStereotype) {
+		Class umlClass = createBlock(owner, elementName, blockStereotype);
+		umlClass.applyStereotype(sytemblockStereotype);
+		return umlClass;
+	}
+
+	private ConnectorEnd createUmlConnectorEnd(Connector connector, String sourcePort, Property partWithPort,
+			Class portOwner) {
+
+		// Get the port and set it
+		ConnectableElement role = portOwner.getOwnedPort(sourcePort, null);
+
+		if (role != null) {
+			return entityUtilInstance.createConnectorEnd(connector, partWithPort, role);
+		}
+		return null;
+	}
+
+	/**
+	 * Creates a new BoundedSubType as requested.
+	 * 
+	 * @param pkg
+	 *            the package where to create the Enumeration
+	 * @param typeName
+	 *            the name of the type
+	 * @param lowerBound
+	 *            the lower bound
+	 * @param upperBound
+	 *            the upper bound
+	 * @return the created type
+	 */
+	public Type createBoundedSubType(Package pkg, String typeName, String lowerBoundValue, String upperBoundValue,
+			Stereotype boundedTypeStereotype) {
+
+		// Create a data type to the component view and apply the stereotype
+		final Type dataType = pkg.createOwnedType(typeName, UMLPackage.Literals.DATA_TYPE);
+		// Stereotype stereotype = UMLUtils.applyStereotype(dataType,
+		// BOUNDED_TYPE);
+		dataType.applyStereotype(boundedTypeStereotype);
+
+		// Extract the stereotiped type and configure it
+		// BoundedSubtype boundedType = (BoundedSubtype)
+		// dataType.getStereotypeApplication(stereotype);
+		final BoundedSubtype boundedType = (BoundedSubtype) dataType.getStereotypeApplication(boundedTypeStereotype);
+		boundedType.setMinValue(lowerBoundValue);
+		boundedType.setMaxValue(upperBoundValue);
+		boundedType.setBaseType((DataType) getPrimitiveType("Integer"));
+		// boundedType.setBaseType((DataType) getUMLPrimitiveType("Integer"));
+		// // Alternative version
+
+		logger.debug("Type '" + dataType.getQualifiedName() + "' created.");
+		return dataType;
+	}
+
+	/**
+	 * Creates a new Enumeration as requested.
+	 * 
+	 * @param pkg
+	 *            the package where to create the Enumeration
+	 * @param enumType
+	 *            the type specifying the values
+	 * @return the created Enumeration
+	 */
+	public Enumeration createEnumerationFromEnumType(Package pkg, Set<String> enumValues) {
+
+		// Create the name using an incremental value
+		final String enumerationName = DEFAULT_ENUMERATION_NAME + (getEnumerations(pkg).size() + 1);
+
+		final Enumeration enumeration = pkg.createOwnedEnumeration(enumerationName);
+		// final Set<String> values = getListValuesForEnumType(enumType);
+		for (String string : enumValues) {
+			enumeration.createOwnedLiteral(string);
+		}
+
+		logger.debug("Type '" + enumeration.getQualifiedName() + "' created.");
+		return enumeration;
+	}
+
+	/**
+	 * Retrieves all the Enumerations owned by the package.
+	 * 
+	 * @param pkg
+	 *            the package to be searched
+	 * @return
+	 */
+	public EList<Enumeration> getEnumerations(Package pkg) {
+		final EList<Enumeration> enumerations = new BasicEList<Enumeration>();
+
+		final EList<Type> types = pkg.getOwnedTypes();
+		for (Type type : types) {
+			if (type instanceof Enumeration) {
+				enumerations.add((Enumeration) type);
+			}
+		}
+		return enumerations;
+	}
+
+	public EList<Enumeration> getEnumerationsInOrder(Package pkg) {
+		final EList<Enumeration> enumerations = getEnumerations(pkg);
+
+		Collections.sort(enumerations, new Comparator<Enumeration>() {
+
+			@Override
+			public int compare(Enumeration o1, Enumeration o2) {
+				return o1.getName().compareTo(o2.getName());
+			}
+		});
+
+		return enumerations;
+	}
+
+	/**
+	 * Creates a Signal type in the given package.
+	 * 
+	 * @param pkg
+	 *            the package where to create the Enumeration
+	 * @return the newly created type
+	 */
+	public Signal createSignalType(Package pkg) {
+		final String signalName = DEFAULT_SIGNAL_NAME;
+
+		final Type type = pkg.createOwnedType(signalName, UMLPackage.Literals.SIGNAL);
+
+		logger.debug("Type '" + type.getQualifiedName() + "' created.");
+		return (Signal) type;
+	}
+
+	/**
+	 * Looks for a Signal already defined in the package.
+	 * 
+	 * @param pkg
+	 *            the package in which look for the Signal
+	 * @return the Signal already defined
+	 */
+	public Signal getExistingSignalType(Package pkg) {
+		final EList<Type> types = pkg.getOwnedTypes();
+
+		for (Type type : types) {
+			if (type instanceof Signal) {
+				return (Signal) type;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Looks for a specific enumeration among existing enumerations of the given
+	 * package.
+	 * 
+	 * @param pkg
+	 *            the package in which look for the Enumeration
+	 * @param enumType
+	 *            the enumeration to match
+	 * @return the enumeration already defined
+	 */
+	public Enumeration getExistingEnumerationForEnumType(Package pkg, Set<String> enumValues) {
+		final EList<Enumeration> enumerations = getEnumerations(pkg);
+
+		if (enumerations.size() > 0) {
+
+			for (Enumeration enumeration : enumerations) {
+				if (enumValues.equals(getListValuesForEnumeration(enumeration))) {
+					return enumeration;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns a Signal as requested (Only a Signal can be defined in the
+	 * package).
+	 * 
+	 * @param pkg
+	 *            the package where to look for or create the new type
+	 * @return the requested type
+	 */
+	public Type getOrCreateSignalType(Package pkg) {
+
+		// Look for existing Signal Type in the package
+		final Type type = getExistingSignalType(pkg);
+
+		if (type != null) {
+
+			// The type has been found in the package, use it
+			logger.debug("Type '" + type.getQualifiedName() + "' found.");
+			return type;
+		} else {
+			return createSignalType(pkg);
+		}
+	}
+
+	public Type getOrCreateEnumerationType(Set<String> enumValues, Package pkg) {
+
+		// Look for existing Enumerations in the package
+		final Type type = getExistingEnumerationForEnumType(pkg, enumValues);
+
+		if (type != null) {
+
+			// The type has been found in the package, use it
+			logger.debug("Type '" + type.getQualifiedName() + "' found.");
+			return type;
+		} else {
+			return createEnumerationFromEnumType(pkg, enumValues);
+		}
+	}
+
+	public Type getOrCreateBoundedSubType(String[] boundaries, Package pkg, Stereotype boundedTypeStereotype) {
+
+		String lowerBound = boundaries[0];
+		String upperBound = boundaries[1];
+		// Generate a suitable type name
+		final String typeName = DEFAULT_BOUNDEDTYPE_NAME + lowerBound + "_" + upperBound;
+
+		return getOrCreateBoundedSubType(typeName, pkg, lowerBound, upperBound, boundedTypeStereotype);
+	}
+
+	public Type getOrCreateBoundedSubType(String typeName, Package pkg, String lowerBoundValue, String upperBoundValue,
+			Stereotype boundedTypeStereotype) {
+		// Look for that type in the ComponentView
+		Type type = pkg.getOwnedType(typeName);
+		if (type != null) {
+
+			// The type has been found in the package, use it
+			logger.debug("Type '" + type.getQualifiedName() + "' found.");
+			return type;
+		} else {
+			return (Type) createBoundedSubType(pkg, typeName, lowerBoundValue, upperBoundValue, boundedTypeStereotype);
+		}
+	}
+
+	/**
+	 * Returns the list of the values inside a given Enumeration.
+	 * 
+	 * @param enumeration
+	 *            the Enumeration to be analysed
+	 * @return the list of contained values
+	 */
+	private Set<String> getListValuesForEnumeration(Enumeration enumeration) {
+		final Set<String> enumValuesNames = new TreeSet<String>(); // Ordered
+																	// list of
+																	// values
+		// Set<String> enumValuesNames = new HashSet<String>(); // Original
+		// order of values
+
+		for (EnumerationLiteral enumLit : enumeration.getOwnedLiterals()) {
+			enumValuesNames.add(enumLit.getName());
+		}
+		return enumValuesNames;
+	}
+
+	public String getFormalPropertyStr(FormalProperty formalProperty, String language) {
+
+		String str = null;
+		if (formalProperty != null) {
+			str = getConstraintBodyStr(formalProperty.getBase_Constraint(), language);
+		}
+		return str;
+	}
+
+	public void updateUmlAssociation(Property componentInstance, Type newType, String[] newMultiplicity)
+			throws Exception {
+		// The component instance is already present, update its
+		// type if needed
+		if (!componentInstance.getType().equals(newType)) {
+			componentInstance.setType(newType);
+
+			// Add the association to the list of changes, it
+			// needs to be redrawn
+			// addedElements.add(componentInstance.getAssociation());
+		}
+
+		String[] componentInstanceMultiplicity = getComponentInstanceMultiplicity(componentInstance);
+
+		if (!equalMultiplicityBoundaries(componentInstanceMultiplicity, newMultiplicity)) {
+			setAttributeMultiplicity(componentInstance, newMultiplicity);
+		}
+
+	}
+
+	public void updateUmlConstraint(Constraint umlConstraint, String updatedText, String language) {
+		final String formalPropertyText = getConstraintBodyStr(umlConstraint, language);
+
+		// If the expression is different, save it,
+		// otherwise go on
+		if (!updatedText.equals(formalPropertyText)) {
+			setTextInUMLConstraint(umlConstraint, updatedText, language);
+		}
+	}
+
+	public String getConstraintBodyStr(Constraint formalProperty, String language) {
+
+		String str = null;
+		if (formalProperty != null) {
+			if (formalProperty.getSpecification() != null) {
+				if (formalProperty.getSpecification() instanceof LiteralString) {
+					str = formalProperty.getSpecification().stringValue();
+				} else if (formalProperty.getSpecification() instanceof OpaqueExpression) {
+					str = getBodyForLanguageOfBodyOwner((OpaqueExpression) formalProperty.getSpecification(), language);
+				}
+
+			}
+		}
+		// logger.debug("getFormalPropertyStr: "+str);
+
+		return str;
+	}
+
+	/**
+	 * Returns the component instance with the given name.
+	 * 
+	 * @param owner
+	 *            the class owning the instance
+	 * @param componentName
+	 *            the name of the instance
+	 * @return the UML property representing the component instance
+	 */
+	public Property getSubComponentInstance(Class owner, String componentName) {
+		// logger.debug("getSubComponentInstance");
+		for (Property umlProperty : (owner.getAttributes())) {
+			// logger.debug("umlProperty: " + umlProperty);
+			// logger.debug("umlProperty.getname: " + umlProperty.getName());
+			if (umlProperty.getName().equals(componentName)
+					&& EntityUtil.getInstance().isComponentInstance(umlProperty)) {
+				return umlProperty;
+			}
+		}
+		return null;
+	}
+
+	public String getSystemElementURIFragment(Model model) throws Exception {
+
+		if (model != null) {
+			TreeIterator<EObject> allElements = model.eResource().getAllContents();
+			if (allElements != null) {
+				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
+						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
+
+				for (Class c : classes) {
+					if (isSystem(c)) {
+						return c.eResource().getURIFragment(c);
+					}
+				}
+			}
+		}
+		throw new Exception("Element does not exist.");
+	}
+
+	public String getSystemViewPackageURIFragment(Model model) throws Exception {
+
+		Package p = getSystemViewPackage(model);
+		return p.eResource().getURIFragment(p);
+
+	}
+
+	public Package getSystemViewPackage(Model model) throws Exception {
+
+		if (model != null) {
+			TreeIterator<EObject> allElements = model.eResource().getAllContents();
+			if (allElements != null) {
+				Collection<org.eclipse.uml2.uml.Package> packages = EcoreUtil
+						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getPackage());
+
+				for (Package p : packages) {
+					if (isSystemViewPackage(p)) {
+						return p;
+					}
+				}
+			}
+		}
+		throw new Exception("Element does not exist.");
+	}
+
+	public EObject getElement(String projectName, String umlFileModelName, String elementID) throws Exception {
+
+		Model model = loadModel(projectName, umlFileModelName);
+		return getElement(model, elementID);
+
+	}
+
+	public EObject getElement(Model model, String elementURI) throws Exception {
+
+		if (model != null) {
+			/*
+			 * TreeIterator<EObject> allElements =
+			 * model.eResource().getAllContents(); while(allElements.hasNext()){
+			 * logger.debug("URI  fragment: "+allElements.next().eResource().
+			 * getURI().fragment()); }
+			 */
+			EObject umlElement = model.eResource().getEObject(elementURI.trim());
+			return umlElement;
+		}
+
+		return null;
+
+	}
+
+	public String getUmlElementName(String projectName, String fileModelPath, String elementID) throws Exception {
+
+		Model model = loadModel(projectName, fileModelPath);
+
+		if (model != null) {
+			EObject umlElement = model.eResource().getEObject(elementID.trim());
+			return ((Class) umlElement).getName();
+		}
+
+		return null;
+
+	}
+
+	public EList<Element> getSubComponentsOfOwner(Constraint constraint) {
+		Element element = constraint.getOwner();
+		EList<Element> subComponents = new BasicEList<Element>();
+
+		for (Property umlProperty : getSubComponentsInstances((Class) element)) {
+			subComponents.add(getUmlType(umlProperty));
+		}
+
+		return subComponents;
+	}
+
+	public Element getSubComponent(Element element, String componentName) {
+
+		for (Property umlProperty : getSubComponentsInstances((Class) element)) {
+			if (umlProperty.getName().compareTo(componentName) == 0) {
+				return getUmlType(umlProperty);
+			}
+		}
+
+		return null;
+	}
+
+	public String[] getSubComponentsNameOfConstraintOwner(Constraint constraint) {
+		Element umlElement = constraint.getOwner();
+		Set<String> subCompArr = getSubComponentsNames((Class) umlElement);
+		return toArray(subCompArr);
+	}
+
+	private String[] toArray(Set<String> set) {
+		String[] strArray = new String[set.size()];
+		return set.toArray(strArray);
+	}
+
+	private String[] toArray(EList<String> eList) {
+		String[] strArray = new String[eList.size()];
+		return eList.toArray(strArray);
+	}
+
+	public String getComponentID(Element umlComponent) {
+
+		if ((isBlock(umlComponent))) {
+			return ((Class) umlComponent).getName();
+		}
+
+		if (isComponentInstance((Element) umlComponent)) {
+			return (((Property) umlComponent).getName());
+		}
+
+		return null;
+	}
+
+	public String getQualifiedName(NamedElement element) {
+		return ((NamedElement) element).getQualifiedName();
+	}
+
+	public String getComponentName(Element umlComponent) {
+
+		if ((isBlock(umlComponent))) {
+			return ((Class) umlComponent).getName();
+		}
+
+		if (isComponentInstance((Element) umlComponent)) {
+			return (((Property) umlComponent).getName());
+		}
+
+		return null;
+	}
+
+	public EList<Property> getInstantiatedArchitecureElementsAsProperties(Class umlComponent) {
+		EList<Property> instantiatedArchitecureList = new BasicEList<Property>();
+		for (Property umlProperty : ((Class) umlComponent).getAttributes()) {
+			if (isInstantiatedArchitecuture(umlProperty)) {
+				instantiatedArchitecureList.add(umlProperty);
+			}
+		}
+		return instantiatedArchitecureList;
+	}
+
+	public EList<InstantiatedArchitectureConfiguration> getInstantiatedArchitecureConfigurations(Class umlComponent) {
+		EList<InstantiatedArchitectureConfiguration> instantiatedArchitecureList = new BasicEList<InstantiatedArchitectureConfiguration>();
+		for (Property umlProperty : ((Class) umlComponent).getAttributes()) {
+			if (isInstantiatedArchitecuture(umlProperty)) {
+				instantiatedArchitecureList.add(getInstantiatedArchitectureConfiguration(umlProperty));
+			}
+		}
+		return instantiatedArchitecureList;
+	}
+
+	public List<Property> getSubComponentsInstances(Class umlComponent) {
+		List<Property> subComponents = new ArrayList<Property>();
+		EList<Property> umlProperties = ((Class) umlComponent).getAttributes();
+		if (umlProperties != null) {
+			for (Property umlProperty : umlProperties) {
+				if (isComponentInstance(umlProperty)) {
+					subComponents.add(umlProperty);
+				}
+			}
+		}
+		return subComponents;
+	}
+
+	/**
+	 * Returns the component instance with the given name.
+	 * 
+	 * @param umlComponent
+	 *            the class owning the instance
+	 * @param componentName
+	 *            the name of the instance
+	 * @return the UML property representing the component instance
+	 */
+	public Property getUmlComponentInstance(Class umlComponent, String componentName) {
+
+		for (Property umlProperty : (umlComponent.getAttributes())) {
+			if (umlProperty.getName().equals(componentName) && isComponentInstance(umlProperty)) {
+				return umlProperty;
+			}
+		}
+		return null;
+	}
+
+	public String[] getEnumValuesFromComponentPorts(Class umlComponent) {
+		EList<String> enumValuesEList = new BasicEList<String>();
+
+		for (Port port : getUmlPortsFromClass(umlComponent)) {
+			if (isEnumerationAttribute(port)) {
+				Set<String> currValues = getListValuesForEnumeratorType(port.getType());
+				enumValuesEList.addAll(currValues);
+			}
+		}
+
+		return toArray(enumValuesEList);
+	}
+
+	public EList<String> getEnumValuesFromComponentAttributes(Element umlComponent) {
+		EList<String> enumValuesEList = new BasicEList<String>();
+
+		if (isComponentInstance(umlComponent)) {
+			umlComponent = getUmlType((Property) umlComponent);
+		}
+
+		if (isBlock(umlComponent) || (isCompType(umlComponent) || (isComponentImplementation(umlComponent)))) {
+			Class umlClass = (Class) umlComponent;
+
+			for (Property umlProperty : umlClass.getOwnedAttributes()) {
+
+				if (isEnumerationAttribute(umlProperty)) {
+					Set<String> currValues = getListValuesForEnumeratorType(umlProperty.getType());
+					if (currValues != null) {
+						enumValuesEList.addAll(currValues);
+					}
+				}
+			}
+
+			EList<FunctionBehavior> functionBehaviors = getUmlFunctionBehaviors(umlClass);
+			if (functionBehaviors != null) {
+				for (FunctionBehavior functionBehavior : functionBehaviors) {
+					for (Parameter parameter : functionBehavior.inputParameters()) {
+						Set<String> currValues = getListValuesForEnumeratorType(parameter.getType());
+						if (currValues != null) {
+							enumValuesEList.addAll(currValues);
+						}
+					}
+					for (Parameter parameter : functionBehavior.outputParameters()) {
+						Set<String> currValues = getListValuesForEnumeratorType(parameter.getType());
+						if (currValues != null) {
+							enumValuesEList.addAll(currValues);
+						}
+					}
+				}
+			}
+		}
+
+		return enumValuesEList;
+		// return toArray(enumValuesEList);
+	}
+
+	public ArrayList<Class> getBlocks(Package umlSelectedPackage) {
+		final EList<Element> packageChildren = umlSelectedPackage.getOwnedElements();
+
+		ArrayList<Class> blocksAsClasses = new ArrayList<Class>();
+
+		if (!packageChildren.isEmpty()) {
+			// logger.debug("getBlocks: "+packageChildren.size());
+			blocksAsClasses = new ArrayList<Class>();
+			for (Element element : packageChildren) {
+
+				if (EntityUtil.getInstance().isBlock(element)
+						&& !ContractEntityUtil.getInstance().isContract(element)) {
+					blocksAsClasses.add((Class) element);
+				}
+			}
+		}
+
+		return blocksAsClasses;
+	};
+
+	public Set<String> getSubComponentsNames(Class umlComponent) {
+
+		Set<String> subComponentsNames = new HashSet<String>();
+		for (Property umlProperty : getSubComponentsInstances(umlComponent)) {
+			subComponentsNames.add((umlProperty).getName());
+		}
+		return subComponentsNames;
+	}
+
+	public String[] getSubComponentsName(Class umlComponent) {
+		return toArray(getSubComponentsNames(umlComponent));
+	}
+
+	public EList<Port> getUmlPorts(Element umlElement, boolean isStaticPort) {
+		EList<Port> portsArr = new BasicEList<Port>();
+		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
+			portsArr.addAll(getUmlPortsFromClass((Class) umlElement, isStaticPort));
+		}
+
+		if (isComponentInstance(umlElement)) {
+			portsArr.addAll(getUmlPortsFromProperty((Property) umlElement, isStaticPort));
+		}
+		return portsArr;
+
+	}
+
+	private EList<Port> getUmlPortsFromProperty(Property umlElement, boolean isStaticPort) {
+		return getUmlPortsFromClass((Class) getUmlType((Property) umlElement), isStaticPort);
+	}
+
+	/*
+	 * private EList<Port> getUMLPortsFromProperty(Element umlElement, int
+	 * portDirection, boolean isStaticPort) { return
+	 * getUMLPortsFromClass((Class)getUMLType((Property)
+	 * umlElement),portDirection,isStaticPort); }
+	 */
+
+	public EList<Port> getUmlPorts(Element umlElement, int portDirection, boolean isStaticPort) {
+		EList<Port> portsArr = new BasicEList<Port>();
+		if (isBlock(umlElement)) {
+			portsArr.addAll(getUmlPortsFromClass((Class) umlElement, portDirection, isStaticPort));
+		}
+
+		if (isCompType(umlElement) || (isComponentImplementation(umlElement))) {
+			portsArr.addAll(getUmlPortsFromComponent((Component) umlElement, portDirection, isStaticPort));
+		}
+
+		if (isComponentInstance(umlElement)) {
+			portsArr.addAll(getUmlPorts(getUmlType((Property) umlElement), portDirection, isStaticPort));
+		}
+		return portsArr;
+
+	}
+
+	private EList<Port> getUmlPortsFromClass(Class umlComponent, int portDirection, boolean isStatic) {
+		EList<Port> ports = new BasicEList<Port>();
+		for (Port umlPort : umlComponent.getOwnedPorts()) {
+			FlowPort fp = getFlowPort(umlPort);
+			if ((fp.getDirection().getValue() == portDirection) && (umlPort.isStatic() == isStatic)) {
+				ports.add(umlPort);
+			}
+		}
+		return ports;
+	}
+
+	public boolean isInputPort(Element umlPort) {
+		return (umlPort instanceof Property && getPortDirection(umlPort) != null
+				&& getPortDirection(umlPort) == FlowDirection.IN_VALUE);
+	}
+
+	public boolean isInOutPort(Element umlPort) {
+		return (umlPort instanceof Property && getPortDirection(umlPort) != null
+				&& getPortDirection(umlPort) == FlowDirection.INOUT_VALUE);
+	}
+
+	public boolean isOutputPort(Element umlPort) {
+		return (umlPort instanceof Property && getPortDirection(umlPort) != null
+				&& getPortDirection(umlPort) == FlowDirection.OUT_VALUE);
+	}
+
+	public Integer getPortDirection(Element umlPort) {
+		if (isFlowPort(umlPort)) {
+			return ((FlowPort) getFlowPort((Port) umlPort)).getDirection().getValue();
+		} else if (isFlowPortMarte(umlPort)) {
+			return ((org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort) getFlowPortMarte((Port) umlPort))
+					.getDirection().getValue();
+		} else {
+			return null;
+		}
+	}
+
+	private Set<Port> getUmlPortsFromComponent(Component umlComponent, int portDirection, boolean isStaticPort) {
+		Set<Port> ports = new HashSet<Port>();
+
+		for (Port umlPort : umlComponent.getOwnedPorts()) {
+			org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort fp = getFlowPortMarte(umlPort);
+			if ((fp.getDirection().getValue() == portDirection) && (umlPort.isStatic() == isStaticPort)) {
+				ports.add(umlPort);
+			}
+		}
+		return ports;
+	}
+
+	private EList<Port> getUmlPortsFromClass(Class umlComponent, boolean isStaticPort) {
+		EList<Port> ports = new BasicEList<Port>();
+		for (Port umlPort : umlComponent.getOwnedPorts()) {
+			if (umlPort.isStatic() == isStaticPort) {
+				ports.add(umlPort);
+			}
+		}
+		return ports;
+	}
+
+	private Set<Port> getUmlPortsFromClass(Class umlComponent) {
+		Set<Port> ports = new HashSet<Port>();
+		for (Port umlPort : umlComponent.getOwnedPorts()) {
+			ports.add(umlPort);
+		}
+		return ports;
+	}
+
+	/*
+	 * private Set<Port> getUmlPortsFromComponent(Component umlComponent) {
+	 * Set<Port> ports = new HashSet<Port>();
+	 * 
+	 * for (Port umlPort : umlComponent.getOwnedPorts()) { ports.add(umlPort); }
+	 * return ports; }
+	 */
+
+	public Package getToPackage(org.eclipse.uml2.uml.Element umlElememt) {
+
+		Package tmp = umlElememt.getNearestPackage();
+		while (tmp.getOwner() != null && (tmp.getOwner() instanceof Package)) {
+			tmp = (Package) tmp.getOwner();
+		}
+		return tmp;
+	}
+
+	private FlowPort getFlowPort(Port umlPort) {
+		Stereotype contrStereo = UMLUtil.getAppliedStereotype(umlPort, FLOW_Port, false);
+		return (FlowPort) umlPort.getStereotypeApplication(contrStereo);
+
+	}
+
+	private org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort getFlowPortMarte(Port umlPort) {
+		Stereotype flowPortStereo = UMLUtil.getAppliedStereotype(umlPort, FLOW_Port_MARTE, false);
+		return (org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort) umlPort
+				.getStereotypeApplication(flowPortStereo);
+	}
+
+	public boolean isPort(Element umlElement) {
+		return ((umlElement instanceof Property) && (isFlowPort(umlElement) || isFlowPortMarte(umlElement)));
+	}
+
+	private boolean isFlowPort(Element umlElement) {
+		return (umlElement instanceof Property && UMLUtil.getAppliedStereotype(umlElement, FLOW_Port, false) != null);
+	}
+
+	private boolean isFlowPortMarte(Element umlElement) {
+		return (umlElement instanceof Property
+				&& UMLUtil.getAppliedStereotype(umlElement, FLOW_Port_MARTE, false) != null);
+	}
+
+	public void deleteComponentContract(Class clazz) {
+		clazz.destroy();
+	}
+
+	public boolean isComponentImplementation(Element umlElement) {
+		return (umlElement instanceof Class && UMLUtil.getAppliedStereotype(umlElement, COMP_IMPL, false) != null);
+	}
+
+	public boolean isInstantiatedArchitecuture(Element umlElement) {
+		return (umlElement instanceof Property
+				&& UMLUtil.getAppliedStereotype(umlElement, INSTANTIATED_ARCHITECTURE_CONFIGURATION, false) != null);
+	}
+
+	// modified method!!
+	public boolean isComponentInstance(Element umlProperty) {
+		// return UMLUtil.getAppliedStereotype(umlProperty, COMP_INST, false) !=
+		// null;
+		if (!(umlProperty instanceof Property)) {
+			return false;
+		}
+
+		Property property = (Property) umlProperty;
+
+		if (property.getAssociation() == null) {
+			return false;
+		}
+
+		if (ContractEntityUtil.getInstance().isContractProperty(property)) {
+			return false;
+		}
+
+		if (isInstantiatedArchitecuture(property)) {
+			return false;
+		}
+
+		Element owner = (getOwner(umlProperty));
+		Association association = property.getAssociation();
+		int associationEndsSize = association.getEndTypes().size();
+		if (associationEndsSize != 2) {
+			return false;
+		}
+		boolean End1TypeIsOwner = association.getEndTypes().get(0).equals(owner);
+		boolean End2TypeIsOwner = association.getEndTypes().get(1).equals(owner);
+
+		return (associationEndsSize == 2) && ((End1TypeIsOwner) || (End2TypeIsOwner));
+
+		// Type umlPropertyType = ((Property) umlProperty).getType();
+		// return (isBlock(umlPropertyType) ||
+		// isComponentImplementation(umlPropertyType));
+	}
+
+	public boolean isBooleanAttribute(Property umlProperty) {
+		return isBooleanType(umlProperty.getType());
+	}
+
+	public boolean isBooleanType(Type type) {
+		if (type != null) {
+			return ((type.getQualifiedName().compareTo(BOOLEAN_TYPE) == 0)
+					|| (type.getQualifiedName().compareTo(MARTE_BOOLEAN_TYPE) == 0));
+		}
+		return false;
+	}
+
+	/*
+	 * public String[] getLowerUpperBoundsForRangeType(Property umlProperty) {
+	 * return getLowerUpperBoundsForRangeType(umlProperty.getType()); }
+	 */
+
+	public String[] getLowerUpperBoundsForRangeType(Type umlType) {
+		BoundedSubtype boundedSubtype = getRangeAttribute(umlType);
+		String[] bounds = { boundedSubtype.getMinValue(), boundedSubtype.getMaxValue() };
+
+		return bounds;
+	}
+
+	private BoundedSubtype getRangeAttribute(Type umlType) {
+		Stereotype boundedStereo = UMLUtil.getAppliedStereotype(umlType, BOUNDED_TYPE, false);
+		return (BoundedSubtype) umlType.getStereotypeApplication(boundedStereo);
+	}
+
+	public boolean isRangeAttribute(Property umlProperty) {
+		return isRangeType(umlProperty.getType());
+	}
+
+	public boolean isRangeType(Type umlType) {
+		if (umlType != null) {
+			if (UMLUtil.getAppliedStereotype(umlType, BOUNDED_TYPE, false) != null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public boolean isDoubleAttribute(Property umlProperty) {
+		if (umlProperty.getType() != null) {
+			return (umlProperty.getType().getName().compareTo("Double") == 0);
+		}
+		return false;
+	}
+
+	public boolean isStringAttribute(Property umlProperty) {
+		return isStringType(umlProperty.getType());
+	}
+
+	public boolean isRealAttribute(Property umlProperty) {
+		return isRealType(umlProperty.getType());
+	}
+
+	public boolean isIntegerAttribute(Property umlProperty) {
+		return isIntegerType(umlProperty.getType());
+	}
+
+	public boolean isContinuousAttribute(Property umlProperty) {
+		if (umlProperty.getType() != null) {
+			return isContinuousType(umlProperty.getType());
+		}
+		return false;
+	}
+
+	public boolean isContinuousType(Type type) {
+		if (type != null) {
+			return type.getQualifiedName().compareTo(CHESS_CONTINUOUS_TYPE) == 0;
+		} else
+			return false;
+	}
+
+	public Type getAttributeType(Property umlProperty) {
+		return (umlProperty.getType());
+	}
+
+	public boolean isEnumerationAttribute(Property umlProperty) {
+		return isEnumerationType(umlProperty.getType());
+	}
+
+	public boolean isEnumerationType(Type umlType) {
+		if (umlType != null) {
+			return (umlType instanceof Enumeration);
+		}
+		return false;
+	}
+
+	public Set<String> getListValuesForEnumeratorType(Type umlType) {
+		Set<String> enumValuesNames = new HashSet<String>();
+		if (umlType instanceof Enumeration) {
+			for (EnumerationLiteral enumLit : ((Enumeration) umlType).getOwnedLiterals()) {
+				enumValuesNames.add(enumLit.getName());
+			}
+			return enumValuesNames;
+
+		}
+		return null;
+	}
+
+	public boolean isEnumValue(String value, Type umlType) {
+
+		if (umlType instanceof Enumeration) {
+			return getListValuesForEnumeratorType(umlType).contains(value);
+		}
+		return false;
+	}
+
+	public String[] getValuesForEnumeratorType(Type umlType) {
+		Set<String> enumValuesNames = getListValuesForEnumeratorType(umlType);
+		if (enumValuesNames != null) {
+			return toArray(enumValuesNames);
+		}
+		return null;
+	}
+
+	public Element getUmlType(Property umlProperty) {
+		return ((Element) umlProperty.getType());
+	}
+
+	public boolean isBlock(Element umlClass) {
+		return (umlClass instanceof Class && UMLUtil.getAppliedStereotype(umlClass, BLOCK, false) != null);
+	}
+
+	public boolean isCompType(Element umlComponent) {
+		return (umlComponent instanceof Class && UMLUtil.getAppliedStereotype(umlComponent, COMP_TYPE, false) != null);
+	}
+
+	public boolean isSystem(Element umlElement) {
+		return (umlElement instanceof Class && UMLUtil.getAppliedStereotype(umlElement, SYSTEM, false) != null);
+	}
+
+	public boolean isFaultyStateMachine(Element umlElement) {
+		return (umlElement instanceof StateMachine
+				&& UMLUtil.getAppliedStereotype(umlElement, FAULTY_STATE_MACHINE, false) != null);
+	}
+
+	public boolean isNominalStateMachine(Element umlElement) {
+		return (umlElement instanceof StateMachine
+				&& UMLUtil.getAppliedStereotype(umlElement, FAULTY_STATE_MACHINE, false) == null);
+	}
+
+	public boolean isPrioritizedTransition(Element umlElement) {
+		return (umlElement instanceof Transition
+				&& UMLUtil.getAppliedStereotype(umlElement, PRIORITIZED_TRANSITION, false) != null);
+	}
+
+	/*
+	 * public void saveConstraint(final Constraint constraint, final String
+	 * text) {
+	 * 
+	 * TransactionalEditingDomain domain =
+	 * TransactionUtil.getEditingDomain(constraint);
+	 * domain.getCommandStack().execute(new RecordingCommand(domain) {
+	 * 
+	 * @Override protected void doExecute() {
+	 * 
+	 * LiteralString litString = (LiteralString) constraint.getSpecification();
+	 * litString.setValue(text); constraint.setSpecification(litString); } }); }
+	 */
+
+	public Element getOwner(Element umlElement) {
+		return umlElement.getOwner();
+	}
+
+	public String getName(Class umlClass) {
+		return umlClass.getName();
+	}
+
+	public String[] getPortsNames(Element umlElement, int portDirection, boolean isStaticPort) {
+		EList<String> portsNames = new BasicEList<String>();
+
+		for (Port umlPort : getUmlPorts(umlElement, portDirection, isStaticPort)) {
+			portsNames.add(umlPort.getName());
+		}
+
+		return toArray(portsNames);
+	}
+
+	public EList<String> getPortsName(EList<Port> ports) {
+		EList<String> portsNames = new BasicEList<String>();
+
+		for (Port umlPort : ports) {
+			portsNames.add(umlPort.getName());
+		}
+		return portsNames;
+	}
+
+	public String[] getInputPortsNames(Element umlElement, boolean isStaticPort) {
+		return getPortsNames(umlElement, FlowDirection.IN_VALUE, isStaticPort);
+	}
+
+	public String[] getOutputPortsNames(Element umlElement, boolean isStaticPort) {
+		return getPortsNames(umlElement, FlowDirection.OUT_VALUE, isStaticPort);
+	}
+
+	public String[] getInputOutputPortsNames(Element umlElement, boolean isStaticPort) {
+		return getPortsNames(umlElement, FlowDirection.INOUT_VALUE, isStaticPort);
+	}
+
+	public Set<Property> getSupportedAttributes(Element umlElement, Boolean isStaticAttribute) {
+		Set<Property> simpleAttributes = new HashSet<Property>();
+
+		if (isComponentInstance(umlElement)) {
+			umlElement = getUmlType((Property) umlElement);
+		}
+
+		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
+			Class umlClass = (Class) umlElement;
+			for (Property umlProperty : umlClass.getOwnedAttributes()) {
+				if ((isStaticAttribute == null) || (umlProperty.isStatic() == isStaticAttribute)) {
+					if (isBooleanAttribute(umlProperty) || isContinuousAttribute(umlProperty)
+							|| isDoubleAttribute(umlProperty) || isRangeAttribute(umlProperty)
+							|| isEnumerationAttribute(umlProperty) || isIntegerAttribute(umlProperty)
+							|| isRealAttribute(umlProperty) || isStringAttribute(umlProperty)) {
+						simpleAttributes.add(umlProperty);
+					} /*
+						 * else if (isContinuousAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isDoubleAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isRangeAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isEnumerationAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isIntegerAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isRealAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }else if
+						 * (isStringAttribute(umlProperty)) {
+						 * simpleAttributes.add(umlProperty); }
+						 */
+				}
+			}
+		}
+
+		return simpleAttributes;
+	}
+
+	private Set<Property> getIntegerAttributes(Element umlElement) {
+		Set<Property> integerAttributes = new HashSet<Property>();
+
+		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
+			Class umlClass = (Class) umlElement;
+			EList<Property> attributes = umlClass.getOwnedAttributes();
+			for (Property umlProperty : attributes) {
+				if (isIntegerAttribute(umlProperty)) {
+					integerAttributes.add(umlProperty);
+				}
+			}
+		}
+
+		if (isComponentInstance(umlElement)) {
+			integerAttributes.addAll(getIntegerAttributes(getUmlType((Property) umlElement)));
+		}
+		return integerAttributes;
+	}
+
+	public Set<Property> getAttributesExceptPorts(Element umlElement, Boolean isStaticAttribute) {
+		Set<Property> attributes = new HashSet<Property>();
+		for (Property umlProperty : getSupportedAttributes(umlElement, isStaticAttribute)) {
+			if (!isPort(umlProperty)) {
+				attributes.add(umlProperty);
+			}
+		}
+		return attributes;
+	}
+
+	public Set<Property> getIntegerAttributesExceptPorts(Element umlElement) {
+		Set<Property> integerAttributes = new HashSet<Property>();
+		for (Property umlProperty : getIntegerAttributes(umlElement)) {
+			if (!isPort(umlProperty)) {
+				integerAttributes.add(umlProperty);
+			}
+		}
+		return integerAttributes;
+	}
+
+	public Collection<StateMachine> getNominalStateMachines() {
+
+		UmlModel umlModel = UmlUtils.getUmlModel();
+		Set<StateMachine> stateMachines = getNominalStateMachines(umlModel);
+		return stateMachines;
+
+	}
+
+	public Set<StateMachine> getNominalStateMachines(Model umlModel) {
+
+		Set<StateMachine> stateMachines = new HashSet<StateMachine>();
+
+		if (umlModel != null) {
+			TreeIterator<EObject> allElements = umlModel.eResource().getAllContents();
+			if (allElements != null) {
+				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
+						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
+				for (Class c : classes) {
+					if (isNominalStateMachine(c)) {
+						stateMachines.add((StateMachine) c);
+					}
+				}
+			}
+		}
+
+		return stateMachines;
+	}
+	
+	public Set<StateMachine> getNominalStateMachines(UmlModel umlModel) {
+
+		Set<StateMachine> stateMachines = new HashSet<StateMachine>();
+
+		if (umlModel != null) {
+			TreeIterator<EObject> allElements = umlModel.getResource().getAllContents();
+			if (allElements != null) {
+				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
+						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
+				for (Class c : classes) {
+					if (isNominalStateMachine(c)) {
+						stateMachines.add((StateMachine) c);
+					}
+				}
+			}
+		}
+
+		return stateMachines;
+	}
+
+	public Set<StateMachine> getNominalStateMachines(Class umlSelectedComponent, boolean fromSubComponent) {
+
+		Set<StateMachine> stateMachines = getNominalStateMachines(umlSelectedComponent);
+		if (fromSubComponent) {
+			for (Property subComponentInstance : getSubComponentsInstances(umlSelectedComponent)) {
+				stateMachines.addAll(getNominalStateMachines((Class) subComponentInstance.getType(), true));
+			}
+		}
+		return stateMachines;
+	}
+
+	public StateMachine getFirstNominalStateMachine(Class umlSelectedComponent) {
+		Set<StateMachine> stateMachines = getNominalStateMachines(umlSelectedComponent);
+		if ((stateMachines != null) && (stateMachines.size() > 0)) {
+			return stateMachines.iterator().next();
+		} else
+			return null;
+	}
+
+	public Set<StateMachine> getNominalStateMachines(Class umlSelectedComponent) {
+
+		Set<StateMachine> stateMachines = new HashSet<StateMachine>();
+
+		if (umlSelectedComponent != null) {
+			EList<Behavior> behaviours = umlSelectedComponent.getOwnedBehaviors();
+			if (behaviours != null) {
+				for (Class c : behaviours) {
+					if (isNominalStateMachine(c)) {
+						stateMachines.add((StateMachine) c);
+					}
+				}
+			}
+		}
+
+		return stateMachines;
+	}
+
+	/**
+	 * Returns the state machine with the given name inside the given element.
+	 * 
+	 * @param umlSelectedComponent
+	 *            the owner component
+	 * @param stateMachineName
+	 *            the name of the state machine
+	 * @return
+	 */
+	public StateMachine getNominalStateMachine(Class umlSelectedComponent, String stateMachineName) {
+		for (StateMachine stateMachine : getNominalStateMachines(umlSelectedComponent)) {
+			if (stateMachine.getName().equals(stateMachineName)) {
+				return stateMachine;
+			}
+		}
+		return null;
+	}
+
+	private <T> Collection<T> iterator2Collection(final Iterator<T> iter) {
+		ArrayList<T> list = new ArrayList<T>();
+		for (; iter.hasNext();) {
+			T item = iter.next();
+			list.add(item);
+		}
+		return list;
+	}
+
+	public EList<Transition> getTranstitions(StateMachine stateMachine) {
+		Region region = stateMachine.getRegions().get(0);
+		return region.getTransitions();
+	}
+
+	public EList<Vertex> getStates(StateMachine stateMachine) {
+		Region region = stateMachine.getRegions().get(0);
+		return region.getSubvertices();
+	}
+
+	public Vertex getState(StateMachine stateMachine, String stateName) {
+		Region region = stateMachine.getRegions().get(0);
+		return region.getSubvertex(stateName);
+	}
+
+	public boolean isInitialState(Vertex state) {
+		return (state instanceof Pseudostate)
+				&& ((Pseudostate) state).getKind().equals(PseudostateKind.INITIAL_LITERAL);
+	}
+
+	public boolean isFinalState(Vertex state) {
+		return ((state instanceof Pseudostate)
+				&& ((Pseudostate) state).getKind().getName().compareTo("Terminate") == 0);
+	}
+
+	public EList<Vertex> getIntermediateStates(StateMachine stateMachine) {
+		EList<Vertex> intermediateStates = new BasicEList<Vertex>();
+		for (Vertex state : getStates(stateMachine)) {
+			if (!isInitialState(state) && !isFinalState(state)) {
+				intermediateStates.add(state);
+			}
+		}
+		return intermediateStates;
+	}
+
+	public EList<String> getStatesNameList(EList<Vertex> states) {
+		EList<String> names = new BasicEList<String>();
+		for (Vertex state : states) {
+			names.add(state.getName());
+		}
+		return names;
+	}
+
+	public EList<String> getTransitionNameList(EList<Transition> transitions) throws Exception {
+		// logger.debug("getTransitionNameList");
+		EList<String> transNames = new BasicEList<String>();
+		for (Transition trans : transitions) {
+			if (trans.getName() == null) {
+				throw new Exception("In " + trans.containingStateMachine().getQualifiedName()
+						+ ", one transition has name == null.");
+			}
+			// logger.debug("transition Name: " + trans.getName());
+			transNames.add(trans.getName());
+		}
+
+		return transNames;
+	}
+
+	public String getStateMachineName(StateMachine stateMachine) {
+		return stateMachine.getName();
+	}
+
+	public String getTransitionName(Transition transition) {
+		return transition.getName();
+	}
+
+	public Vertex getInitialState(StateMachine stateMachine) {
+		for (Vertex state : getStates(stateMachine)) {
+			if (isInitialState(state)) {
+				return state;
+			}
+		}
+		return null;
+	}
+
+	public EList<Transition> getInitialTransitions(StateMachine stateMachine) throws Exception {
+		Vertex initialState = getInitialState(stateMachine);
+		if (initialState != null) {
+			return initialState.getOutgoings();
+		} else {
+			throw new Exception("The state machine of " + ((Class) (stateMachine.getOwner())).getName()
+					+ " does not have the initial state.");
+		}
+
+	}
+
+	public EList<Transition> getNonInitialTransitions(StateMachine stateMachine) {
+		EList<Vertex> states = getIntermediateStates(stateMachine);
+		EList<Transition> transitions = new BasicEList<Transition>();
+		for (Vertex state : states) {
+			if (!isInitialState(state)) {
+				transitions.addAll(state.getOutgoings());
+			}
+		}
+		return transitions;
+	}
+
+	public EList<Transition> getOutgoingTransitions(Vertex state) {
+		return state.getOutgoings();
+	}
+
+	public EList<Transition> getIncomingTransitions(Vertex state) {
+		return state.getIncomings();
+	}
+
+	public String getSignalEventName(Trigger trigger) {
+
+		if (trigger.getEvent() instanceof SignalEvent) {
+			return ((SignalEvent) trigger.getEvent()).getSignal().getName();
+		}
+
+		return null;
+	}
+
+	public Vertex getTransitionNextState(Transition transition) {
+		return transition.getTarget();
+	}
+
+	public Vertex getTransitionSourceState(Transition transition) {
+		return transition.getSource();
+	}
+
+	public Constraint getTransitionGuard(Transition transition) {
+		return transition.getGuard();
+	}
+
+	public String getTransitionGuardText(Transition transition, String language) {
+		Constraint condition = getTransitionGuard((Transition) transition);
+		if (condition != null) {
+			return getConditionExpression(condition, language);
+		}
+		return null;
+	}
+
+	public OpaqueBehavior getTransitionEffect(Transition transition) {
+		if (transition.getEffect() instanceof OpaqueBehavior) {
+			return (OpaqueBehavior) transition.getEffect();
+		}
+		return null;
+	}
+
+	public EList<String> getTransitionEffectParameters(Transition transition) {
+		OpaqueBehavior effect = getTransitionEffect(transition);
+		EList<String> paramsNames = new BasicEList<String>();
+		for (Parameter par : effect.getOwnedParameters()) {
+			paramsNames.add(par.getName());
+		}
+		return paramsNames;
+	}
+
+	public String getTransitionEffectText(Transition transition, String language) {
+		OpaqueBehavior effect = getTransitionEffect(transition);
+		if (effect != null) {
+			return getBodyForLanguageOfBodyOwner(getTransitionEffect(transition), language);
+		}
+		return null;
+	}
+
+	public Integer getTransitionPriority(Transition transition) {
+		if (isPrioritizedTransition(transition)) {
+			Stereotype prioritizedTransitionStereotype = UMLUtil.getAppliedStereotype(transition,
+					PRIORITIZED_TRANSITION, false);
+			PrioritizedTransition prioritizedTransition = (PrioritizedTransition) transition
+					.getStereotypeApplication(prioritizedTransitionStereotype);
+			return prioritizedTransition.getPriority();
+		}
+		return null;
+	}
+
+	public void setTransitionEffectText(Transition transition, String effectText, String language) {
+		OpaqueBehavior effect = getTransitionEffect(transition);
+		if (effect != null) {
+			effect.getLanguages().add(0, language);
+			effect.getBodies().add(0, effectText);
+		}
+	}
+
+	public String getGuardName(Constraint guard) {
+		return guard.getName();
+	}
+
+	public String getStateName(Vertex state) {
+		return state.getName();
+	}
+
+	public String getEffectName(Behavior effect) {
+		return effect.getName();
+	}
+
+	public boolean isFinalTransition(Transition transition) {
+		return isFinalState(transition.getTarget());
+	}
+
+	public EList<Port> getEvents(StateMachine stateMachine) {
+		EList<Port> eventsPort = getEventPorts(getOwner(stateMachine));
+		return eventsPort;
+	}
+
+	public Constraint createTransitionGuard(Transition transition, String guardName, String guardText,
+			String language) {
+
+		// Create an empty guard for the transition
+		final Constraint guard = transition.createGuard(guardName);
+
+		// Create an opaque expression and assign it to the guard
+		final OpaqueExpression opaqueExpression = UMLFactory.eINSTANCE.createOpaqueExpression();
+		guard.createSpecification(null, null, opaqueExpression.eClass());
+
+		// Fill the opaque expression
+		setOpaqueExpressionTextInUMLConstraint(guard, guardText, language);
+
+		return guard;
+	}
+
+	public OpaqueBehavior createTransitionEffect(Transition transition, String effectName, String effectText,
+			String language) {
+
+		// Create an empty behavior for the transition
+		final OpaqueBehavior opaqueBehavior = (OpaqueBehavior) transition.createEffect(effectName,
+				UMLPackage.eINSTANCE.getOpaqueBehavior());
+
+		// Fill the effect
+		setTransitionEffectText(transition, effectText, language);
+
+		return opaqueBehavior;
+	}
+
+	public EList<Port> getEventPorts(Element umlElement) {
+
+		EList<Port> eventPorts = new BasicEList<Port>();
+
+		if (isComponentInstance(umlElement)) {
+			umlElement = getUmlType((Property) umlElement);
+		}
+
+		if (isBlock(umlElement) || (isCompType(umlElement) || (isComponentImplementation(umlElement)))) {
+			Class umlClass = (Class) umlElement;
+			for (Property umlProperty : umlClass.getOwnedAttributes()) {
+				if (isEventPortAttribute(umlProperty)) {
+					eventPorts.add((Port) umlProperty);
+				}
+			}
+		}
+
+		return eventPorts;
+	}
+
+	public boolean isEventPortAttribute(Property umlProperty) {
+		return ((umlProperty.getType() != null) && (isEventType(umlProperty.getType())));
+	}
+
+	public boolean isEventType(Type type) {
+		return (type instanceof Signal);
+	}
+
+	public EList<Port> getTransitionEvents(Transition transition) {
+		if (!isTransitionWithNoEvent(transition)) {
+			return transition.getTriggers().get(0).getPorts();
+		}
+		return null;
+	}
+
+	public String getPortName(Port port) {
+		return port.getName();
+	}
+
+	public String getAttributeName(Property attribute) {
+		return attribute.getName();
+	}
+
+	/**
+	 * Returns the name of the given parameter
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return the requested name
+	 */
+	public String getParameterName(Parameter parameter) {
+		return parameter.getName();
+	}
+
+	/**
+	 * Returns the owner of the given parameter
+	 * 
+	 * @param parameter
+	 *            the parameter
+	 * @return the owner of the parameter
+	 */
+	public Element getParameterOwner(Parameter parameter) {
+		return parameter.getOwner();
+	}
+
+	/**
+	 * Returns the owner of the given function behavior
+	 * 
+	 * @param function
+	 *            the function behavior
+	 * @return the owner of the function behavior
+	 */
+	public Element getUmlFunctionBehaviorOwner(FunctionBehavior function) {
+		return function.getOwner();
+	}
+
+	public boolean isTransitionWithNoEvent(Transition transition) {
+		return !((transition.getTriggers() != null) && (transition.getTriggers().size() != 0)
+				&& (transition.getTriggers().get(0).getPorts() != null)
+				&& transition.getTriggers().get(0).getPorts().size() != 0);
+
+	}
+
+	public boolean isRealType(Type type) {
+		if (type != null) {
+			return ((type.getQualifiedName().compareTo(REAL_TYPE) == 0)
+					|| (type.getQualifiedName().compareTo(MARTE_REAL_TYPE) == 0));
+		}
+		return false;
+	}
+
+	public boolean isIntegerType(Type type) {
+		if (type != null) {
+			return ((type.getQualifiedName().compareTo(INTEGER_TYPE) == 0)
+					|| (type.getQualifiedName().compareTo(MARTE_INTEGER_TYPE) == 0));
+		}
+		return false;
+	}
+
+	public boolean isStringType(Type type) {
+		if (type != null) {
+			return (type.getQualifiedName().compareTo(STRING_TYPE) == 0);
+		}
+		return false;
+	}
+
+	public EList<? extends Port> getUmlPortsExceptEvents(Element umlElement, int portDirection) {
+
+		if (isComponentInstance(umlElement)) {
+			umlElement = getUmlType((Property) umlElement);
+		}
+
+		EList<Port> portsArr = new BasicEList<Port>();
+		if (isBlock(umlElement)) {
+			portsArr.addAll(getUmlPortsExceptEventsFromClass((Class) umlElement, portDirection));
+		}
+
+		if (isCompType(umlElement) || (isComponentImplementation(umlElement))) {
+			portsArr.addAll(getUmlPortsExceptEventsFromComponent((Component) umlElement, portDirection));
+		}
+
+		return portsArr;
+	}
+
+	private Collection<? extends Port> getUmlPortsExceptEventsFromComponent(Component umlComponent, int portDirection) {
+		Set<Port> ports = new HashSet<Port>();
+
+		for (Port umlPort : umlComponent.getOwnedPorts()) {
+			org.eclipse.papyrus.MARTE.MARTE_DesignModel.GCM.FlowPort fp = getFlowPortMarte(umlPort);
+			if ((fp.getDirection().getValue() == portDirection) && (!isEventPortAttribute(umlPort))) {
+				ports.add(umlPort);
+			}
+		}
+		return ports;
+	}
+
+	private EList<? extends Port> getUmlPortsExceptEventsFromClass(Class umlElement, int portDirection) {
+		EList<Port> ports = new BasicEList<Port>();
+		for (Port umlPort : umlElement.getOwnedPorts()) {
+			FlowPort fp = getFlowPort(umlPort);
+			if ((fp.getDirection().getValue() == portDirection) && (!isEventPortAttribute(umlPort))) {
+				ports.add(umlPort);
+			}
+		}
+		return ports;
+	}
+
+	public String getConditionExpression(Constraint condition, String language) {
+		if ((condition.getSpecification() != null) && (condition.getSpecification() instanceof OpaqueExpression)
+				&& ((OpaqueExpression) condition.getSpecification()).getBodies() != null) {
+			return getBodyForLanguageOfBodyOwner((OpaqueExpression) condition.getSpecification(), language);
+		}
+		return null;
+	}
+
+	/**
+	 * Checks if the selected object is a package in the <<SystemView>> branch.
+	 * 
+	 * @param pkg
+	 *            the selected element
+	 * @return true if the package is valid
+	 */
+	public boolean isSystemViewPackage(Element obj) {
+		if (obj instanceof Package) {
+			final Package pkg = (Package) obj;
+			if (pkg.getAppliedStereotype(SYSVIEW) != null) {
+				return true;
+			} else {
+				EList<Package> owningPackages = pkg.allOwningPackages();
+				for (Package owningPackage : owningPackages) {
+					if (owningPackage.getAppliedStereotype(SYSVIEW) != null) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	public EList<Constraint> getRefinementFormalPropertiesAsConstraints(Element component) {
+
+		if (component instanceof Class) {
+			return getRefinementFormalPropertiesAsConstraintsFromClass((Class) component);
+		} else if (component instanceof Property) {
+			return getRefinementFormalPropertiesAsConstraintsFromProperty((Property) component);
+		}
+
+		return null;
+	}
+
+	private EList<Constraint> getRefinementFormalPropertiesAsConstraintsFromClass(Class component) {
+
+		EList<Constraint> formalProperties = new BasicEList<Constraint>();
+
+		for (Constraint umlConstraint : ((Class) component).getOwnedRules()) {
+			if (isRefinementFormalProperty(umlConstraint)) {
+				formalProperties.add(umlConstraint);
+			}
+		}
+
+		return formalProperties;
+	}
+
+	private EList<Constraint> getRefinementFormalPropertiesAsConstraintsFromProperty(Property componentInstance) {
+
+		return getRefinementFormalPropertiesAsConstraintsFromClass((Class) componentInstance.getType());
+	}
+
+	public EList<Constraint> getInterfaceFormalPropertiesAsConstraints(Element component) {
+
+		if (component instanceof Class) {
+			return getInterfaceFormalPropertiesAsConstraintsFromClass((Class) component);
+		} else if (component instanceof Property) {
+			return getInterfaceFormalPropertiesAsConstraintsFromProperty((Property) component);
+		}
+
+		return null;
+	}
+
+	private EList<Constraint> getInterfaceFormalPropertiesAsConstraintsFromClass(Class component) {
+
+		EList<Constraint> formalProperties = new BasicEList<Constraint>();
+
+		for (Constraint umlConstraint : ((Class) component).getOwnedRules()) {
+			if (isInterfaceFormalProperty(umlConstraint)) {
+				formalProperties.add(umlConstraint);
+			}
+		}
+
+		return formalProperties;
+	}
+
+	private EList<Constraint> getInterfaceFormalPropertiesAsConstraintsFromProperty(Property componentInstance) {
+
+		return getInterfaceFormalPropertiesAsConstraintsFromClass((Class) componentInstance.getType());
+	}
+
+	public boolean isFormalProperty(Element umlConstraint) {
+		if (umlConstraint instanceof Constraint) {
+			return UMLUtil.getAppliedStereotype(umlConstraint, FORMAL_PROP, false) != null;
+		}
+		return false;
+	}
+
+	public boolean isInterfaceFormalProperty(Element umlConstraint) {
+		return (isFormalProperty(umlConstraint)
+				&& (((Constraint) umlConstraint).getVisibility() == VisibilityKind.PUBLIC_LITERAL));
+	}
+
+	public boolean isRefinementFormalProperty(Element umlConstraint) {
+		return (isFormalProperty(umlConstraint)
+				&& (((Constraint) umlConstraint).getVisibility() == VisibilityKind.PRIVATE_LITERAL));
+	}
+
+	/**
+	 * Returns the list of Macro Definitions in the given element, as UML
+	 * Constraints.
+	 * 
+	 * @param umlElement
+	 *            the Element to analyze
+	 * @return the list of Macro Definitions as UML Constraints
+	 */
+	public EList<Constraint> getMacroDefinitionsAsUMLConstraints(Element umlElement) {
+		EList<Constraint> constraints = new BasicEList<Constraint>();
+
+		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
+			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
+				if (isMacroDefinition(umlConstraint)) {
+					constraints.add((Constraint) umlConstraint);
+				}
+			}
+		}
+
+		if (isComponentInstance(umlElement)) {
+			constraints.addAll(getMacroDefinitionsAsUMLConstraints(getUmlType((Property) umlElement)));
+		}
+
+		return constraints;
+	}
+
+	/**
+	 * Checks if the given element is a Macro Definition.
+	 * 
+	 * @param umlConstraint
+	 *            the constraint
+	 * @return true if the given element is a Macro Definition
+	 */
+	public boolean isMacroDefinition(Element umlConstraint) {
+		if (umlConstraint instanceof Constraint) {
+			return UMLUtil.getAppliedStereotype(umlConstraint, MACRO_DEFINITION, false) != null;
+		}
+		return false;
+	}
+
+	public String getConstraintQualifiedName(Constraint formalProperty) {
+		if (formalProperty != null) {
+			return ((Constraint) formalProperty).getQualifiedName();
+		}
+		return null;
+	}
+
+	public String getConstraintName(Constraint constraint) {
+		if (constraint != null) {
+			return ((Constraint) constraint).getName();
+		}
+		return null;
+	}
+
+	public FormalProperty getFormalProperty(Constraint umlConstraint) {
+		Stereotype formalPropertyStereotype = UMLUtil.getAppliedStereotype(umlConstraint, FORMAL_PROP, false);
+		return (FormalProperty) umlConstraint.getStereotypeApplication(formalPropertyStereotype);
+	}
+
+	public boolean isDelegationConstraint(Element umlProperty) {
+		return ((umlProperty instanceof Constraint)
+				&& (UMLUtil.getAppliedStereotype(umlProperty, DELEGATION_CONST, false) != null));
+	}
+
+	public EList<Constraint> getDelegationConstraintsAsUMLConstraints(Element umlElement) {
+		EList<Constraint> constraints = new BasicEList<Constraint>();
+
+		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
+			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
+				if (isDelegationConstraint(umlConstraint)) {
+					constraints.add((Constraint) umlConstraint);
+				}
+			}
+		}
+
+		if (isComponentInstance(umlElement)) {
+			constraints.addAll(getDelegationConstraintsAsUMLConstraints(getUmlType((Property) umlElement)));
+		}
+
+		return constraints;
+	}
+
+	public EList<FunctionBehavior> getUmlFunctionBehaviors(Element umlElement) {
+
+		EList<FunctionBehavior> functionBehaviours = null;
+
+		if (isComponentInstance((Element) umlElement)) {
+			umlElement = ((Property) umlElement).getType();
+		}
+
+		if (umlElement instanceof Class) {
+			Class umlClass = (Class) umlElement;
+			EList<Behavior> behaviours = umlClass.getOwnedBehaviors();
+			for (Behavior behavior : behaviours) {
+				if (behavior instanceof FunctionBehavior) {
+					if (functionBehaviours == null) {
+						functionBehaviours = new BasicEList<FunctionBehavior>();
+					}
+					functionBehaviours.add((FunctionBehavior) behavior);
+				}
+			}
+		}
+
+		return functionBehaviours;
+	}
+
+	/**
+	 * Returns the name of the given function behavior
+	 * 
+	 * @param function
+	 *            the function behavior
+	 * @return the requested name
+	 */
+	public String getUmlFunctionBehaviorName(FunctionBehavior uninterpretedFunction) {
+		return uninterpretedFunction.getName();
+	}
+
+	public Type getUmlFunctionBehaviorOutputType(FunctionBehavior uninterpretedFunction) {
+		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
+				return parameter.getType();
+			}
+		}
+		return null;
+	}
+
+	public EList<Type> getUmlFunctionBehaviorInputTypes(FunctionBehavior uninterpretedFunction) {
+
+		EList<Type> inputTypes = new BasicEList<Type>();
+
+		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
+				inputTypes.add(parameter.getType());
+			}
+		}
+		return inputTypes;
+	}
+
+	/**
+	 * Returns the input parameters of the given function behavior
+	 * 
+	 * @param function
+	 *            the function behavior
+	 * @return the input parameters
+	 */
+	public EList<Parameter> getUmlFunctionBehaviorInputParameters(FunctionBehavior function) {
+		final EList<Parameter> inputParameters = new BasicEList<Parameter>();
+
+		// Loop on all the parameters to find the input ones
+		final EList<Parameter> parameters = function.getOwnedParameters();
+		for (Parameter parameter : parameters) {
+			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
+				inputParameters.add(parameter);
+			}
+		}
+		return inputParameters;
+	}
+
+	public Parameter getUmlFunctionBehaviorOutputParameter(FunctionBehavior function) {
+		// Loop on all the parameters to find the input ones
+		final EList<Parameter> parameters = function.getOwnedParameters();
+		for (Parameter parameter : parameters) {
+			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
+				return (parameter);
+			}
+		}
+		return null;
+	}
+
+	public Object getParameterType(Parameter parameter) {
+		return parameter.getType();
+	}
+
+	public String[] getComponentInstanceMultiplicity(Property component) throws Exception {
+		if (isComponentInstance(component)) {
+			return getAttributeMultiplicity(component);
+		}
+
+		throw new Exception("" + component.getName() + " is not a component instance");
+
+	}
+
+	public String[] getAttributeMultiplicity(MultiplicityElement attribute) {
+		// logger.debug("getAttributeMultiplicity");
+
+		ValueSpecification upperValueSpecification = attribute.getUpperValue();
+		ValueSpecification lowerValueSpecification = attribute.getLowerValue();
+
+		String upperValue = getValueSpecificationValue(upperValueSpecification);
+		String lowerValue = getValueSpecificationValue(lowerValueSpecification);
+
+		String[] boundaries = { lowerValue, upperValue };
+		return boundaries;
+	}
+
+	public String getValueSpecificationValue(ValueSpecification valueSpecification) {
+
+		String strValue = null;
+		Object value = null;
+		if (valueSpecification instanceof LiteralInteger) {
+			// logger.debug("instanceof LiteralInteger");
+			value = ((LiteralInteger) valueSpecification).getValue();
+
+		} else if (valueSpecification instanceof LiteralUnlimitedNatural) {
+			// logger.debug("instanceof LiteralUnlimitedNatural");
+			value = ((LiteralUnlimitedNatural) valueSpecification).getValue();
+
+		} else if (valueSpecification instanceof LiteralString) {
+			// logger.debug("instanceof LiteralString");
+			value = ((LiteralString) valueSpecification).getValue();
+		}
+
+		logger.debug("value: " + value);
+
+		strValue = String.valueOf(value);
+
+		if (strValue == "null") {
+			strValue = null;
+		}
+
+		// logger.debug("getValueSpecificationValue: " + strValue);
+		return strValue;
+	}
+
+	/**
+	 * Adds a connector to the given element.
+	 * 
+	 * @param owner
+	 *            the owner element
+	 * @param connector
+	 *            the conne
+	 */
+	public void addConnector(Class owner, Connector connector) {
+
+		// Add the new connector to the list
+		owner.getOwnedConnectors().add(connector);
+	}
+
+	/**
+	 * Creates a connector, but doesn't add it to the owner.
+	 * 
+	 * @param owner
+	 *            the owner element
+	 * @return the created Connector
+	 */
+	public Connector createConnector(String connectorName) {
+
+		Connector connector = UMLFactory.eINSTANCE.createConnector();
+		connector.setName(connectorName);
+
+		logger.debug("\n\nCreated " + connectorName + " Connector\n\n");
+		return connector;
+	}
+
+	/**
+	 * Creates an end to the given connector.
+	 * 
+	 * @param connector
+	 *            the owner Connector
+	 * @param sourceOwner
+	 *            the component instance owning the port
+	 * @param sourcePort
+	 *            the port to be connected
+	 * @return
+	 */
+	public ConnectorEnd createConnectorEnd(Connector connector, Property sourceOwner, ConnectableElement sourcePort) {
+		final ConnectorEnd end = connector.createEnd();
+
+		end.setRole(sourcePort);
+		end.setPartWithPort(sourceOwner);
+		return end;
+	}
+
+	public Parameter createFunctionBehaviorParameter(FunctionBehavior owner, String parameterName, Type parameterType,
+			String[] multiplicity, boolean isInput) {
+
+		logger.debug("\n\n\n Creating functionBehaviorParameter " + parameterName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final Parameter parameter = owner.createOwnedParameter(parameterName, parameterType);
+		parameter.setDirection(isInput ? ParameterDirectionKind.IN_LITERAL : ParameterDirectionKind.OUT_LITERAL);
+
+		setAttributeMultiplicity(parameter, multiplicity);
+
+		logger.debug("\n\nCreated " + parameterName + " functionBehaviorParameter\n\n");
+		return parameter;
+	}
+
+	public Object clone(Object original) {
+		EObject context = (EObject) original;
+		EcoreUtil.Copier copier = new EcoreUtil.Copier();
+		EObject copy = copier.copy(context);
+		copier.copyReferences();
+		return copy;
+	}
+
+	public Constraint createFormalProperty(final Namespace formalPropertyOwner, String formalPropertyName) {
+
+		// Contract contract = getContract(umlContract);
+		// final String formalPropertyName = prefix_name + "_" +
+		// umlContract.getName();
+		final String propertyName = formalPropertyName;
+
+		/*
+		 * TransactionalEditingDomain domain =
+		 * TransactionUtil.getEditingDomain(formalPropertyOwner);
+		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
+		 * 
+		 * @Override protected void doExecute() {
+		 */
+		Constraint umlNewConstraint = formalPropertyOwner.createOwnedRule(propertyName);
+		UMLUtils.applyStereotype(umlNewConstraint, FORMAL_PROP);
+		/*
+		 * } });
+		 */
+		return formalPropertyOwner.getOwnedRule(propertyName);
+
+	}
+
+	/**
+	 * Creates an empty FunctionBehavior belonging to the given owner
+	 * 
+	 * @param owner
+	 *            the owner class of the functionBehavior
+	 * @param functionBehaviorName
+	 *            the name of the functionBehavior
+	 * @return the newly created FunctionBehavior
+	 */
+	public FunctionBehavior createFunctionBehavior(Class owner, String functionBehaviorName) {
+
+		logger.debug("\n\n\n Creating functionBehavior " + functionBehaviorName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final FunctionBehavior functionBehavior = (FunctionBehavior) owner.createOwnedBehavior(functionBehaviorName,
+				UMLPackage.eINSTANCE.getFunctionBehavior());
+
+		logger.debug("\n\nCreated " + functionBehaviorName + " FunctionBehavior\n\n");
+		return functionBehavior;
+	}
+
+	/**
+	 * Creates a PrioritizedTransition and sets it the given priority.
+	 * 
+	 * @param transition
+	 *            the Transition to be stereotyped
+	 * @param priority
+	 *            the priority to assign
+	 */
+	public void createPrioritizedTransition(Transition transition, Integer priority) {
+		final Stereotype prioritizedTransitionStereotype = findStereotype(transition.getNearestPackage(),
+				PRIORITIZED_TRANSITION);
+		if (prioritizedTransitionStereotype != null) {
+			if (!transition.isStereotypeApplied(prioritizedTransitionStereotype)) {
+				transition.applyStereotype(prioritizedTransitionStereotype);
+			}
+			final PrioritizedTransition prioritizedTransition = (PrioritizedTransition) transition
+					.getStereotypeApplication(prioritizedTransitionStereotype);
+			prioritizedTransition.setPriority(priority);
+		}
+	}
+
+	/**
+	 * Returns the input Parameters of the given FunctionBehavior
+	 * 
+	 * @param owner
+	 *            the FunctionBehavior to analyze
+	 * @return the list of input Parameters
+	 */
+	public EList<Parameter> getOwnedInputParameters(FunctionBehavior owner) {
+		EList<Parameter> inputParameters = new BasicEList<Parameter>();
+
+		for (Parameter parameter : owner.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
+				inputParameters.add(parameter);
+			}
+		}
+		return inputParameters;
+	}
+
+	public Parameter createFunctionBehaviorParameter(FunctionBehavior owner, Type parameterType, String[] multiplicity,
+			boolean isInput) {
+
+		// Create the name
+		String parameterName = null;
+		if (isInput) {
+			parameterName = DEFAULT_PARAMETER_IN_NAME + (getOwnedInputParameters(owner).size() + 1); // Incremental
+			// name
+		} else {
+			parameterName = DEFAULT_PARAMETER_OUT_NAME; // There could be only
+														// one
+			// output
+		}
+
+		return createFunctionBehaviorParameter(owner, parameterName, parameterType, multiplicity, isInput);
+	}
+
+	public org.eclipse.uml2.uml.Port createNonStaticPort(Class owner, String portName, Type portType,
+			String[] multiplicityBounds, boolean isInput, Stereotype flowportStereotype) {
+		org.eclipse.uml2.uml.Port umlPort = UMLFactory.eINSTANCE.createPort();
+		umlPort.setName(portName);
+		umlPort.setType(portType);
+		owner.getOwnedPorts().add(umlPort);
+		umlPort.applyStereotype(flowportStereotype);
+		umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
+		FlowPort flowPort = (FlowPort) umlPort.getStereotypeApplication(flowportStereotype);
+		flowPort.setDirection(isInput ? FlowDirection.IN : FlowDirection.OUT);
+
+		setAttributeMultiplicity(umlPort, multiplicityBounds);
+
+		// This version is nicer but a little slower
+		// org.eclipse.uml2.uml.Port umlPort = owner.createOwnedPort(portName,
+		// portType);
+		// Stereotype stereotype = UMLUtils.applyStereotype(umlPort, FLOWPORT);
+		// umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
+		// FlowPort flowPort = (FlowPort)
+		// umlPort.getStereotypeApplication(stereotype);
+		// flowPort.setDirection(isInput? FlowDirection.IN: FlowDirection.OUT);
+		logger.debug("\n\nCreated " + portName + " Port\n\n");
+		return umlPort;
+	}
+
+	public org.eclipse.uml2.uml.Port createStaticPort(Class owner, String portName, Type portType,
+			String[] multiplicityBounds, Stereotype flowPortStereotype) {
+
+		org.eclipse.uml2.uml.Port umlPort = UMLFactory.eINSTANCE.createPort();
+		umlPort.setName(portName);
+		umlPort.setType(portType);
+		owner.getOwnedPorts().add(umlPort);
+		umlPort.applyStereotype(flowPortStereotype);
+		umlPort.setAggregation(AggregationKind.get(AggregationKind.COMPOSITE));
+		FlowPort flowPort = (FlowPort) umlPort.getStereotypeApplication(flowPortStereotype);
+		flowPort.setDirection(FlowDirection.INOUT);
+		umlPort.setIsStatic(true);
+
+		setAttributeMultiplicity(umlPort, multiplicityBounds);
+
+		return umlPort;
+	}
+
+	public RedefinableTemplateSignature createRedefinableTemplateSignature(Class owner, String parameterName) {
+		RedefinableTemplateSignature redefinableTemplateSignature = UMLFactory.eINSTANCE
+				.createRedefinableTemplateSignature();
+		redefinableTemplateSignature.setName("redefinableTemplateSignature");
+
+		TemplateParameter templateParameter = UMLFactory.eINSTANCE.createTemplateParameter();
+		redefinableTemplateSignature.getOwnedParameters().add(templateParameter);
+
+		LiteralString stringParameter = UMLFactory.eINSTANCE.createLiteralString();
+		stringParameter.setName(parameterName);
+		stringParameter.setOwningTemplateParameter(templateParameter);
+		stringParameter.setTemplateParameter(templateParameter);
+		stringParameter.setValue("0");
+		templateParameter.setDefault(stringParameter);
+		templateParameter.setParameteredElement(stringParameter);
+
+		owner.setOwnedTemplateSignature(redefinableTemplateSignature);
+
+		return redefinableTemplateSignature;
+	}
+
+	public String createDelegationConstraintText(String variableIdTextName, String constraintText,
+			String iterConditionText) {
+
+		final StringBuffer delegationText = new StringBuffer();
+
+		delegationText.append(variableIdTextName + " := " + constraintText);
+		if (iterConditionText != null && iterConditionText.length() > 0) {
+			delegationText.append(" " + iterConditionText);
+		}
+		return delegationText.toString();
+	}
+
+	public Connector getExistingConnector(EList<Connector> connectors, String variablePortOwner,
+			String variablePortName, String constraintPortOwner, String constraintPortName) {
+
+		// Loop on all the connectors to find one with same values
+		for (Connector connector : connectors) {
+			final EList<ConnectorEnd> ends = connector.getEnds();
+			if (ends.size() == 2) {
+
+				// Check the first end
+				final Property sourceOwner = ends.get(0).getPartWithPort(); // Should
+																			// be
+																			// the
+																			// owner
+																			// of
+																			// the
+																			// port
+				final org.eclipse.uml2.uml.Port sourcePort = (org.eclipse.uml2.uml.Port) ends.get(0).getRole(); // Should
+																												// be
+																												// the
+																												// port
+
+				if (sourcePort.getName().equals(constraintPortName)) {
+					if (sourceOwner != null && sourceOwner.getName().equals(constraintPortOwner)) {
+					} else if (sourceOwner == null && constraintPortOwner == null) {
+					} else {
+						continue;
+					}
+				} else {
+					continue;
+				}
+
+				// One end is correct, go on with the second
+				final Property targetOwner = ends.get(1).getPartWithPort(); // Should
+																			// be
+																			// the
+																			// owner
+																			// of
+																			// the
+																			// port
+				final org.eclipse.uml2.uml.Port targetPort = (org.eclipse.uml2.uml.Port) ends.get(1).getRole(); // Should
+																												// be
+																												// the
+																												// port
+
+				if (targetPort.getName().equals(variablePortName)) {
+					if (targetOwner != null && targetOwner.getName().equals(variablePortOwner)) {
+					} else if (targetOwner == null && variablePortOwner == null) {
+					} else {
+						continue;
+					}
+				} else {
+					continue;
+				}
+
+				// Connector found
+				return connector;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Create a public formal property
+	 * 
+	 * @param owner
+	 *            the owner of the property
+	 * @param assertionName
+	 *            the name of the formal property
+	 * @param assertionText
+	 *            the text of the formal property
+	 * @return the newly created formal property
+	 */
+	public Constraint createInterfaceFormalProperty(Class owner, String assertionName, String assertionText) {
+
+		final Constraint umlConstraint = createFormalProperty(owner, assertionName);
+		final LiteralString newLs = UMLFactory.eINSTANCE.createLiteralString();
+		final ValueSpecification vs = umlConstraint.createSpecification("ConstraintSpec", null, newLs.eClass());
+		umlConstraint.setSpecification(vs);
+
+		setLiteralStringTextInUMLConstraint(umlConstraint, assertionText);
+
+		return umlConstraint;
+	}
+
+	/**
+	 * Create a private formal property
+	 * 
+	 * @param owner
+	 *            the owner of the property
+	 * @param assertionName
+	 *            the name of the formal property
+	 * @param assertionText
+	 *            the text of the formal property
+	 * @return the newly created formal property
+	 */
+	public Constraint createRefinementFormalProperty(Class owner, String assertionName, String assertionText) {
+
+		final Constraint umlConstraint = createFormalProperty(owner, assertionName);
+		final LiteralString newLs = UMLFactory.eINSTANCE.createLiteralString();
+		final ValueSpecification vs = umlConstraint.createSpecification("ConstraintSpec", null, newLs.eClass());
+		umlConstraint.setSpecification(vs);
+		umlConstraint.setVisibility(VisibilityKind.PRIVATE_LITERAL);
+
+		setLiteralStringTextInUMLConstraint(umlConstraint, assertionText);
+
+		return umlConstraint;
+	}
+
+	public void setTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText,
+			final String language) {
+
+		logger.debug("saveFormalProperty: " + formalPropertyText);
+		// Constraint umlConstraint =
+		// formalProperty.getBase_Constraint();
+		if (umlConstraint.getSpecification() instanceof LiteralString) {
+			setLiteralStringTextInUMLConstraint(umlConstraint, formalPropertyText);
+		} else if (umlConstraint.getSpecification() instanceof OpaqueExpression) {
+			setOpaqueExpressionTextInUMLConstraint(umlConstraint, formalPropertyText, language);
+
+		}
+	}
+
+	public void setLiteralStringTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText) {
+		/*
+		 * TransactionalEditingDomain domain =
+		 * TransactionUtil.getEditingDomain(umlConstraint);
+		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
+		 * 
+		 * @Override protected void doExecute() {
+		 */
+		if (umlConstraint.getSpecification() instanceof LiteralString) {
+			LiteralString litString = (LiteralString) umlConstraint.getSpecification();
+			litString.setValue(formalPropertyText);
+			umlConstraint.setSpecification(litString);
+		}
+		/*
+		 * } });
+		 */
+	}
+
+	public void setOpaqueExpressionTextInUMLConstraint(final Constraint umlConstraint, final String formalPropertyText,
+			final String language) {
+		/*
+		 * TransactionalEditingDomain domain =
+		 * TransactionUtil.getEditingDomain(umlConstraint);
+		 * domain.getCommandStack().execute(new RecordingCommand(domain) {
+		 * 
+		 * @Override protected void doExecute() {
+		 */
+		if (umlConstraint.getSpecification() instanceof OpaqueExpression) {
+			// logger.debug("saveFormalProperty OpaqueExpression");
+			OpaqueExpression opaqueExpr = (OpaqueExpression) umlConstraint.getSpecification();
+			// opaqueExpr.getLanguages().
+			setOpaqueExpressionBodyForLanguage(opaqueExpr, language, formalPropertyText);
+
+		}
+		/*
+		 * } });
+		 */
+	}
+
+	private void setOpaqueExpressionBodyForLanguage(org.eclipse.uml2.uml.OpaqueExpression opaqueExpression,
+			String language, String body) {
+		// checks both lists by size
+		checkAndCorrectListsOfBodyOwner(opaqueExpression);
+		// checks if language exists, if not, creates one
+		if (!opaqueExpression.getLanguages().contains(language)) {
+			// opaqueExpression.getLanguages().add(0, language);
+			// opaqueExpression.getBodies().add(0, body);
+			opaqueExpression.getLanguages().add(language);
+			opaqueExpression.getBodies().add(body);
+		} else {
+			// retrieve the index of the given language in the opaque Expression
+			int index = opaqueExpression.getLanguages().indexOf(language);
+			// sets the body at the given index in the list of bodies.
+			opaqueExpression.getBodies().set(index, body);
+		}
+	}
+
+	/**
+	 * Deletes an element from the model.
+	 * 
+	 * @param element
+	 *            the element to remove
+	 * @throws Exception
+	 */
+	public void deleteElementInTheModel(NamedElement element) throws Exception {
+
+		// Give the focus to the ModelExplorerView
+		ModelExplorerView modelExplorerView = getModelExplorerView();
+		modelExplorerView.setFocus();
+
+		// Select the requested element
+		List<Object> elements = new ArrayList<Object>();
+		elements.add(element);
+		modelExplorerView.revealSemanticElement(elements);
+
+		IHandler deleteHandler = getActiveHandlerFor(IWorkbenchCommandConstants.EDIT_DELETE);
+		deleteHandler.execute(new ExecutionEvent());
+	}
+
+	/**
+	 * Returns the handler for the given command.
+	 * 
+	 * @param commandId
+	 *            the command
+	 * @return the handler
+	 */
+	private IHandler getActiveHandlerFor(final String commandId) {
+		final ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+				.getService(ICommandService.class);
+		commandService.refreshElements(commandId, null);
+		final Command cmd = commandService.getCommand(commandId);
+		return cmd.getHandler();
+	}
+
+	// Needed to bring out a reference from the inner class...
+	ModelExplorerView modelExplorerView;
+
+	/**
+	 * Returns the ModelExplorerView.
+	 * 
+	 * @return
+	 */
+	private ModelExplorerView getModelExplorerView() {
+
+		Display.getDefault().syncExec(new Runnable() {
+
+			public void run() {
+				final IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+
+				// we look for the modelexplorer
+				IViewPart modelexplorer;
+				try {
+					modelexplorer = activeWorkbenchWindow.getActivePage().showView(ModelExplorerPageBookView.VIEW_ID);
+				} catch (PartInitException ex) {
+					ex.printStackTrace(System.out);
+					return;
+				}
+				final ModelExplorerPageBookView view = (ModelExplorerPageBookView) modelexplorer;
+				final ModelExplorerPage page = (ModelExplorerPage) view.getCurrentPage();
+				final IViewPart viewer = page.getViewer();
+				modelExplorerView = (ModelExplorerView) viewer;
+			}
+		});
+		return modelExplorerView;
+	}
+
+	/**
+	 * Removes an element from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the element to remove
+	 */
+	public void removeElement(EList<Class> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a function behavior from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the function behavior to remove
+	 */
+	public void removeFunctionBehavior(EList<Behavior> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a FunctionBehavior parameter from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the function behavior parameter to
+	 *            remove
+	 */
+	public void removeFunctionBehaviorParameter(EList<Parameter> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a formal property from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the formal property to remove
+	 */
+	public void removeFormalProperty(EList<Constraint> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a named element from the given list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the element to remove
+	 */
+	public void removeNamedElement(EList<?> members, String qualifiedElement) {
+		for (Object object : members) {
+			NamedElement element = (NamedElement) object;
+			if (element.getQualifiedName().equals(qualifiedElement)) {
+				try {
+					// ((Element) element).destroy(); //TODO: investigate this
+					// line!
+					deleteElementInTheModel(element);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+				members.remove(element);
+				break;
+			}
+		}
+	}
+
+	/**
+	 * Removes a property from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the property to remove
+	 */
+	public void removeProperty(EList<Property> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a property from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the property to remove
+	 */
+	public void removeConnector(EList<Connector> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a port from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the port to remove
+	 */
+	public void removePort(EList<NamedElement> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	/**
+	 * Removes a Macro Definition from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the macro to remove
+	 */
+	public void removeMacroDefinition(EList<Constraint> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	public Association createUmlAssociation(String subComponentName, Type type, String[] multiplicity, Class owner) {
+
+		final String associationName = DEFAULT_ASSOCIATION_NAME
+				+ (countPackageAssociations(owner.getNearestPackage()) + 1);
+		// I should create an Association between the elements
+		// and not a Component Instance!
+
+		return createAssociation(owner, associationName, subComponentName, type, multiplicity);
+
+	}
+
+	/**
+	 * Returns the number or defined associations for the given package.
+	 * 
+	 * @param pkg
+	 *            the package to analyze
+	 * @return the number of associations found in package
+	 */
+	private int countPackageAssociations(Package pkg) {
+		int counter = 0;
+
+		EList<NamedElement> namedList = pkg.getOwnedMembers();
+		for (NamedElement namedElement : namedList) {
+			if (namedElement instanceof Association) {
+				counter++;
+			}
+		}
+		return counter;
+	}
+
+	/**
+	 * Creates an association between the given owner and element. It will also
+	 * create the relative component instance inside the owner element.
+	 * 
+	 * @param owner
+	 *            the parent Class
+	 * @param elementName
+	 *            the name of the end element
+	 * @param elementType
+	 *            the type of the end element
+	 * @return the created Association
+	 */
+	public Association createAssociation(Class owner, String associationName, String elementName, Type elementType,
+			String[] multiplicity) {
+		logger.debug("createAssociation");
+
+		logger.debug("\n\n\n Creating association " + associationName + " for owner " + owner);
+		logger.debug("elementName = " + elementName + " with type " + elementType.getName() + " [" + multiplicity[0]
+				+ "," + multiplicity[1] + "]");
+		logger.debug("\n\n\n");
+
+		org.eclipse.uml2.uml.Package package_ = owner.getNearestPackage();
+		Association association = (Association) package_.createOwnedType(null, UMLPackage.Literals.ASSOCIATION);
+		Property subComponentInstance = buildAssociationEndInternal(association, elementName, elementType, null, true,
+				(AggregationKind) AggregationKind.get(AggregationKind.COMPOSITE));
+		buildAssociationEndInternal(association, owner.getName().toLowerCase(), owner, null, false,
+				(AggregationKind) AggregationKind.get(AggregationKind.NONE));
+		if (associationName != null) {
+			association.setName(associationName);
+		}
+
+		owner.getOwnedAttributes().add(subComponentInstance);
+
+		// Create the association and adds it to the owning package
+		// the method owner.createAssociation does not allow to set multiplicity
+		// equal to null
+		/*
+		 * final Association association = owner.createAssociation( true,
+		 * AggregationKind.get(AggregationKind.COMPOSITE), elementName, 1, 1,
+		 * elementType, false, AggregationKind.get(AggregationKind.NONE),
+		 * owner.getName().toLowerCase(), 1, 1);
+		 * association.setName(associationName);
+		 */
+		logger.debug("createAssociation done");
+
+		if (!isOneInstance(multiplicity)) {
+			logger.debug("!isOneInstance");
+			setAttributeMultiplicity(subComponentInstance, multiplicity);
+		}
+		// Add SysML Nature on the new Association
+		ElementUtil.addNature(association, SysMLElementTypes.SYSML_NATURE);
+
+		logger.debug("\n\nCreated " + associationName + " Association\n\n");
+		return association;
+	}
+
+	/*
+	 * public static Association createAssociation(Type type, boolean
+	 * end1IsNavigable, AggregationKind end1Aggregation, String end1Name, int
+	 * end1Lower, int end1Upper, Type end1Type, boolean end2IsNavigable,
+	 * AggregationKind end2Aggregation, String end2Name, int end2Lower, int
+	 * end2Upper) { org.eclipse.uml2.uml.Package package_ =
+	 * type.getNearestPackage(); if (package_ == null) { throw new
+	 * IllegalStateException(); } if (end1Aggregation == null) { throw new
+	 * IllegalArgumentException(String.valueOf(end1Aggregation)); } if
+	 * (end2Aggregation == null) { throw new
+	 * IllegalArgumentException(String.valueOf(end2Aggregation)); } Association
+	 * association = (Association) package_.createOwnedType(null,
+	 * UMLPackage.Literals.ASSOCIATION); createAssociationEnd(type, association,
+	 * end1IsNavigable, end1Aggregation, end1Name, end1Lower, end1Upper,
+	 * end1Type); createAssociationEnd(end1Type, association, end2IsNavigable,
+	 * end2Aggregation, end2Name, end2Lower, end2Upper, type); return
+	 * association; }
+	 * 
+	 * protected static Property createAssociationEnd(Class type, Association
+	 * association, boolean isNavigable, AggregationKind aggregation, String
+	 * name, int lower, int upper, Type endType) { EList<Property>
+	 * ownedAttributes = type.getOwnedAttributes(); Property associationEnd =
+	 * type.createOwnedProperty(ownedAttributes == null || !isNavigable ?
+	 * association : type, name, endType, lower, upper);
+	 * associationEnd.setAggregation(aggregation); if (isNavigable) { if
+	 * (ownedAttributes == null) {
+	 * association.getNavigableOwnedEnds().add(associationEnd); } else {
+	 * association.getMemberEnds().add(associationEnd); } } return
+	 * associationEnd; }
+	 */
+
+	private Property buildAssociationEndInternal(final Association assoc, final String name, final Type type,
+			final Integer[] multi, final Boolean navigable, final AggregationKind aggregation) {
+		// The attribute 'targetScope' of an AssociationEnd in UML1.x is no
+		// longer supported in UML2.x
+
+		Property property = UMLFactory.eINSTANCE.createProperty();
+		property.setType((Type) type);
+		property.setAssociation((Association) assoc);
+		if (name != null) {
+			property.setName(name);
+		}
+		if (navigable != null) {
+			property.setIsNavigable(navigable);
+			if (!(Boolean) navigable) {
+				((Association) assoc).getOwnedEnds().add(property);
+			}
+		}
+		if (aggregation != null) {
+			property.setAggregation((AggregationKind) aggregation);
+		}
+
+		if (multi != null) {
+			if (multi[0] != null) {
+				property.setLower(multi[0]);
+			}
+			if (multi[1] != null) {
+				property.setUpper(multi[1]);
+			}
+		}
+
+		return property;
+	}
+
+	private boolean isOneInstance(String[] multiplicityBoundariesAsExpressons) {
+		logger.debug("isOneInstance");
+		return (((multiplicityBoundariesAsExpressons[0] == null) && (multiplicityBoundariesAsExpressons[1] == null))
+				|| (multiplicityBoundariesAsExpressons[0] == "") && (multiplicityBoundariesAsExpressons[1] == ""))
+				|| (isEqualToOne(multiplicityBoundariesAsExpressons[0])
+						&& isEqualToOne(multiplicityBoundariesAsExpressons[1]));
+	}
+
+	private boolean isEqualToOne(String expression) {
+		return isInteger(expression) && (Integer.valueOf(expression) == 1);
+	}
+
+	public static boolean isInteger(String s) {
+		try {
+			Integer.parseInt(s);
+		} catch (NumberFormatException e) {
+			return false;
+		} catch (NullPointerException e) {
+			return false;
+		}
+		// only got here if we didn't return false
+		return true;
+	}
+
+	/**
+	 * Removes a delegation constraint from the list.
+	 * 
+	 * @param members
+	 *            the list of members
+	 * @param qualifiedElement
+	 *            the qualified name of the delegation constraint to remove
+	 */
+	public void removeDelegationConstraint(EList<Constraint> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	public boolean equalMultiplicityBoundaries(String[] newMultiplicityRange, String[] multiplicityRange) {
+		logger.debug("equalMultiplicityBoundaries [0]: " + newMultiplicityRange[0] + " " + multiplicityRange[0]);
+		logger.debug("equalMultiplicityBoundaries [1]: " + newMultiplicityRange[1] + " " + multiplicityRange[1]);
+		boolean equalLowerValue = equals(newMultiplicityRange[0], multiplicityRange[0]);
+		boolean equalUpperValue = equals(newMultiplicityRange[1], multiplicityRange[1]);
+		logger.debug(equalLowerValue + " - " + equalUpperValue);
+		return (equalLowerValue && equalUpperValue);
+
+	}
+
+	private boolean equals(String text1, String text2) {
+		// logger.debug("(text1 == text2): " + (text1 == text2));
+		// logger.debug("text1.equals(text2): "+text1.equals(text2) );
+		return ((text1 == text2) && (text2 == null)) || ((text1 != null) && (text2 != null) && text1.equals(text2));
+	}
+
+	public void setAttributeMultiplicity(MultiplicityElement property, String[] newMultiplicityRange) {
+		logger.debug("setAttributeMultiplicity: " + newMultiplicityRange[0] + " " + newMultiplicityRange[1]);
+		if (newMultiplicityRange[0] != null) {
+			property.setLowerValue(createLiteralStringWithValue(newMultiplicityRange[0]));
+		} else {
+			property.setLowerValue(null);
+		}
+
+		if (newMultiplicityRange[1] != null) {
+			property.setUpperValue(createLiteralStringWithValue(newMultiplicityRange[1]));
+		} else {
+			property.setUpperValue(null);
+		}
+	}
+
+	private LiteralString createLiteralStringWithValue(String value) {
+		LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
+		literalString.setValue(value);
+		return literalString;
+	}
+
+	/**
+	 * Returns the list of Parameter Assumptions of the given element.
+	 * 
+	 * @param umlElement
+	 *            the element to analyze
+	 * @return the list of Parameter Assumptions as Constraints
+	 */
+	public EList<Constraint> getParameterAssumptionsAsConstraintsUml(Element umlElement) {
+		EList<Constraint> constraints = new BasicEList<Constraint>();
+
+		if (isBlock(umlElement) || isCompType(umlElement) || isComponentImplementation(umlElement)) {
+			for (Constraint umlConstraint : ((Class) umlElement).getOwnedRules()) {
+				if (isParameterAssumptions(umlConstraint)) {
+					constraints.add((Constraint) umlConstraint);
+				}
+			}
+		}
+
+		if (isComponentInstance(umlElement)) {
+			constraints.addAll(getParameterAssumptionsAsConstraintsUml(getUmlType((Property) umlElement)));
+		}
+
+		return constraints;
+	}
+
+	/**
+	 * Checks if the given element is a Parameter Assumptions.
+	 * 
+	 * @param umlConstraint
+	 *            the constraint
+	 * @return true if the given element is a Parameter Assumptions.
+	 */
+	public boolean isParameterAssumptions(Element umlConstraint) {
+		if (umlConstraint instanceof Constraint) {
+			return UMLUtil.getAppliedStereotype(umlConstraint, PARAMETER_ASSUMPTIONS, false) != null;
+		}
+		return false;
+	}
+
+	/**
+	 * Creates a new Parameter Assumptions element.
+	 * 
+	 * @param parameterAssumptionsExpression
+	 *            the expression
+	 * @param owner
+	 *            the owning element
+	 * @param parameterAssumptionsStereotype
+	 *            the stereotype to apply
+	 * @return
+	 */
+	public Constraint createParameterAssumptions(String parameterAssumptionsExpression, Class owner,
+			Stereotype parameterAssumptionsStereotype) {
+		final int numParameterAssumptions = getParameterAssumptionsAsConstraintsUml(owner).size();
+		final String parameterAssumptionsName = DEFAULT_PAR_ASSUMPTION_PREFIX + (numParameterAssumptions + 1);
+
+		logger.debug("\n\n\n Creating Parameter Assumption " + parameterAssumptionsName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final Constraint newUMLConstraint = owner.createOwnedRule(parameterAssumptionsName);
+		newUMLConstraint.applyStereotype(parameterAssumptionsStereotype);
+
+		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
+		literalString.setName(DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME);
+		literalString.setValue(parameterAssumptionsExpression);
+		newUMLConstraint.setSpecification(literalString);
+
+		logger.debug("\n\nCreated " + parameterAssumptionsName + " Parameter Assumption\n\n");
+		return newUMLConstraint;
+	}
+
+	/* Should be no more used */
+	public Element createUmlConstraint(Class owner, String parameterAssumptionsText) {
+		int numParameterAssumptions = getParameterAssumptionsAsConstraintsUml(owner).size();
+		String parameterAssumptionsName = DEFAULT_PAR_ASSUMPTION_PREFIX + (numParameterAssumptions + 1);
+
+		logger.debug("\n\n\n Creating constraint " + parameterAssumptionsName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final Constraint newUMLConstraint = owner.createOwnedRule(parameterAssumptionsName);
+		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
+		literalString.setName(DEFAULT_PAR_ASSUMPTION_LITERAL_STRING_NAME);
+		literalString.setValue(parameterAssumptionsText);
+		newUMLConstraint.setSpecification(literalString);
+
+		logger.debug("\n\nCreated " + parameterAssumptionsName + " Constraint\n\n");
+		return newUMLConstraint;
+	}
+
+	/**
+	 * Returns the Constraint associated to the ParameterAssumptions with the
+	 * given expression
+	 * 
+	 * @param parameterAssumptionsExpression
+	 *            the expression to find
+	 * @param owner
+	 *            the owning element
+	 * @return the UML Constraint found
+	 */
+	public Constraint getParameterAssumptionsFromExpression(String parameterAssumptionsExpression, Class owner) {
+		for (Constraint umlConstraint : ((Class) owner).getOwnedRules()) {
+			if (isParameterAssumptions(umlConstraint)
+					&& getConstraintBodyStr(umlConstraint, null).equals(parameterAssumptionsExpression)) {
+				return umlConstraint;
+			}
+		}
+		return null;
+	}
+
+	public void removeParameterAssumptions(EList<Constraint> members, String qualifiedElement) {
+		removeNamedElement(members, qualifiedElement);
+	}
+
+	public String[] getUmlFunctionBehaviorOutputMultiplicity(FunctionBehavior uninterpretedFunction) {
+		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.OUT_LITERAL) {
+				return getAttributeMultiplicity(parameter);
+			}
+		}
+		return null;
+	}
+
+	public EList<String[]> getUmlFunctionBehaviorInputMultiplicities(FunctionBehavior uninterpretedFunction) {
+		EList<String[]> inputMultiplicities = new BasicEList<String[]>();
+
+		for (Parameter parameter : uninterpretedFunction.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
+				inputMultiplicities.add(getAttributeMultiplicity(parameter));
+			}
+		}
+		return inputMultiplicities;
+	}
+
+	/**
+	 * Returns the properties of the component that are only local to it.
+	 * 
+	 * @param component
+	 * @return
+	 */
+	public EList<Property> getLocalProperties(Element component) {
+		final EList<Property> localProperties = new BasicEList<Property>();
+
+		if (isComponentInstance(component)) {
+			component = getUmlType((Property) component);
+		}
+
+		if (isBlock(component) || (isCompType(component) || (isComponentImplementation(component)))) {
+			final Class umlClass = (Class) component;
+			final EList<Property> attributes = umlClass.getOwnedAttributes();
+			for (final Property umlProperty : attributes) {
+				if (umlProperty != null && !isComponentInstance(umlProperty) && !isPort(umlProperty)
+						&& !ContractEntityUtil.getInstance().isContractProperty(umlProperty)) {
+					localProperties.add(umlProperty);
+				}
+			}
+		}
+		return localProperties;
+	}
+
+	/**
+	 * Returns the name of a local property.
+	 * 
+	 * @param property
+	 *            the property
+	 * @return the property name
+	 */
+	public String getLocalPropertyName(Property property) {
+		if (property != null) {
+			return property.getName();
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the list of enumerations as a single string.
+	 * 
+	 * @param enumeration
+	 *            the enumeration
+	 * @return the list of values
+	 */
+	private String getEnumTypeValuesAsStr(Enumeration enumeration) {
+		final StringJoiner enumValues = new StringJoiner(", ", "[", "]");
+
+		for (final String value : getListValuesForEnumeratorType(enumeration)) {
+			enumValues.add(value);
+		}
+		return enumValues.toString();
+	}
+
+	/**
+	 * Returns the type of a local property, taking care of range and
+	 * enumerations.
+	 * 
+	 * @param property
+	 *            the property
+	 * @return the property type
+	 */
+	public String getLocalPropertyType(Property property) {
+		if (property != null) {
+			final Type propertyType = property.getType();
+
+			if (propertyType != null) {
+				if (isRangeType(propertyType)) {
+					String[] range = getLowerUpperBoundsForRangeType(propertyType);
+					return propertyType.getName() + " - Range [" + range[0] + " .. " + range[1] + "]";
+				} else if (isEnumerationType(propertyType)) {
+
+					return propertyType.getName() + " - Enum " + getEnumTypeValuesAsStr((Enumeration) propertyType);
+				} else {
+					return propertyType.getName();
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Creates a new Macro Definition element.
+	 * 
+	 * @param macroDefinitionName
+	 *            the name of the macro
+	 * @param macroDefinitionExpression
+	 *            the expression
+	 * @param owner
+	 *            the owning element
+	 * @param macroDefinitionStereotype
+	 *            the stereotype to apply
+	 * @return the Constraint element
+	 */
+	public Constraint createMacroDefinition(String macroDefinitionName, String macroDefinitionExpression, Class owner,
+			Stereotype macroDefinitionStereotype) {
+		logger.debug("\n\n\n Creating Macro Definition " + macroDefinitionName + " for owner " + owner);
+		logger.debug("\n\n\n");
+
+		final Constraint newUMLConstraint = owner.createOwnedRule(macroDefinitionName);
+		newUMLConstraint.applyStereotype(macroDefinitionStereotype);
+
+		final LiteralString literalString = UMLFactory.eINSTANCE.createLiteralString();
+		literalString.setName(DEFAULT_MACRO_DEFINITION_STRING_NAME);
+		literalString.setValue(macroDefinitionExpression);
+		newUMLConstraint.setSpecification(literalString);
+
+		logger.debug("\n\nCreated " + macroDefinitionName + " Macro Definition\n\n");
+		return newUMLConstraint;
+	}
+
+	/**
+	 * Updates the expression of the given Macro Definition, if needed.
+	 * 
+	 * @param umlConstraint
+	 *            the Macro Definition as Constraint
+	 * @param macroDefinitionExpression
+	 *            the new expression
+	 * @param mapMacroDefinitionsToKeep
+	 *            the map of existing Macro Definitions
+	 */
+	public void updateMacroDefinition(Constraint umlConstraint, String macroDefinitionExpression, String language) {
+
+		// Get the current expression
+		final String constraintExpression = getConstraintBodyStr(umlConstraint, language);
+
+		// If the expression is different, save it, otherwise go on
+		if (!macroDefinitionExpression.equals(constraintExpression)) {
+			setLiteralStringTextInUMLConstraint(umlConstraint, macroDefinitionExpression);
+		}
+	}
+
+	public Class getSystemElement(Model model) throws Exception {
+
+		if (model != null) {
+			TreeIterator<EObject> allElements = model.eResource().getAllContents();
+			if (allElements != null) {
+				Collection<org.eclipse.uml2.uml.Class> classes = EcoreUtil
+						.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getClass_());
+
+				for (Class c : classes) {
+					if (isSystem(c)) {
+						return c;
+					}
+				}
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Returns the System component of the given package, if any.
+	 * 
+	 * @param pkg
+	 *            the package containing the architecture
+	 * @return the System component, or null if any or more than one are found
+	 */
+	public Class getSystemComponent(Package pkg) {
+		boolean found = false;
+		Element systemElement = null;
+
+		if (pkg != null) {
+			final EList<Element> ownedElements = pkg.getOwnedElements();
+			for (Element element : ownedElements) {
+				if (isSystem(element)) {
+					if (!found) {
+						systemElement = element;
+						found = true;
+					} else {
+						return null;
+					}
+				}
+			}
+		}
+		if (found) {
+			return (Class) systemElement;
+		} else {
+			return null;
+		}
+	}
+
+	public EList<String> getParametersListFromInstantiatedArchitectureConfiguration(
+			InstantiatedArchitectureConfiguration instantiatedArchitectureConfiguration) {
+		return instantiatedArchitectureConfiguration.getParameterList();
+	}
+
+	public EList<Operation> getUmlOperations(Element umlElement) {
+
+		if (isComponentInstance((Element) umlElement)) {
+			umlElement = ((Property) umlElement).getType();
+		}
+
+		if (umlElement instanceof Class) {
+			Class umlClass = (Class) umlElement;
+			return umlClass.getOwnedOperations();
+		}
+
+		return null;
+	}
+
+	public EList<Operation> getUmlOperations(Element umlElement, String language) {
+
+		EList<Operation> operations = null;
+
+		if (isComponentInstance((Element) umlElement)) {
+			umlElement = ((Property) umlElement).getType();
+		}
+
+		if (umlElement instanceof Class) {
+			Class umlClass = (Class) umlElement;
+			if (!umlClass.getOwnedOperations().isEmpty()) {
+				operations = new BasicEList<Operation>();
+			}
+			for (Operation operation : umlClass.getOwnedOperations()) {
+				if (getUmlOperationBody(operation, language) != null) {
+					operations.add(operation);
+				}
+			}
+		}
+
+		return operations;
+	}
+
+	public String getUmlOperationName(Operation operation) {
+		return operation.getName();
+	}
+
+	public EList<?> getUmlOperationInputTypes(Operation operation) {
+		EList<Type> inputTypes = new BasicEList<Type>();
+
+		for (Parameter parameter : operation.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.IN_LITERAL) {
+				inputTypes.add(parameter.getType());
+			}
+		}
+		return inputTypes;
+	}
+
+	public String getUmlOperationBody(Operation operation, String language) {
+		if (!operation.getMethods().isEmpty()) {
+			Behavior behavior = operation.getMethods().get(0);
+			if (behavior instanceof OpaqueBehavior) {
+				return getOpaqueBehaviorBody((OpaqueBehavior) behavior, language);
+			} else if (behavior instanceof FunctionBehavior) {
+				return getFunctionBehaviorBody((FunctionBehavior) behavior, language);
+			}
+		}
+		return null;
+	}
+
+	public Type getUmlOperationOutputType(Operation operation) {
+		for (Parameter parameter : operation.getOwnedParameters()) {
+			if (parameter.getDirection() == ParameterDirectionKind.RETURN_LITERAL) {
+				return parameter.getType();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets the value of the 'Body' attribute for the
+	 * <code>FunctionBehavior</code> for a given language.
+	 *
+	 * @param language
+	 *            the language in which the body is written
+	 * @return the value of 'Body' at the index i
+	 */
+	public String getFunctionBehaviorBody(FunctionBehavior functionBehavior, String language) {
+		return getBodyForLanguageOfBodyOwner(functionBehavior, language);
+	}
+
+	/**
+	 * Gets the value of the 'Body' attribute for the
+	 * <code>OpaqueBehavior</code> for a given language.
+	 *
+	 * @param language
+	 *            the language in which the body is written
+	 * @return the value of 'Body' at the index i
+	 */
+	public String getOpaqueBehaviorBody(OpaqueBehavior opaqueBehavior, String language) {
+		return getBodyForLanguageOfBodyOwner(opaqueBehavior, language);
+	}
+
+	/**
+	 * Returns the body for a bodyOwner for the given language
+	 *
+	 * @param bodyOwner
+	 *            the bodyOwner to edit.
+	 * @param language
+	 *            the language in which the body is written
+	 * @return the body for the given language or the empty string if the
+	 *         language was not found
+	 */
+	public String getBodyForLanguageOfBodyOwner(BodyOwner bodyOwner, String language) {
+		String body = null;
+		if (language == null) {
+			if (!bodyOwner.getBodies().isEmpty()) {
+				body = bodyOwner.getBodies().get(0);
+			}
+		} else {
+			// retrieve the index of the given language in the opaque Expression
+			int index = bodyOwner.getLanguages().indexOf(language);
+			if (index != -1) {
+				// language found. return the corresponding body in the bodies
+				// list.
+				// List should be synchronized, ie having the same size, but be
+				// sure...
+				if (index < bodyOwner.getBodies().size()) {
+					body = bodyOwner.getBodies().get(index);
+				}
+			}
+		}
+		return body;
+	}
+
+	/**
+	 * sets the body for a bodyOwner for the given language.
+	 * <p>
+	 * If the language was already defined, it replaces the corresponding body.
+	 * If the language was not already defined, it adds it to the list of
+	 * languages and adds the corresponding body.
+	 * <p>
+	 * A utility method,
+	 * {@link OpaqueExpression#checkAndCorrectLists(org.eclipse.uml2.uml.OpaqueExpression)}
+	 * is used to correct the language and body lists.
+	 *
+	 * @param bodyOwner
+	 *            the opaque expression to edit.
+	 * @param language
+	 *            the language in which the body is written
+	 * @param body
+	 *            the body to save
+	 */
+	public void setBodyForLanguageOfBodyOwner(BodyOwner bodyOwner, String language, String body) {
+		// checks both lists by size
+		checkAndCorrectListsOfBodyOwner(bodyOwner);
+		// checks if language exists, if not, creates one
+		if (!bodyOwner.getLanguages().contains(language)) {
+			bodyOwner.getLanguages().add(language);
+			bodyOwner.getBodies().add(body);
+		} else {
+			// retrieve the index of the given language in the opaque Expression
+			int index = bodyOwner.getLanguages().indexOf(language);
+			// sets the body at the given index in the list of bodies.
+			bodyOwner.getBodies().set(index, body);
+		}
+	}
+
+	/**
+	 * Checks body and languages list of a bodyOwner.
+	 * <p>
+	 * It returns <code>true</code> if both lists have the same size. It returns
+	 * <code>false</code> if one of the list was bigger than the other one. In
+	 * this latter case, one of the list was corrected, ie enough elements where
+	 * added in the list
+	 *
+	 * @param bodyOwner
+	 *            the bodyOwner to check
+	 * @return <code>true</code> if both lists already had the same size,
+	 *         <code>false</code> in other cases.
+	 */
+	private boolean checkAndCorrectListsOfBodyOwner(BodyOwner bodyOwner) {
+		// both lists, languages and bodies, should have the same size
+		final int bodySize = bodyOwner.getBodies().size();
+		final int languageSize = bodyOwner.getLanguages().size();
+		// check both size
+		// if equals, lists are supposed synchronized, it is ok
+		// if less body than languages, add bodies
+		// if more body, add enough languages
+		if (bodySize == languageSize) {
+			return true;
+		} else {
+			final int difference = languageSize - bodySize;
+			if (difference > 0) {
+				// more languages strings than body strings, add enough bodies
+				for (int i = 0; i < difference; i++) {
+					bodyOwner.getBodies().add("");
+				}
+			} else {
+				// more body strings than language strings, add enough languages
+				for (int i = 0; i < (-difference); i++) {
+					bodyOwner.getLanguages().add("");
+				}
+			}
+			// lists had to be modified, return false...
+			return false;
+		}
+	}
+
+	public EList<Property> getBlockTypeAttributes(Class blockAsClass) {
+		EList<Property> attributes = new BasicEList<Property>();
+
+		for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
+			if (!isPort(umlProperty)) {
+				if (isBlockTypeAttribute(umlProperty)) {
+					attributes.add(umlProperty);
+				}
+			}
+		}
+
+		return attributes;
+	}
+
+	public String getAttributeVisibility(Property attribute) {
+		return attribute.getVisibility().getName();
+	}
+
+	public boolean isBlockTypeAttribute(String attributeName, Class blockAsClass) {
+		if (blockAsClass != null) {
+			for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
+				if (!isPort(umlProperty)) {
+					if (isBlockTypeAttribute(umlProperty) && (umlProperty.getName().equals(attributeName))) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	public boolean isBlockTypeAttribute(Property umlProperty) {
+		return (umlProperty.getType() != null) && (isBlock(umlProperty.getType()));
+	}
+
+	/*
+	 * public boolean isConcurrentOperation(String operationName, Class
+	 * blockType) {
+	 * 
+	 * if (blockType != null) { logger.debug("isConcurrentOperation: " +
+	 * operationName + " class: " + blockType.getName()); for (Operation
+	 * operation : blockType.getOperations()) {
+	 * 
+	 * logger.debug("operation.getName(): " + operation.getName());
+	 * logger.debug("operation.getConcurrency(): " +
+	 * operation.getConcurrency());
+	 * logger.debug("CallConcurrencyKind.CONCURRENT_LITERAL: " +
+	 * CallConcurrencyKind.CONCURRENT_LITERAL); logger.
+	 * debug("operation.getConcurrency().getLiteral().equals(CallConcurrencyKind.CONCURRENT_LITERAL) "
+	 * + operation.getConcurrency().getLiteral().equals(CallConcurrencyKind.
+	 * CONCURRENT_LITERAL));
+	 * logger.debug("operation.getName().equals(operationName)) " +
+	 * operation.getName().equals(operationName));
+	 * 
+	 * if (operation.getConcurrency().equals(CallConcurrencyKind.
+	 * CONCURRENT_LITERAL) && (operation.getName().equals(operationName))) {
+	 * logger.debug("TRUE"); return true; } } } return false; }
+	 */
+
+	public Class getBlockType(Package currPackage, String blockName) {
+		PackageableElement element = currPackage.getPackagedElement(blockName);
+
+		if (isBlock(element)) {
+			return (Class) element;
+		}
+
+		return null;
+	}
+
+	public Class getAttributeBlockType(String attributeName, Class block) {
+		// logger.debug("getAttributeBlockType: " + block + " , " +
+		// attributeName);
+		for (Property property : block.getAttributes()) {
+			// logger.debug("property.getName(): " + property.getName());
+			// logger.debug("isBlockTypeAttribute(property): " +
+			// isBlockTypeAttribute(property));
+			if (property.getName().equals(attributeName) && (isBlockTypeAttribute(property))) {
+				// logger.debug("OK!");
+				return (Class) property.getType();
+			}
+		}
+		return null;
+	}
+
+	public Type getOperationType(String operationName, Class block) {
+		final Operation operation = getOperation(operationName, block);
+		if (operation != null) {
+			return getUmlOperationOutputType(operation);
+		}
+		// // logger.debug("getOperationType: " + block + " , " +
+		// operationName);
+		// for (Operation operation : block.getOwnedOperations()) {
+		// // logger.debug("operation.getName(): " + operation.getName());
+		// if (operation.getName().equals(operationName)) {
+		// // logger.debug("OK!");
+		// return getUmlOperationOutputType(operation);
+		// }
+		// }
+		return null;
+	}
+
+	public Operation getOperation(String operationName, Class block) {
+		return block.getOwnedOperation(operationName, null, null);
+		// logger.debug("getOperationType: " + block + " , " + operationName);
+		// for (Operation operation : block.getOwnedOperations()) {
+		// logger.debug("operation.getName(): " + operation.getName());
+		// if (operation.getName().equals(operationName)) {
+		// logger.debug("OK!");
+		// return operation;
+		// }
+		// }
+		// return null;
+	}
+
+	public boolean isAttribute(String attributeName, Class blockAsClass) {
+		if (blockAsClass != null) {
+			Property umlProperty = blockAsClass.getOwnedAttribute(attributeName, null);
+			if ((umlProperty != null) && (!isPort(umlProperty))) {
+				return true;
+			}
+			/*
+			 * for (Property umlProperty : blockAsClass.getOwnedAttributes()) {
+			 * if (umlProperty.getName().equals(attributeName)) { if
+			 * (!isPort(umlProperty)) { return true; } } }
+			 */
+		}
+		return false;
+	}
+
+	public boolean isOperation(String operationName, Class blockAsClass) {
+		if (blockAsClass != null) {
+			Operation umlOperation = blockAsClass.getOwnedOperation(operationName, null, null);
+			if (umlOperation != null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public boolean containsEnumeration(Package currPackage, boolean searchInNestedPackages) {
+
+		final EList<Type> types = currPackage.getOwnedTypes();
+		for (Type type : types) {
+			if (type instanceof Enumeration) {
+				return true;
+			}
+		}
+
+		if (searchInNestedPackages) {
+			for (Package nestedPackage : currPackage.getNestedPackages()) {
+				if (containsEnumeration(nestedPackage, searchInNestedPackages))
+					return true;
+			}
+		}
+		return false;
+	}
+
+	public Type getAttributeType(String attributeName, Class block) {
+		// logger.debug("getAttribute of block: " + block + " , " +
+		// attributeName);
+		for (Property property : block.getAttributes()) {
+			// logger.debug("property.getName(): " + property.getName());
+			if (property.getName().equals(attributeName)) {
+				// logger.debug("OK!");
+				return property.getType();
+			}
+		}
+		return null;
+	}
+
+	public Type getParameterType(int paramIndex, String methodName, Class retrieveBlockType) {
+		// logger.debug("getParameterType: " + retrieveBlockType + " , " +
+		// methodName + " , " + paramIndex);
+		Operation operation = getOperation(methodName, retrieveBlockType);
+		// logger.debug("getParameterType operation: " + operation);
+		if ((operation != null) // && (operation.getMethods() != null) &&
+								// (!operation.getMethods().isEmpty())
+		) {
+
+			if (operation.inputParameters() != null) {
+				EList<Parameter> params = operation.inputParameters();
+				if ((!params.isEmpty())) {
+					Parameter par = params.get(paramIndex);
+					if (par != null) {
+						// logger.debug("getParameterType par: " + par);
+						return par.getType();
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	public String getCallEventOperationName(Trigger trigger) {
+		if (trigger.getEvent() instanceof CallEvent) {
+			return ((CallEvent) trigger.getEvent()).getOperation().getName();
+		}
+
+		return null;
+	}
+
+	public Collection<CallEvent> getAllCallEvent(Class currBlock) {
+		Model model = currBlock.getModel();
+		TreeIterator<EObject> allElements = model.eResource().getAllContents();
+		if (allElements != null) {
+			Collection<CallEvent> callEvents = EcoreUtil.getObjectsByType(iterator2Collection(allElements),
+					UMLPackage.eINSTANCE.getCallEvent());
+			return callEvents;
+		}
+		return null;
+	}
+
+	public String getCallEventOperationName(CallEvent callEvent) throws Exception {
+		if (callEvent.getOperation() != null) {
+			return callEvent.getOperation().getName();
+		}
+		throw new Exception("The callEvent " + callEvent.getQualifiedName() + " has no associated operation");
+	}
+
+	public EList<String> getOperationsNames(Class component) {
+		EList<String> operationsNames = new BasicEList<String>();
+		for (Operation operation : component.getOwnedOperations()) {
+			String operationName = operation.getName();
+			operationsNames.add(operationName);
+		}
+		return operationsNames;
+	}
+
+	public EList<String> getAttributesNames(Class component) {
+		EList<String> attributesNames = new BasicEList<String>();
+		for (Property attribute : component.getOwnedAttributes()) {
+			String attributeName = attribute.getName();
+			if (!isPort(attribute)) {
+				attributesNames.add(attributeName);
+			}
+		}
+		return attributesNames;
+	}
+
+	public EList<Parameter> getOperationParameters(String operationName, Class parentClass) {
+		Operation op = parentClass.getOwnedOperation(operationName, null, null);
+		if (op != null) {
+			return op.getOwnedParameters();
+		}
+		return null;
+	}
+
+	public Operation getCallEventOperation(CallEvent callEvent) throws Exception {
+		if (callEvent.getOperation() != null) {
+			return callEvent.getOperation();
+		}
+		throw new Exception("The callEvent " + callEvent.getQualifiedName() + " has no associated operation");
+	}
+
+	public EList<String> getParametersNames(Operation operation) {
+		EList<String> parametersNames = new BasicEList<String>();
+		for (Parameter par : operation.getOwnedParameters()) {
+			parametersNames.add(par.getName());
+		}
+		return parametersNames;
+	}
+
+	public Object getParameterType(String paramName, String methodName, Class retrieveBlockType) {
+		Operation operation = getOperation(methodName, retrieveBlockType);
+		if ((operation != null)) {
+			if (operation.inputParameters() != null) {
+				Parameter par = operation.getOwnedParameter(paramName, null);
+				if (par != null) {
+					// logger.debug("getParameterType par: " + par);
+					return par.getType();
+				}
+			}
+		}
+		return null;
+	}
+
+
+	public List<String> getMethodArgumentNames(String methodName, Class retrieveBlockType) {
+		List<String> args = new ArrayList<String>();
+		Operation operation = getOperation(methodName, retrieveBlockType);
+		if ((operation != null)) {
+			if (operation.inputParameters() != null) {
+				for(Parameter par : operation.inputParameters()){
+					args.add(par.getName());
+				}				
+			}
+		}
+		return args;
+	}
+	
+	
+	
+	@SuppressWarnings("unchecked")
+	public Collection<Enumeration> getAllEnumeratives(Package packageElement) throws Exception {
+		return (Collection<Enumeration>) EObjectUtil.getAllElements(UMLPackage.eINSTANCE.getEnumeration(),
+				packageElement);
+	}
+
+	
+
+
+	/**
+	 * Returns all the classes in the model.
+	 * <p> BEWARE: all the classes, not only the classes in the given package
+	 * @param packageElement
+	 * @return
+	 * @throws Exception
+	 */
+	public Collection<Class> getAllClasses(Package packageElement) throws Exception {
+		Collection<Class> classElements = null;
+		if (packageElement != null) {
+			TreeIterator<EObject> allElements = packageElement.eResource().getAllContents();
+			if (allElements != null) {
+				classElements = getClassObjects(iterator2Collection(allElements));
+			}
+			return classElements;
+		}
+		throw new Exception("Element does not exist.");
+	}
+
+
+	/**
+	 * Returns the Class elements directly contained in a package.
+	 * @param pkg the Package
+	 * @return the Class children
+	 */
+	public Collection<Class> getPackageClasses(Package pkg) throws Exception {
+		Collection<Class> classElements = null;
+		if (pkg != null) {
+			Collection<Element> ownedElements = pkg.getOwnedElements();
+			if (ownedElements != null) {
+				classElements = getClasses(ownedElements);
+			}
+			return classElements;
+		}
+		throw new Exception("Package does not exist.");
+	}
+	
+	private Collection<Class> getClasses(Collection<Element> elements) {
+		Collection<Class> result = new ArrayList<Class>();
+		for (Element element : elements) {
+			if (isBlock(element)) result.add((Class) element);
+		}
+		return result;
+	}
+
+
+	public Object getParameterType(String paramName, Operation operation) {
+		if ((operation != null)) {
+			if (operation.inputParameters() != null) {
+				Parameter par = operation.getOwnedParameter(paramName, null);
+				if (par != null) {
+					// logger.debug("getParameterType par: " + par);
+					return par.getType();
+				}
+			}
+		}
+		return null;
+	}	
+
+	public Collection<Operation> getAllOperations(Package packageElement) throws Exception {
+		if (packageElement != null) {
+			TreeIterator<EObject> allElements = packageElement.eResource().getAllContents();
+			Collection<org.eclipse.uml2.uml.Operation> operations = EcoreUtil
+					.getObjectsByType(iterator2Collection(allElements), UMLPackage.eINSTANCE.getOperation());
+			return operations;
+		}
+		throw new Exception("Element does not exist.");
+	}
+
+
+
+	public static <T> Collection<T> getClassObjects(Collection<EObject> objects) {
+		Collection<T> result = new ArrayList<T>();
+		for (EObject object : objects) {
+			if (UMLPackage.eINSTANCE.getClass_().isInstance(object) && object.eContainer() instanceof Package) {
+				@SuppressWarnings("unchecked")
+				T t = (T) object;
+				result.add(t);
+			}
+		}
+		return result;
+	}
+	
+
 }
\ No newline at end of file
-- 
GitLab