Skip to content

Commit

Permalink
Leggtil språk Konfigurasjon (#78)
Browse files Browse the repository at this point in the history
  • Loading branch information
SandraLekve authored Jan 27, 2025
1 parent f38e39b commit 1c9cc6c
Show file tree
Hide file tree
Showing 11 changed files with 318 additions and 11 deletions.
11 changes: 10 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,15 @@
<version>${validation-model-jakarta.version}</version>
</dependency>

<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<!-- Junit 5 & mockk-->
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
Expand Down Expand Up @@ -203,7 +212,7 @@
</dependency>
<dependency>
<groupId>io.mockk</groupId>
<artifactId>mockk</artifactId>
<artifactId>mockk-jvm</artifactId>
<version>${mockk.version}</version>
<scope>test</scope>
</dependency>
Expand Down
18 changes: 16 additions & 2 deletions src/main/kotlin/no/nav/familie/pdf/pdf/PdfElementUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.itextpdf.layout.element.Table
import com.itextpdf.layout.element.Text
import com.itextpdf.layout.properties.UnitValue
import no.nav.familie.pdf.pdf.PdfUtils.FontStil
import no.nav.familie.pdf.pdf.PdfUtils.hentOversettelse
import no.nav.familie.pdf.pdf.PdfUtils.settFont
import no.nav.familie.pdf.pdf.domain.VerdilisteElement

Expand Down Expand Up @@ -113,8 +114,21 @@ object PdfElementUtils {
)
}
tabell.caption = captionDiv
tabell.addCell(lagTabellOverskriftscelle("Spørsmål"))
tabell.addCell(lagTabellOverskriftscelle("Svar", false))
val spørsmål: String =
hentOversettelse(
bokmål = "Spørsmål",
nynorsk = "Spørsmål",
engelsk = "Questions",
)

val svar: String =
hentOversettelse(
bokmål = "Svar",
nynorsk = "Svar",
engelsk = "Answer",
)
tabell.addCell(lagTabellOverskriftscelle(spørsmål))
tabell.addCell(lagTabellOverskriftscelle(svar, false))
lagTabellRekursivt(tabellData.verdiliste, tabell)
return tabell
}
Expand Down
42 changes: 36 additions & 6 deletions src/main/kotlin/no/nav/familie/pdf/pdf/PdfUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import no.nav.familie.pdf.pdf.PdfElementUtils.navLogoBilde
import no.nav.familie.pdf.pdf.VisningsvariantUtils.håndterVisningsvariant
import no.nav.familie.pdf.pdf.domain.FeltMap
import no.nav.familie.pdf.pdf.domain.VerdilisteElement
import no.nav.familie.pdf.pdf.språkKonfigurasjon.SpråkKontekst

