Skip to content

Commit 99085c1

Browse files
authored
Merge pull request #4 from ModelDriven/feature/ST5AS-14
feature/ST5AS-14 Implemented type validation
2 parents d70ff5b + 2f458f0 commit 99085c1

215 files changed

Lines changed: 42701 additions & 778 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/Module.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import com.google.inject.AbstractModule;
2+
import config.MetamodelProvider;
3+
import config.impl.JPAMetamodelProvider;
24
import dao.ElementDao;
3-
import dao.ModelDao;
5+
import dao.ProjectDao;
46
import dao.RelationshipDao;
57
import dao.impl.jpa.JpaElementDao;
6-
import dao.impl.jpa.JpaModelDao;
8+
import dao.impl.jpa.JpaProjectDao;
79
import dao.impl.jpa.JpaRelationshipDao;
810
import jackson.databind.ObjectMapperFactory;
911
import jackson.databind.impl.HibernateObjectMapperFactory;
@@ -14,10 +16,11 @@ public class Module extends AbstractModule {
1416

1517
@Override
1618
protected void configure() {
19+
bind(MetamodelProvider.class).to(JPAMetamodelProvider.class).asEagerSingleton();
1720
bind(JPAManager.class).to(HibernateManager.class).asEagerSingleton();
1821
bind(ObjectMapperFactory.class).to(HibernateObjectMapperFactory.class).asEagerSingleton();
1922
bind(ElementDao.class).to(JpaElementDao.class);
20-
bind(ModelDao.class).to(JpaModelDao.class);
23+
bind(ProjectDao.class).to(JpaProjectDao.class);
2124
bind(RelationshipDao.class).to(JpaRelationshipDao.class);
2225
}
2326
}

app/config/MetamodelProvider.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package config;
2+
3+
import java.util.Set;
4+
5+
public interface MetamodelProvider {
6+
<T> Class<? extends T> getImplementationClass(Class<T> intrface);
7+
8+
<T> Class<T> getInterface(Class<? extends T> implementationClass) throws ClassNotFoundException;
9+
10+
Set<Class<?>> getAllImplementationClasses();
11+
12+
Set<Class<?>> getAllInterfaces();
13+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package config.impl;
2+
3+
import config.MetamodelProvider;
4+
import org.omg.sysml.metamodel.MofObject;
5+
import org.omg.sysml.metamodel.impl.MofObjectImpl;
6+
import org.reflections.Reflections;
7+
8+
import java.util.HashSet;
9+
import java.util.Set;
10+
11+
public class JPAMetamodelProvider implements MetamodelProvider {
12+
private static Set<Class<?>> INTERFACES = new HashSet<>(), IMPLEMENTATION_CLASSES = new HashSet<>();
13+
14+
static {
15+
INTERFACES.add(MofObject.class);
16+
for (String pakkage : new String[]{"org.omg.sysml.metamodel", "org.omg.sysml.extension"}) {
17+
INTERFACES.addAll(new Reflections(pakkage).getSubTypesOf(MofObject.class));
18+
}
19+
IMPLEMENTATION_CLASSES.add(MofObjectImpl.class);
20+
for (String pakkage : new String[]{"org.omg.sysml.metamodel.impl", "org.omg.sysml.extension.impl"}) {
21+
IMPLEMENTATION_CLASSES.addAll(new Reflections(pakkage).getSubTypesOf(MofObjectImpl.class));
22+
}
23+
}
24+
25+
@Override
26+
@SuppressWarnings("unchecked")
27+
public <T> Class<T> getInterface(Class<? extends T> implementationClass) {
28+
try {
29+
return (Class<T>) Class.forName(implementationClass.getName().replaceFirst("impl.(\\w+)Impl", "$1"));
30+
} catch (ClassNotFoundException e) {
31+
throw new RuntimeException(e);
32+
}
33+
}
34+
35+
@Override
36+
@SuppressWarnings("unchecked")
37+
public <T> Class<? extends T> getImplementationClass(Class<T> intrface) {
38+
try {
39+
return (Class<? extends T>) Class.forName(intrface.getName().replaceFirst("(.*\\.)(\\w+)$", "$1impl.$2Impl"));
40+
} catch (ClassNotFoundException e) {
41+
throw new RuntimeException(e);
42+
}
43+
}
44+
45+
@Override
46+
public Set<Class<?>> getAllInterfaces() {
47+
return INTERFACES;
48+
}
49+
50+
@Override
51+
public Set<Class<?>> getAllImplementationClasses() {
52+
return IMPLEMENTATION_CLASSES;
53+
}
54+
55+
}
Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package controllers;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4-
import models.Element;
4+
import config.MetamodelProvider;
5+
import jackson.JacksonHelper;
6+
import org.omg.sysml.metamodel.Element;
7+
import org.omg.sysml.metamodel.MofObject;
58
import play.libs.Json;
69
import play.mvc.Controller;
10+
import play.mvc.Http;
711
import play.mvc.Result;
812
import play.mvc.Results;
913
import services.ElementService;
@@ -19,6 +23,8 @@
1923
* Controller for handling all API requests related to SysML v2 elements
2024
*/
2125
public class ElementController extends Controller {
26+
@Inject
27+
private MetamodelProvider metamodelProvider;
2228

2329
@Inject
2430
private ElementService elementService;
@@ -31,26 +37,29 @@ public Result byId(String id) {
3137

3238
public Result all() {
3339
List<Element> elements = elementService.getAll();
34-
return ok(Json.toJson(elements));
40+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Element.class), elements));
3541
}
3642

