/** * Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis, * Rick Salay, Naama Ben-David. * 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: * Naama Ben-David - Initial implementation. * Alessio Di Sandro - Refactoring and fixes. */ package edu.toronto.cs.se.mmint.mavo.diagram.context; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.swt.events.SelectionEvent; import edu.toronto.cs.se.mavo.LogicElement; import edu.toronto.cs.se.mavo.MAVOCollection; import edu.toronto.cs.se.mavo.MAVOElement; import edu.toronto.cs.se.mavo.MayDecision; import edu.toronto.cs.se.mavo.VarDecision; import edu.toronto.cs.se.mmint.MMINTException; import edu.toronto.cs.se.mmint.mavo.constraint.MAVOMIDConstraintChecker; import edu.toronto.cs.se.mmint.mid.MID; import edu.toronto.cs.se.mmint.mid.MIDLevel; import edu.toronto.cs.se.mmint.mid.Model; import edu.toronto.cs.se.mmint.mid.diagram.library.MIDContextMenuListener; import edu.toronto.cs.se.mmint.mid.diagram.library.MIDDiagramUtils; import edu.toronto.cs.se.mmint.mid.utils.MIDRegistry; public class MAVODiagramContextRefineListener extends MIDContextMenuListener { private List<? extends LogicElement> mavoElemsToRefine; private MAVOElement mergedModelObj; private List<MAVOElement> varModelObjs; private Model model; public MAVODiagramContextRefineListener(@NonNull String menuLabel, @NonNull MAVOCollection mayAlternative) { super(menuLabel); List<MAVOCollection> mavoElemsToRefine = new ArrayList<MAVOCollection>(); mavoElemsToRefine.add(mayAlternative); this.mavoElemsToRefine = mavoElemsToRefine; mergedModelObj = null; varModelObjs = null; model = null; } public MAVODiagramContextRefineListener(@NonNull String menuLabel, @NonNull List<MAVOElement> mavoModelObjs) { super(menuLabel); mavoElemsToRefine = mavoModelObjs; mergedModelObj = null; varModelObjs = null; model = null; } public MAVODiagramContextRefineListener(@NonNull String menuLabel, @NonNull MAVOCollection varDomain, @NonNull MAVOElement mergedModelObj, @NonNull List<MAVOElement> varModelObjs) { super(menuLabel); List<MAVOCollection> mavoElemsToRefine = new ArrayList<MAVOCollection>(); mavoElemsToRefine.add(varDomain); this.mavoElemsToRefine = mavoElemsToRefine; this.mergedModelObj = mergedModelObj; this.varModelObjs = varModelObjs; model = null; } @Override public void widgetSelected(SelectionEvent e) { String modelUri = MIDRegistry.getModelAndModelElementUris(mavoElemsToRefine.get(0), MIDLevel.INSTANCES)[0]; Map<MID, List<IFile>> instanceMIDs = MIDDiagramUtils.getInstanceMIDsInWorkspace(); List<IFile> files = null; for (Entry<MID, List<IFile>> instanceMID : instanceMIDs.entrySet()) { model = instanceMID.getKey().getExtendibleElement(modelUri); if (model != null) { files = instanceMID.getValue(); break; } } if (model == null) { MMINTException.print(IStatus.ERROR, "The instance MID that contains this model must be open for the refinement to work", null); return; } AbstractTransactionalCommand command = new MAVODiagramContextRefineCommand( TransactionUtil.getEditingDomain(model), menuLabel, files ); runListenerCommand(command); } protected class MAVODiagramContextRefineCommand extends AbstractTransactionalCommand { public MAVODiagramContextRefineCommand(@NonNull TransactionalEditingDomain domain, @NonNull String label, @NonNull List<IFile> affectedFiles) { super(domain, label, affectedFiles); } @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { LogicElement mavoFirstElemToRefine = mavoElemsToRefine.get(0); if (mavoFirstElemToRefine instanceof MAVOCollection) { if (mavoFirstElemToRefine.eContainer() instanceof MayDecision) { MAVOMIDConstraintChecker.refineModelByMayAlternative(model, (MAVOCollection) mavoFirstElemToRefine); } if (mavoFirstElemToRefine.eContainer() instanceof VarDecision) { MAVOMIDConstraintChecker.refineModelByVarDomain(model, (MAVOCollection) mavoFirstElemToRefine, mergedModelObj, varModelObjs); } } else if (mavoFirstElemToRefine instanceof MAVOElement) { MAVOMIDConstraintChecker.refineModelByMayModelObjects(model, (List<MAVOElement>) mavoElemsToRefine); } return CommandResult.newOKCommandResult(); } } }