object PdfUtils {
fun lagPdfADocument(byteArrayOutputStream: ByteArrayOutputStream): PdfADocument {
Expand Down Expand Up @@ -64,7 +65,8 @@ object PdfUtils {
val harInnholdsfortegnelse = feltMap.pdfConfig.harInnholdsfortegnelse
val innholdsfortegnelse = mutableListOf<InnholdsfortegnelseOppføringer>()

val sideantallInnholdsfortegnelse = if (harInnholdsfortegnelse) kalkulerSideantallInnholdsfortegnelse(feltMap, innholdsfortegnelse) else 0
val sideantallInnholdsfortegnelse =
if (harInnholdsfortegnelse) kalkulerSideantallInnholdsfortegnelse(feltMap, innholdsfortegnelse) else 0

UtilsMetaData.leggtilMetaData(pdfADokument, feltMap)

Expand Down Expand Up @@ -190,8 +192,13 @@ object PdfUtils {
add(lagOverskriftH1(overskrift))
add(navLogoBilde())
setSkjemanummer(this, skjemanummer)

add(lagOverskriftH2("Innholdsfortegnelse"))
val innholdsfortegnelse: String =
hentOversettelse(
bokmål = "Innholdsfortegnelse",
nynorsk = "Innhaldsliste",
engelsk = "Table of Contents",
)
add(lagOverskriftH2(innholdsfortegnelse))
add(lagInnholdsfortegnelse(innholdsfortegnelseOppføringer))
}

Expand All @@ -215,7 +222,14 @@ object PdfUtils {

private fun Document.leggTilSidevisning(pdfADokument: PdfADocument) {
for (sidetall in 1..pdfADokument.numberOfPages) {
val bunntekst = Paragraph().add("Side $sidetall av ${pdfADokument.numberOfPages}")
val bunntekst =
Paragraph().add(
hentOversettelse(
bokmål = "Side $sidetall av ${pdfADokument.numberOfPages}",
nynorsk = "Side $sidetall av ${pdfADokument.numberOfPages}",
engelsk = "Page $sidetall of ${pdfADokument.numberOfPages}",
),
)
showTextAligned(bunntekst, 559f, 30f, sidetall, TextAlignment.RIGHT, VerticalAlignment.BOTTOM, 0f)
}
}
Expand All @@ -232,8 +246,13 @@ object PdfUtils {
}

innholdsfortegnelse.forEach { innholdsfortegnelseElement ->
val alternativTekst =
"${innholdsfortegnelseElement.tittel} på side"
valSide: String =
hentOversettelse(
bokmål = "på side",
nynorsk = "på side",
engelsk = "on page",
)
val alternativTekst = "${innholdsfortegnelseElement.tittel} $påSide"
val lenke =
Link(
innholdsfortegnelseElement.tittel,
Expand Down Expand Up @@ -280,6 +299,17 @@ object PdfUtils {
)
}

fun hentOversettelse(
bokmål: String,
nynorsk: String,
engelsk: String,
): String =
when (SpråkKontekst.brukSpråk()) {
"nn" -> nynorsk
"en" -> engelsk
else -> bokmål
}

fun Paragraph.settFont(stil: FontStil) {
this.setFont(bestemFont(stil))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import no.nav.familie.pdf.pdf.PdfElementUtils.lagOverskriftH4
import no.nav.familie.pdf.pdf.PdfElementUtils.lagPunktliste
import no.nav.familie.pdf.pdf.PdfElementUtils.lagTabell
import no.nav.familie.pdf.pdf.PdfElementUtils.lagTekstElement
import no.nav.familie.pdf.pdf.PdfUtils.hentOversettelse
import no.nav.familie.pdf.pdf.PdfUtils.håndterRekursivVerdiliste
import no.nav.familie.pdf.pdf.domain.VerdilisteElement
import no.nav.familie.pdf.pdf.domain.VisningsVariant
Expand Down Expand Up @@ -55,11 +56,17 @@ object VisningsvariantUtils {
verdiliste: List<VerdilisteElement>,
seksjon: Div,
) {
val ingenVedlegg: String =
hentOversettelse(
bokmål = "Ingen vedlegg lastet opp i denne søknaden",
nynorsk = "Ingen vedlegg lasta opp i denne søknaden",
engelsk = "No attachments uploaded in this application",
)
verdiliste.forEach { vedlegg ->
vedlegg.verdi?.takeIf { it.isEmpty() }?.let {
seksjon.apply {
add(
lagTekstElement("Ingen vedlegg lastet opp i denne søknaden").apply {
lagTekstElement(ingenVedlegg).apply {
setMarginLeft(
15f,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package no.nav.familie.pdf.pdf.språkKonfigurasjon

import com.fasterxml.jackson.core.JsonProcessingException
import com.fasterxml.jackson.databind.ObjectMapper
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
import org.springframework.web.servlet.HandlerInterceptor
import java.io.IOException

@Component
class SpråkAvlyttingskomponent(
private val objectMapper: ObjectMapper,
) : HandlerInterceptor {
private val logger: Logger = LoggerFactory.getLogger(this::class.java)

@Throws(Exception::class)
override fun preHandle(
forespørsel: HttpServletRequest,
respons: HttpServletResponse,
ndterer: Any,
): Boolean {
val språk = hentSpråkFraBody(forespørsel) ?: "nb"
SpråkKontekst.settSpråk(språk)
return true
}

@Throws(Exception::class)
override fun afterCompletion(
forespørsel: HttpServletRequest,
respons: HttpServletResponse,
ndterer: Any,
unntak: Exception?,
) {
SpråkKontekst.tilbakestillSpråk()
}

private fun hentSpråkFraBody(forespørsel: HttpServletRequest): String? =
try {
val jsonNode = objectMapper.readTree(forespørsel.inputStream)
jsonNode.get("pdfConfig")?.get("språk")?.asText()
} catch (e: IOException) {
logger.warn("I/O-feil ved lesing av request body", e)
null
} catch (e: JsonProcessingException) {
logger.warn("Feil ved parsing av JSON", e)
null
} catch (e: Exception) {
logger.warn("Kunne ikke sette språk grunnet unntak:", e)
null
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package no.nav.familie.pdf.pdf.språkKonfigurasjon

object SpråkKontekst {
private val aktivtSpråk = ThreadLocal.withInitial { "nb" }

fun brukSpråk(): String = aktivtSpråk.get()

fun settSpråk(språk: String) = this.aktivtSpråk.set(språk)

fun tilbakestillSpråk() = aktivtSpråk.remove()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package no.nav.familie.pdf.pdf.språkKonfigurasjon

import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer

@Configuration
class WebKonfigurasjon(
private val språkAvlyttingskomponent: SpråkAvlyttingskomponent,
) : WebMvcConfigurer {
override fun addInterceptors(registry: InterceptorRegistry) {
registry.addInterceptor(språkAvlyttingskomponent)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.unmockkObject
import io.mockk.verify
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import no.nav.familie.pdf.pdf.språkKonfigurasjon.SpråkAvlyttingskomponent
import no.nav.familie.pdf.pdf.språkKonfigurasjon.SpråkKontekst
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.mock.web.MockHttpServletRequest
import org.springframework.mock.web.MockHttpServletResponse
import java.io.IOException
import kotlin.test.assertEquals

class SpråkAvlyttingskomponentTest {
private lateinit var språkAvlyttingskomponent: SpråkAvlyttingskomponent
private lateinit var objektMapper: ObjectMapper
private lateinit var forespørsel: HttpServletRequest
private lateinit var respons: HttpServletResponse

@BeforeEach
fun settOpp() {
objektMapper = mockk()
forespørsel = MockHttpServletRequest()
respons = MockHttpServletResponse()
språkAvlyttingskomponent = SpråkAvlyttingskomponent(objektMapper)
}

@AfterEach
fun tilbakestill() {
unmockkObject(SpråkKontekst)
}

@Test
fun `preHandle setter språk korrekt`() {
mockkObject(SpråkKontekst)
val mockJsonNode = mockk<JsonNode>()
every { mockJsonNode.get("pdfConfig")?.get("språk")?.asText() } returns "en"
every { objektMapper.readTree(forespørsel.inputStream) } returns mockJsonNode

val resultat = språkAvlyttingskomponent.preHandle(forespørsel, respons, Any())

verify { SpråkKontekst.settSpråk("en") }
assertEquals(true, resultat)
}

@Test
fun `preHandle setter standard språk til nb hvis ingen språk i body`() {
mockkObject(SpråkKontekst)
val mockJsonNode = mockk<JsonNode>()
every { mockJsonNode.get("pdfConfig")?.get("språk")?.asText() } returns null
every { objektMapper.readTree(forespørsel.inputStream) } returns mockJsonNode

val resultat = språkAvlyttingskomponent.preHandle(forespørsel, respons, Any())

verify { SpråkKontekst.settSpråk("nb") }
assertEquals(true, resultat)
}

@Test
fun `preHandle setter standard språk ved IOException`() {
mockkObject(SpråkKontekst)
every { objektMapper.readTree(forespørsel.inputStream) } throws IOException("I/O feil")

val resultat = språkAvlyttingskomponent.preHandle(forespørsel, respons, Any())

verify { SpråkKontekst.settSpråk("nb") }
assertEquals(true, resultat)
}

@Test
fun `preHandle setter standard språk ved JsonProcessingException`() {
mockkObject(SpråkKontekst)
every { objektMapper.readTree(forespørsel.inputStream) } throws
com.nimbusds.jose.shaded.gson.JsonParseException(
"JSON parsing feil",
null,
)
val resultat = språkAvlyttingskomponent.preHandle(forespørsel, respons, Any())

verify { SpråkKontekst.settSpråk("nb") }
assertEquals(true, resultat)
}

@Test
fun `preHandle setter standard språk ved generell Exception`() {
mockkObject(SpråkKontekst)
every { objektMapper.readTree(forespørsel.inputStream) } throws Exception("Uventet feil")

val resultat = språkAvlyttingskomponent.preHandle(forespørsel, respons, Any())

verify { SpråkKontekst.settSpråk("nb") }
assertEquals(true, resultat)
}

@Test
fun `afterCompletion fjerner språk`() {
mockkObject(SpråkKontekst)

språkAvlyttingskomponent.afterCompletion(forespørsel, respons, Any(), null)

verify { SpråkKontekst.tilbakestillSpråk() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package no.nav.familie.pdf.no.nav.familie.pdf.pdf.språkContextTest

import no.nav.familie.pdf.pdf.språkKonfigurasjon.SpråkKontekst
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

class SpråkKontekstTest {
@BeforeEach
fun settOpp() {
SpråkKontekst.tilbakestillSpråk()
}

@AfterEach
fun tilbakestill() {
SpråkKontekst.tilbakestillSpråk()
}

@Test
fun `standard språk er norsk bokmål`() {
assertEquals("nb", SpråkKontekst.brukSpråk())
}

@Test
fun `kan sette og hente språk`() {
SpråkKontekst.settSpråk("en")
assertEquals("en", SpråkKontekst.brukSpråk())
}

@Test
fun `fjernSpråk setter tilbake til standard nb`() {
SpråkKontekst.settSpråk("fr")
SpråkKontekst.tilbakestillSpråk()
assertEquals("nb", SpråkKontekst.brukSpråk())
}
}
Loading

0 comments on commit 1c9cc6c

Please sign in to comment.