blob: be4477f18e22cbc94e7afdcb3e426d32987ce372 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Chalmers | University of Gothenburg and rt-labs - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.capra.ui.plantuml;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.adapters.TraceMetaModelAdapter;
import org.eclipse.capra.core.adapters.TracePersistenceAdapter;
import org.eclipse.capra.core.helpers.EMFHelper;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.capra.ui.helpers.TraceCreationHelper;
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.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import net.sourceforge.plantuml.eclipse.utils.DiagramTextProvider;
/**
* Provides PlantUML with a string representation of elements connected by trace
* links.
*
* @author Anthony Anjorin, Salome Maro
*/
public class DiagramTextProviderHandler implements DiagramTextProvider {
private TraceMetaModelAdapter metamodelAdapter;
private List<Connection> traces = new ArrayList<>();
@Override
public String getDiagramText(IEditorPart editor, ISelection input) {
List<Object> selectedModels = TraceCreationHelper
.extractSelectedElements(editor.getSite().getSelectionProvider().getSelection());
return getDiagramText(selectedModels);
}
/**
* Creates the {@code String} representation PlantUML uses to render the
* graphics. Based on the selected models, the relevant trace links are
* extracted and a decision is made whether a matrix of a tree view has to
* be displayed.
*
* @param selectedModels
* the models whose trace links should be displayed
* @return a string representation of the visualisation that can be rendered
* by PlantUML
*/
public String getDiagramText(List<Object> selectedModels) {
List<EObject> firstModelElements = null;
List<EObject> secondModelElements = null;
TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
metamodelAdapter = ExtensionPointHelper.getTraceMetamodelAdapter().get();
ResourceSet resourceSet = new ResourceSetImpl();
if (selectedModels.size() > 0 && selectedModels.get(0) instanceof EObject)
resourceSet = ((EObject) selectedModels.get(0)).eResource().getResourceSet();
EObject traceModel = persistenceAdapter.getTraceModel(resourceSet);
if (selectedModels.size() == 1 && selectedModels.get(0) instanceof EObject) {
EObject selectedEObject = (EObject) selectedModels.get(0);
if (DisplayTracesHandler.isTraceViewTransitive()) {
traces = metamodelAdapter.getTransitivelyConnectedElements(selectedEObject, traceModel);
} else {
traces = metamodelAdapter.getConnectedElements(selectedEObject, traceModel);
}
return VisualizationHelper.createNeighboursView(traces, selectedEObject);
} else if (selectedModels.size() == 2) {
firstModelElements = EMFHelper.linearize(selectedModels.get(0));
secondModelElements = EMFHelper.linearize(selectedModels.get(1));
} else {
firstModelElements = selectedModels.stream().flatMap(r -> EMFHelper.linearize(r).stream())
.collect(Collectors.toList());
secondModelElements = firstModelElements;
}
String umlString = VisualizationHelper.createMatrix(traceModel, firstModelElements, secondModelElements);
return umlString;
}
@Override
public boolean supportsEditor(IEditorPart editor) {
return true;
}
@Override
public boolean supportsSelection(ISelection selection) {
return true;
}
}