| /* |
| ----------------------------------------------------------------------- |
| -- 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(); |
| } |
| } |
| } |