From fc31966b5c49a7aaf94a4ff7327be7f5ebd6806a Mon Sep 17 00:00:00 2001 From: tursom Date: Fri, 27 Oct 2023 19:13:44 +0800 Subject: [PATCH] fix NPE of ktorm --- build.gradle.kts | 4 +- .../TestClass_InvocationHandler.class | Bin 3897 -> 3906 bytes ts-core/ts-proxy/build.gradle.kts | 4 ++ .../src/main/kotlin/cn/tursom/proxy/Proxy.kt | 22 +++++++--- .../test/kotlin/cn/tursom/proxy/Example.kt | 2 +- .../src/test/kotlin/cn/tursom/proxy/main.kt | 15 ------- .../database/ktorm/ext/ExtSqlDialect.kt | 10 ++--- .../database/ktorm/ext/ExtSqlFormatter.kt | 3 +- .../database/ktorm/ext/ExtSqlDialectTest.kt | 10 ++++- ts-gradle/README.md | 5 +++ ts-gradle/settings.gradle.kts | 2 +- ts-gradle/ts-gradle-no-test/build.gradle.kts | 8 ---- .../kotlin/cn/tursom/gradle/NoTestPlugin.kt | 31 -------------- ts-gradle/ts-gradle-test/build.gradle.kts | 8 ++++ .../kotlin/cn/tursom/gradle/TestPlugin.kt | 38 ++++++++++++++++++ 15 files changed, 90 insertions(+), 72 deletions(-) delete mode 100644 ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/main.kt create mode 100644 ts-gradle/README.md delete mode 100644 ts-gradle/ts-gradle-no-test/build.gradle.kts delete mode 100644 ts-gradle/ts-gradle-no-test/src/main/kotlin/cn/tursom/gradle/NoTestPlugin.kt create mode 100644 ts-gradle/ts-gradle-test/build.gradle.kts create mode 100644 ts-gradle/ts-gradle-test/src/main/kotlin/cn/tursom/gradle/TestPlugin.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4306871..d1d620f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { id("ts-gradle-env") apply false id("ts-gradle-install") apply false - id("ts-gradle-no-test") apply false + id("ts-gradle-test") apply false id("ts-gradle-publish") apply false id("ts-gradle-repos") apply false } @@ -17,7 +17,7 @@ allprojects { apply(plugin = "maven-publish") apply(plugin = "ts-gradle-env") apply(plugin = "ts-gradle-install") - apply(plugin = "ts-gradle-no-test") + apply(plugin = "ts-gradle-test") apply(plugin = "ts-gradle-publish") apply(plugin = "ts-gradle-repos") diff --git a/ts-core/ts-proxy/TestClass_InvocationHandler.class b/ts-core/ts-proxy/TestClass_InvocationHandler.class index 8a6534ad1d8bb54c68a09923161b14213a44ab25..0c70dbf766bbcb1183a5353ad3f400f54a807c43 100644 GIT binary patch delta 1664 zcma)5TT@$A7+pK(Bj(iB3Vjfp0q-c2u7 z+uBxe*GsF`Ta_87N!A9<zhs}5ZcN?L@gLIqdvv;dT55XE$-HAjj5{^sQ zP0x!}asYcw=*7eIn%Hi8L_P2*LFsL!gX!dCJSyQaO7u1ZfzaR%&|k$Wdaoc`Lj>|< zJUtwaO-0Oj0>dWk#{ufr?<)$M@s!FpO3&%*t&uzK?~jF3DG5>fgWe}k;;;!5I6_6k zfz5FwxbcjPPEB|tZ*!y8W*I3uZKy1slHr%pFJnl?2+bP$w| zUcAO6M~i!N)aZ_h)uFQ&Nr!5L{)} z1@`0X#1gEbMcg%y>ay`1Vr5SY-(q3`&(7l>)sYmLBP5iiS#(edbd??Dna^o~er~Ce zU25d{0>^;rc%k6fr#fCNIL7AY6d@MaVCUlKPel&8Y%0!NUs*!O{*guOSb@NDHnVT5 zhOG)Z(az9x!HuOErK~D}YZg{fjVuIZv!8>>hO(N#j(L3Q(=s9wF zixYJkzaI}N%EpTvJ-hB8$)k4xeb?4ex#3o*IC3gCJQ`C!_O9NsbAa{0tw_mZ@c&aNdV+5sxzJi99vB} zUP!TMDSFR5PO9Ne?BSgnLzfnA_2i-J^WMOz%kX-|n>fWN7jT-r`G#N?CmBk?S(N5+ z#ycXkRVc6rTdv?^tq}ir^JP(HU6sd2esJ{?pQzoXf0Wo=pBCP$R6PYThtF3#^Ck1?ApH$` CjAHu$ delta 1731 zcmb7ETTmNS82*-B$Rwo7nq zf1@!Jnhf}Z7IaFm4~vE2Oah&u-;P6g+=eb3W|x$G&LcviS3=yme39^YaLfXo-BO%3 zJC2H^Cs=D@U-GaWLt=fLEhLs?jsE9^O_ToVX$wxUzZ1Rc1fH~E9Fy$6q=CaBJjEAJ zt7wp*9MKOolkN6x-^R{bJ0h5|(g{zRj>>qY%esaq0wWO>&#Gus(XC=Y#W8j>sZ%|T zA{(;sGRw7;vY<&K*WwW;OFr-*-=Z28pSCa1>a>qT6BrAMD=w2M-p~5 zg@V(O@XSag6wVKZBKf1Cnc#61A5*9_&Y>tvEx(p*T(sdlF0q^Hn)EH3wVsI5O;H2o zf-c2Cs;q%jJOim{gc)Qo1DTL8PpfnE@^NY%S^6sOUPfN}*cztNgYwT9UqN^oy9F_= z5TVOUc*bYY`_rG}dCv=)7JZl!kq!}gA*RqLh!8qjDe>a^ygnkydM zPtM)CoVShxT&Klns4wo&)u0)=9J#KB`%T?8JjQidC^^5mLuhG2V-sB~@a=TyhTBl$ z$d%mim`dH~F_ivD&Ts3BJ7@ou9cBtqXh?A65``!-B?j(Lw!t{L|5LV19D|=4mG?+D zy?nTN*`k4%V!S(r;x2ml6>#M4IF1;YZ@B!P<_aBjgx>5}2ks)4537gz@1->qi%zhD zek!~w6v{Lb0Cfp@QO^oq*-Cjemf|o|5c5-X)wNwDis+Z4>9TA-QT3+BFmiISFs$9Y|5b(LJVKnzn}b){#Kg=Omh5 zF?gQ(zUjTl%*>_^`9PO7-<>vmXl`gUH|%}D%+&N7mx;>}JgZ2t7SGMYF%P+S9q0A* z3#<5KBmU!`;xn$r22;G2&+&yZzmT%0>PviOeuMuH@Zs=Ky* YT*cqSt}0FJg0hD1wue3w%y$4FCWD diff --git a/ts-core/ts-proxy/build.gradle.kts b/ts-core/ts-proxy/build.gradle.kts index 5afc5af..2db7ced 100644 --- a/ts-core/ts-proxy/build.gradle.kts +++ b/ts-core/ts-proxy/build.gradle.kts @@ -20,3 +20,7 @@ artifacts { tasks.withType().configureEach { kotlinOptions.freeCompilerArgs += "-Xjvm-default=all" } + +tasks.withType() { + jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") +} diff --git a/ts-core/ts-proxy/src/main/kotlin/cn/tursom/proxy/Proxy.kt b/ts-core/ts-proxy/src/main/kotlin/cn/tursom/proxy/Proxy.kt index 2ac7c70..7196ce8 100644 --- a/ts-core/ts-proxy/src/main/kotlin/cn/tursom/proxy/Proxy.kt +++ b/ts-core/ts-proxy/src/main/kotlin/cn/tursom/proxy/Proxy.kt @@ -37,22 +37,27 @@ object Proxy { inline operator fun get( clazz: Class, container: MutableProxyContainer = defaultContainer(), + useDirectAccessor: Boolean = false, builder: (Class) -> T, ): Pair { val target = getCachedTarget(clazz) - val directAccessor = builder(target) val obj = builder(target) + val directAccessor = if (useDirectAccessor) builder(target) else obj container.target = obj - container.ctx[directAccessorKey] = directAccessor + if (useDirectAccessor) container.ctx[directAccessorKey] = directAccessor injectCallback(obj as Factory, container, directAccessor as Factory) return obj to container } - inline fun get() = get(T::class.java) + inline fun get( + container: MutableProxyContainer = defaultContainer(), + useDirectAccessor: Boolean = false, + ) = get(T::class.java, container, useDirectAccessor) + inline operator fun get( argumentTypes: Array>, arguments: Array, @@ -122,15 +127,20 @@ object Proxy { container, ) - operator fun get(clazz: Class, container: MutableProxyContainer = defaultContainer()) = - get(clazz, container, Class::newInstance) + operator fun get( + clazz: Class, + container: MutableProxyContainer = defaultContainer(), + useDirectAccessor: Boolean = false, + ) = + get(clazz, container, useDirectAccessor, Class::newInstance) operator fun get( clazz: Class, argumentTypes: Array>, arguments: Array, container: MutableProxyContainer = defaultContainer(), - ) = get(clazz, container) { + useDirectAccessor: Boolean = false, + ) = get(clazz, container, useDirectAccessor) { it.getConstructor(*argumentTypes).newInstance(*arguments) } diff --git a/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/Example.kt b/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/Example.kt index fe1c165..e26ca98 100644 --- a/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/Example.kt +++ b/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/Example.kt @@ -68,7 +68,7 @@ class Example { @Test fun test() { - val (t, container) = Proxy.get() + val (t, container) = Proxy.get(useDirectAccessor = true) val getA = GetA(t) println(getA.t == t) diff --git a/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/main.kt b/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/main.kt deleted file mode 100644 index be8bdd6..0000000 --- a/ts-core/ts-proxy/src/test/kotlin/cn/tursom/proxy/main.kt +++ /dev/null @@ -1,15 +0,0 @@ -package cn.tursom.proxy - - -fun b() { - repeat(9) { i -> repeat(i) { j -> print("$j*$i=${i * j} ") };println() } -} - -fun a() { - repeat(9) { i -> repeat(i) { j -> print("$j*$i=${i * j} ") };println() } -} - -fun main() { - (1..9).map { i -> println((1..i).map { "$it*$i=${i * it}" }) } -} - diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialect.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialect.kt index 263bd35..97b9e15 100644 --- a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialect.kt +++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialect.kt @@ -14,11 +14,11 @@ class ExtSqlDialect( override fun createSqlFormatter(database: Database, beautifySql: Boolean, indentSize: Int): SqlFormatter { val formatter = sqlDialect.createSqlFormatter(database, beautifySql, indentSize) val (proxyFormatter, container) = Proxy.get(formatter.javaClass) { InstantAllocator(it) } - run { - val extSqlFormatter = ExtSqlFormatter(formatter) - extSqlFormatter.registerVisitor(DirectSqlExpression.visitor) - container.addProxy(extSqlFormatter) - } + + val extSqlFormatter = ExtSqlFormatter(formatter) + extSqlFormatter.registerVisitor(DirectSqlExpression.visitor) + container.addProxy(extSqlFormatter) + formatter.javaClass.allFieldsSequence.forEach { field -> field.isAccessible = true field.set(proxyFormatter, field.get(formatter)) diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlFormatter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlFormatter.kt index 0d6c3fa..5b52140 100644 --- a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlFormatter.kt +++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/ext/ExtSqlFormatter.kt @@ -1,13 +1,12 @@ package cn.tursom.database.ktorm.ext -import cn.tursom.proxy.function.ProxyMethod import cn.tursom.reflect.asm.ReflectAsmKtField import org.ktorm.expression.SqlExpression import org.ktorm.expression.SqlFormatter class ExtSqlFormatter( private val prevFormatter: SqlFormatter, -) : ProxyMethod { +) { companion object { private val builderField = ReflectAsmKtField.get("_builder") } diff --git a/ts-database/ts-ktorm/src/test/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialectTest.kt b/ts-database/ts-ktorm/src/test/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialectTest.kt index 79e1378..b8a5bbf 100644 --- a/ts-database/ts-ktorm/src/test/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialectTest.kt +++ b/ts-database/ts-ktorm/src/test/kotlin/cn/tursom/database/ktorm/ext/ExtSqlDialectTest.kt @@ -19,4 +19,12 @@ internal class ExtSqlDialectTest { formatter.visit(IntSqlType sql "select count(*) from user u where u.uid = subscribe.mid" eq 0) println(formatter.sql) } -} \ No newline at end of file +} + + +data class User(var name: String, var age: Int) + + +fun main() { + +} diff --git a/ts-gradle/README.md b/ts-gradle/README.md new file mode 100644 index 0000000..517d4f6 --- /dev/null +++ b/ts-gradle/README.md @@ -0,0 +1,5 @@ +## 模块介绍 + +本模块负责管理各种通用的 gradle 插件,并提供给本项目使用。目前已有的各种插件如下: + +- ts-gradle-env: 提供各种环境支持,包括将 yaml 与 properties 文件的内容读取到 ext 中,以及提供一些 diff --git a/ts-gradle/settings.gradle.kts b/ts-gradle/settings.gradle.kts index 1d4265b..21ea64f 100644 --- a/ts-gradle/settings.gradle.kts +++ b/ts-gradle/settings.gradle.kts @@ -1,5 +1,5 @@ include("ts-gradle-env") -include("ts-gradle-no-test") +include("ts-gradle-test") include("ts-gradle-install") include("ts-gradle-publish") include("ts-gradle-repos") diff --git a/ts-gradle/ts-gradle-no-test/build.gradle.kts b/ts-gradle/ts-gradle-no-test/build.gradle.kts deleted file mode 100644 index b0dd312..0000000 --- a/ts-gradle/ts-gradle-no-test/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -gradlePlugin { - plugins { - create("ts-gradle-no-test") { - id = "ts-gradle-no-test" - implementationClass = "cn.tursom.gradle.NoTestPlugin" - } - } -} diff --git a/ts-gradle/ts-gradle-no-test/src/main/kotlin/cn/tursom/gradle/NoTestPlugin.kt b/ts-gradle/ts-gradle-no-test/src/main/kotlin/cn/tursom/gradle/NoTestPlugin.kt deleted file mode 100644 index e9b2e7f..0000000 --- a/ts-gradle/ts-gradle-no-test/src/main/kotlin/cn/tursom/gradle/NoTestPlugin.kt +++ /dev/null @@ -1,31 +0,0 @@ -package cn.tursom.gradle - -import org.gradle.api.Plugin -import org.gradle.api.Project - -class NoTestPlugin : Plugin { - override fun apply(target: Project) { - target.excludeTest() - } -} - -fun Project.excludeTest() { - if (gradle.startParameter.taskNames.firstOrNull { taskName -> - taskName.contains("test", true) - } == null) { - try { - tasks.run { - named("test") { it.enabled = false } - named("testClasses") { it.enabled = false } - named("compileTestJava") { it.enabled = false } - try { - named("compileTestKotlin") { it.enabled = false } - } catch (_: Exception) { - } - named("processTestResources") { it.enabled = false } - } - } catch (e: Exception) { - println("W: exclude tests failed with ${e.javaClass.name}: ${e.message}") - } - } -} diff --git a/ts-gradle/ts-gradle-test/build.gradle.kts b/ts-gradle/ts-gradle-test/build.gradle.kts new file mode 100644 index 0000000..9f69baf --- /dev/null +++ b/ts-gradle/ts-gradle-test/build.gradle.kts @@ -0,0 +1,8 @@ +gradlePlugin { + plugins { + create("ts-gradle-test") { + id = "ts-gradle-test" + implementationClass = "cn.tursom.gradle.TestPlugin" + } + } +} diff --git a/ts-gradle/ts-gradle-test/src/main/kotlin/cn/tursom/gradle/TestPlugin.kt b/ts-gradle/ts-gradle-test/src/main/kotlin/cn/tursom/gradle/TestPlugin.kt new file mode 100644 index 0000000..b8525ab --- /dev/null +++ b/ts-gradle/ts-gradle-test/src/main/kotlin/cn/tursom/gradle/TestPlugin.kt @@ -0,0 +1,38 @@ +package cn.tursom.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.testing.Test + +class TestPlugin : Plugin { + override fun apply(target: Project) { + if (target.isTestTask()) { + target.tasks.withType(Test::class.java) { + it.jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED") + } + } else { + target.excludeTest() + } + } +} + +fun Project.excludeTest() { + try { + tasks.run { + named("test") { it.enabled = false } + named("testClasses") { it.enabled = false } + named("compileTestJava") { it.enabled = false } + try { + named("compileTestKotlin") { it.enabled = false } + } catch (_: Exception) { + } + named("processTestResources") { it.enabled = false } + } + } catch (e: Exception) { + println("W: exclude tests failed with ${e.javaClass.name}: ${e.message}") + } +} + +fun Project.isTestTask() = gradle.startParameter.taskNames.any { taskName -> + taskName.contains("test", true) +}