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")