blob: f701564a7edee248b4f09f7a7357daf6e45b85b6 [file] [log] [blame]
/*******************************************************************************
* 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 v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Alberto Debiasi - initial API and implementation
******************************************************************************/
package org.polarsys.chess.contracts.contractEditor;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog;
import org.eclipse.papyrus.uml.diagram.composite.part.Messages;
import org.eclipse.papyrus.uml.tools.providers.UMLContentProvider;
import org.eclipse.papyrus.uml.tools.providers.UMLLabelProvider;
import org.eclipse.swt.widgets.Display;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Constraint;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Profile;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.UMLPackage;
import org.polarsys.chess.contracts.profile.chesscontract.FormalProperty;
import org.polarsys.chess.contracts.profile.chesscontract.util.ContractEntityUtil;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.service.core.model.ChessSystemModel;
import org.polarsys.chess.service.gui.utils.SelectionUtil;
import eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab;
import eu.fbk.eclipse.standardtools.utils.core.model.AbstractSystemModel;
/**
* This is the contract editor designed for the CHESS platform. It extends the
* ContractEditorTab that is designed to be extended and contains standard
* methods not related to specific technologies. The only rule is that it
* requires Eclipse based platforms.
*
*/
public class CustomContractEditorTab extends ContractEditorTab {
private ContractEntityUtil contractEntityUtil = ContractEntityUtil.getInstance();
private SelectionUtil selectionUtil = SelectionUtil.getInstance();
private EntityUtil entityUtil = EntityUtil.getInstance();
@Override
public Resource getResourceFromContract(Object contract) {
return ((Class) contract).eResource();
}
public String getContractQualifiedName(Object contract) {
if (contract != null) {
return ((Class) contract).getQualifiedName();
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #returnComponent(org.eclipse.jface.viewers.ISelection)
*/
@Override
public Object returnComponent(ISelection selection) {
Object selectedUmlElement = selectionUtil.getUmlSelectedObject(selection);
if (selectedUmlElement instanceof Property) {
if (entityUtil.isComponentInstance((Property) selectedUmlElement)) {
Element umlClass = entityUtil.getUmlType((Property) selectedUmlElement);
if (!contractEntityUtil.isContract(umlClass)) {
return umlClass;
}
}
} else if (selectedUmlElement instanceof Class) {
if (!contractEntityUtil.isContract((Class) selectedUmlElement)) {
return selectedUmlElement;
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #returnContract(org.eclipse.jface.viewers.ISelection)
*/
@Override
public Object returnContract(ISelection selection) {
Object selectedUmlElement = selectionUtil.getUmlSelectedObject(selection);
if (selectedUmlElement instanceof Property) {
if (contractEntityUtil.isContractProperty((Property) selectedUmlElement)) {
return entityUtil.getUmlType((Property) selectedUmlElement);
}
if (entityUtil.isComponentInstance((Property) selectedUmlElement)) {
Element classType = entityUtil.getUmlType((Property) selectedUmlElement);
if (contractEntityUtil.isContract(classType)) {
return classType;
}
}
} else if (selectedUmlElement instanceof Class) {
if (contractEntityUtil.isContract((Class) selectedUmlElement)) {
return selectedUmlElement;
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getContractListStr(java.lang.Object)
*/
@Override
public String[] getContractListStr(Object component) {
EList<String> contractNames = new BasicEList<String>();
for (Property prop : ((Class) component).getAttributes()) {
if (contractEntityUtil.isContractProperty(prop)) {
if (prop.getType() == null) {
contractNames.add(prop.getName() + " : <TYPE NOT DEFINED>");
} else {
contractNames.add(prop.getName() + " : " + prop.getType().getName());
}
}
}
String[] contractNamesArr = new String[contractNames.size()];
return contractNames.toArray(contractNamesArr);
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #extractContractFromComponent(java.lang.Object, java.lang.String)
*/
@Override
public Object extractContractFromComponent(Object component, String contractName) {
return contractEntityUtil.getUmlContract((Class) component, contractName);
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #createAssumption(java.lang.Object)
*/
@Override
public void createAssumption(Object contract) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
contractEntityUtil.createAssumptionToUmlContract((Class) contract);
}});
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #browseAssumptionButtonPressed(java.lang.Object)
*/
@Override
public String browseAssumptionButtonPressed(Object contract) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
Constraint assumeConstraint = selectProperty(contract);
if (assumeConstraint != null) {
contractEntityUtil.assignUmlConstraintAssumptionToUmlContract(assumeConstraint, (Class) contract);
}
}
});
return contractEntityUtil.getAssumeStrFromUmlContract((Class) contract);
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #createGuarantee(java.lang.Object)
*/
@Override
public void createGuarantee(Object contract) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
contractEntityUtil.createGuaranteeToUmlContract((Class) contract);
}});
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #browseGuaranteeButtonPressed(java.lang.Object)
*/
@Override
public String browseGuaranteeButtonPressed(Object contract) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
Constraint guaranteeConstraint = selectProperty(contract);
if (guaranteeConstraint != null) {
contractEntityUtil.assignUmlConstraintGuaranteeToUmlContract(guaranteeConstraint, (Class) contract);
}
}
});
return contractEntityUtil.getGuaranteeStrFromUmlContract((Class) contract);
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #guaranteeEditorchanged(java.lang.Object, java.lang.String)
*/
@Override
public void guaranteeEditorchanged(Object contract, String textChanged) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
contractEntityUtil.setTextToGuaranteeOrCreateGuarantee(textChanged, (Class) contract);
}
});
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #assumptionEditorchanged(java.lang.Object, java.lang.String)
*/
@Override
public void assumptionEditorchanged(Object contract, String textChanged) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(contract);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
contractEntityUtil.setTextToAssumeOrCreateAssume(textChanged, (Class) contract);
}
});
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getContractName(java.lang.Object)
*/
public String getContractName(Object contract) {
if (contract != null) {
return ((Class) contract).getQualifiedName();
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getAssumeStrFromContract(java.lang.Object)
*/
@Override
public String getAssumeStrFromContract(Object contract) {
return (contractEntityUtil.getAssumeStrFromUmlContract((Class) contract));
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getAssumeQualifiedNameFromContract(java.lang.Object)
*/
@Override
public String getAssumeQualifiedNameFromContract(Object contract) {
FormalProperty assumeFormalProperty = contractEntityUtil.getAssumeFromUmlContract((Class) contract);
if (assumeFormalProperty != null) {
return assumeFormalProperty.getBase_Constraint().getQualifiedName();
}
else {
return "no Assume defined";
}
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getGuaranteeStrFromContract(java.lang.Object)
*/
@Override
public String getGuaranteeStrFromContract(Object contract) {
return (contractEntityUtil.getGuaranteeStrFromUmlContract((Class) contract));
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #getGuaranteeQualifiedNameFromContract(java.lang.Object)
*/
@Override
public String getGuaranteeQualifiedNameFromContract(Object contract) {
FormalProperty guaranteeFormalProperty = contractEntityUtil.getGuaranteeFromUmlContract((Class) contract);
if (guaranteeFormalProperty != null) {
return guaranteeFormalProperty.getBase_Constraint().getQualifiedName();
}
else {
return "no Guarantee defined";
}
}
/*
* (non-Javadoc)
*
* @see
* eu.fbk.eclipse.standardtools.contractEditor.propertyTab.ContractEditorTab
* #createContractProperty(java.lang.Object, java.lang.String)
*/
@Override
public void createContractProperty(Object component, String propertyName) {
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(component);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
contractEntityUtil.createContractPropertyToUmlComponent((Class) component, propertyName);
}});
}
/**
* It allows the user to select a formal property to be used as assumption
* or guarantee of a contract.
*
* @param contract
* the contract
* @return the formal property selected
*/
private Constraint selectProperty(Object contract) {
TreeSelectorDialog dialog = new TreeSelectorDialog(Display.getDefault().getActiveShell());
org.eclipse.uml2.uml.Package pkg = entityUtil.getToPackage((Class) contract);
// Profile profile = null;
Profile profile = pkg.getAppliedProfile("CHESSContract", true);
Stereotype formalPropertyStereotype = profile.getOwnedStereotype("FormalProperty");
UMLContentProvider provider = new UMLContentProvider(pkg,
// contract.getOwner(),
UMLPackage.eINSTANCE.getPackage_PackagedElement(), formalPropertyStereotype);
dialog.setContentProvider(provider);
dialog.setLabelProvider(new UMLLabelProvider());
dialog.setMessage(Messages.UMLModelingAssistantProviderMessage);
dialog.setTitle(Messages.UMLModelingAssistantProviderTitle);
if (dialog.open() == org.eclipse.jface.window.Window.OK) {
Object[] result = dialog.getResult();
if (result != null && result.length > 0 && result[0] instanceof Constraint) {
return (Constraint) result[0];
}
}
return null;
}
@Override
public AbstractSystemModel getSystemModel() {
return ChessSystemModel.getInstance();
}
}