37-
public Result create() {
38-
JsonNode requestBodyJson = request().body().asJson();
39-
Element requestElement = Json.fromJson(requestBodyJson, Element.class);
40-
Optional<Element> responseElement = elementService.create(requestElement);
41-
return responseElement.map(e -> ok(Json.toJson(e))).orElseGet(Results::badRequest);
43+
public Result create(Http.Request request) {
44+
JsonNode requestBodyJson = request.body().asJson();
45+
MofObject requestedObject = Json.fromJson(requestBodyJson, metamodelProvider.getImplementationClass(MofObject.class));
46+
if (!(requestedObject instanceof Element)) {
47+
return Results.badRequest();
48+
}
49+
Optional<Element> responseElement = elementService.create(((Element) requestedObject));
50+
return responseElement.map(e -> created(Json.toJson(e))).orElseGet(Results::badRequest);
4251
}
4352

44-
public Result byModel(String modelId) {
45-
UUID modelUuid = UUID.fromString(modelId);
46-
List<Element> elements = elementService.getByModelId(modelUuid);
47-
return ok(Json.toJson(elements));
53+
public Result byProject(String projectId) {
54+
UUID projectUuid = UUID.fromString(projectId);
55+
List<Element> elements = elementService.getByProjectId(projectUuid);
56+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Element.class), elements));
4857
}
4958

50-
public Result byModelAndId(String elementId, String modelId) {
59+
public Result byProjectAndId(String elementId, String projectId) {
5160
UUID elementUuid = UUID.fromString(elementId);
52-
UUID modelUuid = UUID.fromString(modelId);
53-
Optional<Element> element = elementService.getByModelIdAndId(modelUuid, elementUuid);
61+
UUID projectUuid = UUID.fromString(projectId);
62+
Optional<Element> element = elementService.getByProjectIdAndId(projectUuid, elementUuid);
5463
return element.map(e -> ok(Json.toJson(e))).orElseGet(Results::notFound);
5564
}
5665
}

app/controllers/ModelController.java

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package controllers;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import config.MetamodelProvider;
5+
import jackson.JacksonHelper;
6+
import org.omg.sysml.extension.Project;
7+
import play.libs.Json;
8+
import play.mvc.Controller;
9+
import play.mvc.Http;
10+
import play.mvc.Result;
11+
import play.mvc.Results;
12+
import services.ProjectService;
13+
14+
import javax.inject.Inject;
15+
import java.util.List;
16+
import java.util.Optional;
17+
import java.util.UUID;
18+
19+
/**
20+
* @author Manas Bajaj
21+
*
22+
* Controller for handling all API requests related to SysML v2 elements
23+
*/
24+
public class ProjectController extends Controller {
25+
@Inject
26+
private MetamodelProvider metamodelProvider;
27+
28+
@Inject
29+
private ProjectService projectService;
30+
31+
public Result byId(String id) {
32+
UUID uuid = UUID.fromString(id);
33+
Optional<Project> project = projectService.getById(uuid);
34+
return project.map(m -> ok(Json.toJson(m))).orElseGet(Results::notFound);
35+
}
36+
37+
public Result all() {
38+
List<Project> projects = projectService.getAll();
39+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Project.class), projects));
40+
}
41+
42+
public Result create(Http.Request request) {
43+
JsonNode requestBodyJson = request.body().asJson();
44+
Project requestProject = Json.fromJson(requestBodyJson, metamodelProvider.getImplementationClass(Project.class));
45+
Optional<Project> responseProject = projectService.create(requestProject);
46+
return responseProject.map(e -> created(Json.toJson(e))).orElseGet(Results::badRequest);
47+
}
48+
}
Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package controllers;
22

