Skip to content

Commit a55fded

Browse files
authored
Merge pull request #28 from ModelDriven/ST5AS-55
ST5AS-55 : Filter outgoing/incoming relationships
2 parents c6d14b6 + 11303c0 commit a55fded

5 files changed

Lines changed: 49 additions & 9 deletions

File tree

app/controllers/RelationshipController.java

Lines changed: 10 additions & 6 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;
@@ -15,10 +16,7 @@
1516
import services.RelationshipService;
1617

1718
import javax.inject.Inject;
18-
import java.util.List;
19-
import java.util.Optional;
20-
import java.util.Set;
21-
import java.util.UUID;
19+
import java.util.*;
2220
import java.util.stream.Collectors;
2321

2422
/**
@@ -57,8 +55,14 @@ public Result create(Http.Request request) {
5755
return responseRelationship.map(e -> created(Json.toJson(e))).orElseGet(Results::internalServerError);
5856
}
5957

60-
public Result getRelationshipsByProjectIdCommitIdRelatedElementId(UUID projectId, UUID commitId, UUID elementId, Http.Request request) {
61-
Set<Relationship> relationships = relationshipService.getRelationshipsByProjectCommitRelatedElement(projectId, commitId, elementId);
58+
public Result getRelationshipsByProjectIdCommitIdRelatedElementId(UUID projectId, UUID commitId, UUID elementId, Optional<String> direction, Http.Request request) {
59+
RelationshipDirection relDirection = direction
60+
.flatMap(d -> Arrays.stream(RelationshipDirection.values())
61+
.filter(rd -> rd.toString().equalsIgnoreCase(d))
62+
.findAny())
63+
.orElse(RelationshipDirection.BOTH);
64+
65+
Set<Relationship> relationships = relationshipService.getRelationshipsByProjectCommitRelatedElement(projectId, commitId, elementId, relDirection);
6266
boolean respondWithJsonLd = ElementController.respondWithJsonLd(request);
6367
return ok(JacksonHelper.collectionValueToTree(Set.class,
6468
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: 20 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,25 @@ 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, 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 (RelationshipDirection.OUT.equals(direction)) {
50+
results = allRelationships.stream()
51+
.filter(r -> r.getSource().stream()
52+
.anyMatch(e -> Objects.equals(e.getIdentifier(), relatedElementId))
53+
)
54+
.collect(Collectors.toSet());
55+
} else if (RelationshipDirection.IN.equals(direction)) {
56+
results = allRelationships.stream()
57+
.filter(r -> r.getTarget().stream()
58+
.anyMatch(e -> Objects.equals(e.getIdentifier(), relatedElementId))
59+
)
60+
.collect(Collectors.toSet());
61+
}
62+
63+
return results;
4664
}
4765
}

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)

public/swagger/openapi.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,16 @@ paths:
337337
type: string
338338
format: uuid
339339
required: true
340+
- name: direction
341+
in: query
342+
description: Filter for relationships that are incoming (in), outgoing (out), or both relative to the related element
343+
type: string
344+
enum:
345+
- 'in'
346+
- 'out'
347+
- 'both'
348+
default: 'both'
349+
required: false
340350
get:
341351
tags:
342352
- Relationship

0 commit comments

Comments
 (0)