Skip to content

Commit fa28c4a

Browse files
committed
convert code java to kotlin
1 parent 5fd0596 commit fa28c4a

22 files changed

+289
-340
lines changed

build.gradle

Lines changed: 0 additions & 54 deletions
This file was deleted.

build.gradle.kts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
plugins {
2+
kotlin("jvm") version "1.6.21"
3+
kotlin("plugin.spring") version "1.6.21"
4+
kotlin("plugin.jpa") version "1.6.21"
5+
id("org.springframework.boot") version "2.7.18" apply false
6+
id("io.spring.dependency-management") version "1.0.15.RELEASE"
7+
id("maven-publish")
8+
}
9+
10+
group = "hyeon9mak"
11+
version = "2.2.0-spring-boot-2"
12+
13+
java {
14+
sourceCompatibility = JavaVersion.VERSION_1_8
15+
targetCompatibility = JavaVersion.VERSION_1_8
16+
}
17+
18+
repositories {
19+
mavenCentral()
20+
}
21+
22+
dependencies {
23+
implementation("org.springframework.boot:spring-boot-starter-web")
24+
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
25+
implementation("org.springframework.boot:spring-boot-starter-aop")
26+
implementation("io.github.microutils:kotlin-logging-jvm:2.1.23")
27+
implementation("org.jetbrains.kotlin:kotlin-reflect")
28+
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
29+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
30+
}
31+
32+
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
33+
kotlinOptions {
34+
freeCompilerArgs = listOf("-Xjsr305=strict")
35+
jvmTarget = "1.8"
36+
}
37+
}
38+
39+
dependencyManagement {
40+
imports {
41+
mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
42+
}
43+
}
44+
45+
publishing {
46+
publications {
47+
create<MavenPublication>("maven") {
48+
groupId = project.group.toString()
49+
artifactId = project.name
50+
version = project.version.toString()
51+
52+
from(components["java"])
53+
}
54+
}
55+
}

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME
File renamed without changes.

src/main/java/hyeon9mak/multidatasourcequerycounter/AutoConfig.java

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package hyeon9mak.multidatasourcequerycounter
2+
3+
import org.springframework.boot.autoconfigure.AutoConfiguration
4+
import org.springframework.context.annotation.ComponentScan
5+
6+
@ComponentScan("hyeon9mak.multidatasourcequerycounter")
7+
@AutoConfiguration
8+
class AutoConfig

