| /******************************************************************************* |
| * Copyright (c) 2016, 2019 Chalmers | University of Gothenburg, rt-labs and others. |
| * 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 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Chalmers | University of Gothenburg and rt-labs - initial API and implementation and/or initial documentation |
| * Chalmers | University of Gothenburg - additional features, updated API |
| *******************************************************************************/ |
| package org.eclipse.capra.ui.handlers; |
| |
| import java.util.Collection; |
| import java.util.List; |
| import java.util.Optional; |
| import java.util.function.BiFunction; |
| import java.util.stream.Collectors; |
| |
| import org.eclipse.capra.core.adapters.TraceMetaModelAdapter; |
| import org.eclipse.capra.core.adapters.TracePersistenceAdapter; |
| import org.eclipse.capra.core.handlers.IArtifactHandler; |
| import org.eclipse.capra.core.helpers.ArtifactHelper; |
| import org.eclipse.capra.core.helpers.EMFHelper; |
| import org.eclipse.capra.core.helpers.ExtensionPointHelper; |
| import org.eclipse.capra.core.helpers.TraceHelper; |
| import org.eclipse.capra.ui.views.SelectionView; |
| import org.eclipse.core.commands.AbstractHandler; |
| import org.eclipse.core.commands.ExecutionEvent; |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.dialogs.ElementListSelectionDialog; |
| import org.eclipse.ui.handlers.HandlerUtil; |
| |
| public class TraceCreationHandler extends AbstractHandler { |
| |
| @Override |
| public Object execute(ExecutionEvent event) throws ExecutionException { |
| IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); |
| createTrace(window, (traceTypes, selection) -> getTraceTypeToCreate(window, traceTypes, selection)); |
| return null; |
| } |
| |
| public void createTrace(IWorkbenchWindow window, |
| BiFunction<Collection<EClass>, List<EObject>, Optional<EClass>> chooseTraceType) { |
| List<?> artifacts = SelectionView.getOpenedView().getSelection(); |
| |
| TraceMetaModelAdapter traceAdapter = ExtensionPointHelper.getTraceMetamodelAdapter().get(); |
| TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get(); |
| |
| ResourceSet resourceSet = new ResourceSetImpl(); |
| // add trace model to resource set |
| EObject traceModel = persistenceAdapter.getTraceModel(resourceSet); |
| // add artifact model to resource set |
| EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet); |
| |
| ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel); |
| TraceHelper traceHelper = new TraceHelper(traceModel); |
| |
| // Create the artifact wrappers |
| List<EObject> wrappers = artifactHelper.createWrappers(artifacts); |
| |
| // Get the type of trace to be created |
| Collection<EClass> traceTypes = traceAdapter.getAvailableTraceTypes(wrappers); |
| Optional<EClass> chosenType = chooseTraceType.apply(traceTypes, wrappers); |
| |
| // Create trace |
| if (chosenType.isPresent()) { |
| // check if the connection already exists |
| if (traceHelper.traceExists(wrappers, chosenType.get(), traceModel)) { |
| MessageDialog.openInformation(window.getShell(), "Capra Information", |
| "The trace link you want to create already exists and will therefore not be created"); |
| } else { |
| traceHelper.createTrace(wrappers, chosenType.get()); |
| persistenceAdapter.saveTracesAndArtifacts(traceModel, artifactModel); |
| traceHelper.annotateTrace(wrappers); |
| } |
| } |
| } |
| |
| private Optional<EClass> getTraceTypeToCreate(IWorkbenchWindow window, Collection<EClass> traceTypes, |
| List<EObject> wrappers) { |
| ElementListSelectionDialog dialog = new ElementListSelectionDialog(window.getShell(), new LabelProvider() { |
| @Override |
| public String getText(Object element) { |
| EClass eclass = (EClass) element; |
| return eclass.getName(); |
| } |
| }); |
| dialog.setTitle("Select the trace type you want to create"); |
| dialog.setElements(traceTypes.toArray()); |
| |
| dialog.setMessage( |
| "Selection: " + wrappers.stream().map(this::getSelectionDisplayName).collect(Collectors.toList())); |
| |
| if (dialog.open() == Window.OK) { |
| return Optional.of((EClass) dialog.getFirstResult()); |
| } |
| |
| return Optional.empty(); |
| } |
| |
| private String getSelectionDisplayName(EObject element) { |
| TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get(); |
| EObject artifactModel = persistenceAdapter.getArtifactWrappers(new ResourceSetImpl()); |
| ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel); |
| IArtifactHandler<?> handler = artifactHelper.getHandler(artifactHelper.unwrapWrapper(element)).get(); |
| |
| return handler.withCastedHandler(artifactHelper.unwrapWrapper(element), (h, o) -> h.getDisplayName(o)) |
| .orElse(EMFHelper.getIdentifier(element)); |
| |
| } |
| |
| } |