blob: a5a3b6f792f9d3850fc10e80b12798b8466ed55c [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.safetyAnalysis.commands;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.uml2.uml.Class;
import org.polarsys.chess.chessmlprofile.Dependability.DependableComponent.Analysis;
import org.polarsys.chess.chessmlprofile.ParameterizedArchitecture.InstantiatedArchitectureConfiguration;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.service.core.exceptions.NoComponentException;
import org.polarsys.chess.service.core.model.ChessSystemModel;
import org.polarsys.chess.service.core.utils.AnalysisResultUtil;
import org.polarsys.chess.service.core.utils.FileNamesUtil;
import org.polarsys.chess.service.gui.utils.SelectionUtil;
import eu.fbk.eclipse.standardtools.utils.ui.dialogs.SelectArchitectureConfigurationDialog;
import eu.fbk.eclipse.standardtools.ExecOcraCommands.ui.services.OCRAExecService;
import eu.fbk.eclipse.standardtools.utils.ui.commands.AbstractJobCommand;
import eu.fbk.eclipse.standardtools.utils.ui.dialogs.MessageTimeModelDialog;
import eu.fbk.eclipse.standardtools.utils.ui.utils.OCRADirectoryUtil;
import eu.fbk.tools.adapter.ocra.ComputeContractFaultTree;
/**
*
*
*/
public class ComputeContractFaultTreeCommand extends AbstractJobCommand {
private SelectionUtil selectionUtil = SelectionUtil.getInstance();
private OCRAExecService ocraExecService = OCRAExecService.getInstance(ChessSystemModel.getInstance());
private OCRADirectoryUtil ocraDirectoryUtil = OCRADirectoryUtil.getInstance();
private AnalysisResultUtil analysisResultUtil = AnalysisResultUtil.getInstance();
public ComputeContractFaultTreeCommand() {
super("Contract-based Fault Tree");
}
private Class umlSelectedComponent;
private InstantiatedArchitectureConfiguration selectedInstantiatedArchitectureConfiguration;
private Resource umlSelectedResource;
private boolean isDiscreteTime;
private boolean showPopups;
private String ossFilepath;
private String resultFilePath;
private boolean usexTextValidation;
private boolean commandExecuted;
@Override
public void execPreJobOperations(ExecutionEvent event, IProgressMonitor monitor) throws Exception {
// The user could select a component or a package containing an
// architecture
// In the latter case, extract the system component from that package
try {
umlSelectedComponent = selectionUtil.getUmlComponentFromSelectedObject(event);
} catch (NoComponentException e) {
umlSelectedComponent = analysisResultUtil.getSystemComponentFromEvent(event);
}
umlSelectedResource = umlSelectedComponent.eResource();
isDiscreteTime = MessageTimeModelDialog.openQuestion(true);
showPopups = false;
usexTextValidation = true;
ossFilepath = ocraDirectoryUtil.getOSSDirPath();
resultFilePath = FileNamesUtil.getInstance().computeContractFaultTreeFileName(umlSelectedComponent);
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
EList<InstantiatedArchitectureConfiguration> instantiatedArchitecures = EntityUtil.getInstance()
.getInstantiatedArchitecureConfigurations(umlSelectedComponent);
if ((instantiatedArchitecures != null) && (!instantiatedArchitecures.isEmpty())) {
SelectArchitectureConfigurationDialog dialog = new SelectArchitectureConfigurationDialog(shell,
ChessSystemModel.getInstance(), instantiatedArchitecures);
dialog.open();
if (dialog.goAhead()) {
selectedInstantiatedArchitectureConfiguration = (InstantiatedArchitectureConfiguration) dialog
.getSelectedAchitectureConfiguration();
final String configurationName = ChessSystemModel.getInstance()
.getInstantiatedArchitectureConfigurationName(selectedInstantiatedArchitectureConfiguration);
resultFilePath = ocraDirectoryUtil.getCommandFaultTreeGenResultPath(configurationName);
}
}
}
@Override
public void execJobCommand(ExecutionEvent event, IProgressMonitor monitor) throws Exception {
commandExecuted = ocraExecService.executeComputeFaultTree(umlSelectedComponent, selectedInstantiatedArchitectureConfiguration,umlSelectedResource,
isDiscreteTime, usexTextValidation, showPopups, ossFilepath, resultFilePath, monitor, true);
}
@Override
public void execPostJobOperations(ExecutionEvent event, NullProgressMonitor nullProgressMonitor) throws Exception {
// If requested to store the data, execute the command here, cannot be
// called later
if (commandExecuted) {
// Store the result
analysisResultUtil.createOrUpdateAnalysisContext(Analysis.CONTRACT_BASED_FTA_ANALYSIS, ECollections.emptyEList(),
resultFilePath, true, umlSelectedComponent, selectedInstantiatedArchitectureConfiguration, null);
// Visualize the result
analysisResultUtil.showResult(ComputeContractFaultTree.FUNCTION_NAME, resultFilePath);
}
}
}