Bug 546776: Internal links for ReqIf requirements

This implementation gets the reqif internal links (defined as specRelation)
and makes them available to Capra.
diff --git a/bundles/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java b/bundles/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
index 8798a58..ae82c98 100644
--- a/bundles/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
+++ b/bundles/org.eclipse.capra.handler.reqIf/src/org/eclipse/capra/handler/reqif/ReqIfHandler.java
@@ -13,18 +13,23 @@
  *******************************************************************************/
 package org.eclipse.capra.handler.reqif;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.eclipse.capra.core.adapters.Connection;
 import org.eclipse.capra.core.handlers.AbstractArtifactHandler;
 import org.eclipse.capra.handler.reqif.preferences.ReqifPreferences;
 import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.rmf.reqif10.AttributeValue;
 import org.eclipse.rmf.reqif10.SpecHierarchy;
 import org.eclipse.rmf.reqif10.SpecObject;
+import org.eclipse.rmf.reqif10.SpecRelation;
+import org.eclipse.rmf.reqif10.Specification;
 import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
 
 public class ReqIfHandler extends AbstractArtifactHandler<SpecHierarchy> {
@@ -68,8 +73,36 @@
 
 	@Override
 	public List<Connection> addInternalLinks(EObject investigatedElement, List<String> selectedRelationshipTypes) {
-		// Method currently left empty to wait for user requirements of relevant
-		// internal links for REQIF requirements.
+		if (investigatedElement instanceof SpecHierarchy) {
+			SpecHierarchy spec = (SpecHierarchy) investigatedElement;
+
+			// get all relationships in the model
+			EList<SpecRelation> specRelations = ReqIF10Util.getReqIF(spec).getCoreContent()
+					.getSpecRelations();
+			List<Specification> specifications = ReqIF10Util.getReqIF(spec).getCoreContent().getSpecifications();
+
+			// get relationships containing the investigated element
+			List<SpecRelation> relevantRelations = specRelations.stream()
+					.filter(r -> (r.getSource().equals(spec.getObject())) || r.getTarget().equals(spec.getObject()))
+					.collect(Collectors.toList());
+			List<Connection> connections = new ArrayList<>();
+
+			// get all specHierachy objects contained in the relevant links as
+			// targets
+			for(SpecRelation r: relevantRelations) {
+				List<EObject> targets = new ArrayList<>();
+				for (Specification specification : specifications) {
+					for (SpecHierarchy s : specification.getChildren()) {
+						if ((s.getObject().getIdentifier().equals(r.getTarget().getIdentifier()))
+								|| s.getObject().getIdentifier().equals(r.getSource().getIdentifier())) {
+						targets.add(s);
+					}
+				}
+				connections.add(new Connection(investigatedElement, targets, r));
+				}
+			}
+			return connections;
+		} else
 		return Collections.emptyList();
 	}