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