diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeMain.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeMain.java index 53ebf4e3..544debd7 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeMain.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeMain.java @@ -5,8 +5,8 @@ import uk.co.compendiumdev.challenge.apimodel.ChallengeApiModel; import uk.co.compendiumdev.challenge.challengers.Challengers; import uk.co.compendiumdev.thingifier.Thingifier; -import uk.co.compendiumdev.thingifier.application.MainImplementation; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; +import uk.co.compendiumdev.thingifier.adapter.spark.MainImplementation; import uk.co.compendiumdev.thingifier.core.repository.ThingStoreProviderConfig; public class ChallengeMain { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeRouteHandler.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeRouteHandler.java index f6007cf3..1f092b0b 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeRouteHandler.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/ChallengeRouteHandler.java @@ -10,8 +10,8 @@ import uk.co.compendiumdev.challenge.practicemodes.simpleapi.SimpleApiRoutes; import uk.co.compendiumdev.challenge.practicemodes.simulation.SimulationRoutes; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.htmlgui.htmlgen.DefaultGUIHTML; public class ChallengeRouteHandler { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiRequestHook.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiRequestHook.java index 9f3392fd..e045290d 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiRequestHook.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiRequestHook.java @@ -6,12 +6,12 @@ import uk.co.compendiumdev.challenge.CHALLENGE; import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; public class ChallengerApiRequestHook implements HttpApiRequestHook { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiResponseHook.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiResponseHook.java index a7ad40ca..4a85730b 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiResponseHook.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerApiResponseHook.java @@ -7,12 +7,12 @@ import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiResponseHook; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.AcceptHeaderParser; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.ContentTypeHeaderParser; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiResponseHook; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; import uk.co.compendiumdev.thingifier.core.repository.EntityInstanceQuery; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPRequestHook.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPRequestHook.java index 88b71390..04942495 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPRequestHook.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPRequestHook.java @@ -6,10 +6,10 @@ import uk.co.compendiumdev.challenge.CHALLENGE; import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.InternalHttpRequestHook; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.InternalHttpRequestHook; /* This is an Internal HTTP Request because it covers functionality for endpoints that do not diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPResponseHook.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPResponseHook.java index bd3d1657..aafb0b8a 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPResponseHook.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHTTPResponseHook.java @@ -1,6 +1,6 @@ package uk.co.compendiumdev.challenge.challengehooks; -import static uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod.*; +import static uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod.*; import java.util.List; import uk.co.compendiumdev.challenge.CHALLENGE; @@ -8,10 +8,10 @@ import uk.co.compendiumdev.challenge.ChallengerState; import uk.co.compendiumdev.challenge.challengers.Challengers; import uk.co.compendiumdev.challenge.challengesrouting.XChallengerHeader; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.InternalHttpResponseHook; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.BearerAuthHeaderParser; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.InternalHttpResponseHook; public class ChallengerInternalHTTPResponseHook implements InternalHttpResponseHook { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/AuthRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/AuthRoutes.java index 4dbfcbbb..a8e396a4 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/AuthRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/AuthRoutes.java @@ -7,6 +7,11 @@ import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.HttpApiResponseToInternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpRequestToHttpApiRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpResponseToSpark; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.SparkToInternalHttpRequest; import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.RoutingStatus; import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb; @@ -19,11 +24,6 @@ import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.BearerAuthHeaderParser; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.ContentTypeHeaderParser; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.HttpApiResponseToInternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpRequestToHttpApiRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpResponseToSpark; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.SparkToInternalHttpRequest; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/ChallengesRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/ChallengesRoutes.java index 13cd606e..2fd649cf 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/ChallengesRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/ChallengesRoutes.java @@ -7,13 +7,13 @@ import uk.co.compendiumdev.challenge.apimodel.ChallengeThingifier; import uk.co.compendiumdev.challenge.challengers.Challengers; import uk.co.compendiumdev.challenge.challenges.ChallengeDefinitions; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.SparkApiRequestResponseHandler; +import uk.co.compendiumdev.thingifier.adapter.spark.AdhocDocumentedSparkRouteConfigurer; import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.RoutingStatus; import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; import uk.co.compendiumdev.thingifier.api.restapihandlers.RestApiGetHandler; -import uk.co.compendiumdev.thingifier.application.AdhocDocumentedSparkRouteConfigurer; -import uk.co.compendiumdev.thingifier.application.routehandlers.SparkApiRequestResponseHandler; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.query.FilterBy; import uk.co.compendiumdev.thingifier.core.query.QueryFilterParams; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/HeartBeatRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/HeartBeatRoutes.java index 6b3eddb1..4f7c0f9f 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/HeartBeatRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/HeartBeatRoutes.java @@ -1,9 +1,9 @@ package uk.co.compendiumdev.challenge.challengesrouting; import java.util.List; +import uk.co.compendiumdev.thingifier.adapter.spark.AdhocDocumentedSparkRouteConfigurer; import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; -import uk.co.compendiumdev.thingifier.application.AdhocDocumentedSparkRouteConfigurer; import uk.co.compendiumdev.thingifier.spark.SimpleSparkRouteCreator; public class HeartBeatRoutes { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/XChallengerHeader.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/XChallengerHeader.java index 78160646..85aec839 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/XChallengerHeader.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/challengesrouting/XChallengerHeader.java @@ -2,7 +2,7 @@ import spark.Response; import uk.co.compendiumdev.challenge.ChallengerAuthData; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; public class XChallengerHeader { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiRequestHandler.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiRequestHandler.java index 44ad064f..6c9fd7d3 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiRequestHandler.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiRequestHandler.java @@ -1,9 +1,9 @@ package uk.co.compendiumdev.challenge.practicemodes.mirror; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.HttpApiRequestHandler; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.AcceptHeaderParser; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; -import uk.co.compendiumdev.thingifier.application.routehandlers.HttpApiRequestHandler; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstanceDraft; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiTextRequestHandler.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiTextRequestHandler.java index 77fe8dee..467a0d0c 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiTextRequestHandler.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorHttpApiTextRequestHandler.java @@ -1,9 +1,9 @@ package uk.co.compendiumdev.challenge.practicemodes.mirror; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.HttpApiRequestHandler; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeaderPair; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; -import uk.co.compendiumdev.thingifier.application.routehandlers.HttpApiRequestHandler; import uk.co.compendiumdev.thingifier.core.query.FilterBy; public class MirrorHttpApiTextRequestHandler implements HttpApiRequestHandler { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorRoutes.java index 4b89e111..f241fc45 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/MirrorRoutes.java @@ -6,10 +6,10 @@ import java.util.List; import spark.Route; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierAutoDocGenRouting; +import uk.co.compendiumdev.thingifier.adapter.spark.AdhocDocumentedSparkRouteConfigurer; import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; -import uk.co.compendiumdev.thingifier.application.AdhocDocumentedSparkRouteConfigurer; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierAutoDocGenRouting; import uk.co.compendiumdev.thingifier.htmlgui.htmlgen.DefaultGUIHTML; import uk.co.compendiumdev.thingifier.spark.SimpleSparkRouteCreator; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/RequestMirror.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/RequestMirror.java index 9a54faea..4668fc5d 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/RequestMirror.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/mirror/RequestMirror.java @@ -4,8 +4,8 @@ import spark.Response; import uk.co.compendiumdev.challenge.spark.SparkMessageLengthValidator; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.SparkApiRequestResponseHandler; import uk.co.compendiumdev.thingifier.api.http.headers.headerparser.AcceptHeaderParser; -import uk.co.compendiumdev.thingifier.application.routehandlers.SparkApiRequestResponseHandler; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.FieldType; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/AddMoreItemsIfNecessary.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/AddMoreItemsIfNecessary.java index 71126c32..d3cacd29 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/AddMoreItemsIfNecessary.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/AddMoreItemsIfNecessary.java @@ -1,9 +1,9 @@ package uk.co.compendiumdev.challenge.practicemodes.simpleapi; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.repository.ThingStore; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/ResetAutoIncrementWhenTooHigh.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/ResetAutoIncrementWhenTooHigh.java index 8913d3cc..a7555d6c 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/ResetAutoIncrementWhenTooHigh.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/ResetAutoIncrementWhenTooHigh.java @@ -1,9 +1,9 @@ package uk.co.compendiumdev.challenge.practicemodes.simpleapi; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.repository.ThingStore; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiCorsHeadersResponseHook.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiCorsHeadersResponseHook.java index 77dc4551..8b5f1b97 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiCorsHeadersResponseHook.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiCorsHeadersResponseHook.java @@ -1,11 +1,11 @@ package uk.co.compendiumdev.challenge.practicemodes.simpleapi; -import static uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod.OPTIONS; +import static uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod.OPTIONS; import java.util.List; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.InternalHttpResponseHook; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.InternalHttpResponseHook; public class SimpleApiCorsHeadersResponseHook implements InternalHttpResponseHook { diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiRoutes.java index 43897a24..c1d1f3e1 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simpleapi/SimpleApiRoutes.java @@ -4,13 +4,13 @@ import java.util.List; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierAutoDocGenRouting; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.RoutingStatus; import uk.co.compendiumdev.thingifier.api.docgen.RoutingVerb; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierAutoDocGenRouting; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simulation/SimulationRoutes.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simulation/SimulationRoutes.java index 272fb5e7..76c5195d 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simulation/SimulationRoutes.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/practicemodes/simulation/SimulationRoutes.java @@ -5,13 +5,13 @@ import java.util.List; import uk.co.compendiumdev.challenge.ChallengerConfig; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierAutoDocGenRouting; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.HttpApiRequestHandler; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.SparkApiRequestResponseHandler; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierAutoDocGenRouting; -import uk.co.compendiumdev.thingifier.application.routehandlers.HttpApiRequestHandler; -import uk.co.compendiumdev.thingifier.application.routehandlers.SparkApiRequestResponseHandler; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; diff --git a/challenger/src/main/java/uk/co/compendiumdev/challenge/spark/SparkMessageLengthValidator.java b/challenger/src/main/java/uk/co/compendiumdev/challenge/spark/SparkMessageLengthValidator.java index 066ed109..23a403c1 100644 --- a/challenger/src/main/java/uk/co/compendiumdev/challenge/spark/SparkMessageLengthValidator.java +++ b/challenger/src/main/java/uk/co/compendiumdev/challenge/spark/SparkMessageLengthValidator.java @@ -2,16 +2,16 @@ import spark.Request; import spark.Response; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.HttpApiResponseToInternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpRequestToHttpApiRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpResponseToSpark; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.SparkToInternalHttpRequest; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.HttpApiResponseToInternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpRequestToHttpApiRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpResponseToSpark; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.SparkToInternalHttpRequest; public class SparkMessageLengthValidator { diff --git a/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpRequestHookTest.java b/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpRequestHookTest.java index 526ef021..435d56a4 100644 --- a/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpRequestHookTest.java +++ b/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpRequestHookTest.java @@ -7,8 +7,8 @@ import uk.co.compendiumdev.challenge.CHALLENGE; import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; public class ChallengerInternalHttpRequestHookTest { diff --git a/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpResponseHookTest.java b/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpResponseHookTest.java index e6ba5aca..448cec9e 100644 --- a/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpResponseHookTest.java +++ b/challenger/src/test/java/uk/co/compendiumdev/challenge/challengehooks/ChallengerInternalHttpResponseHookTest.java @@ -6,9 +6,9 @@ import uk.co.compendiumdev.challenge.CHALLENGE; import uk.co.compendiumdev.challenge.ChallengerAuthData; import uk.co.compendiumdev.challenge.challengers.Challengers; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; public class ChallengerInternalHttpResponseHookTest { diff --git a/standAloneSqlLiteTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/sqlite/application/Main.java b/standAloneSqlLiteTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/sqlite/application/Main.java index fa74efe8..6d027d4e 100644 --- a/standAloneSqlLiteTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/sqlite/application/Main.java +++ b/standAloneSqlLiteTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/sqlite/application/Main.java @@ -2,7 +2,7 @@ import static spark.Spark.get; -import uk.co.compendiumdev.thingifier.application.MainImplementation; +import uk.co.compendiumdev.thingifier.adapter.spark.MainImplementation; import uk.co.compendiumdev.thingifier.application.examples.TodoManagerThingifier; import uk.co.compendiumdev.thingifier.core.repository.sqlite.SqliteThingStoreProvider; diff --git a/standAloneTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java b/standAloneTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java index 5682e16f..22fa5d0a 100644 --- a/standAloneTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java +++ b/standAloneTodoListManagerRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java @@ -4,7 +4,7 @@ import static spark.route.HttpMethod.get; import uk.co.compendiumdev.thingifier.Thingifier; -import uk.co.compendiumdev.thingifier.application.MainImplementation; +import uk.co.compendiumdev.thingifier.adapter.spark.MainImplementation; import uk.co.compendiumdev.thingifier.application.examples.TodoManagerThingifier; public class Main { diff --git a/standAloneTodoListRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java b/standAloneTodoListRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java index e27c86d1..97c67116 100644 --- a/standAloneTodoListRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java +++ b/standAloneTodoListRestApi/src/main/java/uk/co/compendiumdev/todolist/application/Main.java @@ -2,7 +2,7 @@ import static spark.Spark.get; -import uk.co.compendiumdev.thingifier.application.MainImplementation; +import uk.co.compendiumdev.thingifier.adapter.spark.MainImplementation; import uk.co.compendiumdev.thingifier.application.examples.TodoListThingifier; public class Main { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/SparkHttpGenericExceptionRoutings.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/SparkHttpGenericExceptionRoutings.java similarity index 96% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/SparkHttpGenericExceptionRoutings.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/SparkHttpGenericExceptionRoutings.java index bbc62d3f..238078b1 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/SparkHttpGenericExceptionRoutings.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/SparkHttpGenericExceptionRoutings.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.httprouting; +package uk.co.compendiumdev.thingifier.adapter.http; import static spark.Spark.exception; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierAutoDocGenRouting.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierAutoDocGenRouting.java similarity index 98% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierAutoDocGenRouting.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierAutoDocGenRouting.java index afb8d8af..38442a6c 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierAutoDocGenRouting.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierAutoDocGenRouting.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.httprouting; +package uk.co.compendiumdev.thingifier.adapter.http; import static spark.Spark.get; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierHttpApiRoutings.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierHttpApiRoutings.java similarity index 95% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierHttpApiRoutings.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierHttpApiRoutings.java index 165f47a8..5cdc3a99 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httprouting/ThingifierHttpApiRoutings.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/ThingifierHttpApiRoutings.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.httprouting; +package uk.co.compendiumdev.thingifier.adapter.http; import static spark.Spark.*; @@ -6,18 +6,18 @@ import java.util.List; import spark.Request; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiResponseHook; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.*; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.InternalHttpRequestHook; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.InternalHttpResponseHook; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.SparkRequestResponseHook; import uk.co.compendiumdev.thingifier.api.docgen.ApiRoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.ApiRoutingDefinitionDocGenerator; import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiResponseHook; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.*; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.InternalHttpRequestHook; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.InternalHttpResponseHook; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.SparkRequestResponseHook; import uk.co.compendiumdev.thingifier.spark.SimpleSparkRouteCreator; public class ThingifierHttpApiRoutings { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiRequestHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiRequestHook.java similarity index 91% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiRequestHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiRequestHook.java index 116d8ca1..c921a71c 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiRequestHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiRequestHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.httpapimessagehooks; +package uk.co.compendiumdev.thingifier.adapter.http.messagehooks; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiResponseHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiResponseHook.java similarity index 91% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiResponseHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiResponseHook.java index b583f970..8c71bfd8 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/httpapimessagehooks/HttpApiResponseHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/messagehooks/HttpApiResponseHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.httpapimessagehooks; +package uk.co.compendiumdev.thingifier.adapter.http.messagehooks; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/HttpApiRequestHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/HttpApiRequestHandler.java similarity index 76% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/HttpApiRequestHandler.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/HttpApiRequestHandler.java index 32c6ab5e..116fe7bc 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/HttpApiRequestHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/HttpApiRequestHandler.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.routehandlers; +package uk.co.compendiumdev.thingifier.adapter.http.routehandlers; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/ShutdownRouteHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/ShutdownRouteHandler.java similarity index 95% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/ShutdownRouteHandler.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/ShutdownRouteHandler.java index 6548b09f..9d3fa502 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/ShutdownRouteHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/ShutdownRouteHandler.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.routehandlers; +package uk.co.compendiumdev.thingifier.adapter.http.routehandlers; import static spark.Spark.get; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/SparkApiRequestResponseHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/SparkApiRequestResponseHandler.java similarity index 71% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/SparkApiRequestResponseHandler.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/SparkApiRequestResponseHandler.java index 4e594684..183a6f86 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/routehandlers/SparkApiRequestResponseHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/http/routehandlers/SparkApiRequestResponseHandler.java @@ -1,19 +1,19 @@ -package uk.co.compendiumdev.thingifier.application.routehandlers; +package uk.co.compendiumdev.thingifier.adapter.http.routehandlers; import spark.Request; import spark.Response; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.HttpApiResponseToInternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpRequestToHttpApiRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.InternalHttpResponseToSpark; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion.SparkToInternalHttpRequest; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.http.ThingifierHttpApi; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; -import uk.co.compendiumdev.thingifier.api.restapihandlers.SessionHeaderParser; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.HttpApiResponseToInternalHttpResponse; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpRequestToHttpApiRequest; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.InternalHttpResponseToSpark; -import uk.co.compendiumdev.thingifier.application.internalhttpconversion.SparkToInternalHttpRequest; public class SparkApiRequestResponseHandler { private final Request request; @@ -58,12 +58,9 @@ public String handle() { if (httpApiResponse == null) { ApiResponse apiResponse = handler.handle(myRequest); - apiResponse.usingRelationships( - thingifier - .getStore( - SessionHeaderParser.getDatabaseNameFromHeaderValue( - myRequest.getHeaders())) - .relationships()); + ThingifierRequestContext context = + ThingifierRequestContext.from(thingifier, myRequest.getHeaders()); + apiResponse.usingRelationships(context.store().relationships()); httpApiResponse = new HttpApiResponse( diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeader.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeader.java similarity index 85% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeader.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeader.java index 9653cd7e..d405fd1f 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeader.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeader.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; public final class InternalHttpHeader { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeaders.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeaders.java similarity index 96% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeaders.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeaders.java index 288fa2f0..8bcdcbcb 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpHeaders.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpHeaders.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; import java.util.LinkedHashMap; import java.util.Locale; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpMethod.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpMethod.java similarity index 86% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpMethod.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpMethod.java index f70e5ef4..c0fa10dc 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpMethod.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpMethod.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; import java.util.Locale; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequest.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequest.java similarity index 99% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequest.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequest.java index 7162d259..3a4491a0 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequest.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequest.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; import java.util.ArrayList; import java.util.LinkedHashMap; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpResponse.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpResponse.java similarity index 95% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpResponse.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpResponse.java index 2e7cb08e..4d8d1189 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpResponse.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpResponse.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; public final class InternalHttpResponse { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponse.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponse.java similarity index 83% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponse.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponse.java index a3737dcb..f03d1725 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponse.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponse.java @@ -1,8 +1,8 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.Map; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; public final class HttpApiResponseToInternalHttpResponse { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequest.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequest.java similarity index 84% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequest.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequest.java index 7856d48a..10f45e1f 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequest.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequest.java @@ -1,11 +1,11 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.ArrayList; import java.util.List; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpHeader; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeaderPair; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpHeader; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; public final class InternalHttpRequestToHttpApiRequest { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpResponseToSpark.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpResponseToSpark.java similarity index 84% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpResponseToSpark.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpResponseToSpark.java index 9da950a6..32781972 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpResponseToSpark.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpResponseToSpark.java @@ -1,8 +1,8 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.Map; import spark.Response; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; public final class InternalHttpResponseToSpark { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkResponseToInternalHttpResponse.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkResponseToInternalHttpResponse.java similarity index 83% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkResponseToInternalHttpResponse.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkResponseToInternalHttpResponse.java index 4cc18385..e7ec338f 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkResponseToInternalHttpResponse.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkResponseToInternalHttpResponse.java @@ -1,7 +1,7 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import spark.Response; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; public class SparkResponseToInternalHttpResponse { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkToInternalHttpRequest.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkToInternalHttpRequest.java similarity index 93% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkToInternalHttpRequest.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkToInternalHttpRequest.java index dcfba7a8..83492624 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/SparkToInternalHttpRequest.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/SparkToInternalHttpRequest.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.ArrayList; import java.util.Enumeration; @@ -7,7 +7,7 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; import spark.Request; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; public final class SparkToInternalHttpRequest { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/ThingifierHttpApiBridge.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/ThingifierHttpApiBridge.java similarity index 84% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/ThingifierHttpApiBridge.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/ThingifierHttpApiBridge.java index c47e0fa0..695cd7aa 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/ThingifierHttpApiBridge.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/ThingifierHttpApiBridge.java @@ -1,14 +1,14 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.List; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiResponseHook; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.http.ThingifierHttpApi; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiResponseHook; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; public final class ThingifierHttpApiBridge { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/AdhocDocumentedSparkRouteConfigurer.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/AdhocDocumentedSparkRouteConfigurer.java similarity index 97% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/AdhocDocumentedSparkRouteConfigurer.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/AdhocDocumentedSparkRouteConfigurer.java index a3b8953e..79b7cb19 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/AdhocDocumentedSparkRouteConfigurer.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/AdhocDocumentedSparkRouteConfigurer.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application; +package uk.co.compendiumdev.thingifier.adapter.spark; import java.util.List; import spark.Route; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/MainImplementation.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/MainImplementation.java similarity index 94% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/MainImplementation.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/MainImplementation.java index cea27c7f..6a48fcbf 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/MainImplementation.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/MainImplementation.java @@ -1,21 +1,21 @@ -package uk.co.compendiumdev.thingifier.application; +package uk.co.compendiumdev.thingifier.adapter.spark; import java.util.HashMap; import java.util.List; import java.util.Map; import spark.Spark; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.SparkHttpGenericExceptionRoutings; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierAutoDocGenRouting; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; +import uk.co.compendiumdev.thingifier.adapter.http.routehandlers.ShutdownRouteHandler; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.ClearDataPreSparkRequestHook; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.LogTheResponseHook; +import uk.co.compendiumdev.thingifier.adapter.spark.messagehooks.LogTheSparkRequestHook; import uk.co.compendiumdev.thingifier.api.docgen.RoutingDefinition; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfigProfile; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfigProfiles; -import uk.co.compendiumdev.thingifier.application.httprouting.SparkHttpGenericExceptionRoutings; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierAutoDocGenRouting; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; -import uk.co.compendiumdev.thingifier.application.routehandlers.ShutdownRouteHandler; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.ClearDataPreSparkRequestHook; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.LogTheResponseHook; -import uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks.LogTheSparkRequestHook; import uk.co.compendiumdev.thingifier.htmlgui.htmlgen.DefaultGUIHTML; import uk.co.compendiumdev.thingifier.htmlgui.routing.DefaultGuiRoutings; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/ClearDataPreSparkRequestHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/ClearDataPreSparkRequestHook.java similarity index 94% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/ClearDataPreSparkRequestHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/ClearDataPreSparkRequestHook.java index 1a73297c..6a49c491 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/ClearDataPreSparkRequestHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/ClearDataPreSparkRequestHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; import spark.Request; import spark.Response; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpRequestHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpRequestHook.java new file mode 100644 index 00000000..afe33700 --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpRequestHook.java @@ -0,0 +1,9 @@ +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; + +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; + +public interface InternalHttpRequestHook { + // return an InternalHttpResponse if you want to end immediately from the hook + InternalHttpResponse run(InternalHttpRequest request); +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpResponseHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpResponseHook.java new file mode 100644 index 00000000..a1aa4ec5 --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/InternalHttpResponseHook.java @@ -0,0 +1,10 @@ +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; + +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; + +public interface InternalHttpResponseHook { + // throw an exception to return the response + // amend the response in hook + void run(InternalHttpRequest request, InternalHttpResponse response); +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheResponseHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheResponseHook.java similarity index 85% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheResponseHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheResponseHook.java index cfdf3b8e..690bffa8 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheResponseHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheResponseHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; import spark.Request; import spark.Response; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheSparkRequestHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheSparkRequestHook.java similarity index 87% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheSparkRequestHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheSparkRequestHook.java index 30ac69b7..091dadf7 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/LogTheSparkRequestHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/LogTheSparkRequestHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; import spark.Request; import spark.Response; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/SparkRequestResponseHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/SparkRequestResponseHook.java similarity index 83% rename from thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/SparkRequestResponseHook.java rename to thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/SparkRequestResponseHook.java index c546a900..6d8c3498 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/SparkRequestResponseHook.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/spark/messagehooks/SparkRequestResponseHook.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; +package uk.co.compendiumdev.thingifier.adapter.spark.messagehooks; import spark.Request; import spark.Response; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/ThingifierRestAPIHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/ThingifierRestAPIHandler.java index 1b4a388a..d6d2a199 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/ThingifierRestAPIHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/ThingifierRestAPIHandler.java @@ -1,6 +1,7 @@ package uk.co.compendiumdev.thingifier.api; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; @@ -36,34 +37,42 @@ public ThingifierRestAPIHandler(final Thingifier aThingifier) { public ApiResponse get( final String url, final QueryFilterParams queryParams, HttpHeadersBlock headers) { - return withRepository(get.handle(url, queryParams, headers), headers); + ThingifierRequestContext context = contextFrom(headers); + return withRepository(get.handle(url, queryParams, context), context); } public ApiResponse head( final String url, final QueryFilterParams queryParams, HttpHeadersBlock headers) { - final ApiResponse response = get.handle(url, queryParams, headers); + ThingifierRequestContext context = contextFrom(headers); + final ApiResponse response = get.handle(url, queryParams, context); response.clearBody(); - return withRepository(response, headers); + return withRepository(response, context); } public ApiResponse delete(final String url, HttpHeadersBlock headers) { - return withRepository(delete.handle(url, headers), headers); + ThingifierRequestContext context = contextFrom(headers); + return withRepository(delete.handle(url, context), context); } public ApiResponse post(final String url, final BodyParser args, HttpHeadersBlock headers) { - return withRepository(post.handle(url, args, headers), headers); + ThingifierRequestContext context = contextFrom(headers); + return withRepository(post.handle(url, args, context), context); } public ApiResponse put(final String url, final BodyParser args, HttpHeadersBlock headers) { - return withRepository(put.handle(url, args, headers), headers); + ThingifierRequestContext context = contextFrom(headers); + return withRepository(put.handle(url, args, context), context); } - private ApiResponse withRepository(final ApiResponse response, final HttpHeadersBlock headers) { + private ThingifierRequestContext contextFrom(final HttpHeadersBlock headers) { + return ThingifierRequestContext.from(thingifier, headers); + } + + private ApiResponse withRepository( + final ApiResponse response, final ThingifierRequestContext context) { if (response == null) { return null; } - HttpHeadersBlock safeHeaders = headers == null ? new HttpHeadersBlock() : headers; - String databaseName = SessionHeaderParser.getDatabaseNameFromHeaderValue(safeHeaders); - return response.usingRelationships(thingifier.getStore(databaseName).relationships()); + return response.usingRelationships(context.store().relationships()); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java index 47b6e16d..177167cf 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java @@ -3,12 +3,11 @@ import java.util.ArrayList; import java.util.List; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiResponseHook; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; -import uk.co.compendiumdev.thingifier.api.restapihandlers.SessionHeaderParser; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiResponseHook; public final class ThingifierHttpApi { @@ -121,22 +120,10 @@ public HttpApiResponse validateRequestSyntax( return httpResponse; } - private void createDatabaseBasedOnSessionHeaderUIfNecessary(final String sessionHeaderValue) { - if (sessionHeaderValue != null) { - // make sure database exists - thingifier.ensureCreatedAndPopulatedInstanceDatabaseNamed(sessionHeaderValue); - } - } - public ApiResponse routeAndProcessRequest(final HttpApiRequest request, HttpVerb verb) { ApiResponse apiResponse = null; - // if there is a session id and we have not created the erm yet, then do that now - String databaseToUse = - SessionHeaderParser.getDatabaseNameFromHeaderValue(request.getHeaders()); - createDatabaseBasedOnSessionHeaderUIfNecessary(databaseToUse); - switch (verb) { case GET: apiResponse = @@ -208,11 +195,6 @@ public HttpApiResponse query(final HttpApiRequest request, final String query) { HttpApiResponse httpResponse = runTheHttpApiRequestHooksOn(request); - // if there is a session id and we have not created the erm yet, then do that - String databaseToUse = - SessionHeaderParser.getDatabaseNameFromHeaderValue(request.getHeaders()); - createDatabaseBasedOnSessionHeaderUIfNecessary(databaseToUse); - if (httpResponse == null) { ApiResponse apiResponse = thingifier diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContext.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContext.java new file mode 100644 index 00000000..364e1a27 --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContext.java @@ -0,0 +1,52 @@ +package uk.co.compendiumdev.thingifier.api.http; + +import static uk.co.compendiumdev.thingifier.api.http.ThingifierHttpApi.HTTP_SESSION_HEADER_NAME; + +import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; +import uk.co.compendiumdev.thingifier.core.EntityRelModel; +import uk.co.compendiumdev.thingifier.core.repository.ThingStore; + +public final class ThingifierRequestContext { + + private final String databaseName; + private final ThingStore store; + private final HttpHeadersBlock headers; + + private ThingifierRequestContext( + final String databaseName, final ThingStore store, final HttpHeadersBlock headers) { + this.databaseName = databaseName; + this.store = store; + this.headers = headers; + } + + public static ThingifierRequestContext from( + final Thingifier thingifier, final HttpHeadersBlock requestHeaders) { + HttpHeadersBlock safeHeaders = + requestHeaders == null ? new HttpHeadersBlock() : requestHeaders; + String databaseName = databaseNameFrom(safeHeaders); + thingifier.ensureCreatedAndPopulatedInstanceDatabaseNamed(databaseName); + return new ThingifierRequestContext( + databaseName, thingifier.getStore(databaseName), safeHeaders); + } + + private static String databaseNameFrom(final HttpHeadersBlock requestHeaders) { + String sessionHeaderValue = requestHeaders.get(HTTP_SESSION_HEADER_NAME); + if (sessionHeaderValue.isEmpty()) { + return EntityRelModel.DEFAULT_DATABASE_NAME; + } + return sessionHeaderValue; + } + + public String databaseName() { + return databaseName; + } + + public ThingStore store() { + return store; + } + + public HttpHeadersBlock headers() { + return headers; + } +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ApiMappingError.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ApiMappingError.java new file mode 100644 index 00000000..7fd9afd7 --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ApiMappingError.java @@ -0,0 +1,41 @@ +package uk.co.compendiumdev.thingifier.api.restapihandlers; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public final class ApiMappingError { + + private final int statusCode; + private final List messages; + + private ApiMappingError(final int statusCode, final Collection messages) { + this.statusCode = statusCode; + this.messages = Collections.unmodifiableList(new ArrayList<>(messages)); + } + + public static ApiMappingError withMessage(final int statusCode, final String message) { + return new ApiMappingError(statusCode, Collections.singletonList(message)); + } + + public static ApiMappingError withMessages( + final int statusCode, final Collection messages) { + return new ApiMappingError(statusCode, messages); + } + + public int statusCode() { + return statusCode; + } + + public List messages() { + return messages; + } + + public String firstMessage() { + if (messages.isEmpty()) { + return ""; + } + return messages.get(0); + } +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/EntityUrlMatcher.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/EntityUrlMatcher.java index f9e6848a..83e8526e 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/EntityUrlMatcher.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/EntityUrlMatcher.java @@ -1,27 +1,27 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; -import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; +import uk.co.compendiumdev.thingifier.core.repository.ThingStore; final class EntityUrlMatcher { private EntityUrlMatcher() {} - static EntityDefinition entityFromCollectionUrl(final Thingifier thingifier, final String url) { + static EntityDefinition entityFromCollectionUrl(final SchemaCatalog schema, final String url) { String[] parts = parts(url); if (parts.length != 1) { return null; } - return thingifier.getERmodel().getSchema().getDefinitionWithSingularOrPluralNamed(parts[0]); + return schema.definitionWithSingularOrPluralNamed(parts[0]); } - static EntityDefinition entityFromInstanceUrl(final Thingifier thingifier, final String url) { + static EntityDefinition entityFromInstanceUrl(final SchemaCatalog schema, final String url) { String[] parts = parts(url); if (parts.length != 2) { return null; } - return thingifier.getERmodel().getSchema().getDefinitionWithSingularOrPluralNamed(parts[0]); + return schema.definitionWithSingularOrPluralNamed(parts[0]); } static String identifierFromInstanceUrl(final String url) { @@ -45,16 +45,13 @@ static boolean hasPartCount(final String url, final int count) { } static EntityInstance findInstanceFromUrl( - final Thingifier thingifier, final String url, final String database) { - EntityDefinition entity = entityFromInstanceUrl(thingifier, url); + final SchemaCatalog schema, final ThingStore store, final String url) { + EntityDefinition entity = entityFromInstanceUrl(schema, url); String identifier = identifierFromInstanceUrl(url); if (entity == null || identifier == null) { return null; } - return thingifier - .getStore(database) - .entityQueries() - .findByQueryIdentifier(entity, identifier); + return store.entityQueries().findByQueryIdentifier(entity, identifier); } static String[] parts(final String url) { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParser.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParser.java index 45d2cdfa..19dfbbd3 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParser.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParser.java @@ -5,59 +5,58 @@ import java.util.Map; import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; +import uk.co.compendiumdev.thingifier.application.command.RelationshipReference; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.FieldType; import uk.co.compendiumdev.thingifier.core.domain.definitions.relationship.RelationshipVectorDefinition; -import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; import uk.co.compendiumdev.thingifier.core.reporting.ValidationReport; -import uk.co.compendiumdev.thingifier.core.repository.ThingStore; public final class RelationshipBodyCommandParser { - private final Thingifier thingifier; + private final SchemaCatalog schema; public RelationshipBodyCommandParser(final Thingifier thingifier) { - this.thingifier = thingifier; + this(new ThingifierSchemaCatalog(thingifier)); + } + + RelationshipBodyCommandParser(final SchemaCatalog schema) { + this.schema = schema; } public RelationshipBodyCommands parse( - final BodyParser bodyargs, final EntityDefinition entity, final String database) { - return parse(bodyargs.getFlattenedStringMap(), entity, database); + final BodyParser bodyargs, final EntityDefinition entity) { + return parse(bodyargs.getFlattenedStringMap(), entity); } public RelationshipBodyCommands parse( - final List> flattenedArgs, - final EntityDefinition entity, - final String database) { + final List> flattenedArgs, final EntityDefinition entity) { List> relationshipEntries = new ArrayList<>(); - List connections = new ArrayList<>(); + List references = new ArrayList<>(); ValidationReport report = new ValidationReport(); for (Map.Entry keyValue : flattenedArgs) { String key = keyValue.getKey(); if (key.startsWith("relationships.")) { relationshipEntries.add(keyValue); - parseComplexRelationship(entity, keyValue, database, report, connections); + parseComplexRelationship(entity, keyValue, report, references); } else if (key.contains(".")) { String[] parts = key.split("\\."); if (parts.length > 0 && entity.related().hasRelationship(parts[0])) { relationshipEntries.add(keyValue); - parseCompressedRelationship(entity, keyValue, database, report, connections); + parseCompressedRelationship(entity, keyValue, report, references); } } } report.setValid(report.getErrorMessages().isEmpty()); - return new RelationshipBodyCommands(relationshipEntries, connections, report); + return new RelationshipBodyCommands(relationshipEntries, references, report); } private void parseCompressedRelationship( final EntityDefinition entity, final Map.Entry keyValue, - final String database, final ValidationReport report, - final List connections) { + final List references) { String[] parts = keyValue.getKey().split("\\."); if (parts.length != 2) { reportIsNotValidRelationship(keyValue.getKey(), report); @@ -76,31 +75,15 @@ private void parseCompressedRelationship( return; } - EntityInstance related = - resolveRelatedForCompressed( - entity, relationshipName, fieldName, keyValue.getValue(), database); - if (related == null) { - report.addErrorMessage( - String.format( - "cannot find %s to relate to with %s %s", - relationshipName, fieldName, keyValue.getValue())); - return; - } - - if (!validRelationshipBetweenThings( - entity, relationshipName, related.getEntity(), report)) { - return; - } - - connections.add(new RelationshipConnection(relationshipName, related)); + references.add( + RelationshipReference.compressed(relationshipName, fieldName, keyValue.getValue())); } private void parseComplexRelationship( final EntityDefinition entity, final Map.Entry keyValue, - final String database, final ValidationReport report, - final List connections) { + final List references) { String[] parts = keyValue.getKey().split("\\."); if (parts.length != 4) { reportIsNotValidRelationship(keyValue.getKey(), report); @@ -116,59 +99,20 @@ private void parseComplexRelationship( } EntityDefinition relationshipTo = - thingifier - .getERmodel() - .getSchema() - .getDefinitionWithSingularOrPluralNamed(relationshipToTerm); + schema.definitionWithSingularOrPluralNamed(relationshipToTerm); if (relationshipTo == null || !validRelationshipBetweenThings( entity, relationshipName, relationshipTo, report)) { return; } - ThingStore store = thingifier.getStore(database); - EntityInstance related = - store.entityQueries().findByQueryIdentifier(relationshipTo, keyValue.getValue()); - if (related == null) { - related = - store.entityQueries() - .findByField(relationshipTo, relationshipField, keyValue.getValue()); - } - - if (related == null) { - report.addErrorMessage( - String.format( - "cannot find %s of %s to relate to with %s %s", - relationshipField, - relationshipToTerm, - relationshipField, - keyValue.getValue())); - return; - } - - connections.add(new RelationshipConnection(relationshipName, related)); - } - - private EntityInstance resolveRelatedForCompressed( - final EntityDefinition entity, - final String relationshipName, - final String fieldName, - final String fieldValue, - final String database) { - ThingStore store = thingifier.getStore(database); - for (RelationshipVectorDefinition vector : - entity.related().getRelationships(relationshipName)) { - EntityDefinition relatedEntity = vector.getTo(); - EntityInstance related = - store.entityQueries().findByField(relatedEntity, fieldName, fieldValue); - if (related == null) { - related = store.entityQueries().findByQueryIdentifier(relatedEntity, fieldValue); - } - if (related != null) { - return related; - } - } - return null; + references.add( + RelationshipReference.explicit( + relationshipName, + relationshipTo, + relationshipToTerm, + relationshipField, + keyValue.getValue())); } private boolean supportsReferenceField( diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommands.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommands.java index 89be0c6a..1ee5667a 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommands.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommands.java @@ -3,21 +3,21 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; +import uk.co.compendiumdev.thingifier.application.command.RelationshipReference; import uk.co.compendiumdev.thingifier.core.reporting.ValidationReport; public final class RelationshipBodyCommands { private final List> relationshipEntries; - private final List connections; + private final List references; private final ValidationReport validationReport; RelationshipBodyCommands( final List> relationshipEntries, - final List connections, + final List references, final ValidationReport validationReport) { this.relationshipEntries = new ArrayList<>(relationshipEntries); - this.connections = new ArrayList<>(connections); + this.references = new ArrayList<>(references); this.validationReport = validationReport; } @@ -25,8 +25,8 @@ public List> relationshipEntries() { return new ArrayList<>(relationshipEntries); } - public List connections() { - return new ArrayList<>(connections); + public List references() { + return new ArrayList<>(references); } public ValidationReport validationReport() { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolver.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolver.java index 666ef318..11f687e3 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolver.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolver.java @@ -1,7 +1,6 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import java.util.List; -import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.FieldType; @@ -12,14 +11,12 @@ final class RepositoryBackedRelationshipUrlResolver { - private final Thingifier thingifier; + private final SchemaCatalog schema; private final EntityInstanceQuery query; private final RelationshipRepository relationships; - RepositoryBackedRelationshipUrlResolver( - final Thingifier thingifier, final String databaseName) { - this.thingifier = thingifier; - ThingStore store = thingifier.getStore(databaseName); + RepositoryBackedRelationshipUrlResolver(final SchemaCatalog schema, final ThingStore store) { + this.schema = schema; this.query = store.entityQueries(); this.relationships = store.relationships(); } @@ -71,7 +68,7 @@ RelationshipUrlResolution resolveRelationshipInstance(final String url) { } private EntityDefinition entityFor(final String term) { - return thingifier.getERmodel().getSchema().getDefinitionWithSingularOrPluralNamed(term); + return schema.definitionWithSingularOrPluralNamed(term); } private boolean matchesQueryIdentifier(final EntityInstance instance, final String identifier) { diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiDeleteHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiDeleteHandler.java index f869a971..60901ae6 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiDeleteHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiDeleteHandler.java @@ -1,6 +1,7 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.application.ThingCommandResult; @@ -14,20 +15,20 @@ public RestApiDeleteHandler(final Thingifier aThingifier) { } public ApiResponse handle(final String url, HttpHeadersBlock requestHeaders) { + return handle(url, ThingifierRequestContext.from(thingifier, requestHeaders)); + } - String instanceDatabaseName = - SessionHeaderParser.getDatabaseNameFromHeaderValue(requestHeaders); - + public ApiResponse handle(final String url, final ThingifierRequestContext context) { ThingWriteRequestMapping mapping = - new ThingWriteRequestMapper(thingifier, instanceDatabaseName).mapDelete(url); + new ThingWriteRequestMapper(thingifier, context.store()).mapDelete(url); + ThingCommandResultApiMapper apiMapper = + new ThingCommandResultApiMapper(thingifier.apiConfig()); if (mapping.isError()) { - return mapping.getErrorResponse(); + return apiMapper.map(mapping.getError()); } ThingCommandResult result = - new ThingCommandService(thingifier.getStore(instanceDatabaseName)) - .execute(mapping.getCommand()); - return new ThingCommandResultApiMapper(thingifier.apiConfig()) - .map(mapping.getCommand(), result); + new ThingCommandService(context.store()).execute(mapping.getCommand()); + return apiMapper.map(mapping.getCommand(), result); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiGetHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiGetHandler.java index 9ab408df..b27f03de 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiGetHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiGetHandler.java @@ -1,6 +1,7 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.application.ThingQueryService; @@ -20,18 +21,23 @@ public ApiResponse handle( final String url, final QueryFilterParams queryParams, final HttpHeadersBlock requestHeaders) { + return handle(url, queryParams, ThingifierRequestContext.from(thingifier, requestHeaders)); + } + public ApiResponse handle( + final String url, + final QueryFilterParams queryParams, + final ThingifierRequestContext context) { + ThingReadResultApiMapper apiMapper = new ThingReadResultApiMapper(thingifier.apiConfig()); // if there are params, and we are not allowed to filter, and we enforce that if (queryParams.size() > 0 && thingifier.apiConfig().forParams().willEnforceFilteringThroughUrlParams() && !thingifier.apiConfig().forParams().willAllowFilteringThroughUrlParams()) { - return ApiResponse.error( - 400, String.format("Can not use query parameters with %s", url)); + return apiMapper.map( + ApiMappingError.withMessage( + 400, String.format("Can not use query parameters with %s", url))); } - String instanceDatabaseName = - SessionHeaderParser.getDatabaseNameFromHeaderValue(requestHeaders); - RepositoryQueryResult queryResults; boolean allowFiltering = thingifier.apiConfig().forParams().willAllowFilteringThroughUrlParams(); @@ -41,12 +47,11 @@ public ApiResponse handle( ThingReadRequestMapping mapping = new ThingReadRequestMapper(thingifier).map(url, effectiveQueryParams); if (mapping.isError()) { - return mapping.getErrorResponse(); + return apiMapper.map(mapping.getError()); } - queryResults = - queryService.execute(mapping.getQuery(), thingifier.getStore(instanceDatabaseName)); + queryResults = queryService.execute(mapping.getQuery(), context.store()); - return new ThingReadResultApiMapper(thingifier.apiConfig()).map(url, queryResults); + return apiMapper.map(url, queryResults); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPostHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPostHandler.java index 6829ca33..ed2efc74 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPostHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPostHandler.java @@ -1,6 +1,7 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; @@ -16,19 +17,21 @@ public RestApiPostHandler(final Thingifier aThingifier) { public ApiResponse handle( final String url, final BodyParser args, final HttpHeadersBlock requestHeaders) { - String instanceDatabaseName = - SessionHeaderParser.getDatabaseNameFromHeaderValue(requestHeaders); + return handle(url, args, ThingifierRequestContext.from(thingifier, requestHeaders)); + } + public ApiResponse handle( + final String url, final BodyParser args, final ThingifierRequestContext context) { ThingWriteRequestMapping mapping = - new ThingWriteRequestMapper(thingifier, instanceDatabaseName).mapPost(url, args); + new ThingWriteRequestMapper(thingifier, context.store()).mapPost(url, args); + ThingCommandResultApiMapper apiMapper = + new ThingCommandResultApiMapper(thingifier.apiConfig()); if (mapping.isError()) { - return mapping.getErrorResponse(); + return apiMapper.map(mapping.getError()); } ThingCommandResult result = - new ThingCommandService(thingifier.getStore(instanceDatabaseName)) - .execute(mapping.getCommand()); - return new ThingCommandResultApiMapper(thingifier.apiConfig()) - .map(mapping.getCommand(), result); + new ThingCommandService(context.store()).execute(mapping.getCommand()); + return apiMapper.map(mapping.getCommand(), result); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPutHandler.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPutHandler.java index 624dec37..98b326ab 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPutHandler.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RestApiPutHandler.java @@ -1,6 +1,7 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.ThingifierRequestContext; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; @@ -16,20 +17,21 @@ public RestApiPutHandler(final Thingifier aThingifier) { public ApiResponse handle( final String url, final BodyParser args, final HttpHeadersBlock requestHeaders) { + return handle(url, args, ThingifierRequestContext.from(thingifier, requestHeaders)); + } - String instanceDatabaseName = - SessionHeaderParser.getDatabaseNameFromHeaderValue(requestHeaders); - + public ApiResponse handle( + final String url, final BodyParser args, final ThingifierRequestContext context) { ThingWriteRequestMapping mapping = - new ThingWriteRequestMapper(thingifier, instanceDatabaseName).mapPut(url, args); + new ThingWriteRequestMapper(thingifier, context.store()).mapPut(url, args); + ThingCommandResultApiMapper apiMapper = + new ThingCommandResultApiMapper(thingifier.apiConfig()); if (mapping.isError()) { - return mapping.getErrorResponse(); + return apiMapper.map(mapping.getError()); } ThingCommandResult result = - new ThingCommandService(thingifier.getStore(instanceDatabaseName)) - .execute(mapping.getCommand()); - return new ThingCommandResultApiMapper(thingifier.apiConfig()) - .map(mapping.getCommand(), result); + new ThingCommandService(context.store()).execute(mapping.getCommand()); + return apiMapper.map(mapping.getCommand(), result); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SchemaCatalog.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SchemaCatalog.java new file mode 100644 index 00000000..10d22aed --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SchemaCatalog.java @@ -0,0 +1,10 @@ +package uk.co.compendiumdev.thingifier.api.restapihandlers; + +import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; + +public interface SchemaCatalog { + + EntityDefinition definitionWithSingularOrPluralNamed(String term); + + boolean hasRelationshipNamed(String name); +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SessionHeaderParser.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SessionHeaderParser.java deleted file mode 100644 index d0d10f98..00000000 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/SessionHeaderParser.java +++ /dev/null @@ -1,19 +0,0 @@ -package uk.co.compendiumdev.thingifier.api.restapihandlers; - -import static uk.co.compendiumdev.thingifier.api.http.ThingifierHttpApi.HTTP_SESSION_HEADER_NAME; - -import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; -import uk.co.compendiumdev.thingifier.core.EntityRelModel; - -public class SessionHeaderParser { - - public static String getDatabaseNameFromHeaderValue(final HttpHeadersBlock requestHeaders) { - String sessionHeaderValue = requestHeaders.get(HTTP_SESSION_HEADER_NAME); - String instanceDatabaseName = EntityRelModel.DEFAULT_DATABASE_NAME; - if (!sessionHeaderValue.isEmpty()) { - instanceDatabaseName = sessionHeaderValue; - } - - return instanceDatabaseName; - } -} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingBodyCommandMapper.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingBodyCommandMapper.java index d3a5f492..26adc794 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingBodyCommandMapper.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingBodyCommandMapper.java @@ -5,7 +5,7 @@ import java.util.Map; import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; +import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; import uk.co.compendiumdev.thingifier.application.command.AmendThingCommand; import uk.co.compendiumdev.thingifier.application.command.CreateAndConnectRelationshipCommand; import uk.co.compendiumdev.thingifier.application.command.CreateThingCommand; @@ -15,15 +15,29 @@ import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstanceDraft; import uk.co.compendiumdev.thingifier.core.reporting.ValidationReport; +import uk.co.compendiumdev.thingifier.core.repository.ThingStore; public final class ThingBodyCommandMapper { - private final Thingifier thingifier; - private final String database; + private final SchemaCatalog schema; + private final ThingifierApiConfig apiConfig; + private final ThingStore store; public ThingBodyCommandMapper(final Thingifier thingifier, final String database) { - this.thingifier = thingifier; - this.database = database; + this(thingifier, thingifier.getStore(database)); + } + + ThingBodyCommandMapper(final Thingifier thingifier, final ThingStore store) { + this(new ThingifierSchemaCatalog(thingifier), thingifier.apiConfig(), store); + } + + ThingBodyCommandMapper( + final SchemaCatalog schema, + final ThingifierApiConfig apiConfig, + final ThingStore store) { + this.schema = schema; + this.apiConfig = apiConfig; + this.store = store; } public ThingWriteRequestMapping mapCreate( @@ -38,7 +52,7 @@ public ThingWriteRequestMapping mapCreate( ValidationReport validated = new BodyCreationValidator().validate(bodyargs, entity); if (!validated.isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error( + ApiMappingError.withMessage( 400, String.format( "Invalid Creation: %s", validated.getCombinedErrorMessages()))); @@ -59,12 +73,12 @@ public ThingWriteRequestMapping mapCreateWithPrimaryKey( .areFieldsUnique( bodyargs, entity, - thingifier.getStore(database).entityQueries(), + store.entityQueries(), entity.getFieldNamesOfType( FieldType.AUTO_INCREMENT, FieldType.AUTO_GUID)); if (!validated.isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error( + ApiMappingError.withMessage( 409, "Cannot Create with duplicate values: " + validated.getCombinedErrorMessages())); @@ -84,13 +98,14 @@ public ThingWriteRequestMapping mapCreateWithPrimaryKey( List fieldValues = FieldValues.fromListMapEntryStringString(bodyargs.getFlattenedStringMap()); - thingifier.getStore(database).administration().accommodateProtectedIds(entity, fieldValues); + store.administration().accommodateProtectedIds(entity, fieldValues); - if (thingifier.apiConfig().willApiEnforceDeclaredTypesInInput()) { + if (apiConfig.willApiEnforceDeclaredTypesInInput()) { ValidationReport validatedTypes = bodyargs.validateAgainstType(entity); if (!validatedTypes.isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error(400, validatedTypes.getCombinedErrorMessages())); + ApiMappingError.withMessage( + 400, validatedTypes.getCombinedErrorMessages())); } } @@ -105,9 +120,9 @@ public ThingWriteRequestMapping mapCreateWithPrimaryKey( ignoreFields); copyBaseDraftValues(baseDraft, draft); return ThingWriteRequestMapping.command( - new CreateThingCommand(draft, relationships.connections(), true)); + new CreateThingCommand(draft, relationships.references(), true)); } catch (Exception e) { - return ThingWriteRequestMapping.error(ApiResponse.error(400, e.getMessage())); + return ThingWriteRequestMapping.error(ApiMappingError.withMessage(400, e.getMessage())); } } @@ -117,7 +132,7 @@ public ThingWriteRequestMapping mapAmend( final boolean replaceExistingFieldsAndRelationships) { bodyargs.getMap(); - if (thingifier.apiConfig().willApiEnforceDeclaredTypesInInput()) { + if (apiConfig.willApiEnforceDeclaredTypesInInput()) { List doNotValidateFields = instance.getEntity() .getFieldNamesOfType(FieldType.AUTO_INCREMENT, FieldType.AUTO_GUID); @@ -125,7 +140,8 @@ public ThingWriteRequestMapping mapAmend( bodyargs.validateAgainstTypeIgnoring(instance.getEntity(), doNotValidateFields); if (!validatedTypes.isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error(400, validatedTypes.getCombinedErrorMessages())); + ApiMappingError.withMessage( + 400, validatedTypes.getCombinedErrorMessages())); } } @@ -137,12 +153,13 @@ public ThingWriteRequestMapping mapAmend( fieldValuesExcludingRelationships(bodyargs, relationships)); draft = new EntityInstanceBulkUpdater(instance).setFieldValuesFrom(fieldValues); } catch (Exception e) { - return ThingWriteRequestMapping.error(ApiResponse.error(400, e.getMessage())); + return ThingWriteRequestMapping.error(ApiMappingError.withMessage(400, e.getMessage())); } if (!relationships.validationReport().isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error(400, relationships.validationReport().getErrorMessages())); + ApiMappingError.withMessages( + 400, relationships.validationReport().getErrorMessages())); } return ThingWriteRequestMapping.command( @@ -150,7 +167,7 @@ public ThingWriteRequestMapping mapAmend( instance, draft, replaceExistingFieldsAndRelationships, - relationships.connections())); + relationships.references())); } public ThingWriteRequestMapping mapCreateAndConnect( @@ -175,11 +192,12 @@ private ThingWriteRequestMapping mapCreateFromValidatedBody( final EntityInstanceDraft baseDraft, final RelationshipBodyCommands relationships, final boolean validateFinalRelationships) { - if (thingifier.apiConfig().willApiEnforceDeclaredTypesInInput()) { + if (apiConfig.willApiEnforceDeclaredTypesInInput()) { ValidationReport validatedTypes = bodyargs.validateAgainstType(entity); if (!validatedTypes.isValid()) { return ThingWriteRequestMapping.error( - ApiResponse.error(400, validatedTypes.getCombinedErrorMessages())); + ApiMappingError.withMessage( + 400, validatedTypes.getCombinedErrorMessages())); } } @@ -192,20 +210,20 @@ private ThingWriteRequestMapping mapCreateFromValidatedBody( copyBaseDraftValues(baseDraft, draft); return ThingWriteRequestMapping.command( new CreateThingCommand( - draft, relationships.connections(), validateFinalRelationships)); + draft, relationships.references(), validateFinalRelationships)); } catch (Exception e) { - return ThingWriteRequestMapping.error(ApiResponse.error(400, e.getMessage())); + return ThingWriteRequestMapping.error(ApiMappingError.withMessage(400, e.getMessage())); } } private RelationshipBodyCommands parseRelationships( final BodyParser bodyargs, final EntityDefinition entity) { - return new RelationshipBodyCommandParser(thingifier).parse(bodyargs, entity, database); + return new RelationshipBodyCommandParser(schema).parse(bodyargs, entity); } private ThingWriteRequestMapping invalidRelationships(final ValidationReport validation) { return ThingWriteRequestMapping.error( - ApiResponse.error( + ApiMappingError.withMessage( 400, String.format( "Invalid relationships: %s", diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingCommandResultApiMapper.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingCommandResultApiMapper.java index 82171eaa..0d49f7b0 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingCommandResultApiMapper.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingCommandResultApiMapper.java @@ -22,6 +22,10 @@ public ThingCommandResultApiMapper(final ThingifierApiConfig apiConfig) { this.apiConfig = apiConfig; } + public ApiResponse map(final ApiMappingError error) { + return ApiResponse.error(error.statusCode(), error.messages()); + } + public ApiResponse map(final ThingWriteCommand command, final ThingCommandResult result) { if (result.isError()) { return errorResponseFor(command, result); diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapper.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapper.java index 3ca27be2..90bab7c9 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapper.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapper.java @@ -1,7 +1,6 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; import uk.co.compendiumdev.thingifier.Thingifier; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.application.query.ReadCollectionQuery; import uk.co.compendiumdev.thingifier.application.query.ReadInstanceQuery; import uk.co.compendiumdev.thingifier.application.query.ReadRelationshipQuery; @@ -10,10 +9,14 @@ public final class ThingReadRequestMapper { - private final Thingifier thingifier; + private final SchemaCatalog schema; public ThingReadRequestMapper(final Thingifier thingifier) { - this.thingifier = thingifier; + this(new ThingifierSchemaCatalog(thingifier)); + } + + ThingReadRequestMapper(final SchemaCatalog schema) { + this.schema = schema; } public ThingReadRequestMapping map(final String url, final QueryFilterParams queryParams) { @@ -32,7 +35,7 @@ public ThingReadRequestMapping map(final String url, final QueryFilterParams que } String identifierCandidate = terms[1]; - if (thingifier.getERmodel().getSchema().hasRelationshipNamed(identifierCandidate) + if (schema.hasRelationshipNamed(identifierCandidate) || entityForTerm(identifierCandidate) != null) { return notFound(url); } @@ -52,10 +55,11 @@ public ThingReadRequestMapping map(final String url, final QueryFilterParams que private ThingReadRequestMapping notFound(final String url) { return ThingReadRequestMapping.error( - ApiResponse.error404(String.format("Could not find an instance with %s", url))); + ApiMappingError.withMessage( + 404, String.format("Could not find an instance with %s", url))); } private EntityDefinition entityForTerm(final String term) { - return thingifier.getERmodel().getSchema().getDefinitionWithSingularOrPluralNamed(term); + return schema.definitionWithSingularOrPluralNamed(term); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapping.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapping.java index ee804cdb..737ea8b4 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapping.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapping.java @@ -1,35 +1,34 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.application.query.ThingReadQuery; public final class ThingReadRequestMapping { private final ThingReadQuery query; - private final ApiResponse errorResponse; + private final ApiMappingError error; - private ThingReadRequestMapping(final ThingReadQuery query, final ApiResponse errorResponse) { + private ThingReadRequestMapping(final ThingReadQuery query, final ApiMappingError error) { this.query = query; - this.errorResponse = errorResponse; + this.error = error; } public static ThingReadRequestMapping query(final ThingReadQuery query) { return new ThingReadRequestMapping(query, null); } - public static ThingReadRequestMapping error(final ApiResponse errorResponse) { - return new ThingReadRequestMapping(null, errorResponse); + public static ThingReadRequestMapping error(final ApiMappingError error) { + return new ThingReadRequestMapping(null, error); } public boolean isError() { - return errorResponse != null; + return error != null; } public ThingReadQuery getQuery() { return query; } - public ApiResponse getErrorResponse() { - return errorResponse; + public ApiMappingError getError() { + return error; } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadResultApiMapper.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadResultApiMapper.java index bfdcf0cf..2bc25dfa 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadResultApiMapper.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadResultApiMapper.java @@ -14,6 +14,10 @@ public ThingReadResultApiMapper(final ThingifierApiConfig apiConfig) { this.apiConfig = apiConfig; } + public ApiResponse map(final ApiMappingError error) { + return ApiResponse.error(error.statusCode(), error.messages()); + } + public ApiResponse map(final String url, final RepositoryQueryResult queryResults) { List queryItems = queryResults.getListEntityInstances(); diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapper.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapper.java index 23f8dd76..f893070c 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapper.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapper.java @@ -4,8 +4,8 @@ import java.util.Map; import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.api.restapihandlers.commonerrorresponse.NoSuchEntity; +import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; import uk.co.compendiumdev.thingifier.application.command.ConnectExistingRelationshipCommand; import uk.co.compendiumdev.thingifier.application.command.DeleteThingCommand; import uk.co.compendiumdev.thingifier.application.command.DisconnectRelationshipCommand; @@ -15,72 +15,78 @@ import uk.co.compendiumdev.thingifier.core.domain.definitions.field.instance.NamedValue; import uk.co.compendiumdev.thingifier.core.domain.definitions.relationship.RelationshipVectorDefinition; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; +import uk.co.compendiumdev.thingifier.core.repository.ThingStore; public final class ThingWriteRequestMapper { - private final Thingifier thingifier; - private final String database; + private final SchemaCatalog schema; + private final ThingStore store; private final ThingBodyCommandMapper bodyCommandMapper; public ThingWriteRequestMapper(final Thingifier thingifier, final String database) { - this.thingifier = thingifier; - this.database = database; - this.bodyCommandMapper = new ThingBodyCommandMapper(thingifier, database); + this(thingifier, thingifier.getStore(database)); + } + + public ThingWriteRequestMapper(final Thingifier thingifier, final ThingStore store) { + this(new ThingifierSchemaCatalog(thingifier), thingifier.apiConfig(), store); + } + + ThingWriteRequestMapper( + final SchemaCatalog schema, + final ThingifierApiConfig apiConfig, + final ThingStore store) { + this.schema = schema; + this.store = store; + this.bodyCommandMapper = new ThingBodyCommandMapper(schema, apiConfig, store); } public ThingWriteRequestMapping mapPost(final String url, final BodyParser args) { - EntityDefinition entityDefinition = - EntityUrlMatcher.entityFromCollectionUrl(thingifier, url); + EntityDefinition entityDefinition = EntityUrlMatcher.entityFromCollectionUrl(schema, url); if (entityDefinition != null) { return bodyCommandMapper.mapCreate(args, entityDefinition, true); } - entityDefinition = EntityUrlMatcher.entityFromInstanceUrl(thingifier, url); + entityDefinition = EntityUrlMatcher.entityFromInstanceUrl(schema, url); if (entityDefinition != null) { return mapPostToInstance(url, args, entityDefinition); } String thingName = EntityUrlMatcher.entityTermFromUrl(url); if (!thingName.isEmpty() && EntityUrlMatcher.hasPartCount(url, 2)) { - return ThingWriteRequestMapping.error(NoSuchEntity.response(thingName)); + return ThingWriteRequestMapping.error(NoSuchEntity.error(thingName)); } RepositoryBackedRelationshipUrlResolver.RelationshipUrlResolution relationship = - new RepositoryBackedRelationshipUrlResolver(thingifier, database) - .resolveCollection(url); + new RepositoryBackedRelationshipUrlResolver(schema, store).resolveCollection(url); if (relationship.matchedRelationshipPath()) { return mapPostToRelationship(url, args, relationship); } return ThingWriteRequestMapping.error( - ApiResponse.error(400, "Your request was not understood")); + ApiMappingError.withMessage(400, "Your request was not understood")); } public ThingWriteRequestMapping mapPut(final String url, final BodyParser args) { - EntityDefinition thing = EntityUrlMatcher.entityFromCollectionUrl(thingifier, url); + EntityDefinition thing = EntityUrlMatcher.entityFromCollectionUrl(schema, url); if (thing != null) { return ThingWriteRequestMapping.error( - ApiResponse.error(405, "Cannot create root level entity with a PUT")); + ApiMappingError.withMessage(405, "Cannot create root level entity with a PUT")); } - thing = EntityUrlMatcher.entityFromInstanceUrl(thingifier, url); + thing = EntityUrlMatcher.entityFromInstanceUrl(schema, url); if (thing == null) { if (EntityUrlMatcher.hasPartCount(url, 2)) { String thingName = EntityUrlMatcher.entityTermFromUrl(url); if (!thingName.isEmpty()) { - return ThingWriteRequestMapping.error(NoSuchEntity.response(thingName)); + return ThingWriteRequestMapping.error(NoSuchEntity.error(thingName)); } } return ThingWriteRequestMapping.error( - ApiResponse.error(400, "Your request was not understood")); + ApiMappingError.withMessage(400, "Your request was not understood")); } String instanceGuid = EntityUrlMatcher.identifierFromInstanceUrl(url); - EntityInstance instance = - thingifier - .getStore(database) - .entityQueries() - .findByQueryIdentifier(thing, instanceGuid); + EntityInstance instance = store.entityQueries().findByQueryIdentifier(thing, instanceGuid); if (instance == null) { return mapPutCreate(args, thing, instanceGuid); @@ -90,34 +96,33 @@ public ThingWriteRequestMapping mapPut(final String url, final BodyParser args) } public ThingWriteRequestMapping mapDelete(final String url) { - EntityDefinition thing = EntityUrlMatcher.entityFromCollectionUrl(thingifier, url); + EntityDefinition thing = EntityUrlMatcher.entityFromCollectionUrl(schema, url); if (thing != null) { return ThingWriteRequestMapping.error( - ApiResponse.error(405, "Cannot delete root level entity")); + ApiMappingError.withMessage(405, "Cannot delete root level entity")); } - EntityDefinition entity = EntityUrlMatcher.entityFromInstanceUrl(thingifier, url); + EntityDefinition entity = EntityUrlMatcher.entityFromInstanceUrl(schema, url); if (entity != null) { - EntityInstance instance = - EntityUrlMatcher.findInstanceFromUrl(thingifier, url, database); + EntityInstance instance = EntityUrlMatcher.findInstanceFromUrl(schema, store, url); if (instance == null) { return ThingWriteRequestMapping.error( - ApiResponse.error404( - String.format("Could not find any instances with %s", url))); + ApiMappingError.withMessage( + 404, String.format("Could not find any instances with %s", url))); } return ThingWriteRequestMapping.command(new DeleteThingCommand(instance)); } RepositoryBackedRelationshipUrlResolver.RelationshipUrlResolution relationship = - new RepositoryBackedRelationshipUrlResolver(thingifier, database) + new RepositoryBackedRelationshipUrlResolver(schema, store) .resolveRelationshipInstance(url); if (relationship.matchedRelationshipPath()) { if (!relationship.relationshipInstancePath() || relationship.parentInstance() == null || relationship.childInstance() == null) { return ThingWriteRequestMapping.error( - ApiResponse.error404( - String.format("Could not find any instances with %s", url))); + ApiMappingError.withMessage( + 404, String.format("Could not find any instances with %s", url))); } return ThingWriteRequestMapping.command( new DisconnectRelationshipCommand( @@ -127,7 +132,8 @@ public ThingWriteRequestMapping mapDelete(final String url) { } return ThingWriteRequestMapping.error( - ApiResponse.error404(String.format("Could not find any instances with %s", url))); + ApiMappingError.withMessage( + 404, String.format("Could not find any instances with %s", url))); } private ThingWriteRequestMapping mapPostToInstance( @@ -136,14 +142,12 @@ private ThingWriteRequestMapping mapPostToInstance( if (entityDefinition.hasPrimaryKeyField()) { EntityInstance instance = - thingifier - .getStore(database) - .entityQueries() - .findByQueryIdentifier(entityDefinition, primaryKey); + store.entityQueries().findByQueryIdentifier(entityDefinition, primaryKey); if (instance == null) { return ThingWriteRequestMapping.error( - ApiResponse.error404( + ApiMappingError.withMessage( + 404, String.format( "No such %s entity instance with %s == %s found", entityDefinition.getName(), @@ -155,7 +159,8 @@ private ThingWriteRequestMapping mapPostToInstance( } return ThingWriteRequestMapping.error( - ApiResponse.error404( + ApiMappingError.withMessage( + 404, String.format( "Entity %s does not have a primary key defined", entityDefinition.getName()))); @@ -167,7 +172,7 @@ private ThingWriteRequestMapping mapPutCreate( thing.getFieldsOfType(FieldType.AUTO_INCREMENT, FieldType.AUTO_GUID); if (!forbiddenPutCreationFields.isEmpty()) { return ThingWriteRequestMapping.error( - ApiResponse.error( + ApiMappingError.withMessage( 400, String.format( "Cannot create %s with PUT due to Auto fields %s", @@ -180,7 +185,7 @@ private ThingWriteRequestMapping mapPutCreate( if (namedValue.name.equals(thing.getPrimaryKeyField().getName()) && !namedValue.value.equals(instanceGuid)) { return ThingWriteRequestMapping.error( - ApiResponse.error( + ApiMappingError.withMessage( 400, String.format( "Cannot create %s with PUT as key does not match body value %s != %s", @@ -201,7 +206,8 @@ private ThingWriteRequestMapping mapPostToRelationship( EntityInstance connectThis = relationship.parentInstance(); if (connectThis == null) { return ThingWriteRequestMapping.error( - ApiResponse.error404( + ApiMappingError.withMessage( + 404, String.format("Could not find parent thing for relationship %s", url))); } @@ -225,10 +231,7 @@ private ThingWriteRequestMapping mapPostToRelationship( matchingFieldNames = matchingFieldNames + fieldName + " "; } relatedItem = - thingifier - .getStore(database) - .entityQueries() - .findByField(thingTo, fieldName, args.get(fieldName)); + store.entityQueries().findByField(thingTo, fieldName, args.get(fieldName)); if (relatedItem != null) { break; } @@ -237,7 +240,8 @@ private ThingWriteRequestMapping mapPostToRelationship( if (amExpectingARelatedItem && relatedItem == null) { matchingFieldNames = matchingFieldNames.trim().replace(" ", ", "); return ThingWriteRequestMapping.error( - ApiResponse.error404( + ApiMappingError.withMessage( + 404, String.format( "Could not find thing matching value for %s", matchingFieldNames))); @@ -252,7 +256,7 @@ private ThingWriteRequestMapping mapPostToRelationship( connectThis .getEntity() .getNamedRelationshipTo(relationshipName, relatedItem.getEntity()); - ApiResponse relationshipError = + ApiMappingError relationshipError = relationshipErrorIfInvalid( connectThis, relatedItem, relationshipToUse, relationshipName); if (relationshipError != null) { @@ -264,13 +268,13 @@ private ThingWriteRequestMapping mapPostToRelationship( connectThis, relationshipToUse.getName(), relatedItem)); } - private ApiResponse relationshipErrorIfInvalid( + private ApiMappingError relationshipErrorIfInvalid( final EntityInstance connectThis, final EntityInstance relatedItem, final RelationshipVectorDefinition relationshipToUse, final String relationshipName) { if (relationshipToUse == null) { - return ApiResponse.error( + return ApiMappingError.withMessage( 400, String.format( "Could not find a relationship named %s between %s and a %s", @@ -280,7 +284,7 @@ private ApiResponse relationshipErrorIfInvalid( } if (relationshipToUse.getTo() != relatedItem.getEntity()) { - return ApiResponse.error( + return ApiMappingError.withMessage( 400, String.format( "Could not connect %s (%s) to %s (%s) via relationship %s because it is a %s instead of a %s", diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapping.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapping.java index 88acfd61..cf099e54 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapping.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapping.java @@ -1,36 +1,34 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.application.command.ThingWriteCommand; public final class ThingWriteRequestMapping { private final ThingWriteCommand command; - private final ApiResponse errorResponse; + private final ApiMappingError error; - private ThingWriteRequestMapping( - final ThingWriteCommand command, final ApiResponse errorResponse) { + private ThingWriteRequestMapping(final ThingWriteCommand command, final ApiMappingError error) { this.command = command; - this.errorResponse = errorResponse; + this.error = error; } public static ThingWriteRequestMapping command(final ThingWriteCommand command) { return new ThingWriteRequestMapping(command, null); } - public static ThingWriteRequestMapping error(final ApiResponse errorResponse) { - return new ThingWriteRequestMapping(null, errorResponse); + public static ThingWriteRequestMapping error(final ApiMappingError error) { + return new ThingWriteRequestMapping(null, error); } public boolean isError() { - return errorResponse != null; + return error != null; } public ThingWriteCommand getCommand() { return command; } - public ApiResponse getErrorResponse() { - return errorResponse; + public ApiMappingError getError() { + return error; } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingifierSchemaCatalog.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingifierSchemaCatalog.java new file mode 100644 index 00000000..7b3014cc --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingifierSchemaCatalog.java @@ -0,0 +1,23 @@ +package uk.co.compendiumdev.thingifier.api.restapihandlers; + +import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; + +final class ThingifierSchemaCatalog implements SchemaCatalog { + + private final Thingifier thingifier; + + ThingifierSchemaCatalog(final Thingifier thingifier) { + this.thingifier = thingifier; + } + + @Override + public EntityDefinition definitionWithSingularOrPluralNamed(final String term) { + return thingifier.getERmodel().getSchema().getDefinitionWithSingularOrPluralNamed(term); + } + + @Override + public boolean hasRelationshipNamed(final String name) { + return thingifier.getERmodel().getSchema().hasRelationshipNamed(name); + } +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/commonerrorresponse/NoSuchEntity.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/commonerrorresponse/NoSuchEntity.java index d3379125..4f417590 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/commonerrorresponse/NoSuchEntity.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/commonerrorresponse/NoSuchEntity.java @@ -1,10 +1,11 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers.commonerrorresponse; -import uk.co.compendiumdev.thingifier.api.response.ApiResponse; +import uk.co.compendiumdev.thingifier.api.restapihandlers.ApiMappingError; public class NoSuchEntity { - public static ApiResponse response(final String entityName) { - return ApiResponse.error404(String.format("No such entity as %s found", entityName)); + public static ApiMappingError error(final String entityName) { + return ApiMappingError.withMessage( + 404, String.format("No such entity as %s found", entityName)); } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/ThingCommandService.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/ThingCommandService.java index ea6ea33e..130c9322 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/ThingCommandService.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/ThingCommandService.java @@ -10,7 +10,9 @@ import uk.co.compendiumdev.thingifier.application.command.CreateThingCommand; import uk.co.compendiumdev.thingifier.application.command.DeleteThingCommand; import uk.co.compendiumdev.thingifier.application.command.DisconnectRelationshipCommand; +import uk.co.compendiumdev.thingifier.application.command.RelationshipReference; import uk.co.compendiumdev.thingifier.application.command.ThingWriteCommand; +import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.Field; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.definition.FieldType; import uk.co.compendiumdev.thingifier.core.domain.definitions.field.instance.FieldValue; @@ -74,19 +76,20 @@ public ThingCommandResult execute(final ThingWriteCommand command) { } public ThingCommandResult create( - final EntityInstanceDraft draft, final List relationships) { + final EntityInstanceDraft draft, final List relationships) { return create(draft, relationships, true); } public ThingCommandResult create( final EntityInstanceDraft draft, - final List relationships, + final List relationships, final boolean validateFinalRelationships) { EntityInstance created = null; try { created = store.entities().create(draft); ThingCommandResult relationshipResult = - connectRelationships(created, relationships, validateFinalRelationships); + connectRelationshipReferences( + created, relationships, validateFinalRelationships, true); if (relationshipResult.isError()) { rollbackDelete(created); return relationshipResult; @@ -102,7 +105,7 @@ public ThingCommandResult amend( final EntityInstance instance, final EntityInstanceDraft draft, final boolean replaceExistingFieldsAndRelationships, - final List relationships) { + final List relationships) { EntityInstance updated = null; RelationshipSnapshot originalRelationships = RelationshipSnapshot.capture(store, instance); try { @@ -113,7 +116,8 @@ public ThingCommandResult amend( updated = store.entities().patch(instance, draft); } - ThingCommandResult relationshipResult = connectRelationships(updated, relationships); + ThingCommandResult relationshipResult = + connectRelationshipReferences(updated, relationships, true, false); if (relationshipResult.isError()) { rollbackAmendment(updated, instance, originalRelationships); return relationshipResult; @@ -187,8 +191,8 @@ public ThingCommandResult disconnectRelationship( } public ThingCommandResult connectRelationships( - final EntityInstance instance, final List relationships) { - return connectRelationships(instance, relationships, true); + final EntityInstance instance, final List relationships) { + return connectRelationshipReferences(instance, relationships, true, false); } private ThingCommandResult createAndConnect(final CreateAndConnectRelationshipCommand command) { @@ -244,6 +248,103 @@ private ThingCommandResult connectRelationships( } } + private ThingCommandResult connectRelationshipReferences( + final EntityInstance instance, + final List references, + final boolean validateFinalRelationships, + final boolean prefixRelationshipErrors) { + RelationshipResolution resolution = resolveRelationshipReferences(instance, references); + if (resolution.hasErrors()) { + if (prefixRelationshipErrors) { + return ThingCommandResult.error( + "Invalid relationships: " + String.join(", ", resolution.errors)); + } + return ThingCommandResult.error(resolution.errors); + } + + return connectRelationships(instance, resolution.relationships, validateFinalRelationships); + } + + private RelationshipResolution resolveRelationshipReferences( + final EntityInstance instance, final List references) { + List relationships = new ArrayList<>(); + List errors = new ArrayList<>(); + + for (RelationshipReference reference : references) { + EntityInstance related = resolveRelationshipReference(instance, reference); + if (related == null) { + errors.add(missingRelationshipReferenceMessage(reference)); + } else { + relationships.add( + new RelationshipConnection(reference.relationshipName(), related)); + } + } + + return new RelationshipResolution(relationships, errors); + } + + private EntityInstance resolveRelationshipReference( + final EntityInstance instance, final RelationshipReference reference) { + if (reference.hasExplicitTargetEntity()) { + return resolveExplicitRelationshipReference(reference); + } + + for (RelationshipVectorDefinition vector : + instance.getEntity().related().getRelationships(reference.relationshipName())) { + EntityDefinition relatedEntity = vector.getTo(); + EntityInstance related = + store.entityQueries() + .findByField( + relatedEntity, + reference.referenceFieldName(), + reference.referenceValue()); + if (related == null) { + related = + store.entityQueries() + .findByQueryIdentifier(relatedEntity, reference.referenceValue()); + } + if (related != null) { + return related; + } + } + + return null; + } + + private EntityInstance resolveExplicitRelationshipReference( + final RelationshipReference reference) { + EntityInstance related = + store.entityQueries() + .findByQueryIdentifier( + reference.targetEntity(), reference.referenceValue()); + if (related == null) { + related = + store.entityQueries() + .findByField( + reference.targetEntity(), + reference.referenceFieldName(), + reference.referenceValue()); + } + return related; + } + + private String missingRelationshipReferenceMessage(final RelationshipReference reference) { + if (reference.hasExplicitTargetEntity()) { + return String.format( + "cannot find %s of %s to relate to with %s %s", + reference.referenceFieldName(), + reference.targetTerm(), + reference.referenceFieldName(), + reference.referenceValue()); + } + + return String.format( + "cannot find %s to relate to with %s %s", + reference.relationshipName(), + reference.referenceFieldName(), + reference.referenceValue()); + } + private void rollbackAmendment( final EntityInstance current, final EntityInstance original, @@ -300,6 +401,22 @@ private String messageFrom(final Exception exception) { return message == null ? "" : message; } + private static final class RelationshipResolution { + + private final List relationships; + private final List errors; + + private RelationshipResolution( + final List relationships, final List errors) { + this.relationships = relationships; + this.errors = errors; + } + + private boolean hasErrors() { + return !errors.isEmpty(); + } + } + private static final class RelationshipSnapshot { private final List links; diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/AmendThingCommand.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/AmendThingCommand.java index 5861f667..715370bc 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/AmendThingCommand.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/AmendThingCommand.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstanceDraft; @@ -12,13 +11,13 @@ public final class AmendThingCommand implements ThingWriteCommand { private final EntityInstance instance; private final EntityInstanceDraft draft; private final boolean replaceExistingFieldsAndRelationships; - private final List relationships; + private final List relationships; public AmendThingCommand( final EntityInstance instance, final EntityInstanceDraft draft, final boolean replaceExistingFieldsAndRelationships, - final List relationships) { + final List relationships) { this.instance = instance; this.draft = draft; this.replaceExistingFieldsAndRelationships = replaceExistingFieldsAndRelationships; @@ -37,7 +36,7 @@ public boolean shouldReplaceExistingFieldsAndRelationships() { return replaceExistingFieldsAndRelationships; } - public List getRelationships() { + public List getRelationships() { return relationships; } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateAndConnectRelationshipCommand.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateAndConnectRelationshipCommand.java index 2404ab91..2cdae769 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateAndConnectRelationshipCommand.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateAndConnectRelationshipCommand.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstanceDraft; @@ -12,13 +11,13 @@ public final class CreateAndConnectRelationshipCommand implements ThingWriteComm private final EntityInstance parent; private final String relationshipName; private final EntityInstanceDraft childDraft; - private final List childRelationships; + private final List childRelationships; public CreateAndConnectRelationshipCommand( final EntityInstance parent, final String relationshipName, final EntityInstanceDraft childDraft, - final List childRelationships) { + final List childRelationships) { this.parent = parent; this.relationshipName = relationshipName; this.childDraft = childDraft; @@ -37,7 +36,7 @@ public EntityInstanceDraft getChildDraft() { return childDraft; } - public List getChildRelationships() { + public List getChildRelationships() { return childRelationships; } } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateThingCommand.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateThingCommand.java index 18b7e8dd..141d3ff6 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateThingCommand.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/CreateThingCommand.java @@ -3,18 +3,17 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstanceDraft; public final class CreateThingCommand implements ThingWriteCommand { private final EntityInstanceDraft draft; - private final List relationships; + private final List relationships; private final boolean validateFinalRelationships; public CreateThingCommand( final EntityInstanceDraft draft, - final List relationships, + final List relationships, final boolean validateFinalRelationships) { this.draft = draft; this.relationships = Collections.unmodifiableList(new ArrayList<>(relationships)); @@ -25,7 +24,7 @@ public EntityInstanceDraft getDraft() { return draft; } - public List getRelationships() { + public List getRelationships() { return relationships; } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/RelationshipReference.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/RelationshipReference.java new file mode 100644 index 00000000..db39203b --- /dev/null +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/command/RelationshipReference.java @@ -0,0 +1,67 @@ +package uk.co.compendiumdev.thingifier.application.command; + +import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; + +public final class RelationshipReference { + + private final String relationshipName; + private final EntityDefinition targetEntity; + private final String targetTerm; + private final String referenceFieldName; + private final String referenceValue; + + private RelationshipReference( + final String relationshipName, + final EntityDefinition targetEntity, + final String targetTerm, + final String referenceFieldName, + final String referenceValue) { + this.relationshipName = relationshipName; + this.targetEntity = targetEntity; + this.targetTerm = targetTerm; + this.referenceFieldName = referenceFieldName; + this.referenceValue = referenceValue; + } + + public static RelationshipReference compressed( + final String relationshipName, + final String referenceFieldName, + final String referenceValue) { + return new RelationshipReference( + relationshipName, null, "", referenceFieldName, referenceValue); + } + + public static RelationshipReference explicit( + final String relationshipName, + final EntityDefinition targetEntity, + final String targetTerm, + final String referenceFieldName, + final String referenceValue) { + return new RelationshipReference( + relationshipName, targetEntity, targetTerm, referenceFieldName, referenceValue); + } + + public String relationshipName() { + return relationshipName; + } + + public boolean hasExplicitTargetEntity() { + return targetEntity != null; + } + + public EntityDefinition targetEntity() { + return targetEntity; + } + + public String targetTerm() { + return targetTerm; + } + + public String referenceFieldName() { + return referenceFieldName; + } + + public String referenceValue() { + return referenceValue; + } +} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpRequestHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpRequestHook.java deleted file mode 100644 index f970ecf2..00000000 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpRequestHook.java +++ /dev/null @@ -1,9 +0,0 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; - -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; - -public interface InternalHttpRequestHook { - // return an InternalHttpResponse if you want to end immediately from the hook - InternalHttpResponse run(InternalHttpRequest request); -} diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpResponseHook.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpResponseHook.java deleted file mode 100644 index 531029c1..00000000 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/application/sparkhttpmessageHooks/InternalHttpResponseHook.java +++ /dev/null @@ -1,10 +0,0 @@ -package uk.co.compendiumdev.thingifier.application.sparkhttpmessageHooks; - -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; - -public interface InternalHttpResponseHook { - // throw an exception to return the response - // amend the response in hook - void run(InternalHttpRequest request, InternalHttpResponse response); -} diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequestTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequestTest.java similarity index 96% rename from thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequestTest.java rename to thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequestTest.java index a0acda38..bd75690a 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttp/InternalHttpRequestTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/InternalHttpRequestTest.java @@ -1,4 +1,4 @@ -package uk.co.compendiumdev.thingifier.application.internalhttp; +package uk.co.compendiumdev.thingifier.adapter.internalhttp; import java.util.ArrayList; import java.util.LinkedHashMap; diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponseTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponseTest.java similarity index 90% rename from thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponseTest.java rename to thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponseTest.java index 930513ed..043362fe 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/HttpApiResponseToInternalHttpResponseTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/HttpApiResponseToInternalHttpResponseTest.java @@ -1,14 +1,14 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpResponse; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.JsonOutputConfig; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpResponse; class HttpApiResponseToInternalHttpResponseTest { diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequestTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequestTest.java similarity index 91% rename from thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequestTest.java rename to thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequestTest.java index 0647e95e..51d056be 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/internalhttpconversion/InternalHttpRequestToHttpApiRequestTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/adapter/internalhttp/conversion/InternalHttpRequestToHttpApiRequestTest.java @@ -1,13 +1,13 @@ -package uk.co.compendiumdev.thingifier.application.internalhttpconversion; +package uk.co.compendiumdev.thingifier.adapter.internalhttp.conversion; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpMethod; +import uk.co.compendiumdev.thingifier.adapter.internalhttp.InternalHttpRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpMethod; -import uk.co.compendiumdev.thingifier.application.internalhttp.InternalHttpRequest; class InternalHttpRequestToHttpApiRequestTest { diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContextTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContextTest.java new file mode 100644 index 00000000..b511df4a --- /dev/null +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/ThingifierRequestContextTest.java @@ -0,0 +1,35 @@ +package uk.co.compendiumdev.thingifier.api.http; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.http.headers.HttpHeadersBlock; +import uk.co.compendiumdev.thingifier.core.EntityRelModel; + +public class ThingifierRequestContextTest { + + @Test + public void defaultsToDefaultDatabaseWhenSessionHeaderIsAbsent() { + Thingifier thingifier = new Thingifier(); + + ThingifierRequestContext context = + ThingifierRequestContext.from(thingifier, new HttpHeadersBlock()); + + Assertions.assertEquals(EntityRelModel.DEFAULT_DATABASE_NAME, context.databaseName()); + Assertions.assertSame( + thingifier.getStore(EntityRelModel.DEFAULT_DATABASE_NAME), context.store()); + } + + @Test + public void resolvesSessionDatabaseAndPreservesHeaders() { + Thingifier thingifier = new Thingifier(); + HttpHeadersBlock headers = new HttpHeadersBlock(); + headers.put(ThingifierHttpApi.HTTP_SESSION_HEADER_NAME, "session-one"); + + ThingifierRequestContext context = ThingifierRequestContext.from(thingifier, headers); + + Assertions.assertEquals("session-one", context.databaseName()); + Assertions.assertSame(thingifier.getStore("session-one"), context.store()); + Assertions.assertSame(headers, context.headers()); + } +} diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiRequestHooksTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiRequestHooksTest.java index 41171367..aff41180 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiRequestHooksTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiRequestHooksTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiRequestHook; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; @@ -13,7 +14,6 @@ import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.JsonOutputConfig; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiRequestHook; class ThingifierHttpApiRequestHooksTest { diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiResponseHooksTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiResponseHooksTest.java index 75efd3c8..f1780820 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiResponseHooksTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/http/hooks/ThingifierHttpApiResponseHooksTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.messagehooks.HttpApiResponseHook; import uk.co.compendiumdev.thingifier.api.ermodelconversion.JsonThing; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.HttpApiResponse; @@ -12,7 +13,6 @@ import uk.co.compendiumdev.thingifier.api.response.ApiResponse; import uk.co.compendiumdev.thingifier.apiconfig.JsonOutputConfig; import uk.co.compendiumdev.thingifier.apiconfig.ThingifierApiConfig; -import uk.co.compendiumdev.thingifier.application.httpapimessagehooks.HttpApiResponseHook; class ThingifierHttpApiResponseHooksTest { diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParserTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParserTest.java index ca90956d..4ae02471 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParserTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParserTest.java @@ -9,7 +9,7 @@ import uk.co.compendiumdev.thingifier.Thingifier; import uk.co.compendiumdev.thingifier.api.http.HttpApiRequest; import uk.co.compendiumdev.thingifier.api.http.bodyparser.BodyParser; -import uk.co.compendiumdev.thingifier.application.RelationshipConnection; +import uk.co.compendiumdev.thingifier.application.command.RelationshipReference; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.Cardinality; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; @@ -40,18 +40,17 @@ public void parsesCompressedRelationshipAsValidationAndExecutionCommand() { RelationshipBodyCommands commands = new RelationshipBodyCommandParser(thingifier) - .parse( - parserFor(thingifier, body), - task, - EntityRelModel.DEFAULT_DATABASE_NAME); + .parse(parserFor(thingifier, body), task); Assertions.assertTrue(commands.validationReport().isValid()); Assertions.assertEquals(1, commands.relationshipEntries().size()); - List connections = commands.connections(); - Assertions.assertEquals(1, connections.size()); - Assertions.assertEquals("task-of", connections.get(0).relationshipName()); - Assertions.assertEquals(projectInstance, connections.get(0).relatedInstance()); + List references = commands.references(); + Assertions.assertEquals(1, references.size()); + Assertions.assertEquals("task-of", references.get(0).relationshipName()); + Assertions.assertEquals("guid", references.get(0).referenceFieldName()); + Assertions.assertEquals( + projectInstance.getPrimaryKeyValue(), references.get(0).referenceValue()); } @Test diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolverTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolverTest.java index 6c720d5a..4103efee 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolverTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RepositoryBackedRelationshipUrlResolverTest.java @@ -58,7 +58,7 @@ public void createModel() { resolver = new RepositoryBackedRelationshipUrlResolver( - thingifier, EntityRelModel.DEFAULT_DATABASE_NAME); + new ThingifierSchemaCatalog(thingifier), repository); } @Test diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapperTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapperTest.java index 1e310721..1763abdf 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapperTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingReadRequestMapperTest.java @@ -1,5 +1,6 @@ package uk.co.compendiumdev.thingifier.api.restapihandlers; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import uk.co.compendiumdev.thingifier.Thingifier; @@ -67,7 +68,9 @@ public void rejectsInvalidRoot() { mapperFor(taskProjectThingifier()).map("missing", params()); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); + Assertions.assertEquals( + List.of("Could not find an instance with missing"), mapping.getError().messages()); } @Test @@ -76,7 +79,7 @@ public void rejectsRelationshipNameInIdentifierPosition() { mapperFor(taskProjectThingifier()).map("project/tasks", params()); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); } @Test @@ -85,7 +88,7 @@ public void rejectsEntityNameInIdentifierPosition() { mapperFor(taskProjectThingifier()).map("project/task", params()); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); } @Test @@ -93,7 +96,7 @@ public void rejectsEmptyRoute() { ThingReadRequestMapping mapping = mapperFor(taskProjectThingifier()).map("", params()); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); } @Test @@ -102,7 +105,7 @@ public void rejectsTooDeepRoute() { mapperFor(taskProjectThingifier()).map("project/p1/tasks/t1", params()); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); } @Test diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapperTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapperTest.java index 5917cf2c..c5ba4b2f 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapperTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/api/restapihandlers/ThingWriteRequestMapperTest.java @@ -2,6 +2,7 @@ import com.google.gson.Gson; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -89,7 +90,7 @@ public void rejectsPutCreateWhenBodyPrimaryKeyDoesNotMatchUrlKey() { mapperFor(thingifier).mapPut("note/n-1", parserFor(thingifier, body)); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(400, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(400, mapping.getError().statusCode()); } @Test @@ -101,7 +102,7 @@ public void rejectsPutCreateWhenEntityHasAutoFields() { .mapPut("task/manual", parserFor(thingifier, "title", "Created")); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(400, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(400, mapping.getError().statusCode()); } @Test @@ -113,7 +114,7 @@ public void postMissingInstanceMapsToNotFound() { .mapPost("task/missing", parserFor(thingifier, "title", "Patched")); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(404, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(404, mapping.getError().statusCode()); } @Test @@ -188,7 +189,9 @@ public void mapsUnrecognisedPostToBadRequest() { .mapPost("not-understood", parserFor(thingifier, "title", "Nope")); Assertions.assertTrue(mapping.isError()); - Assertions.assertEquals(400, mapping.getErrorResponse().getStatusCode()); + Assertions.assertEquals(400, mapping.getError().statusCode()); + Assertions.assertEquals( + List.of("Your request was not understood"), mapping.getError().messages()); } private Thingifier taskProjectThingifier() { diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/ThingCommandServiceTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/ThingCommandServiceTest.java index 43a586fa..e263ed27 100644 --- a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/ThingCommandServiceTest.java +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/application/ThingCommandServiceTest.java @@ -10,6 +10,7 @@ import uk.co.compendiumdev.thingifier.application.command.CreateThingCommand; import uk.co.compendiumdev.thingifier.application.command.DeleteThingCommand; import uk.co.compendiumdev.thingifier.application.command.DisconnectRelationshipCommand; +import uk.co.compendiumdev.thingifier.application.command.RelationshipReference; import uk.co.compendiumdev.thingifier.core.EntityRelModel; import uk.co.compendiumdev.thingifier.core.domain.definitions.Cardinality; import uk.co.compendiumdev.thingifier.core.domain.definitions.EntityDefinition; @@ -42,8 +43,10 @@ public void createCommandCreatesThingAndConnectsRelationships() { EntityInstanceDraft.forEntity(task) .withField("title", "Task"), List.of( - new RelationshipConnection( - "task-of", projectInstance)), + RelationshipReference.compressed( + "task-of", + "guid", + projectInstance.getPrimaryKeyValue())), true)); Assertions.assertTrue(result.isSuccessful()); @@ -53,6 +56,98 @@ public void createCommandCreatesThingAndConnectsRelationships() { store.relationships().listRelated(result.getInstance(), "task-of").get(0)); } + @Test + public void createCommandCanResolveExplicitRelationshipReferenceByTargetField() { + Thingifier thingifier = taskProjectThingifier(); + ThingStore store = storeFor(thingifier); + EntityDefinition task = thingifier.getDefinitionNamed("task"); + EntityDefinition project = thingifier.getDefinitionNamed("project"); + EntityInstance projectInstance = + store.entities() + .create( + EntityInstanceDraft.forEntity(project) + .withField("title", "Project")); + + ThingCommandResult result = + new ThingCommandService(store) + .execute( + new CreateThingCommand( + EntityInstanceDraft.forEntity(task) + .withField("title", "Task"), + List.of( + RelationshipReference.explicit( + "task-of", + project, + "projects", + "title", + "Project")), + true)); + + Assertions.assertTrue(result.isSuccessful()); + Assertions.assertEquals( + projectInstance, + store.relationships().listRelated(result.getInstance(), "task-of").get(0)); + } + + @Test + public void createCommandRollsBackWhenRelationshipReferenceCannotBeResolved() { + Thingifier thingifier = taskProjectThingifier(); + ThingStore store = storeFor(thingifier); + EntityDefinition task = thingifier.getDefinitionNamed("task"); + int taskCount = store.entityQueries().count(task); + + ThingCommandResult result = + new ThingCommandService(store) + .execute( + new CreateThingCommand( + EntityInstanceDraft.forEntity(task) + .withField("title", "Task"), + List.of( + RelationshipReference.compressed( + "task-of", "guid", "missing")), + true)); + + Assertions.assertTrue(result.isError()); + Assertions.assertEquals(taskCount, store.entityQueries().count(task)); + Assertions.assertEquals( + List.of( + "Invalid relationships: cannot find task-of to relate to with guid missing"), + result.getErrorMessages()); + } + + @Test + public void createCommandDoesNotDeleteExistingRelatedItemWhenFinalValidationFails() { + Thingifier thingifier = taskProjectThingifierWithMandatoryCategory(); + ThingStore store = storeFor(thingifier); + EntityDefinition task = thingifier.getDefinitionNamed("task"); + EntityDefinition project = thingifier.getDefinitionNamed("project"); + EntityInstance projectInstance = + store.entities() + .create( + EntityInstanceDraft.forEntity(project) + .withField("title", "Project")); + int taskCount = store.entityQueries().count(task); + + ThingCommandResult result = + new ThingCommandService(store) + .execute( + new CreateThingCommand( + EntityInstanceDraft.forEntity(task) + .withField("title", "Task"), + List.of( + RelationshipReference.compressed( + "task-of", + "guid", + projectInstance.getPrimaryKeyValue())), + true)); + + Assertions.assertTrue(result.isError()); + Assertions.assertEquals(taskCount, store.entityQueries().count(task)); + Assertions.assertNotNull( + store.entityQueries() + .findByQueryIdentifier(project, projectInstance.getPrimaryKeyValue())); + } + @Test public void amendCommandRollsBackFieldsAndRelationshipsOnValidationFailure() { Thingifier thingifier = mandatoryTaskProjectThingifier(); @@ -90,6 +185,48 @@ public void amendCommandRollsBackFieldsAndRelationshipsOnValidationFailure() { projectInstance, store.relationships().listRelated(restored, "task-of").get(0)); } + @Test + public void amendCommandRollsBackWhenRelationshipReferenceCannotBeResolved() { + Thingifier thingifier = taskProjectThingifier(); + ThingStore store = storeFor(thingifier); + EntityDefinition task = thingifier.getDefinitionNamed("task"); + EntityDefinition project = thingifier.getDefinitionNamed("project"); + EntityInstance taskInstance = + store.entities() + .create( + EntityInstanceDraft.forEntity(task) + .withField("title", "Original title")); + EntityInstance projectInstance = + store.entities() + .create( + EntityInstanceDraft.forEntity(project) + .withField("title", "Project")); + store.relationships().connect(taskInstance, "task-of", projectInstance); + + ThingCommandResult result = + new ThingCommandService(store) + .execute( + new AmendThingCommand( + taskInstance, + EntityInstanceDraft.forEntity(task) + .withField("title", "Rejected title"), + false, + List.of( + RelationshipReference.compressed( + "task-of", "guid", "missing")))); + + EntityInstance restored = + store.entityQueries() + .findByQueryIdentifier(task, taskInstance.getPrimaryKeyValue()); + Assertions.assertTrue(result.isError()); + Assertions.assertEquals("Original title", restored.getFieldValue("title").asString()); + Assertions.assertEquals( + List.of("cannot find task-of to relate to with guid missing"), + result.getErrorMessages()); + Assertions.assertEquals( + projectInstance, store.relationships().listRelated(restored, "task-of").get(0)); + } + @Test public void deleteCommandDeletesInstance() { Thingifier thingifier = taskProjectThingifier(); @@ -201,6 +338,37 @@ public void failedCreateAndConnectRelationshipRollsBackCreatedChild() { store.relationships().listRelated(projectInstance, "tasks").isEmpty()); } + @Test + public void failedCreateAndConnectRelationshipRollsBackOnUnresolvedChildRelationship() { + Thingifier thingifier = taskProjectThingifierWithMandatoryCategory(); + ThingStore store = storeFor(thingifier); + EntityDefinition task = thingifier.getDefinitionNamed("task"); + EntityDefinition project = thingifier.getDefinitionNamed("project"); + EntityInstance projectInstance = + store.entities() + .create( + EntityInstanceDraft.forEntity(project) + .withField("title", "Project")); + int taskCount = store.entityQueries().count(task); + + ThingCommandResult result = + new ThingCommandService(store) + .execute( + new CreateAndConnectRelationshipCommand( + projectInstance, + "tasks", + EntityInstanceDraft.forEntity(task) + .withField("title", "Rolled back"), + List.of( + RelationshipReference.compressed( + "category", "guid", "missing")))); + + Assertions.assertTrue(result.isError()); + Assertions.assertEquals(taskCount, store.entityQueries().count(task)); + Assertions.assertTrue( + store.relationships().listRelated(projectInstance, "tasks").isEmpty()); + } + private Thingifier taskProjectThingifier() { Thingifier thingifier = new Thingifier(); EntityDefinition task = thingifier.defineThing("task", "tasks"); diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/architecture/ArchitectureBoundaryTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/architecture/ArchitectureBoundaryTest.java new file mode 100644 index 00000000..a32b0875 --- /dev/null +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/architecture/ArchitectureBoundaryTest.java @@ -0,0 +1,117 @@ +package uk.co.compendiumdev.thingifier.architecture; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import uk.co.compendiumdev.thingifier.core.domain.instances.EntityInstance; +import uk.co.compendiumdev.thingifier.core.repository.RelationshipRepository; + +public class ArchitectureBoundaryTest { + + @Test + public void applicationPackageDoesNotImportTransportOrApiResponseTypes() throws IOException { + String applicationSources = + allJavaSources( + moduleRoot() + .resolve( + "src/main/java/uk/co/compendiumdev/thingifier/application")); + + Assertions.assertFalse(applicationSources.contains("import spark.")); + Assertions.assertFalse( + applicationSources.contains("uk.co.compendiumdev.thingifier.adapter.")); + Assertions.assertFalse( + applicationSources.contains( + "uk.co.compendiumdev.thingifier.api.response.ApiResponse")); + } + + @Test + public void commandAndQueryPackagesDoNotImportApiResponse() throws IOException { + String commandSources = + allJavaSources( + moduleRoot() + .resolve( + "src/main/java/uk/co/compendiumdev/thingifier/application/command")); + String querySources = + allJavaSources( + moduleRoot() + .resolve( + "src/main/java/uk/co/compendiumdev/thingifier/application/query")); + + Assertions.assertFalse(commandSources.contains("ApiResponse")); + Assertions.assertFalse(querySources.contains("ApiResponse")); + } + + @Test + public void relationshipBodyParserDoesNotResolveRepositoryInstances() throws IOException { + String parserSource = + Files.readString( + moduleRoot() + .resolve( + "src/main/java/uk/co/compendiumdev/thingifier/api/restapihandlers/RelationshipBodyCommandParser.java")); + + Assertions.assertFalse(parserSource.contains("entityQueries()")); + Assertions.assertFalse(parserSource.contains("findByField(")); + Assertions.assertFalse(parserSource.contains("findByQueryIdentifier(")); + } + + @Test + public void coreDoesNotContainUrlRouteQueryParser() { + Assertions.assertFalse( + Files.exists( + coreMainRoot() + .resolve( + "uk/co/compendiumdev/thingifier/core/query/RepositoryUrlQuery.java"))); + } + + @Test + public void relationshipRepositoryRemovalApiDoesNotExposeCascadeDecisions() + throws NoSuchMethodException { + Method removeBetween = + RelationshipRepository.class.getMethod( + "removeBetween", EntityInstance.class, EntityInstance.class, String.class); + Method removeAll = + RelationshipRepository.class.getMethod("removeAll", EntityInstance.class); + + Assertions.assertEquals(Void.TYPE, removeBetween.getReturnType()); + Assertions.assertEquals(Void.TYPE, removeAll.getReturnType()); + } + + private String allJavaSources(final Path root) throws IOException { + StringBuilder combined = new StringBuilder(); + try (Stream paths = Files.walk(root)) { + paths.filter(path -> path.toString().endsWith(".java")) + .forEach(path -> combined.append(readUnchecked(path)).append('\n')); + } + return combined.toString(); + } + + private String readUnchecked(final Path path) { + try { + return Files.readString(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private Path moduleRoot() { + Path cwd = Paths.get("").toAbsolutePath(); + if (Files.exists(cwd.resolve("src/main/java"))) { + return cwd; + } + return cwd.resolve("thingifier"); + } + + private Path coreMainRoot() { + Path cwd = Paths.get("").toAbsolutePath(); + Path sibling = cwd.resolve("../ercoremodel/src/main/java").normalize(); + if (Files.exists(sibling)) { + return sibling; + } + return cwd.resolve("ercoremodel/src/main/java"); + } +} diff --git a/thingifierapp/src/main/java/uk/co/compendiumdev/thingifier/application/Main.java b/thingifierapp/src/main/java/uk/co/compendiumdev/thingifier/application/Main.java index 2e6303cd..81ed19f8 100644 --- a/thingifierapp/src/main/java/uk/co/compendiumdev/thingifier/application/Main.java +++ b/thingifierapp/src/main/java/uk/co/compendiumdev/thingifier/application/Main.java @@ -1,9 +1,10 @@ package uk.co.compendiumdev.thingifier.application; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; +import uk.co.compendiumdev.thingifier.adapter.spark.MainImplementation; import uk.co.compendiumdev.thingifier.application.examples.TodoListThingifier; import uk.co.compendiumdev.thingifier.application.examples.TodoManagerThingifier; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; /* diff --git a/todoManagerRestAuto/src/test/java/uk/co/compendiumdev/thingifier/tactical/postmanreplication/Environment.java b/todoManagerRestAuto/src/test/java/uk/co/compendiumdev/thingifier/tactical/postmanreplication/Environment.java index 3a6fa66c..64ed1b6d 100644 --- a/todoManagerRestAuto/src/test/java/uk/co/compendiumdev/thingifier/tactical/postmanreplication/Environment.java +++ b/todoManagerRestAuto/src/test/java/uk/co/compendiumdev/thingifier/tactical/postmanreplication/Environment.java @@ -6,10 +6,10 @@ import spark.Spark; import uk.co.compendiumdev.sparkstart.Port; import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierAutoDocGenRouting; +import uk.co.compendiumdev.thingifier.adapter.http.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; import uk.co.compendiumdev.thingifier.application.examples.TodoManagerThingifier; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierAutoDocGenRouting; -import uk.co.compendiumdev.thingifier.application.httprouting.ThingifierHttpApiRoutings; import uk.co.compendiumdev.thingifier.htmlgui.htmlgen.DefaultGUIHTML; public class Environment {