From 8ef0e1603fab606149ca834462e796fa609cec13 Mon Sep 17 00:00:00 2001 From: IceCream Date: Tue, 7 Jul 2020 16:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20After?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../com/IceCreamQAQ/Yu/annotation/After.java | 14 +++++++++++ .../Yu/controller/NewActionContext.kt | 4 +-- .../Yu/controller/NewControllerLoader.kt | 25 +++++++++++++++---- .../Yu/controller/router/NewRouter.kt | 6 ++++- .../test/yu/controller/TestNewController.kt | 6 +++++ 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 71bbc4e7..a55bcd81 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ jar 4.0.0 - 0.1.3.0-SNAPSHOTS + 0.1.3.0 com.IceCreamQAQ diff --git a/src/main/java/com/IceCreamQAQ/Yu/annotation/After.java b/src/main/java/com/IceCreamQAQ/Yu/annotation/After.java index 7261d62e..a4701979 100644 --- a/src/main/java/com/IceCreamQAQ/Yu/annotation/After.java +++ b/src/main/java/com/IceCreamQAQ/Yu/annotation/After.java @@ -1,4 +1,18 @@ package com.IceCreamQAQ.Yu.annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) public @interface After { + + int value() default 0; + + String[] except() default ""; + + String[] only() default ""; + } diff --git a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewActionContext.kt b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewActionContext.kt index e947ab20..1e3e8475 100644 --- a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewActionContext.kt +++ b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewActionContext.kt @@ -10,7 +10,7 @@ interface NewActionContext { operator fun set(name: String, obj: Any) fun onError(e: Throwable): Throwable? - fun onSuccess(result: Any): Any? + fun onSuccess(result: Any?): Any? } @@ -29,7 +29,7 @@ class NewActionContextImpl : NewActionContext { override fun onError(e: Throwable): Throwable = e - override fun onSuccess(result: Any): Any? { + override fun onSuccess(result: Any?): Any? { this.result = result return null } diff --git a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewControllerLoader.kt b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewControllerLoader.kt index fc66d7d9..95eb2498 100644 --- a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewControllerLoader.kt +++ b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/NewControllerLoader.kt @@ -1,9 +1,6 @@ package com.IceCreamQAQ.Yu.controller -import com.IceCreamQAQ.Yu.annotation.Action -import com.IceCreamQAQ.Yu.annotation.Before -import com.IceCreamQAQ.Yu.annotation.Path -import com.IceCreamQAQ.Yu.annotation.With +import com.IceCreamQAQ.Yu.annotation.* import com.IceCreamQAQ.Yu.controller.router.* import com.IceCreamQAQ.Yu.di.YuContext import com.IceCreamQAQ.Yu.loader.LoadItem @@ -69,11 +66,18 @@ abstract class NewControllerLoader : Loader { val methods = controllerClass.methods val befores = HashMap() + val afters = HashMap() + for (method in allMethods) { val before = method.getAnnotation(Before::class.java) if (before != null) { val beforeInvoker = createMethodInvoker(instance, method) - befores[before] = (beforeInvoker) + befores[before] = beforeInvoker + } + val after = method.getAnnotation(After::class.java) + if (after != null) { + val afterInvoker = createMethodInvoker(instance, method) + afters[after] = afterInvoker } } // val before = befores.toTypedArray() @@ -101,8 +105,19 @@ abstract class NewControllerLoader : Loader { } abs.add(invoker) } + val aas = ArrayList() + w@ for ((after, invoker) in afters) { + if (after.except.size != 1 || after.except[0] != "") for (s in after.except) { + if (s == actionMethodName) continue@w + } + if (after.only.size != 1 || after.only[0] != "") for (s in after.only) { + if (s != actionMethodName) continue@w + } + aas.add(invoker) + } actionInvoker.befores = abs.toTypedArray() + actionInvoker.afters = aas.toTypedArray() val mi = getMatchItem(actionPath, actionInvoker) diff --git a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/router/NewRouter.kt b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/router/NewRouter.kt index f3db3448..f4c57aa0 100644 --- a/src/main/kotlin/com/IceCreamQAQ/Yu/controller/router/NewRouter.kt +++ b/src/main/kotlin/com/IceCreamQAQ/Yu/controller/router/NewRouter.kt @@ -73,8 +73,12 @@ open class NewActionInvoker(level: Int, method: Method, instance: Any) : NewRout val o = before.invoke(context) if (o != null) context[o::class.java.simpleName.toLowerCaseFirstOne()] = o } - val result = invoker.invoke(context) ?: return true + val result = invoker.invoke(context) context.onSuccess(result) + for (after in afters) { + val o = after.invoke(context) + if (o != null) context[o::class.java.simpleName.toLowerCaseFirstOne()] = o + } } catch (e: Exception) { throw context.onError(e) ?: return true } diff --git a/src/test/kotlin/com/icecreamqaq/test/yu/controller/TestNewController.kt b/src/test/kotlin/com/icecreamqaq/test/yu/controller/TestNewController.kt index 2e83d98f..5052385f 100644 --- a/src/test/kotlin/com/icecreamqaq/test/yu/controller/TestNewController.kt +++ b/src/test/kotlin/com/icecreamqaq/test/yu/controller/TestNewController.kt @@ -1,6 +1,7 @@ package com.icecreamqaq.test.yu.controller import com.IceCreamQAQ.Yu.annotation.Action +import com.IceCreamQAQ.Yu.annotation.After import com.IceCreamQAQ.Yu.annotation.NewDefaultController import com.IceCreamQAQ.Yu.annotation.Path import com.icecreamqaq.test.yu.annotation.TestHook @@ -14,6 +15,11 @@ class TestNewController { @Action("m{abc}b{bbc}") fun mb(abc: String, bbc: String) = "mb: abc = $abc, bbc = $bbc." + @After + fun after(){ + println("TestNewControllerAfter") + } + } @Path("11")