33
import com.fasterxml.jackson.databind.JsonNode;
4-
import models.Element;
5-
import models.Relationship;
4+
import config.MetamodelProvider;
5+
import jackson.JacksonHelper;
6+
import org.omg.sysml.metamodel.MofObject;
7+
import org.omg.sysml.metamodel.Relationship;
68
import play.libs.Json;
79
import play.mvc.Controller;
10+
import play.mvc.Http;
811
import play.mvc.Result;
912
import play.mvc.Results;
1013
import services.RelationshipService;
@@ -20,6 +23,9 @@
2023
* Controller for handling all API requests related to SysML v2 elements
2124
*/
2225
public class RelationshipController extends Controller {
26+
@Inject
27+
private MetamodelProvider metamodelProvider;
28+
2329
@Inject
2430
private RelationshipService relationshipService;
2531

@@ -31,37 +37,40 @@ public Result byId(String id) {
3137

3238
public Result all() {
3339
List<Relationship> relationships = relationshipService.getAll();
34-
return ok(Json.toJson(relationships));
40+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Relationship.class), relationships));
3541
}
3642

37-
public Result create() {
38-
JsonNode requestBodyJson = request().body().asJson();
39-
Relationship requestRelationship = Json.fromJson(requestBodyJson, Relationship.class);
40-
Optional<Relationship> responseRelationship = relationshipService.create(requestRelationship);
41-
return responseRelationship.map(e -> ok(Json.toJson(e))).orElseGet(Results::badRequest);
43+
public Result create(Http.Request request) {
44+
JsonNode requestBodyJson = request.body().asJson();
45+
MofObject requestedObject = Json.fromJson(requestBodyJson, metamodelProvider.getImplementationClass(MofObject.class));
46+
if (!(requestedObject instanceof Relationship)) {
47+
return Results.badRequest();
48+
}
49+
Optional<Relationship> responseRelationship = relationshipService.create((Relationship) requestedObject);
50+
return responseRelationship.map(e -> created(Json.toJson(e))).orElseGet(Results::badRequest);
4251
}
4352

4453
public Result byRelatedElementId(String id) {
4554
UUID elementUuid = UUID.fromString(id);
4655
List<Relationship> relationships = relationshipService.getByRelatedElementId(elementUuid);
47-
return ok(Json.toJson(relationships));
56+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Relationship.class), relationships));
4857
}
4958

5059
public Result bySourceElementId(String id) {
5160
UUID elementUuid = UUID.fromString(id);
5261
List<Relationship> relationships = relationshipService.getBySourceElementId(elementUuid);
53-
return ok(Json.toJson(relationships));
62+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Relationship.class), relationships));
5463
}
5564

5665
public Result byTargetElementId(String id) {
5766
UUID elementUuid = UUID.fromString(id);
5867
List<Relationship> relationships = relationshipService.getByTargetElementId(elementUuid);
59-
return ok(Json.toJson(relationships));
68+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Relationship.class), relationships));
6069
}
6170

62-
public Result byModel(String modelId) {
63-
UUID modelUuid = UUID.fromString(modelId);
64-
List<Relationship> relationships = relationshipService.getByModelId(modelUuid);
65-
return ok(Json.toJson(relationships));
71+
public Result byProject(String projectId) {
72+
UUID projectUuid = UUID.fromString(projectId);
73+
List<Relationship> relationships = relationshipService.getByProjectId(projectUuid);
74+
return ok(JacksonHelper.collectionValueToTree(List.class, metamodelProvider.getImplementationClass(Relationship.class), relationships));
6675
}
6776
}

app/dao/ElementDao.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dao;
22

3-
import models.Element;
4-
import models.Model;
3+
import org.omg.sysml.extension.Project;
4+
import org.omg.sysml.metamodel.Element;
55

66
import java.util.List;
77
import java.util.Optional;
@@ -20,7 +20,7 @@ public interface ElementDao extends Dao<Element> {
2020

2121
void deleteAll();
2222

23-
List<Element> findAllByModel(Model model);
23+
List<Element> findAllByProject(Project project);
2424

25-
Optional<Element> findByModelAndId(Model model, UUID id);
25+
Optional<Element> findByProjectAndId(Project project, UUID id);
2626
}

app/dao/ModelDao.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)