Skip to content

Commit

Permalink
feature/get temporal data for an entity id (#30)
Browse files Browse the repository at this point in the history
  • Loading branch information
PoulomiNandy authored Nov 18, 2021
1 parent b717aee commit 99574e2
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 4 deletions.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,10 @@
build
out

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/

39 changes: 39 additions & 0 deletions kngsild/src/main/kotlin/io/egm/kngsild/api/TemporalService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import arrow.core.left
import arrow.core.right
import io.egm.kngsild.model.ApplicationError
import io.egm.kngsild.model.ContextBrokerError
import io.egm.kngsild.model.ResourceNotFound
import io.egm.kngsild.utils.*
import io.egm.kngsild.utils.JsonUtils.serializeObject
import org.slf4j.LoggerFactory
Expand Down Expand Up @@ -56,4 +57,42 @@ class TemporalService(
}
}
}

fun retrieve(
entityId: URI,
queryParams: Map<String, String>,
contextUrl: String
): Either<ApplicationError, NgsildEntity> {
val params: String = HttpUtils.paramsUrlBuilder(queryParams)
return authUtils.getToken().flatMap {
val request = HttpRequest
.newBuilder()
.uri(
URI.create("$contextBrokerUrl$temporalApiRootPath/$entityId$params")
)
.setHeader("Accept", HttpUtils.APPLICATION_JSONLD)
.setHeader("Link", HttpUtils.httpLinkHeaderBuilder(contextUrl))
.setHeader("Authorization", "Bearer $it")
.GET().build()

try {
logger.debug("Issuing retrieve: /ngsi-ld/v1/temporal/entities/$entityId$params")
val httpResponse = HttpUtils.httpClient.send(request, HttpResponse.BodyHandlers.ofString())
logger.debug("Http response status code: ${httpResponse.statusCode()}")
logger.debug("Http response body: ${httpResponse.body()}")

if (httpResponse.statusCode() == HttpURLConnection.HTTP_OK)
JsonUtils.deserializeObject(httpResponse.body()).right()
else if (httpResponse.statusCode() == HttpURLConnection.HTTP_NOT_FOUND)
ResourceNotFound("Entity not found").left()
else ContextBrokerError(
"Failed to retrieve entity, " +
"received ${httpResponse.statusCode()} (${httpResponse.body()}) from context broker"
).left()
} catch (e: IOException) {
val errorMessage = e.message ?: "Error encountered while processing GET request"
ContextBrokerError(errorMessage).left()
}
}
}
}
35 changes: 31 additions & 4 deletions kngsild/src/test/kotlin/io/egm/kngsild/api/TemporalServiceTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import arrow.core.right
import com.github.tomakehurst.wiremock.WireMockServer
import com.github.tomakehurst.wiremock.client.WireMock
import com.github.tomakehurst.wiremock.core.WireMockConfiguration
import io.egm.kngsild.utils.AuthUtils
import io.egm.kngsild.utils.NgsiLdAttributeNG
import io.egm.kngsild.utils.NgsiLdUtils
import io.egm.kngsild.utils.*
import io.egm.kngsild.utils.UriUtils.toUri
import io.egm.kngsild.utils.groupByProperty
import org.junit.jupiter.api.*
import org.mockito.Mockito
import java.net.URI

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class TemporalServiceTest {
Expand Down Expand Up @@ -96,4 +94,33 @@ class TemporalServiceTest {
)
)
}

@Test
fun `it should retrieve temporal data of an entityId`() {
val entityId = gimmeNgsildEntity("urn:ngsi-ld:Sensor:01".toUri()!!, emptyMap())
WireMock.stubFor(
WireMock.get(WireMock.urlMatching("/ngsi-ld/v1/temporal/entities/urn:ngsi-ld:Sensor:01"))
.willReturn(WireMock.ok().withBody(JsonUtils.serializeObject(entityId)))
)

val mockedAuthUtils = Mockito.mock(AuthUtils::class.java)
Mockito.`when`(
mockedAuthUtils.getToken()
).thenReturn("token".right())
val temporalService = TemporalService("http://localhost:8089", mockedAuthUtils)

val response = temporalService.retrieve(
"urn:ngsi-ld:Sensor:01".toUri()!!,
emptyMap(),
NgsiLdUtils.coreContext
)

Assertions.assertTrue(response.isRight())
Assertions.assertTrue(response.exists { it["id"] == "urn:ngsi-ld:Sensor:01" })
}

private fun gimmeNgsildEntity(id: URI, attributes: Map<String, Any>): NgsildEntity =
mapOf(
"id" to id
).plus(attributes)
}

0 comments on commit 99574e2

Please sign in to comment.