Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<version>4.0.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

Expand All @@ -29,16 +29,16 @@

<!-- Maven build plugins and their dependencies -->
<build-helper-plugin.version>3.6.1</build-helper-plugin.version>
<build-properties-plugin.version>1.2.1</build-properties-plugin.version>
<maven-compiler.plugin.version>3.14.1</maven-compiler.plugin.version>
<surefire-plugin.version>3.5.4</surefire-plugin.version>
<build-properties-plugin.version>1.3.0</build-properties-plugin.version>
<maven-compiler.plugin.version>3.15.0</maven-compiler.plugin.version>
<surefire-plugin.version>3.5.5</surefire-plugin.version>
<maven-enforcer-plugin.version>3.6.2</maven-enforcer-plugin.version>
<ktlint-plugin.version>3.5.0</ktlint-plugin.version>

<!-- Library versions -->
<arrow-core.version>2.2.0</arrow-core.version>
<geolatte.version>1.10</geolatte.version>
<kotlin-logging-jvm.version>7.0.13</kotlin-logging-jvm.version>
<arrow-core.version>2.2.2</arrow-core.version>
<geolatte.version>1.11</geolatte.version>
<kotlin-logging-jvm.version>8.0.01</kotlin-logging-jvm.version>
<quicktheories.version>0.26</quicktheories.version>

<!-- Other properties -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.geolatte.geom.json.GeolatteGeomModule
import org.geolatte.geom.json.Setting
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
import org.springframework.boot.runApplication
import org.springframework.boot.security.autoconfigure.UserDetailsServiceAutoConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Primary
import org.springframework.transaction.annotation.EnableTransactionManagement
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package fi.hsl.jore4.mapmatching.config

import org.geolatte.geom.LineString
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import tools.jackson.core.JsonGenerator
import tools.jackson.databind.SerializationContext
import tools.jackson.databind.SerializationFeature
import tools.jackson.databind.ValueSerializer
import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy
import tools.jackson.databind.module.SimpleModule

@Configuration
class JacksonGeoJsonConfig {
@Bean
fun geolatteLineStringJsonCustomizer(): JsonMapperBuilderCustomizer =
JsonMapperBuilderCustomizer { builder ->
val module = SimpleModule("GeoLatteLineStringModule")
@Suppress("UNCHECKED_CAST")
module.addSerializer(
LineString::class.java as Class<LineString<*>>,
GeoLatteLineStringSerializer()
)

builder.addModule(module)
builder.disable(SerializationFeature.FAIL_ON_SELF_REFERENCES)
builder.enable(SerializationFeature.WRITE_SELF_REFERENCES_AS_NULL)

// Jackson 3.x treats Kotlin `isXxx` boolean properties as JavaBean is-getters and
// strips the "is" prefix (e.g. `isTraversalForwards` → `traversalForwards`).
// Disable is-getter detection so Kotlin property names are preserved verbatim.
builder.accessorNaming(DefaultAccessorNamingStrategy.Provider().withIsGetterPrefix(""))
}

private class GeoLatteLineStringSerializer : ValueSerializer<LineString<*>>() {
override fun serialize(
value: LineString<*>,
generator: JsonGenerator,
context: SerializationContext
) {
val positions = value.positions
val coordinateDimension = positions.coordinateDimension

generator.writeStartObject(value)
generator.writeStringProperty("type", "LineString")
generator.writeName("coordinates")
generator.writeStartArray()

val coordinateBuffer = DoubleArray(coordinateDimension)
for (index in 0 until positions.size()) {
positions.getCoordinates(index, coordinateBuffer)
generator.writeStartArray()
for (dimension in 0 until coordinateDimension) {
generator.writeNumber(coordinateBuffer[dimension])
}
generator.writeEndArray()
}

generator.writeEndArray()
generator.writeEndObject()
}
}
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ spring.flyway.locations=classpath:db/migration
spring.flyway.schemas=routing,extensions,flyway
spring.flyway.default-schema=flyway
spring.flyway.create-schemas=true
spring.flyway.init-sqls=SET search_path = extensions, routing;

spring.thymeleaf.cache=@spring.thymeleaf.cache@

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fi.hsl.jore4.mapmatching.config

import org.geolatte.geom.builder.DSL.c
import org.geolatte.geom.builder.DSL.linestring
import org.geolatte.geom.crs.CrsRegistry
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.containsString
import org.junit.jupiter.api.Test
import tools.jackson.databind.json.JsonMapper

class JacksonGeoJsonConfigTest {
@Test
fun serializesGeolatteLineStringAsGeoJson() {
val customizer = JacksonGeoJsonConfig().geolatteLineStringJsonCustomizer()
val builder = JsonMapper.builder()
customizer.customize(builder)
val mapper = builder.build()

val epsg3067 = CrsRegistry.getProjectedCoordinateReferenceSystemForEPSG(3067)
val geometry = linestring(epsg3067, c(385795.1, 6672185.2), c(386284.0, 6673127.0))

val payload: Map<String, Any> = mapOf("geometry" to geometry)
val json = mapper.writeValueAsString(payload)

assertThat(json, containsString("\"geometry\":{\"type\":\"LineString\""))
assertThat(json, containsString("\"coordinates\":[[385795.1,6672185.2],[386284.0,6673127.0]]"))
}
}