diff --git a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/config/ConnectionProviderConfig.kt b/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/config/ConnectionProviderConfig.kt deleted file mode 100644 index 1c95b82278..0000000000 --- a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/config/ConnectionProviderConfig.kt +++ /dev/null @@ -1,28 +0,0 @@ -package uk.gov.justice.digital.hmpps.audit.config - -import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Condition -import org.springframework.context.annotation.ConditionContext -import org.springframework.context.annotation.Conditional -import org.springframework.context.annotation.Configuration -import org.springframework.core.type.AnnotatedTypeMetadata -import uk.gov.justice.digital.hmpps.datasource.DeliusConnectionProvider - -@Configuration -class ConnectionProviderConfig { - @Bean - @Conditional(OracleCondition::class) - fun hibernatePropertiesCustomizer(): HibernatePropertiesCustomizer { - return HibernatePropertiesCustomizer { props: MutableMap -> - props["hibernate.connection.provider_class"] = DeliusConnectionProvider::class.java - } - } -} - -class OracleCondition : Condition { - override fun matches(context: ConditionContext, metadata: AnnotatedTypeMetadata): Boolean { - val url = context.environment.getProperty("spring.datasource.url") - return url?.startsWith("jdbc:oracle") ?: false && !context.environment.acceptsProfiles { it.test("oracle") } - } -} diff --git a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/service/OptimisationTables.kt b/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/service/OptimisationTables.kt index ce11456b87..95dbe5a114 100644 --- a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/service/OptimisationTables.kt +++ b/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/audit/service/OptimisationTables.kt @@ -1,11 +1,13 @@ package uk.gov.justice.digital.hmpps.audit.service +import org.springframework.context.annotation.Condition +import org.springframework.context.annotation.ConditionContext import org.springframework.context.annotation.Conditional +import org.springframework.core.type.AnnotatedTypeMetadata import org.springframework.jdbc.core.JdbcTemplate import org.springframework.stereotype.Service import org.springframework.transaction.support.TransactionSynchronization import org.springframework.transaction.support.TransactionSynchronizationManager -import uk.gov.justice.digital.hmpps.audit.config.OracleCondition @Service class OptimisationTables(private val optimisationTablesRebuild: OptimisationTablesRebuild?) { @@ -25,3 +27,10 @@ class OptimisationTablesRebuild(private val jdbcTemplate: JdbcTemplate) { }) } } + +class OracleCondition : Condition { + override fun matches(context: ConditionContext, metadata: AnnotatedTypeMetadata): Boolean { + val url = context.environment.getProperty("spring.datasource.url") + return url?.startsWith("jdbc:oracle") ?: false && !context.environment.acceptsProfiles { it.test("oracle") } + } +} diff --git a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProvider.kt b/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProvider.kt deleted file mode 100644 index f6d963ee9f..0000000000 --- a/libs/audit/src/main/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProvider.kt +++ /dev/null @@ -1,23 +0,0 @@ -package uk.gov.justice.digital.hmpps.datasource - -import org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl -import uk.gov.justice.digital.hmpps.security.ServiceContext -import java.sql.Connection - -open class DeliusConnectionProvider : DatasourceConnectionProviderImpl() { - override fun getConnection(): Connection { - return super.getConnection().also { con -> - ServiceContext.servicePrincipal()?.username.let { username -> - con.prepareStatement("call PKG_VPD_CTX.SET_CLIENT_IDENTIFIER(?)").use { - it.setString(1, username) - it.execute() - } - } - } - } - - override fun closeConnection(connection: Connection) { - connection.prepareStatement("call PKG_VPD_CTX.CLEAR_CLIENT_IDENTIFIER()").use { it.execute() } - super.closeConnection(connection) - } -} diff --git a/libs/audit/src/test/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProviderTest.kt b/libs/audit/src/test/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProviderTest.kt deleted file mode 100644 index 31ba857d8c..0000000000 --- a/libs/audit/src/test/kotlin/uk/gov/justice/digital/hmpps/datasource/DeliusConnectionProviderTest.kt +++ /dev/null @@ -1,73 +0,0 @@ -package uk.gov.justice.digital.hmpps.datasource - -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mock -import org.mockito.junit.jupiter.MockitoExtension -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever -import org.springframework.boot.context.event.ApplicationStartedEvent -import uk.gov.justice.digital.hmpps.security.ServiceContext -import uk.gov.justice.digital.hmpps.user.AuditUser -import uk.gov.justice.digital.hmpps.user.AuditUserService -import java.sql.Connection -import java.sql.PreparedStatement -import javax.sql.DataSource - -@ExtendWith(MockitoExtension::class) -class DeliusConnectionProviderTest { - - @Mock - private lateinit var connection: Connection - - @Mock - private lateinit var preparedStatement: PreparedStatement - - @Mock - private lateinit var dataSource: DataSource - - @Mock - private lateinit var auditUserService: AuditUserService - - @Mock - private lateinit var applicationStartedEvent: ApplicationStartedEvent - - private lateinit var serviceContext: ServiceContext - - private val deliusConnectionProvider = DeliusConnectionProvider() - - @Test - fun `retrieving a connection with oracle sets client identifier with security context`() { - val user = AuditUser(1, "ServiceUserName") - whenever(auditUserService.findUser(user.username)).thenReturn(user) - whenever(connection.prepareStatement(anyString())).thenReturn(preparedStatement) - whenever(dataSource.connection).thenReturn(connection) - serviceContext = ServiceContext(user.username, auditUserService) - serviceContext.onApplicationEvent(applicationStartedEvent) - deliusConnectionProvider.dataSource = dataSource - deliusConnectionProvider.configure(mapOf()) - - deliusConnectionProvider.connection - - verify(dataSource).connection - verify(connection).prepareStatement("call PKG_VPD_CTX.SET_CLIENT_IDENTIFIER(?)") - verify(preparedStatement).setString(1, user.username) - verify(preparedStatement).execute() - } - - @Test - fun `close connection successfully removes context in db`() { - whenever(connection.prepareStatement(anyString())).thenReturn(preparedStatement) - - deliusConnectionProvider.dataSource = dataSource - deliusConnectionProvider.configure(mapOf()) - - deliusConnectionProvider.closeConnection(connection) - - verify(connection).prepareStatement("call PKG_VPD_CTX.CLEAR_CLIENT_IDENTIFIER()") - verify(preparedStatement).execute() - verify(preparedStatement).close() - } -}