blob: 8b0f8ae6aaec5d4603a7bed66fe5a0ac44858b75 [file] [log] [blame]
/*------------------------------------------------------------------------------
-
- Copyright (c) 2015-2016 University of Padova, ITALY - Intecs SpA
- 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:
-
- Alessandro Zovi azovi@math.unipd.it
- Stefano Puri stefano.puri@intecs.it
- Laura Baracchi laura.baracchi@intecs.it
- Nicholas Pacini nicholas.pacini@intecs.it
-
- Initial API and implementation and/or initial documentation
------------------------------------------------------------------------------*/package org.polarsys.chess.multicore.commands;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.papyrus.MARTE.MARTE_Foundations.Alloc.Assign;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForResource;
import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
import org.eclipse.papyrus.infra.widgets.providers.FilteredContentProvider;
import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider;
import org.eclipse.papyrus.infra.widgets.providers.StaticContentProvider;
import org.eclipse.papyrus.infra.widgets.selectors.ReferenceSelector;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.InstanceSpecification;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Package;
import org.polarsys.chess.chessmlprofile.Predictability.DeploymentConfiguration.HardwareBaseline.CH_HwProcessor;
import org.polarsys.chess.core.profiles.CHESSProfileManager;
import org.polarsys.chess.core.util.uml.ModelError;
import org.polarsys.chess.core.util.uml.UMLUtils;
import org.polarsys.chess.multicore.ReferenceSelectorNoDoubleClick;
import org.polarsys.chess.multicore.dialogs.CoreSelectorDialog;
import org.polarsys.chess.multicore.dialogs.SystemSelectionDialog;
import org.polarsys.chess.multicore.model.AbstractCommand;
import org.polarsys.chess.multicore.model.CHCore;
import org.polarsys.chess.multicore.model.CHTask;
import org.polarsys.chess.multicore.utils.GeneratorUtils;
import org.polarsys.chess.multicore.utils.QueryUtils;
/**
* The Class AssignTasks2CoresCommand.
*/
public class AssignTasks2CoresCommand extends
AbstractCommand {
/** The tasks. */
private EList<CHTask> tasks;
/** The processors map. */
private Map<Package, EList<InstanceSpecification>> processorsMap = new HashMap<Package, EList<InstanceSpecification>>();
/** The cores map. */
private Map<InstanceSpecification, EList<CHCore>> coresMap = new HashMap<InstanceSpecification, EList<CHCore>>();
/** The result. */
private Map<CHCore, LinkedHashSet<Object>> result;
/** The hw system. */
private static Component hwSystem;
/** The operation list. */
private HashMap<CHTask, EList<CHTask>> operationList;
/** The assignments. */
private EList<Assign> assignments;
/** The hw systems list. */
private EList<InstanceSpecification> hwSystemsList = new BasicEList<InstanceSpecification>();
/**
* Open selector to choose HW system where assign tasks.
*
* @param umlModel the uml model
* @param hwSystemsList the hw systems list
* @return the instance specification
*/
private static InstanceSpecification openSystemSelector (Model umlModel,
EList<InstanceSpecification> hwSystemsList) {
// First of all show selector to select HwSystem
List<InstanceSpecification> systemSelection = new ArrayList<InstanceSpecification>();
for (InstanceSpecification syst : hwSystemsList) {
systemSelection.add(syst);
}
Shell activeShell = Display.getDefault().getActiveShell();
SystemSelectionDialog systemDialog = new SystemSelectionDialog(activeShell, systemSelection, "Select System where to assign tasks");
if (systemDialog.open() == Window.OK) {
String selectedSystemQN = systemDialog.getSystemName();
EList<Element> allElems = umlModel.allOwnedElements();
for (Element elem : allElems) {
InstanceSpecification theSystem;
if (elem instanceof InstanceSpecification) {
theSystem = (InstanceSpecification)elem;
if (theSystem.getQualifiedName()!=null && theSystem.getQualifiedName().equals(selectedSystemQN)) {
Classifier classif = theSystem.getClassifiers().get(0);
hwSystem = (Component)classif;
return theSystem;
}
}
}
}
return null;
}
/**
* Open the Wizard window to assign tasks to Cores (for the selected HW System).
*
* @param tasks the tasks
* @param pack the pack
* @param cores the cores
* @param assignments the assignments
* @return the map
*/
private static Map<CHCore, LinkedHashSet<Object>> openWizard(
final EList<CHTask> tasks,
Package pack,
EList<CHCore> cores,
EList<Assign> assignments) {
// final ServicesRegistry servicesRegistry = ((IMultiDiagramEditor) (PlatformUI
// .getWorkbench().getActiveWorkbenchWindow().getActivePage()
// .getActiveEditor())).getServicesRegistry();
ServicesRegistry servicesRegistry = null;
try {
servicesRegistry = ServiceUtilsForResource.getInstance().getServiceRegistry(pack.eResource());
} catch (ServiceException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
}
// Look for the tasks that are not assigned to a Processor in this package (deployment)
EList<CHTask> taskNotYetAssignedToCore = new BasicEList<CHTask>();
for (CHTask i : tasks) {
if (!(QueryUtils.isTaskAssigned2Core(i, pack, assignments))) {
taskNotYetAssignedToCore.add(i);
}
}
final ReferenceSelector referenceSelector = new ReferenceSelectorNoDoubleClick(
true, null, taskNotYetAssignedToCore);
final IStaticContentProvider semanticProvider = new StaticContentProvider(
tasks.toArray());
final FilteredContentProvider filteredProvider = new FilteredContentProvider(
semanticProvider);
referenceSelector.setContentProvider(filteredProvider);
CoreSelectorDialog dialog = null;
ILabelProvider serv = null;
try {
serv = servicesRegistry.getService(LabelProviderService.class)
.getLabelProvider();
} catch (final ServiceException e) {
// Activator.log.error("LabelProviderServiceNotFound", e);
}
referenceSelector.setLabelProvider(serv);
dialog = new CoreSelectorDialog(Display.getDefault()
.getActiveShell(), referenceSelector, cores, pack, assignments,
CoreSelectorDialog.TASKS_TO_CORES,
"Assign Tasks to Cores");
dialog.setLabelProvider(serv);
//dialog.setMessage("Messages.CreateDiagramImage_LifelineDialogMessage");
//dialog.setTitle("Messages.CreateDiagramImage_LifelineDialogTitle");
// dialog.setInitialElementSelections(insts2);
if (dialog.open() == org.eclipse.jface.window.Window.OK) {
Map<CHCore, LinkedHashSet<Object>> result = dialog
.getResult();
if (result != null)
return result;
}
return null;
}
/* (non-Javadoc)
* @see org.polarsys.chess.multicore.model.AbstractCommand#execute()
*/
@Override
public void execute() throws ModelError {
queryContent(umlModel);
printContent();
int howMany = hwSystemsList.size();
InstanceSpecification theSystem = null;
if (howMany > 1) {
theSystem = openSystemSelector(umlModel, hwSystemsList);
}
else {
theSystem = hwSystemsList.get(0);
}
if (theSystem!=null) {
Package pack = QueryUtils.getOwnerCHGaResourcePlatformPackage(umlModel, theSystem);
EList<InstanceSpecification> processorList = processorsMap.get(pack);
EList<CHCore> cores = new BasicEList<CHCore>();
if (processorList!=null) {
for (InstanceSpecification proc : processorList) {
EList<CHCore> coreList = coresMap.get(proc);
for (CHCore core : coreList) {
cores.add(core);
}
}
}
result = openWizard(tasks, pack, cores, assignments);
if (result != null) {
updateModel();
}
}
}
/**
* Prints the content.
*/
private void printContent() {
System.out.println("Tasks:");
for (CHTask component : tasks) {
System.out.println(component);
}
Set<Package> packs = processorsMap.keySet();
for (Package pack: packs) {
System.out.println("Package: "+pack.getName());
EList<InstanceSpecification> procList = processorsMap.get(pack);
for (InstanceSpecification theProc : procList) {
System.out.println("Processor: "+theProc.getName());
EList<CHCore> coreList = coresMap.get(theProc);
for (CHCore theCore : coreList) {
System.out.println("Core: "+theCore.getName());
}
}
}
}
/**
* Update model.
*/
private void updateModel() {
TransactionalEditingDomain editingDomain = TransactionUtil
.getEditingDomain(umlModel);
editingDomain.getCommandStack().execute(new Com(editingDomain));
}
/**
* Get all that is needed from the model.
*
* @param umlModel the uml model
* @throws ModelError the model error
*/
private void queryContent(Model umlModel) throws ModelError {
try{
hwSystem = UMLUtils.getResourcePlatformComponent(umlModel, CHESSProfileManager.DEPLOYMENT_VIEW);
}catch (ModelError me){
ModelError me2 = new ModelError(me.getMessage()+" Be sure that HW root Components in the ComponentView are stereotyped with CHGaResourcePlatorm");
throw me2;
}
// Look for Packages stereotyped as CHGAResourcePlatform in the Deployment View
EList<Package> packages = QueryUtils.getResourcePlatformPackages(umlModel, CHESSProfileManager.DEPLOYMENT_VIEW);
if (packages.size()==0) {
ModelError me = new ModelError("Error in model: no Package stereotyped as CHGAResourcePlatform in the Deployment View!");
throw me;
}
hwSystemsList = new BasicEList<InstanceSpecification>();
for(Package pack : packages) {
EList<InstanceSpecification> processors = new BasicEList<InstanceSpecification>();
for (CH_HwProcessor ch_processor : QueryUtils.getAllProcessorInstancesInPackage(pack)) {
InstanceSpecification instSpec = ch_processor.getBase_InstanceSpecification();
processors.add(instSpec);
EList<CHCore> theCores = QueryUtils.getCores(ch_processor);
coresMap.put(instSpec, theCores);
}
InstanceSpecification theSystem = UMLUtils.getRootInstanceInPackage(pack);
hwSystemsList.add(theSystem);
processorsMap.put(pack, processors);
}
if (hwSystemsList.isEmpty()) {
ModelError me = new ModelError("Error in model: no System in the Deployment View!");
throw me;
}
EList<InstanceSpecification> instances = UMLUtils.getAllComponentInstances(umlModel, true);
tasks = QueryUtils.getCHTasksList(instances);
operationList = QueryUtils.getOperationChain(umlModel, tasks);
assignments = UMLUtils.getTask2CoreAssignments(umlModel, CHESSProfileManager.DEPLOYMENT_VIEW);
}
/**
* The Class Com.
*/
class Com extends RecordingCommand {
/** The assigned operations. */
private HashSet<CHTask> assignedOperations;
/**
* Instantiates a new com.
*
* @param domain the domain
*/
public Com(TransactionalEditingDomain domain) {
super(domain);
}
/* (non-Javadoc)
* @see org.eclipse.emf.transaction.RecordingCommand#doExecute()
*/
@Override
protected void doExecute() {
Map<CHCore, LinkedHashSet<Object>> core2chtask = new HashMap<CHCore, LinkedHashSet<Object>>();
for (CHCore core : result.keySet()) {
assignedOperations = new HashSet<CHTask>();
LinkedHashSet<Object> list = new LinkedHashSet<Object>();
for (Object task : result.get(core)) {
CHTask owningTask = (CHTask) task;
list.add(owningTask);
addRelatedOperations(owningTask, list);
}
core2chtask.put(core, list);
}
QueryUtils.deleteTask2CoreAssociations(hwSystem);
GeneratorUtils.buildTask2CoreAssociations(hwSystem, core2chtask);
}
//the related operations of a task are assigned to the same core of the task,
/**
* Adds the related operations.
*
* @param owningTask the owning task
* @param list the list
*/
//TODO for now every operation shared by multiple tasks is assigned to the same core of the first task that was processed
private void addRelatedOperations(CHTask owningTask, LinkedHashSet<Object> list) {
for (CHTask operation : operationList.get(owningTask)) {
if(!assignedOperations.contains(operation)) {
list.add(operation);
assignedOperations.add(operation);
}
}
}
}
}