blob: f4c5047fc6a79be9a2054836b3d146966e1c89a7 [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS M2M plugin --
-- --
-- Copyright (C) 2011-2012 --
-- University of Padova, ITALY --
-- --
-- Author: Alessandro Zovi azovi@math.unipd.it --
-- --
-- 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-v20.html --
-----------------------------------------------------------------------
*/
package org.polarsys.chess.m2m.transformations;
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaAnalysisContext;
import org.eclipse.papyrus.MARTE.MARTE_AnalysisModel.SAM.SaEndtoEndFlow;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Stereotype;
import org.polarsys.chess.chessmlprofile.Core.CHESS;
import org.polarsys.chess.chessmlprofile.Core.CHGaResourcePlatform;
import org.polarsys.chess.chessmlprofile.Core.PSMPackage;
import org.polarsys.chess.chessmlprofile.Predictability.RTComponentModel.CHRtSpecification;
import org.polarsys.chess.core.util.uml.UMLUtils;
import org.polarsys.chess.core.views.ViewUtils;
import org.polarsys.chess.m2m.Activator;
/**
* Utility class for the QVT transformations.
*/
public class TransUtil {
/** The Constant TRANSPATH. */
public static final String TRANSPATH = "/transformations/";
/** The Constant QVTO_PIM2PSM. */
public static final String QVTO_PIM2PSM = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "CHESS_PIM2PSM.qvto";
/** The Constant QVTO_PIM2PSMVERDE. */
public static final String QVTO_PIM2PSMVERDE = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "CHESS_PIM2PSM_Inst_full_VERDE.qvto";
/** The Constant QVTO_PIM2PSM_FULL. */
public static final String QVTO_PIM2PSM_FULL = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "CHESS_PIM2PSM_Inst_full.qvto";
/** The Constant QVTO_CEILING. */
public static final String QVTO_CEILING = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "CHESS_CeilingAssignment.qvto";
/** The Constant QVTO_MULTIINSTANCE. */
public static final String QVTO_MULTIINSTANCE = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "BuildMultiInstance.qvto";
/** The Constant QVTO_REMMULTIINSTANCE. */
public static final String QVTO_REMMULTIINSTANCE = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "RemoveMultiInstance.qvto";
/** The Constant TRANSFORMATIONS_DIR. */
public static final String TRANSFORMATIONS_DIR = "schedulability_analysis";
/** The Constant TRANSFORMATIONS_FULL_DIR. */
public static final String TRANSFORMATIONS_FULL_DIR = "schedulability_analysis_full";
/** The Constant CODEGEN_DIR. */
public static final String CODEGEN_DIR = "src-gen";
/** The Constant PIM_PSM_DIR. */
public static final String PIM_PSM_DIR = "m2m-temp";
/** The Constant TRANSFORMATIONS_DIR_VERDE. */
public static final String TRANSFORMATIONS_DIR_VERDE = "schedulability_analysis_full_VERDE";
/** The Constant TRANSFORMATIONS_DIR_E2E. */
public static final String TRANSFORMATIONS_DIR_E2E= "End-To-End_schedulability_analysis";
/** The Constant QVTO_PIM2PSME2E. */
public static final String QVTO_PIM2PSME2E = "platform:/plugin/" + Activator.PLUGIN_ID + TRANSPATH + "CHESS_PIM2PSM_EndToEnd.qvto";
/** The Constant RESULTS_DIR_E2E. */
public static final String RESULTS_DIR_E2E = "End-To-End_analysis_results";
/** The Constant SA_ANALYSIS_CTX. */
public static final String SA_ANALYSIS_CTX = "MARTE::MARTE_AnalysisModel::SAM::SaAnalysisContext";
/**
* Load mode as QVT ModelContent.
*
* @param modelFile the model file
* @return the QVT ModelContent stored in the given model file
*
* @see org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent
*/
public static ModelContent loadModel(IFile modelFile){
return EmfUtil.loadModel(URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true));
}
/**
* Purge the model.
*
* @param modelFile the model file
* @param saAnalysisQN the qualified name of MARTE <<SaAnalysisContext>> Class on which the purge needs to be applied
* @return the Model purged
* @throws IOException Signals that an I/O exception has occurred.
* @see #purgeModel(Model, String)
*/
public static Model purgeModel(IFile modelFile, String saAnalysisQN) throws IOException {
ModelContent inModel = loadModel(modelFile);
Model m = (Model) inModel.getContent().get(0);
purgeModel(m, saAnalysisQN);
return m;
}
/**
* Purge the model.
*
* @param model the model
* @param saAnalysisQN the qualified name of MARTE <<SaAnalysisContext>> Class on which the purge needs to be applied
* @throws IOException Signals that an I/O exception has occurred during saving the model resource.
*/
public static void purgeModel(Model model, String saAnalysisQN) throws IOException {
//get the correct PSM package and platform...
Package psmPackage = null;
Package platform = null;
Class saAnalysisClass = null;
CHESS chess = (CHESS) model.getStereotypeApplication(model.getAppliedStereotype("CHESS::Core::CHESS"));
for (Package pkg : chess.getPsmView().getBase_Package().getNestedPackages()) {
Stereotype stereo = pkg.getAppliedStereotype("CHESS::Core::PSMPackage");
if(stereo != null){
PSMPackage psmPkg = (PSMPackage) pkg.getStereotypeApplication(stereo);
if(psmPkg.getAnalysisContext() == null)
continue;
if(psmPkg.getAnalysisContext().getBase_NamedElement().getQualifiedName().equals(saAnalysisQN)){
psmPackage = pkg;
platform = ((CHGaResourcePlatform) psmPkg.getAnalysisContext().getPlatform().get(0)).getBase_Package();
}
}
}
//...get the analysis context...
for(Element elem : chess.getAnalysisView().getRtanalysisview().getBase_Package().allOwnedElements()){
if(elem instanceof Class && ((Class)elem).getQualifiedName().equals(saAnalysisQN)){
saAnalysisClass = (Class) elem;
}
}
//...and remove the PSM package and clear the backpropagation (platform & context)
if(psmPackage != null && platform != null){
psmPackage.destroy();
purgeBackpropagation(model, platform);
}
if(saAnalysisClass != null){
purgeE2EResults(model, saAnalysisClass);
}
}
//Remove the values of the backpropagation results
/**
* Purge backpropagation data.
* The back propagation of analysis results to CHRtSpecification stereotype is deprecated.
*
* @param m the m
* @param platform the platform
*/
@Deprecated
private static void purgeBackpropagation(Model m, Package platform) {
String name = platform.getName();
name = name.substring(0, name.lastIndexOf('_'));
Component compPlatform = null;
for (Element el : m.allOwnedElements()) {
if(el instanceof Component){
if(((Component) el).getName().equals(name)){
compPlatform = (Component) el;
}
}
}
if(compPlatform != null){
for (Element el : compPlatform.getOwnedComments()) {
CHRtSpecification chrt = UMLUtils.getStereotypeApplication(el, CHRtSpecification.class);
if (chrt != null){
chrt.getRespT().clear();
chrt.getBlockT().clear();
}
}
}
}
/**
* Purge e2 e results.
*
* @param m the m
* @param saAnalysisClass the sa analysis class
*/
private static void purgeE2EResults(Model m, Class saAnalysisClass) {
SaAnalysisContext saCtx = UMLUtils.getStereotypeApplication(saAnalysisClass, SaAnalysisContext.class);
saCtx.setIsSched("");
if(saCtx.getWorkload().size() > 0){
Activity act = (Activity) saCtx.getWorkload().get(0).getBase_NamedElement();
SaEndtoEndFlow e2eflow = UMLUtils.getStereotypeApplication(act, SaEndtoEndFlow.class);
e2eflow.getEnd2EndT().clear();
}
}
}