src/main/java/hyeon9mak/multidatasourcequerycounter/ConnectionQueryMonitor.java

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package hyeon9mak.multidatasourcequerycounter
2+
3+
import org.aopalliance.intercept.MethodInterceptor
4+
import org.aopalliance.intercept.MethodInvocation
5+
import org.springframework.aop.framework.ProxyFactory
6+
7+
class ConnectionQueryMonitor(
8+
private val queryCountPerRequest: QueryCountPerRequest,
9+
private val connection: Any,
10+
) : MethodInterceptor {
11+
12+
override fun invoke(invocation: MethodInvocation): Any? {
13+
val result = invocation.proceed()
14+
15+
if (result != null && invocation.preparedStatementInvoked()) {
16+
val proxyFactory = ProxyFactory(result)
17+
proxyFactory.addAdvice(PreparedStatementQueryMonitor(queryCountPerRequest = queryCountPerRequest))
18+
return proxyFactory.proxy
19+
}
20+
21+
return result
22+
}
23+
24+
fun getProxy(): Any {
25+
val proxyFactory = ProxyFactory(connection)
26+
proxyFactory.addAdvice(this)
27+
return proxyFactory.proxy
28+
}
29+
30+
private fun MethodInvocation.preparedStatementInvoked(): Boolean = this.method.name == JDBC_PREPARE_STATEMENT_METHOD_NAME
31+
32+
companion object {
33+
private const val JDBC_PREPARE_STATEMENT_METHOD_NAME = "prepareStatement"
34+
}
35+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package hyeon9mak.multidatasourcequerycounter
2+
3+
import kotlinx.coroutines.ThreadContextElement
4+
import org.springframework.web.context.request.RequestAttributes
5+
import org.springframework.web.context.request.RequestContextHolder
6+
import kotlin.coroutines.CoroutineContext
7+
8+
/**
9+
* https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/
10+
*/
11+
class CoroutineQueryCountContextElement(
12+
private val requestAttributes: RequestAttributes = RequestContextHolder.currentRequestAttributes(),
13+
) : ThreadContextElement<RequestAttributes> {
14+
15+
companion object Key : CoroutineContext.Key<CoroutineQueryCountContextElement>
16+
17+
override val key: CoroutineContext.Key<CoroutineQueryCountContextElement>
18+
get() = Key
19+
20+
override fun updateThreadContext(context: CoroutineContext): RequestAttributes {
21+
RequestContextHolder.setRequestAttributes(requestAttributes)
22+
return requestAttributes
23+
}
24+
25+
override fun restoreThreadContext(context: CoroutineContext, oldState: RequestAttributes) {
26+
RequestContextHolder.setRequestAttributes(oldState)
27+
}
28+
}

src/main/java/hyeon9mak/multidatasourcequerycounter/CountQueries.java

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package hyeon9mak.multidatasourcequerycounter
2+
3+
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
4+
@Retention(AnnotationRetention.RUNTIME)
5+
annotation class CountQueries(
6+
/**
7+
* prefix for query count log message.
8+
*/
9+
val prefix: String = ""
10+
)

src/main/java/hyeon9mak/multidatasourcequerycounter/HikariDataSourceQueryCounter.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package hyeon9mak.multidatasourcequerycounter
2+
3+
import org.aspectj.lang.ProceedingJoinPoint
4+
import org.aspectj.lang.annotation.Around
5+
import org.aspectj.lang.annotation.Aspect
6+
import org.aspectj.lang.reflect.MethodSignature
7+
import org.springframework.stereotype.Component
8+
import org.springframework.web.context.request.RequestContextHolder
9+
import org.springframework.web.context.request.ServletRequestAttributes
10+
11+
@Aspect
12+
@Component
13+
class HikariDataSourceQueryCounter(
14+
private val queryCountPerRequest: QueryCountPerRequest,
15+
private val queryCountLogger: QueryCountLogger,
16+
) {
17+
@Around("execution( * com.zaxxer.hikari.HikariDataSource.getConnection())")
18+
fun aroundConnection(joinPoint: ProceedingJoinPoint): Any {
19+
val connection = joinPoint.proceed()
20+
val connectionQueryMonitor = ConnectionQueryMonitor(queryCountPerRequest, connection)
21+
return connectionQueryMonitor.getProxy()
22+
}
23+
24+
@Around("@annotation(countQueries)")
25+
fun aroundCountQueriesMethod(joinPoint: ProceedingJoinPoint, countQueries: CountQueries): Any {
26+
val result = joinPoint.proceed()
27+
28+
val attributes = RequestContextHolder.getRequestAttributes() as ServletRequestAttributes?
29+
30+
if (attributes.isInRequestScope) {
31+
val request = attributes!!.request
32+
queryCountPerRequest.apiUrl = request.method + " " + request.requestURI
33+
} else {
34+
val methodSignature = joinPoint.signature as MethodSignature
35+
val methodName = methodSignature.method.name
36+
val className = methodSignature.declaringType.simpleName
37+
queryCountPerRequest.apiUrl = countQueries.prefix + className + "." + methodName
38+
}
39+
40+
queryCountLogger.logQueryCount(queryCountPerRequest)
41+
42+
return result
43+
}
44+
45+
private val ServletRequestAttributes?.isInRequestScope: Boolean
46+
get() = this != null
47+
}

0 commit comments

Comments
 (0)