Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TB-58: Energi, oppvarming, vannforsyning, avløp og noen bruksareal fra matrikkelen #90

Merged
merged 9 commits into from
Sep 20, 2024
12 changes: 9 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@ dependencies {

// OpenAPI
implementation(libs.kompendium.core)

testImplementation(libs.kotlin.test)
testImplementation(libs.assertj)
}

tasks {
Expand All @@ -84,6 +81,15 @@ testing {
useJUnitJupiter()
}

named<JvmTestSuite>("test") {
dependencies {
implementation(libs.kotlin.test)
implementation(libs.assertk)
implementation(libs.mockk)
implementation(testFixtures(project(":matrikkel-api")))
}
}

register<JvmTestSuite>("integrationTest") {
dependencies {
implementation(project())
Expand Down
5 changes: 5 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ jaxwsVersion = "4.0.3"
hikariVersion = "5.1.0"
assertjVersion = "3.26.3"
testcontainersVersion = "1.20.1"
mockkVersion = "1.13.12"
assertkVersion = "0.28.1"

[libraries]
ktor-server-core = { group = "io.ktor", name = "ktor-server-core-jvm", version.ref = "ktorVersion" }
Expand Down Expand Up @@ -45,6 +47,9 @@ jaxws-tools = { group = "com.sun.xml.ws", name = "jaxws-tools", version.ref = "j

assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertjVersion" }
testcontainers-postgresql = { group = "org.testcontainers", name = "postgresql", version.ref = "testcontainersVersion" }
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockkVersion" }
mockk-dsl = { group = "io.mockk", name = "mockk-dsl", version.ref = "mockkVersion" }
assertk = { group = "com.willowtreeapps.assertk", name = "assertk", version.ref = "assertkVersion" }

[plugins]
kotlin-jvm = { id = "jvm", version.ref = "kotlinVersion" }
Expand Down
3 changes: 3 additions & 0 deletions matrikkel-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import no.kartverket.matrikkel.bygning.gradle.wsimport.WsImportTask

plugins {
`java-library`
`java-test-fixtures`
kotlin("jvm")
idea
}
Expand All @@ -16,6 +17,8 @@ dependencies {
exclude(group = "org.eclipse.angus") // Ekskluderer angus email
}

testFixturesApi(libs.mockk.dsl)

jaxws(libs.jaxws.tools)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.kartverket.matrikkel.bygning.matrikkelapi

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BruksenhetId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BygningId

fun bygningId(value: Long): BygningId = BygningId().apply { this.value = value }
anderssonw marked this conversation as resolved.
Show resolved Hide resolved

fun bruksenhetId(value: Long): BruksenhetId = BruksenhetId().apply { this.value = value }
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ package no.kartverket.matrikkel.bygning.matrikkelapi

import jakarta.xml.ws.BindingProvider
import jakarta.xml.ws.handler.MessageContext
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleIdList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleObject
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelContext
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.geometri.koder.KoordinatsystemKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.service.bygning.BygningService
Expand Down Expand Up @@ -95,20 +92,3 @@ class MatrikkelApi(private val baseUrl: URI) {
}
}
}

// TODO Kanskje finne et eget sted for disse
inline fun <reified T : MatrikkelBubbleObject?> StoreService.getObjectAs(
id: MatrikkelBubbleId?,
matrikkelContext: MatrikkelContext,
): T {
val obj = this.getObject(id, matrikkelContext)
return T::class.java.cast(obj)
}

inline fun <reified T : MatrikkelBubbleObject?> StoreService.getObjectsAs(
ids: List<MatrikkelBubbleId>,
matrikkelContext: MatrikkelContext,
): List<T> {
val objects = this.getObjects(MatrikkelBubbleIdList().apply { item.addAll(ids) }, matrikkelContext)
return objects.item.filterIsInstance<T>().map { T::class.java.cast(it) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package no.kartverket.matrikkel.bygning.matrikkelapi

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleIdList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelContext
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Bruksenhet
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BruksenhetId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Bygning
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BygningId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.service.store.StoreService

fun StoreService.getBygning(id: BygningId, matrikkelContext: MatrikkelContext): Bygning {
return getObject(id, matrikkelContext) as Bygning
}

fun StoreService.getBruksenheter(ids: Iterable<BruksenhetId>, matrikkelContext: MatrikkelContext): List<Bruksenhet> {
val objects = getObjects(MatrikkelBubbleIdList().apply { item.addAll(ids) }, matrikkelContext)
return objects.item.map { it as Bruksenhet }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package no.kartverket.matrikkel.bygning.matrikkelapi

import java.time.Instant
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.Timestamp as MatrikkelTimestamp

fun MatrikkelTimestamp.toInstant(): Instant {
val calendar = timestamp.toGregorianCalendar() // TODO: Må sjekke litt mer på hvor trygt dette er
return calendar.toInstant()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package no.kartverket.matrikkel.bygning.matrikkelapi.builders

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Bruksenhet

fun bruksenhet(scope: Bruksenhet.() -> Unit) = Bruksenhet()
.apply {
// Fyll inn verdier som aldri vil være null i matrikkelen, bortsett fra de man alltid bør spesifisere eksplisitt i testen.
antallRom = 0
antallBad = 0
antallWC = 0
bruksareal = 0.0
kjokkentilgangId = MatrikkelKjokkentilgangKode.IkkeOppgitt()
isSkalUtga = false
isByggSkjermingsverdig = false
}
.apply(scope)
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package no.kartverket.matrikkel.bygning.matrikkelapi.builders

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BruksenhetId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BruksenhetIdList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Bygning
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Etasje
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.EtasjeList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.Etasjedata
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.EnergikildeKodeIdList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.OppvarmingsKodeIdList

fun bygning(scope: Bygning.() -> Unit): Bygning = Bygning()
.apply {
// Fyll inn verdier som aldri vil være null i matrikkelen.
etasjedata = Etasjedata()
etasjedata.antallBoenheter = 0
etasjedata.bruksarealTilBolig = 0.0
etasjedata.bruksarealTilAnnet = 0.0
etasjedata.bruksarealTotalt = 0.0
etasjedata.alternativtAreal = 0.0
etasjedata.alternativtAreal2 = 0.0
etasjedata.bruttoarealTilBolig = 0.0
etasjedata.bruttoarealTilAnnet = 0.0
etasjedata.bruttoarealTotalt = 0.0
}
.apply(scope)
.apply {
// Fyller inn tomme lister hvis det ikke har blitt fylt inn noe annet.
if (bruksenhetIds == null) bruksenhetIds = BruksenhetIdList()
if (energikildeKodeIds == null) energikildeKodeIds = EnergikildeKodeIdList()
if (oppvarmingsKodeIds == null) oppvarmingsKodeIds = OppvarmingsKodeIdList()
}

fun Bygning.bruksenhetIds(vararg bruksenhetIds: BruksenhetId) {
this.bruksenhetIds = BruksenhetIdList().apply {
item.addAll(bruksenhetIds)
}
}

fun Bygning.etasjer(vararg etasjer: Etasje) {
this.etasjer = EtasjeList().apply {
item.addAll(etasjer)
}
}

fun etasje(scope: Etasje.() -> Unit): Etasje = Etasje().apply(scope)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package no.kartverket.matrikkel.bygning.matrikkelapi.builders

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.Timestamp
import javax.xml.datatype.DatatypeFactory

private val datatypeFactory by lazy { DatatypeFactory.newDefaultInstance() }

fun timestampUtc(year: Int, month: Int, day: Int, hour: Int = 0, minute: Int = 0, second: Int = 0): Timestamp {
anderssonw marked this conversation as resolved.
Show resolved Hide resolved
val timestamp = Timestamp()
timestamp.timestamp = datatypeFactory.newXMLGregorianCalendar(year, month, day, hour, minute, second, 0, 0)
return timestamp
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
@file:Suppress("unused")

package no.kartverket.matrikkel.bygning.matrikkelapi.builders

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.AvlopsKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.EnergikildeKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.EtasjeplanKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.KjokkentilgangKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.OppvarmingsKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.VannforsyningsKodeId

enum class MatrikkelEtasjeplanKode(private val idValue: Long) {
IkkeOppgitt(0),
Hovedetasje(1),
Kjelleretasje(2),
Loft(3),
Underetasje(4);

operator fun invoke() = EtasjeplanKodeId().apply { value = idValue }
}

enum class MatrikkelVannforsyningKode(private val idValue: Long) {
IkkeOppgitt(0),
TilknyttetOffVannverk(1),
TilknyttetPrivatVannverk(2),
AnnenPrivatInnlagt(3),
AnnenPrivatIkkeInnlagt(4);

operator fun invoke() = VannforsyningsKodeId().apply { value = idValue }
}

enum class MatrikkelAvlopKode(private val idValue: Long) {
IkkeOppgitt(0),
OffentligKloakk(1),
PrivatKloakk(2),
IngenKloakk(3);

operator fun invoke() = AvlopsKodeId().apply { value = idValue }
}

enum class MatrikkelEnergikildeKode(private val idValue: Long) {
Elektrisitet(0),
OljeParafin(1),
Biobrensel(2),
Solenergi(3),
Varmepumpe(4),
Gass(5),
Fjernvarme(6),
AnnenEnergiKilde(7);

operator fun invoke() = EnergikildeKodeId().apply { value = idValue }
}

enum class MatrikkelOppvarmingKode(private val idValue: Long) {
Elektrisk(0),
Sentralvarme(1),
AnnenOppvarming(2);

operator fun invoke() = OppvarmingsKodeId().apply { value = idValue }
}

enum class MatrikkelKjokkentilgangKode(private val idValue: Long) {
IkkeOppgitt(0),
Kjokken(1),
IkkeKjokken(2),
FellesKjokken(3),
Ukjent(4);

operator fun invoke() = KjokkentilgangKodeId().apply { value = idValue }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package no.kartverket.matrikkel.bygning.matrikkelapi.builders

import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleObject
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleObjectList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.EnergikildeKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.EnergikildeKodeIdList
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.OppvarmingsKodeId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.koder.OppvarmingsKodeIdList

fun matrikkelBubbleObjectList(vararg bubbles: MatrikkelBubbleObject) = MatrikkelBubbleObjectList().apply {
item.addAll(bubbles)
}

fun energikildeKodeIdList(vararg ids: EnergikildeKodeId) = EnergikildeKodeIdList().apply {
item.addAll(ids)
}

fun oppvarmingsKodeIdList(vararg ids: OppvarmingsKodeId) = OppvarmingsKodeIdList().apply {
item.addAll(ids)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package no.kartverket.matrikkel.bygning.matrikkelapi.matchers

import io.mockk.MockKMatcherScope
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.MatrikkelBubbleIdList
import kotlin.reflect.KClass

inline fun <reified I : MatrikkelBubbleId> MockKMatcherScope.matchId(id: I) = match<I> {
it.value == id.value
}

fun MockKMatcherScope.matchIds(vararg ids: MatrikkelBubbleId): MatrikkelBubbleIdList {
val idMap = HashMap<KClass<*>, HashSet<Long>>()
ids.forEach { id -> idMap.getOrPut(id::class, ::HashSet).add(id.value) }

return match<MatrikkelBubbleIdList> { idList ->
idList.item.all { idMap[it::class]?.contains(it.value) ?: false }
}
}
Loading
Loading