blob: 814266f1cfe5c47856789a55ceeb147f8bc8424f [file] [log] [blame]
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;
}
@Override
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;
}
@Override
public boolean isThereATraceBetween(EObject first, EObject second, EObject traceModel) {
return false;
}
@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, traceModel)
|| handlerSecondElement.isThereAnInternalTraceBetween(first, second, traceModel);
}
}