Skip to content

Commit 8c4f0a2

Browse files
erlingjdkristoiv
andcommitted
Add support for parsing XML from incoming request
Co-authored-by: kristoiv <[email protected]>
1 parent 33ecacf commit 8c4f0a2

File tree

5 files changed

+70
-14
lines changed

5 files changed

+70
-14
lines changed

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ val brukernotifikasjon_schemas_version: String by project
1010
val kafka_version: String by project
1111
val kafka_avro_version: String by project
1212
val influxdb_version: String by project
13+
val jackson_version: String by project
1314

1415
group = "no.nav.hjelpemidler"
1516
version = "1.0-SNAPSHOT"
@@ -31,6 +32,8 @@ dependencies {
3132
implementation("org.apache.kafka:kafka-clients:$kafka_version")
3233
implementation("io.confluent:kafka-avro-serializer:$kafka_avro_version")
3334
implementation("org.influxdb:influxdb-java:$influxdb_version")
35+
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:$jackson_version")
36+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version")
3437
}
3538

3639
tasks.withType<KotlinCompile>() {

gradle.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ konfig_version=1.6.10.0
66
brukernotifikasjon_schemas_version=1.2021.01.18-11.12-b9c8c40b98d1
77
kafka_version=2.6.0
88
kafka_avro_version=6.0.1
9-
influxdb_version=2.21
9+
influxdb_version=2.21
10+
# version matches R&R version of Jackson
11+
jackson_version=2.12.0

src/main/kotlin/no/nav/hjelpemidler/Application.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package no.nav.hjelpemidler
22

33
import com.fasterxml.jackson.annotation.JsonFormat
4+
import com.fasterxml.jackson.dataformat.xml.XmlMapper
45
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
56
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
67
import com.fasterxml.jackson.module.kotlin.readValue
@@ -26,7 +27,8 @@ import java.util.UUID
2627

2728
private val logg = KotlinLogging.logger {}
2829
private val sikkerlogg = KotlinLogging.logger("tjenestekall")
29-
private val mapper = jacksonObjectMapper().registerModule(JavaTimeModule())
30+
private val mapperJson = jacksonObjectMapper().registerModule(JavaTimeModule())
31+
private val mapperXml = XmlMapper().registerModule(JavaTimeModule())
3032

3133
// Unngå "inappropriate blocking method call" for objectmapper.writeValueAsString
3234
@Suppress("BlockingMethodInNonBlockingContext")
@@ -68,36 +70,45 @@ fun main() {
6870
return@post
6971
}
7072

71-
val rawJson: String = call.receiveText()
73+
var incomingFormatType = "JSON"
74+
if (call.request.header("Content-Type").toString().contains("application/xml")) {
75+
incomingFormatType = "XML"
76+
}
77+
78+
val requestBody: String = call.receiveText()
7279
SensuMetrics().meldingFraOebs()
7380
if (Configuration.application["APP_PROFILE"] != "prod") {
74-
sikkerlogg.info("Received JSON push request from OEBS: $rawJson")
81+
sikkerlogg.info("Received $incomingFormatType push request from OEBS: $requestBody")
7582
}
7683

7784
// Check for valid json request
7885
val ordrelinje: OrdrelinjeOebs?
7986
try {
80-
ordrelinje = mapper.readValue(rawJson)
87+
if (incomingFormatType == "XML"){
88+
ordrelinje = mapperXml.readValue(requestBody)
89+
} else {
90+
ordrelinje = mapperJson.readValue(requestBody)
91+
}
8192
if (Configuration.application["APP_PROFILE"] != "prod") {
8293
sikkerlogg.info(
83-
"Parsing incoming json request successful: ${
84-
mapper.writeValueAsString(
94+
"Parsing incoming $incomingFormatType request successful: ${
95+
mapperJson.writeValueAsString(
8596
ordrelinje
8697
)
8798
}"
8899
)
89100
}
90101
SensuMetrics().oebsParsingOk()
91102
} catch (e: Exception) {
92-
// Deal with invalid json in request
93-
sikkerlogg.info("Parsing incoming json request failed with exception (responding 4xx): $e")
103+
// Deal with invalid json/xml in request
104+
sikkerlogg.info("Parsing incoming $incomingFormatType request failed with exception (responding 4xx): $e")
94105
if (Configuration.application["APP_PROFILE"] != "prod") {
95106
sikkerlogg.info(
96-
"JSON in failed parsing: ${mapper.writeValueAsString(rawJson)}"
107+
"$incomingFormatType in failed parsing: ${mapperJson.writeValueAsString(requestBody)}"
97108
)
98109
}
99110
SensuMetrics().oebsParsingFeilet()
100-
call.respond(HttpStatusCode.BadRequest, "bad request: json not valid")
111+
call.respond(HttpStatusCode.BadRequest, "bad request: $incomingFormatType not valid")
101112
return@post
102113
}
103114

@@ -136,15 +147,15 @@ fun main() {
136147
data = ordrelinje.toOrdrelinje()
137148
)
138149

139-
// Publish the received json to our rapid
150+
// Publish the received json/xml to our rapid as json
140151
try {
141152
if (Configuration.application["APP_PROFILE"] != "prod") {
142153
logg.info { "Publiserer ordrelinje til rapid i miljø ${Configuration.application["APP_PROFILE"]}" }
143-
rapidApp!!.publish(ordrelinje.fnrBruker, mapper.writeValueAsString(melding))
154+
rapidApp!!.publish(ordrelinje.fnrBruker, mapperJson.writeValueAsString(melding))
144155
SensuMetrics().meldingTilRapidSuksess()
145156
} else {
146157
ordrelinje.fnrBruker = "MASKERT"
147-
sikkerlogg.info { "Ordrelinje mottatt i prod som ikkje blir sendt til rapid: ${mapper.writeValueAsString(ordrelinje)}" }
158+
sikkerlogg.info { "Ordrelinje mottatt i prod som ikkje blir sendt til rapid: ${mapperJson.writeValueAsString(ordrelinje)}" }
148159
}
149160
} catch (e: Exception) {
150161
if (Configuration.application["APP_PROFILE"] != "prod") {

src/main/kotlin/no/nav/hjelpemidler/model/OrdrelinjeOebs.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package no.nav.hjelpemidler.model
22

33
import com.fasterxml.jackson.annotation.JsonFormat
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
45
import com.fasterxml.jackson.annotation.JsonProperty
56
import java.time.LocalDate
67

8+
@JsonIgnoreProperties(ignoreUnknown = true)
79
data class OrdrelinjeOebs(
810
@JsonProperty("System")
911
val mottakendeSystem: String,

src/test/kotlin/no/nav/hjelpemidler/ParsingTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package no.nav.hjelpemidler
22

3+
import com.fasterxml.jackson.dataformat.xml.XmlMapper
34
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
45
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
56
import com.fasterxml.jackson.module.kotlin.readValue
@@ -123,4 +124,41 @@ internal class ParsingTest {
123124
assertEquals("012345", result.artikkelnr)
124125
println(mapper.writeValueAsString(result))
125126
}
127+
128+
@Test
129+
fun `Parse XML`() {
130+
val mapper = XmlMapper()
131+
mapper.registerModule(JavaTimeModule())
132+
133+
val result: OrdrelinjeOebs = mapper.readValue(
134+
"""
135+
<ki:StatusInfo xmlns:ki="urn:nav.no/ordre/statusinfo">
136+
<ki:System>DIGIHOT</ki:System>
137+
<ki:IncidentNummer/>
138+
<ki:IncidentStatus/>
139+
<ki:IncidentType/>
140+
<ki:IncidentSoknadType/>
141+
<ki:IncidentVedtakDato/>
142+
<ki:IncidentSoknad/>
143+
<ki:IncidentResultat/>
144+
<ki:IncidentRef/>
145+
<ki:OrdreNumber>0178581</ki:OrdreNumber>
146+
<ki:LineNumber>6</ki:LineNumber>
147+
<ki:ShipmentNumber>2</ki:ShipmentNumber>
148+
<ki:Description>Putevibrator FlexiBlink Life med quote: &quot; æøå </ki:Description>
149+
<ki:CategoryDescription/>
150+
<ki:OrderedItem>012345</ki:OrderedItem>
151+
<ki:User_ItemType>Hjelpemiddel</ki:User_ItemType>
152+
<ki:Quantity>3</ki:Quantity>
153+
<ki:AccountNumber>01127622634</ki:AccountNumber>
154+
<ki:OeBSInternFnr>01127622634</ki:OeBSInternFnr>
155+
<ki:LastUpdateDate>2021-04-15</ki:LastUpdateDate>
156+
</ki:StatusInfo>
157+
""".trimIndent()
158+
)
159+
160+
println(result.toString())
161+
assertEquals("012345", result.artikkelnr)
162+
println(mapper.writeValueAsString(result))
163+
}
126164
}

0 commit comments

Comments
 (0)