API changes to support DSL internal links
Change-Id: I8e017a34050987725e98ab0d16ce6bc40bfcf4d8
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java
new file mode 100644
index 0000000..ef371c4
--- /dev/null
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/AbstractMetaModelAdapter.java
@@ -0,0 +1,144 @@
+package org.eclipse.capra.core.adapters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.handlers.IArtifactHandler;
+import org.eclipse.capra.core.helpers.ArtifactHelper;
+import org.eclipse.capra.core.helpers.ExtensionPointHelper;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+/**
+ * Implements standard functionality for the methods defined in the
+ * {@link TraceMetaModelAdapter}.
+ */
+public abstract class AbstractMetaModelAdapter implements TraceMetaModelAdapter {
+
+ private List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+ List<Object> accumulator, List<String> selectedRelationshipTypes, int currentDepth, int maximumDepth,
+ List<Connection> existingTraces) {
+ List<Connection> directElements = getInternalElements(element, traceModel, selectedRelationshipTypes, true,
+ maximumDepth, existingTraces);
+ List<Connection> allElements = new ArrayList<>();
+ int currDepth = currentDepth + 1;
+ for (Connection connection : directElements) {
+ if (!accumulator.contains(connection.getTlink())) {
+ allElements.add(connection);
+ accumulator.add(connection.getTlink());
+ for (EObject e : connection.getTargets()) {
+ if (maximumDepth == 0 || currDepth < (maximumDepth + 2)) {
+ allElements.addAll(getInternalElementsTransitive(e, traceModel, accumulator,
+ selectedRelationshipTypes, currDepth, maximumDepth, existingTraces));
+ }
+ }
+ }
+ }
+
+ return allElements;
+ }
+
+ /**
+ * Used to get internal links connected to a selected element.
+ * @param element
+ * the selected element
+ * @param traceModel
+ * the current trace model
+ * @param selectedRelationshipTypes
+ * the selected relationship types from the filter, if the user has selected any
+ * @param maximumDepth
+ * The maximum depth the transitivity should go. 0 means show all the links
+ * @param existingTraces
+ * The trace links that have been created manually by the user, these are obtained from the trace model
+ */
+ public List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+ List<String> selectedRelationshipTypes, int maximumDepth, List<Connection> existingTraces) {
+ List<Object> accumulator = new ArrayList<>();
+ return getInternalElementsTransitive(element, traceModel, accumulator, selectedRelationshipTypes, 0,
+ maximumDepth, existingTraces);
+ }
+
+ @Override
+ public List<Connection> getInternalElements(EObject element, EObject traceModel,
+ List<String> selectedRelationshipTypes, boolean traceLinksTransitive, int transitivityDepth,
+ List<Connection> existingTraces) {
+ List<Connection> allElements = new ArrayList<>();
+ ArrayList<Integer> duplicationCheck = new ArrayList<>();
+ List<Connection> directElements;
+ if (traceLinksTransitive) {
+ directElements = getTransitivelyConnectedElements(element, traceModel, selectedRelationshipTypes,
+ transitivityDepth);
+ } else {
+ directElements = getConnectedElements(element, traceModel, selectedRelationshipTypes);
+ }
+ List<Integer> hashCodes = new ArrayList<>();
+
+ for (Connection conn : existingTraces) {
+ int connectionHash = conn.getOrigin().hashCode() + conn.getTlink().hashCode();
+ for (EObject targ : conn.getTargets()) {
+ connectionHash += targ.hashCode();
+ }
+ hashCodes.add(connectionHash);
+ }
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
+ EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
+ ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel);
+
+ for (Connection conn : directElements) {
+ int connectionHash = conn.getOrigin().hashCode() + conn.getTlink().hashCode();
+ for (EObject targ : conn.getTargets()) {
+ connectionHash += targ.hashCode();
+ }
+ if (!hashCodes.contains(connectionHash)) {
+ allElements.add(conn);
+ }
+ for (EObject o : conn.getTargets()) {
+ @SuppressWarnings("unchecked")
+ IArtifactHandler<Object> handler = (IArtifactHandler<Object>) artifactHelper.getHandler(o).orElse(null);
+ handler.addInternalLinks(o, allElements, duplicationCheck, selectedRelationshipTypes);
+
+ }
+ }
+
+ if (element.getClass().getPackage().toString().contains("org.eclipse.eatop")) {
+ @SuppressWarnings("unchecked")
+ IArtifactHandler<Object> handler = (IArtifactHandler<Object>) artifactHelper.getHandler(element)
+ .orElse(null);
+ handler.addInternalLinks(element, allElements, duplicationCheck, selectedRelationshipTypes);
+ }
+ return allElements;
+ }
+
+ /** Decide if two objects are connected according to the given trace model
+ *
+ * @param first
+ * First object
+ * @param second
+ * Second object
+ * @param traceModel
+ * Trace model to base decision on
+ * @return <code>true</code> if object are connected, <code>false</code>
+ * otherwise
+ */
+ public boolean isThereATraceBetween(EObject first, EObject second, EObject traceModel) {
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel) {
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
+ EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
+ ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel);
+ IArtifactHandler<?> handlerFirstElement = artifactHelper.getHandler(first).orElse(null);
+ IArtifactHandler<?> handlerSecondElement = artifactHelper.getHandler(second).orElse(null);
+
+ return handlerFirstElement.isThereAnInternalTraceBetween(first, second)
+ || handlerSecondElement.isThereAnInternalTraceBetween(first, second);
+ }
+}
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
index 3ef86ba..d4979bd 100644
--- a/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/adapters/TraceMetaModelAdapter.java
@@ -87,6 +87,23 @@
* all objects connected to element via t}]
*/
List<Connection> getConnectedElements(EObject element, EObject traceModel);
+
+ /**
+ * Determine a list of all objects connected to element according to the
+ * given trace model
+ *
+ * @param element
+ * The element used to determine the list of connected objects.
+ * Note that this element could be a trace in the trace model
+ * @param traceModel
+ * Trace model to base calculation on
+ * @param selectedRelationshipTypes
+ * List of selected relationship types from the context menu of
+ * plantuml
+ * @return A Map with the following structure: [Trace object t -> {list of
+ * all objects connected to element via t}]
+ */
+ List<Connection> getConnectedElements(EObject element, EObject traceModel, List<String> selectedRelationshipTypes);
/**
* Determine a list of all objects connected to element according to the
@@ -97,12 +114,36 @@
* Note that this element could be a trace in the trace model
* @param traceModel
* Trace model to base calculation on
+ * @param transitivityDepth
+ * The maximum depth the user wants to go down transitively. 0
+ * indicates no limit.
* @return A Map with the following structure: [Trace object t -> {list of
* all objects connected to element via t}]
*/
- List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel);
+ List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel, int transitivityDepth);
/**
+ * Determine a list of all objects connected to element according to the
+ * given trace model
+ *
+ * @param element
+ * The element used to determine the list of connected objects.
+ * Note that this element could be a trace in the trace model
+ * @param traceModel
+ * Trace model to base calculation on
+ * @param selectedRelationshipTypes
+ * List of selected relationship types from the context menu of
+ * plantuml
+ * @param transitivityDepth
+ * The maximum depth the user wants to go down transitively. 0
+ * indicates no limit.
+ * @return A Map with the following structure: [Trace object t -> {list of
+ * all objects connected to element via t}]
+ */
+ List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+ List<String> selectedRelationshipTypes, int transitivityDepth);
+
+ /**
* Given a trace model, this method returns a list of all trace links in the
* model
*
@@ -123,4 +164,64 @@
* the trace model to delete the links from
*/
void deleteTrace(List<Connection> toDelete, EObject traceModel);
+
+ /**
+ * Determine a list of all objects internally connected to element (e.g.
+ * UML)
+ *
+ * @param element
+ * The element used to determine the list of connected objects.
+ * Note that this element could be a trace in the trace model
+ * @param traceModel
+ * Trace model to base calculation on
+ * @param selectedRelationshipTypes
+ * List of selected relationship types from the context menu of
+ * plantuml
+ * @param traceLinksTransitive
+ * Used to determine if tracelink elements should be received
+ * transitively
+ * @param transitivityDepth
+ * Used to in case tracelinks are received transivitely in order
+ * to set the depth
+ * @return A Map with the following structure: [Trace object t -> {list of
+ * all objects connected to element via t}]
+ */
+ List<Connection> getInternalElements(EObject element, EObject traceModel, List<String> selectedRelationshipTypes,
+ boolean traceLinksTransitive, int transitivityDepth, List<Connection> existingTraces);
+
+ /**
+ * Determine a list of elements internally connected to the selected one
+ * transitively
+ *
+ * @param element
+ * The element used to determine the list of connected objects.
+ * Note that this element could be a trace in the trace model
+ * @param traceModel
+ * Trace model to base calculation on
+ * @param transitivityDepth
+ * The maximum depth the user wants to go down transitively. 0
+ * indicates no limit.
+ * @return A Map with the following structure: [Trace object t -> {list of
+ * all objects connected to element via t}]
+ */
+ List<Connection> getInternalElementsTransitive(EObject element, EObject traceModel,
+ List<String> selectedRelationshipTypes, int transitivityDepth, List<Connection> existingTraces);
+
+ /**
+ * Decide if two objects are connected internally by passing the selected
+ * objects down to the artifact handlers and returns a String with the Type
+ * of connection for the trace matrix (empty String if no connection exists)
+ * This is implemented in the {@link AbstractMetaModelAdapter} and does not
+ * need to be overwritten but can be used like it is.
+ *
+ * @param first
+ * First object
+ * @param second
+ * Second object
+ * @param traceModel
+ * Trace model to base decision on
+ * @return <code>true</code> if object are connected, <code>false</code>
+ * otherwise
+ */
+ boolean isThereAnInternalTraceBetween(EObject first, EObject second, EObject traceModel);
}
diff --git a/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java b/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
index a69b1f7..39a3cad 100644
--- a/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
+++ b/org.eclipse.capra.core/src/org/eclipse/capra/core/handlers/IArtifactHandler.java
@@ -10,9 +10,12 @@
*******************************************************************************/
package org.eclipse.capra.core.handlers;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.emf.ecore.EObject;
@@ -115,5 +118,34 @@
* not be created.
*/
String generateMarkerMessage(IResourceDelta delta, String wrapperUri);
+
+ /**
+ * Adds internal links related to a given element
+ *
+ * @param investigatedElement
+ * Element currently under investigation for links
+ * @param allElements
+ * List of all elements for Plant-uml view
+ * @param duplicationCheck
+ * List of String for checking for duplication
+ * @param selectedRelationshipTypes
+ * relationship types selected by the user to be displayed in the plantUML view
+ */
+ void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes);
+
+ /**
+ * Decide if two objects have an internal link between them.
+ *
+ * @param first
+ * First object
+ * @param second
+ * Second object
+ * @param traceModel
+ * Trace model to base decision on
+ * @return <code>true</code> if object are connected, <code>false</code>
+ * otherwise
+ */
+ boolean isThereAnInternalTraceBetween(EObject first, EObject second);
}
diff --git a/org.eclipse.capra.generic.tracemodels/plugin.xml b/org.eclipse.capra.generic.tracemodels/plugin.xml
index 31f48f2..c1a39b9 100644
--- a/org.eclipse.capra.generic.tracemodels/plugin.xml
+++ b/org.eclipse.capra.generic.tracemodels/plugin.xml
@@ -24,14 +24,6 @@
class="org.eclipse.capra.GenericTraceMetaModel.GenericTraceMetaModelPackage"
genModel="model/generictrace.xcore"/>
</extension>
-
- <extension point="org.eclipse.emf.ecore.generated_package">
- <!-- @generated artifact -->
- <package
- uri="org.eclipse.capra.GenericArtifactMetaModel"
- class="org.eclipse.capra.GenericArtifactMetaModel.GenericArtifactMetaModelPackage"
- genModel="model/artifact.xcore"/>
- </extension>
<extension
point="org.eclipse.capra.configuration.traceabilityMetaModel">
<TraceabilityMetaModelAdapter
diff --git a/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java b/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
index d717fff..239f04c 100644
--- a/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
+++ b/org.eclipse.capra.generic.tracemodels/src/org/eclipse/capra/generic/tracemodels/GenericMetaModelAdapter.java
@@ -20,6 +20,7 @@
import org.eclipse.capra.GenericTraceMetaModel.GenericTraceMetaModelPackage;
import org.eclipse.capra.GenericTraceMetaModel.GenericTraceModel;
import org.eclipse.capra.GenericTraceMetaModel.RelatedTo;
+import org.eclipse.capra.core.adapters.AbstractMetaModelAdapter;
import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.adapters.TraceMetaModelAdapter;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
@@ -35,7 +36,9 @@
/**
* Provides generic functionality to deal with traceability meta models.
*/
-public class GenericMetaModelAdapter implements TraceMetaModelAdapter {
+public class GenericMetaModelAdapter extends AbstractMetaModelAdapter implements TraceMetaModelAdapter {
+
+ private static int DEFAULT_INITIAL_TRANSITIVITY_DEPTH =-2;
public GenericMetaModelAdapter() {
// TODO Auto-generated constructor stub
@@ -100,8 +103,9 @@
}
if (relevantLinks.size() > 0) {
return true;
- } else
- return false;
+ }
+
+ return this.isThereAnInternalTraceBetween(firstElement, secondElement, traceModel);
}
@Override
@@ -124,28 +128,55 @@
return connections;
}
+ @Override
+ public List<Connection> getConnectedElements(EObject element, EObject tracemodel,
+ List<String> selectedRelationshipTypes) {
+ GenericTraceModel root = (GenericTraceModel) tracemodel;
+ List<Connection> connections = new ArrayList<>();
+ List<RelatedTo> traces = root.getTraces();
+
+ if (selectedRelationshipTypes.size() == 0 || selectedRelationshipTypes
+ .contains(GenericTraceMetaModelPackage.eINSTANCE.getRelatedTo().getName())) {
+ if (element instanceof RelatedTo) {
+ RelatedTo trace = (RelatedTo) element;
+ connections.add(new Connection(element, trace.getItem(), trace));
+ } else {
+
+ for (RelatedTo trace : traces) {
+ if (trace.getItem().contains(element)) {
+ connections.add(new Connection(element, trace.getItem(), trace));
+ }
+ }
+ }
+ }
+ return connections;
+ }
private List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
- List<Object> accumulator) {
+ List<Object> accumulator, int currentDepth, int maximumDepth) {
List<Connection> directElements = getConnectedElements(element, traceModel);
List<Connection> allElements = new ArrayList<>();
- directElements.forEach(connection -> {
+ int currDepth = currentDepth + 1;
+ for (Connection connection : directElements) {
if (!accumulator.contains(connection.getTlink())) {
allElements.add(connection);
accumulator.add(connection.getTlink());
- connection.getTargets().forEach(e -> {
- allElements.addAll(getTransitivelyConnectedElements(e, traceModel, accumulator));
- });
+ for (EObject e : connection.getTargets()) {
+ if (maximumDepth == 0 || currDepth <= maximumDepth) {
+ allElements.addAll(
+ getTransitivelyConnectedElements(e, traceModel, accumulator, currDepth, maximumDepth));
+ }
+ }
}
- });
+ }
return allElements;
}
@Override
- public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel) {
+ public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel, int maximumDepth) {
List<Object> accumulator = new ArrayList<>();
- return getTransitivelyConnectedElements(element, traceModel, accumulator);
+ return getTransitivelyConnectedElements(element, traceModel, accumulator, DEFAULT_INITIAL_TRANSITIVITY_DEPTH, maximumDepth);
}
@Override
@@ -184,4 +215,33 @@
}
}
}
+
+ @Override
+ public List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+ List<String> selectedRelationshipTypes, int maximumDepth) {
+ List<Object> accumulator = new ArrayList<>();
+ return getTransitivelyConnectedElements(element, traceModel, accumulator, selectedRelationshipTypes, DEFAULT_INITIAL_TRANSITIVITY_DEPTH,
+ maximumDepth);
+ }
+
+ private List<Connection> getTransitivelyConnectedElements(EObject element, EObject traceModel,
+ List<Object> accumulator, List<String> selectedRelationshipTypes, int currentDepth, int maximumDepth) {
+ List<Connection> directElements = getConnectedElements(element, traceModel, selectedRelationshipTypes);
+ List<Connection> allElements = new ArrayList<>();
+ int currDepth = currentDepth++;
+ for (Connection connection : directElements) {
+ if (!accumulator.contains(connection.getTlink())) {
+ allElements.add(connection);
+ accumulator.add(connection.getTlink());
+ for (EObject e : connection.getTargets()) {
+ if (maximumDepth == 0 || currDepth <= maximumDepth) {
+ allElements.addAll(getTransitivelyConnectedElements(e, traceModel, accumulator,
+ selectedRelationshipTypes, currDepth, maximumDepth));
+ }
+ }
+ }
+ }
+
+ return allElements;
+ }
}
diff --git a/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java b/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
index 0b8117b..855eb87 100644
--- a/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
+++ b/org.eclipse.capra.handler.cdt/src/org/eclipse/capra/handler/cdt/CDTHandler.java
@@ -10,8 +10,12 @@
*******************************************************************************/
package org.eclipse.capra.handler.cdt;
+import java.util.ArrayList;
+import java.util.List;
+
import org.apache.http.client.utils.URIBuilder;
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.handlers.AnnotationException;
import org.eclipse.capra.core.handlers.IAnnotateArtifact;
@@ -90,4 +94,15 @@
public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
return null;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for C code
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
index ffa88e8..97b4304 100644
--- a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
+++ b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/EMFHandler.java
@@ -10,6 +10,10 @@
*******************************************************************************/
package org.eclipse.capra.handler.emf;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.EMFHelper;
import org.eclipse.core.resources.IResourceDelta;
@@ -39,4 +43,15 @@
public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
return null;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for EMF models
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
index 3cc75e5..746696a 100644
--- a/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
+++ b/org.eclipse.capra.handler.emf/src/org/eclipse/capra/handler/emf/notification/ModelChangeListener.java
@@ -70,7 +70,8 @@
TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get();
ResourceSetImpl newResourceSet = new ResourceSetImpl();
EObject traceModel = persistenceAdapter.getTraceModel(newResourceSet);
- if (traceModel != null) {
+ //check that atleast one trace link exists
+ if (traceModel!=null && traceModel.eContents().size() > 0) {
IPath path = new Path(EcoreUtil.getURI(traceModel).toPlatformString(false));
IFile traceContainer = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
diff --git a/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java b/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
index 113aed2..da4bcba 100644
--- a/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
+++ b/org.eclipse.capra.handler.file/src/org/eclipse/capra/handler/file/IFileHandler.java
@@ -10,7 +10,11 @@
*******************************************************************************/
package org.eclipse.capra.handler.file;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.core.resources.IFile;
@@ -52,4 +56,15 @@
+ " has been changed. Please check if associated trace links are still valid.";
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Files
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
diff --git a/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java b/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
index c9a3986..c8f014a 100644
--- a/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
+++ b/org.eclipse.capra.handler.gef/src/org/eclipse/capra/handler/gef/GEFHandler.java
@@ -10,6 +10,10 @@
*******************************************************************************/
package org.eclipse.capra.handler.gef;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.emf.ecore.EObject;
@@ -42,4 +46,15 @@
public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
return null;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for GEF models
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
index 8394364..052d53a 100644
--- a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
+++ b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/BuildElementHandler.java
@@ -10,7 +10,11 @@
*******************************************************************************/
package org.eclipse.capra.handler.hudson;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.core.resources.IResourceDelta;
@@ -48,4 +52,15 @@
return null;
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Build Elements
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
diff --git a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
index a89a693..6a3f45b 100644
--- a/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
+++ b/org.eclipse.capra.handler.hudson/src/org/eclipse/capra/handler/hudson/TestElementHandler.java
@@ -10,7 +10,11 @@
*******************************************************************************/
package org.eclipse.capra.handler.hudson;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.core.resources.IResourceDelta;
@@ -49,4 +53,15 @@
return null;
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Test Elements
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
diff --git a/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java b/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
index a98b3ba..8c87fb0 100644
--- a/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
+++ b/org.eclipse.capra.handler.jdt/src/org/eclipse/capra/handler/jdt/JavaElementHandler.java
@@ -12,10 +12,13 @@
import java.io.BufferedReader;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
import java.util.stream.Collectors;
import org.apache.http.client.utils.URIBuilder;
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.handlers.AnnotationException;
import org.eclipse.capra.core.handlers.IAnnotateArtifact;
@@ -156,4 +159,15 @@
return message;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Java code
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java b/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
index 0c3dc3d..addb961 100644
--- a/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
+++ b/org.eclipse.capra.handler.mylyn/src/org/eclipse/capra/handler/mylyn/MylynHandler.java
@@ -10,7 +10,11 @@
*******************************************************************************/
package org.eclipse.capra.handler.mylyn;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.core.resources.IResourceDelta;
@@ -45,4 +49,15 @@
public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
return null;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Mylyn tasks
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java b/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
index 6c68750..345a26c 100644
--- a/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
+++ b/org.eclipse.capra.handler.office/src/org/eclipse/capra/handler/office/OfficeHandler.java
@@ -11,7 +11,11 @@
package org.eclipse.capra.handler.office;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.capra.ui.office.model.CapraOfficeObject;
@@ -57,5 +61,16 @@
return null;
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for Office files
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
diff --git a/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java b/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
index 03ddd4f..cf2f413 100644
--- a/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
+++ b/org.eclipse.capra.handler.papyrus/src/org/eclipse/capra/handler/papyrus/PapyrusHandler.java
@@ -10,6 +10,10 @@
*******************************************************************************/
package org.eclipse.capra.handler.papyrus;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.emf.ecore.EObject;
@@ -46,4 +50,16 @@
return null;
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links specific for Papyrus models.
+ //Currently, UML links such as association and those from the SYSML Profile are handled by the UML Handler
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
\ No newline at end of file
diff --git a/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java b/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
index f4a52a0..2e5981e 100644
--- a/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
+++ b/org.eclipse.capra.handler.php/src/org/eclipse/capra/handler/php/PhpHandler.java
@@ -1,6 +1,10 @@
package org.eclipse.capra.handler.php;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.capra.core.adapters.ArtifactMetaModelAdapter;
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
import org.eclipse.core.resources.IResourceDelta;
@@ -36,4 +40,15 @@
return null;
}
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for PHP Code
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
+
}
diff --git a/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java b/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
index a02b640..6de0265 100644
--- a/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
+++ b/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
@@ -10,6 +10,10 @@
*******************************************************************************/
package org.eclipse.capra.handler.reqif;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.Connection;
import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.emf.ecore.EObject;
@@ -40,4 +44,15 @@
public String generateMarkerMessage(IResourceDelta delta, String wrapperUri) {
return null;
}
+
+ @Override
+ public void addInternalLinks(EObject investigatedElement, List<Connection> allElements,
+ ArrayList<Integer> duplicationCheck, List<String> selectedRelationshipTypes) {
+ // Method currently left empty to wait for user requirements of relevant internal links for REQIF requirements
+ }
+
+ @Override
+ public boolean isThereAnInternalTraceBetween(EObject first, EObject second) {
+ return false;
+ }
}
diff --git a/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java b/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
index 4804400..93cf732 100644
--- a/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
+++ b/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceabiltyMatrix.java
@@ -38,15 +38,15 @@
public class TestTraceabiltyMatrix {
private final static String EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT = "@startuml\n" + "salt\n" + "{#\n"
- + ".|modelB : EPackage\n" + "modelA : EPackage |X\n" + "}\n" + "\n" + "@enduml\n";
+ + ".|modelB : EPackage\n" + "modelA : EPackage |\nX\n" + "}\n" + "\n" + "@enduml\n";
private final static String EXPECTED_TEXT_FOR_SELECTED_PACKAGES_TRANSITIVE = "@startuml\n" + "salt\n" + "{#\n"
- + ".|B : EClass|BB : EClass|modelB : EPackage\n" + "A : EClass |X|.|.\n" + "AA : EClass |.|X|.\n"
- + "modelA : EPackage |.|.|X\n" + "}\n" + "\n" + "@enduml\n";
+ + ".|B : EClass|BB : EClass|modelB : EPackage\n" + "A : EClass |\nX|\n.|\n.\n" + "AA : EClass |\n.|\nX|\n.\n"
+ + "modelA : EPackage |\n.|\n.|\nX\n" + "}\n" + "\n" + "@enduml\n";
private final static String EXPECTED_TEXT_FOR_SELECTED_CLASSES = "@startuml\n" + "salt\n" + "{#\n"
- + ".|A : EClass|B : EClass|AA : EClass|BB : EClass\n" + "A : EClass |.|X|.|.\n" + "B : EClass |X|.|.|.\n"
- + "AA : EClass |.|.|.|X\n" + "BB : EClass |.|.|X|.\n" + "}\n" + "\n" + "@enduml\n";
+ + ".|A : EClass|B : EClass|AA : EClass|BB : EClass\n" + "A : EClass |\n.|\nX|\n.|\n.\n" + "B : EClass |\nX|\n.|\n.|\n.\n"
+ + "AA : EClass |\n.|\n.|\n.|\nX\n" + "BB : EClass |\n.|\n.|\nX|\n.\n" + "}\n" + "\n" + "@enduml\n";
@Before
public void init() throws CoreException {
@@ -143,6 +143,8 @@
ToggleTransitivityHandler.setTraceViewTransitive(false);
DiagramTextProviderHandler provider = new DiagramTextProviderHandler();
String plantUMLTextForSelectedPackages_Direct = provider.getDiagramText(selectedPackages);
+ System.out.println("What I see: " + plantUMLTextForSelectedPackages_Direct);
+ System.out.println("What is expected" + EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT);
assertTrue(plantUMLTextForSelectedPackages_Direct.equals(EXPECTED_TEXT_FOR_SELECTED_PACKAGES_DIRECT));
// Test transitively connected Elements
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
index c6bb097..9576618 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/DiagramTextProviderHandler.java
@@ -75,7 +75,9 @@
if (selectedModels.size() == 1) {
if (ToggleTransitivityHandler.isTraceViewTransitive()) {
- traces = metamodelAdapter.getTransitivelyConnectedElements(selectedObject, traceModel);
+ int transitivityDepth = 0;
+ //more to follow in the next commit
+ traces = metamodelAdapter.getTransitivelyConnectedElements(selectedObject, traceModel, transitivityDepth);
} else {
traces = metamodelAdapter.getConnectedElements(selectedObject, traceModel);
}
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
index 051bf7e..1a760b9 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/ToggleDisplayGraphHandler.java
@@ -44,7 +44,7 @@
public static boolean isDisplayGraph() {
Preferences graphDisplay = getPreference();
- return graphDisplay.get("option", "matrix").equals("matrix");
+ return graphDisplay.get("option", "graph").equals("matrix");
}
private static Preferences getPreference() {
diff --git a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
index adad9a5..4564655 100644
--- a/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
+++ b/org.eclipse.capra.ui.plantuml/src/org/eclipse/capra/ui/plantuml/VisualizationHelper.xtend
@@ -17,7 +17,8 @@
«IF firstElements != null»
.«FOR e : secondElements»|«Connections.getArtifactLabel(e)»«ENDFOR»
«FOR first : firstElements»
- «Connections.getArtifactLabel(first)» «FOR second : secondElements»|«IF traceAdapter.isThereATraceBetween(first, second, traceModel)»X«ELSE».«ENDIF»«ENDFOR»
+ «Connections.getArtifactLabel(first)» «FOR second : secondElements»|
+ «IF traceAdapter.isThereATraceBetween(first, second, traceModel)»X«ELSE».«ENDIF»«ENDFOR»
«ENDFOR»
«ELSE»
Choose two containers to show a traceability matrix of their contents.
diff --git a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
index 9c9cab4..c576236 100644
--- a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
+++ b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/.VisualizationHelper.xtendbin
Binary files differ
diff --git a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
index 7644e2c..ae41436 100644
--- a/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
+++ b/org.eclipse.capra.ui.plantuml/xtend-gen/org/eclipse/capra/ui/plantuml/VisualizationHelper.java
@@ -45,6 +45,7 @@
{
for(final EObject second : secondElements) {
_builder.append("|");
+ _builder.newLineIfNotEmpty();
{
boolean _isThereATraceBetween = traceAdapter.isThereATraceBetween(first, second, traceModel);
if (_isThereATraceBetween) {
diff --git a/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java b/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
index 43a3e47..18993bd 100644
--- a/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
+++ b/org.eclipse.capra.ui.zest/src/org/eclipse/capra/ui/zest/TraceNodeContentProvider.java
@@ -76,7 +76,8 @@
List<EObject> nodes = new ArrayList<>();
if (currentSelection.get(0) instanceof EObject) {
EObject object = (EObject) currentSelection.get(0);
- connections = metaModelAdapter.getTransitivelyConnectedElements(object, traceModel);
+ int transitivityDepth = 0;
+ connections = metaModelAdapter.getTransitivelyConnectedElements(object, traceModel, transitivityDepth);
for (Connection c : connections) {
nodes.add(c.getOrigin());
nodes.addAll(c.getTargets());