Skip to content

Commit 3dc305e

Browse files
committed
Added support for filtering outgoing/incoming relationships for an element in a given project and commit
1 parent c6d14b6 commit 3dc305e

5 files changed

Lines changed: 38 additions & 5 deletions

File tree

app/controllers/RelationshipController.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import jackson.JsonLdMofObjectAdornment;
77
import org.omg.sysml.metamodel.MofObject;
88
import org.omg.sysml.metamodel.Relationship;
9+
import org.omg.sysml.utils.RelationshipDirection;
910
import play.Environment;
1011
import play.libs.Json;
1112
import play.mvc.Controller;
@@ -57,8 +58,18 @@ public Result create(Http.Request request) {
5758
return responseRelationship.map(e -> created(Json.toJson(e))).orElseGet(Results::internalServerError);
5859
}
5960

60-
public Result getRelationshipsByProjectIdCommitIdRelatedElementId(UUID projectId, UUID commitId, UUID elementId, Http.Request request) {
61-
Set<Relationship> relationships = relationshipService.getRelationshipsByProjectCommitRelatedElement(projectId, commitId, elementId);
61+
public Result getRelationshipsByProjectIdCommitIdRelatedElementId(UUID projectId, UUID commitId, UUID elementId, Optional<String> direction, Http.Request request) {
62+
RelationshipDirection relDirection = RelationshipDirection.BOTH;
63+
if(direction.isPresent()) {
64+
if(direction.get().equalsIgnoreCase(RelationshipDirection.IN.toString()))
65+
relDirection = RelationshipDirection.IN;
66+
else if(direction.get().equalsIgnoreCase(RelationshipDirection.OUT.toString()))
67+
relDirection = RelationshipDirection.OUT;
68+
else
69+
relDirection = RelationshipDirection.BOTH;
70+
}
71+
72+
Set<Relationship> relationships = relationshipService.getRelationshipsByProjectCommitRelatedElement(projectId, commitId, elementId, Optional.of(relDirection));
6273
boolean respondWithJsonLd = ElementController.respondWithJsonLd(request);
6374
return ok(JacksonHelper.collectionValueToTree(Set.class,
6475
respondWithJsonLd ? JsonLdMofObjectAdornment.class : metamodelProvider.getImplementationClass(Relationship.class),
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.omg.sysml.utils;
2+
3+
public enum RelationshipDirection {
4+
IN,
5+
OUT,
6+
BOTH
7+
}

app/services/RelationshipService.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import org.omg.sysml.lifecycle.Commit;
99
import org.omg.sysml.metamodel.Element;
1010
import org.omg.sysml.metamodel.Relationship;
11+
import org.omg.sysml.utils.RelationshipDirection;
1112

1213
import javax.inject.Inject;
1314
import javax.inject.Singleton;
1415
import java.util.*;
16+
import java.util.stream.Collectors;
1517

1618
@Singleton
1719
public class RelationshipService {
@@ -39,9 +41,19 @@ public Optional<Relationship> create(Relationship relationship) {
3941
return relationship.getIdentifier() != null ? relationshipDao.update(relationship) : relationshipDao.persist(relationship);
4042
}
4143

42-
public Set<Relationship> getRelationshipsByProjectCommitRelatedElement(UUID projectId, UUID commitId, UUID relatedElementId) {
44+
public Set<Relationship> getRelationshipsByProjectCommitRelatedElement(UUID projectId, UUID commitId, UUID relatedElementId, Optional<RelationshipDirection> direction) {
4345
Commit commit = projectDao.findById(projectId).flatMap(project -> commitDao.findByProjectAndId(project, commitId)).orElseThrow(() -> new IllegalArgumentException("Commit " + commitId + " not found."));
4446
Element relatedElement = elementDao.findByCommitAndId(commit, relatedElementId).orElseThrow(() -> new IllegalArgumentException("Element " + relatedElementId + " not found."));
45-
return relationshipDao.findAllByCommitRelatedElement(commit, relatedElement);
47+
Set<Relationship> allRelationships = relationshipDao.findAllByCommitRelatedElement(commit, relatedElement);
48+
Set<Relationship> results = allRelationships;
49+
if (direction.isPresent()) {
50+
if (direction.get().equals(RelationshipDirection.OUT)) {
51+
results = allRelationships.stream().filter(r -> r.getSource().stream().anyMatch(e -> e.getIdentifier().equals(relatedElementId))).collect(Collectors.toSet());
52+
} else if (direction.get().equals(RelationshipDirection.IN)) {
53+
results = allRelationships.stream().filter(r -> r.getTarget().stream().anyMatch(e -> e.getIdentifier().equals(relatedElementId))).collect(Collectors.toSet());
54+
}
55+
}
56+
57+
return results;
4658
}
4759
}

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ javacOptions in Compile ++= Seq("-s", "generated")
3333

3434
sources in(Compile, doc) := Seq.empty
3535
publishArtifact in(Compile, packageDoc) := false
36+
37+
//routesImport += “org.omg.sysml.utils.RelationshipDirection”

conf/routes

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# This file defines all application routes (Higher priority routes first)
33
# ~~~~
44

5+
56
# An example controller showing a sample home page
67
GET / controllers.HomeController.index
78

@@ -22,7 +23,7 @@ GET /projects/:projectId/commits/:commitId/elements/:elementId
2223
GET /projects/:projectId/commits/:commitId/roots controllers.ElementController.getRootsByProjectIdCommitId(projectId : java.util.UUID, commitId : java.util.UUID, request : Request)
2324

2425
# Relationship endpoints
25-
GET /projects/:projectId/commits/:commitId/elements/:relatedElementId/relationships controllers.RelationshipController.getRelationshipsByProjectIdCommitIdRelatedElementId(projectId : java.util.UUID, commitId : java.util.UUID, relatedElementId : java.util.UUID, request : Request)
26+
GET /projects/:projectId/commits/:commitId/elements/:relatedElementId/relationships controllers.RelationshipController.getRelationshipsByProjectIdCommitIdRelatedElementId(projectId : java.util.UUID, commitId : java.util.UUID, relatedElementId : java.util.UUID, direction : java.util.Optional[String], request : Request)
2627

2728
# Map static resources from the /public folder to the /assets URL path
2829
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)

0 commit comments

Comments
 (0)