Skip to content
Open
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
2 changes: 1 addition & 1 deletion dice/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<groupId>tools.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
</dependency>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@ package com.embabel.dice.agent
import com.embabel.agent.api.annotation.LlmTool
import com.embabel.agent.api.tool.Tool
import com.embabel.agent.core.ContextId
import com.embabel.dice.agent.DiscoveryTools.Companion.asTools
import com.embabel.dice.projection.lineage.ProjectionRecordStore
import com.embabel.dice.projection.memory.CollectorRunner
import com.embabel.dice.query.discovery.CollectorDryRunDto
import com.embabel.dice.query.discovery.DiscoveryQuery
import com.embabel.dice.query.discovery.ProjectionHealthDto
import com.embabel.dice.query.discovery.RetrievalMode
import com.embabel.dice.query.discovery.RetrievalRouter
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.slf4j.LoggerFactory
import tools.jackson.module.kotlin.jacksonObjectMapper

/**
* LLM-invocable tools exposing the discovery surface — proposition query, graph path, why-explain,
Expand Down
2 changes: 1 addition & 1 deletion dice/src/main/kotlin/com/embabel/dice/agent/Memory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ import com.embabel.dice.proposition.Proposition
import com.embabel.dice.proposition.PropositionQuery
import com.embabel.dice.proposition.PropositionRepository
import com.embabel.dice.proposition.PropositionStatus
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.slf4j.LoggerFactory
import tools.jackson.module.kotlin.jacksonObjectMapper
import java.util.function.UnaryOperator

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import com.embabel.dice.proposition.PropositionQuery
import com.embabel.dice.proposition.PropositionRepository
import com.embabel.dice.proposition.PropositionStatus
import com.embabel.dice.proposition.PropositionStoreType
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.slf4j.LoggerFactory
import tools.jackson.module.kotlin.jacksonObjectMapper
import tools.jackson.module.kotlin.readValue
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption
Expand Down Expand Up @@ -55,7 +55,7 @@ class JsonFilePropositionRepository @JvmOverloads constructor(

private val logger = LoggerFactory.getLogger(JsonFilePropositionRepository::class.java)

private val mapper = jacksonObjectMapper().findAndRegisterModules()
private val mapper = jacksonObjectMapper()

private val propositions = ConcurrentHashMap<String, Proposition>()
private val embeddings = ConcurrentHashMap<String, FloatArray>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ import com.embabel.dice.pipeline.ChunkPropositionResult
import com.embabel.dice.pipeline.PropositionPipeline
import com.embabel.dice.proposition.PropositionRepository
import com.embabel.dice.proposition.revision.RevisionResult
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import tools.jackson.databind.ObjectMapper

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we verify that existing consumers can still start and use Dice JSON with Jackson 2 on the classpath? If not, this needs a compatibility period before changing the public ObjectMapper type.

import tools.jackson.module.kotlin.jacksonObjectMapper
import tools.jackson.module.kotlin.readValue

/**
* REST controller that runs the proposition extraction pipeline over text or uploaded files.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,13 @@ import com.embabel.agent.core.ContextId
import com.embabel.dice.proposition.EntityMention
import com.embabel.dice.proposition.MentionRole
import com.embabel.dice.proposition.Proposition
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertInstanceOf
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import tools.jackson.databind.DeserializationFeature
import tools.jackson.databind.ObjectMapper
import tools.jackson.module.kotlin.jacksonMapperBuilder

/**
* The gate-decision events are declared on a `@JsonTypeInfo(use = CLASS)` interface, which is the
Expand All @@ -40,10 +39,9 @@ class GateDiceEventSerializationTest {
// (the @JsonTypeInfo discriminator on the DiceEvent interface) without coupling to the
// nested Proposition type's own serialization shape, which carries a derived getter
// (contextIdValue) that has no matching constructor parameter.
private val mapper: ObjectMapper = ObjectMapper()
.registerKotlinModule()
.registerModule(JavaTimeModule())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
private val mapper: ObjectMapper = jacksonMapperBuilder()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.build()

private fun proposition(): Proposition = Proposition(
contextId = ContextId("ctx"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,9 @@
package com.embabel.dice.proposition

import com.embabel.agent.core.ContextId
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

// A real consumer registers modules (incl. JSR-310 for the Instant fields) on its mapper;
// findAndRegisterModules() picks up jackson-datatype-jsr310 from the classpath.
import tools.jackson.module.kotlin.jacksonObjectMapper

/**
* Verifies that a [Proposition] round-trips cleanly through JSON. The class exposes computed
Expand All @@ -32,7 +29,7 @@ import org.junit.jupiter.api.Test
*/
class PropositionJacksonRoundTripTest {

private val mapper = jacksonObjectMapper().findAndRegisterModules()
private val mapper = jacksonObjectMapper()

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add a JSON fixture written by the Jackson 2 repository and load it here? This only tests a Jackson 3 round trip, so it does not cover existing persisted data.


@Test
fun `a Proposition round-trips through JSON preserving its core fields`() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
*/
package com.embabel.dice.provenance

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotEquals
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import tools.jackson.module.kotlin.jacksonObjectMapper
import tools.jackson.module.kotlin.readValue

class SourceLocatorTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
package com.embabel.dice.support

import com.embabel.dice.text2graph.support.Entities
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import tools.jackson.module.kotlin.jacksonObjectMapper
import org.junit.jupiter.api.Test

class EntitiesTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,27 @@ import com.embabel.dice.proposition.MentionRole
import com.embabel.dice.proposition.Proposition
import com.embabel.dice.proposition.PropositionRepository
import com.embabel.dice.proposition.store.InMemoryPropositionRepository
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
import org.springframework.http.MediaType
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import tools.jackson.databind.json.JsonMapper
import tools.jackson.module.kotlin.kotlinModule
import java.time.Instant
import kotlin.reflect.KClass
import kotlin.reflect.KType
import kotlin.reflect.full.functions
import kotlin.reflect.jvm.javaMethod
import org.springframework.http.MediaType

/**
* Opt-in and leak-free contract for the discovery REST surface, plus the cross-tier signature gate
Expand Down Expand Up @@ -82,16 +81,17 @@ class DiscoveryControllerTest {
@BeforeEach
fun setUp() {
repository = TestPropositionRepository()
val objectMapper = ObjectMapper()
.registerModule(KotlinModule.Builder().build())
.registerModule(JavaTimeModule())
val objectMapper = JsonMapper.builder()
.addModule(kotlinModule())
.findAndAddModules()
.build()
val controller = DiscoveryController(
store = repository,
projectionRecordStore = emptyRecordStore,
collectorRunner = noopCollectorRunner,
)
mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setMessageConverters(MappingJackson2HttpMessageConverter(objectMapper))
.setMessageConverters(JacksonJsonHttpMessageConverter(objectMapper))
.build()
}

Expand Down Expand Up @@ -192,16 +192,17 @@ class DiscoveryControllerTest {
override fun delete(id: String): Boolean = false
override fun count(): Int = 0
}
val objectMapper = ObjectMapper()
.registerModule(KotlinModule.Builder().build())
.registerModule(JavaTimeModule())
val objectMapper = JsonMapper.builder()
.addModule(kotlinModule())
.findAndAddModules()
.build()
val controller = DiscoveryController(
store = failingStore,
projectionRecordStore = emptyRecordStore,
collectorRunner = noopCollectorRunner,
)
val mvc = MockMvcBuilders.standaloneSetup(controller)
.setMessageConverters(MappingJackson2HttpMessageConverter(objectMapper))
.setMessageConverters(JacksonJsonHttpMessageConverter(objectMapper))
.build()

mvc.perform(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,19 @@ import com.embabel.agent.core.ContextId
import com.embabel.agent.rag.service.RetrievableIdentifier
import com.embabel.common.core.types.SimilarityResult
import com.embabel.common.core.types.TextSimilaritySearchRequest
import com.embabel.dice.proposition.EntityMention
import com.embabel.dice.proposition.MentionRole
import com.embabel.dice.proposition.Proposition
import com.embabel.dice.proposition.PropositionRepository
import com.embabel.dice.proposition.PropositionStatus
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.embabel.dice.proposition.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.springframework.http.MediaType
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import tools.jackson.databind.json.JsonMapper
import tools.jackson.module.kotlin.kotlinModule
import java.util.concurrent.ConcurrentHashMap

/**
Expand Down Expand Up @@ -89,22 +85,23 @@ class MemoryControllerTest {

private lateinit var mockMvc: MockMvc
private lateinit var propositionRepository: TestPropositionRepository
private lateinit var objectMapper: ObjectMapper
private lateinit var objectMapper: JsonMapper

@BeforeEach
fun setUp() {
propositionRepository = TestPropositionRepository()

objectMapper = ObjectMapper()
.registerModule(KotlinModule.Builder().build())
.registerModule(JavaTimeModule())
objectMapper = JsonMapper.builder()
.addModule(kotlinModule())
.findAndAddModules()
.build()

val controller = MemoryController(
propositionRepository = propositionRepository,
)

mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setMessageConverters(MappingJackson2HttpMessageConverter(objectMapper))
.setMessageConverters(JacksonJsonHttpMessageConverter(objectMapper))
.build()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,39 +17,38 @@ package com.embabel.dice.web.rest

import com.embabel.agent.core.ContextId
import com.embabel.agent.core.DataDictionary
import com.embabel.agent.rag.ingestion.ContentChunker
import com.embabel.agent.rag.ingestion.HierarchicalContentReader
import com.embabel.agent.rag.model.Chunk
import com.embabel.agent.rag.model.NavigableDocument
import com.embabel.dice.common.EntityResolver
import com.embabel.dice.common.NewEntity
import com.embabel.dice.common.Resolutions
import com.embabel.dice.common.SuggestedEntity
import com.embabel.dice.common.resolver.AlwaysCreateEntityResolver
import com.embabel.dice.common.support.InMemorySchemaRegistry
import com.embabel.agent.rag.ingestion.ContentChunker
import com.embabel.agent.rag.ingestion.HierarchicalContentReader
import com.embabel.agent.rag.model.Chunk
import com.embabel.agent.rag.model.NavigableDocument
import com.embabel.dice.pipeline.ChunkPropositionResult
import com.embabel.dice.pipeline.PropositionPipeline
import com.embabel.dice.pipeline.PropositionResults
import com.embabel.dice.proposition.*
import com.embabel.dice.proposition.revision.RevisionResult
import com.fasterxml.jackson.annotation.JsonClassDescription
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.http.MediaType
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter
import org.springframework.mock.web.MockMultipartFile
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import tools.jackson.databind.json.JsonMapper
import tools.jackson.module.kotlin.kotlinModule

/**
* Contract tests for the proposition extraction REST controller.
Expand All @@ -64,7 +63,7 @@ class PropositionPipelineControllerTest {
private lateinit var propositionPipeline: PropositionPipeline
private lateinit var entityResolver: EntityResolver
private lateinit var schemaRegistry: InMemorySchemaRegistry
private lateinit var objectMapper: ObjectMapper
private lateinit var objectMapper: JsonMapper

@JsonClassDescription("A composer of music")
data class Composer(val id: String, val name: String)
Expand All @@ -80,9 +79,10 @@ class PropositionPipelineControllerTest {
val schema = DataDictionary.fromClasses("test", Composer::class.java, Work::class.java)
schemaRegistry = InMemorySchemaRegistry(schema)

objectMapper = ObjectMapper()
.registerModule(KotlinModule.Builder().build())
.registerModule(JavaTimeModule())
objectMapper = JsonMapper.builder()
.addModule(kotlinModule())
.findAndAddModules()
.build()

val controller = PropositionPipelineController(
propositionPipeline = propositionPipeline,
Expand All @@ -92,7 +92,7 @@ class PropositionPipelineControllerTest {
)

mockMvc = MockMvcBuilders.standaloneSetup(controller)
.setMessageConverters(MappingJackson2HttpMessageConverter(objectMapper))
.setMessageConverters(JacksonJsonHttpMessageConverter(objectMapper))
.build()
}

Expand Down Expand Up @@ -306,7 +306,7 @@ class PropositionPipelineControllerTest {
contentChunker = chunker,
)
val mvc = MockMvcBuilders.standaloneSetup(fileController)
.setMessageConverters(MappingJackson2HttpMessageConverter(objectMapper))
.setMessageConverters(JacksonJsonHttpMessageConverter(objectMapper))
.build()

mvc.perform(
Expand Down