add context Object to check methods and create the ability to have a specific method for each type of context or one for all by using the superclass and casting yourself
This commit is contained in:
parent
019ba8f552
commit
659218682e
@ -2,22 +2,36 @@ package net.tomatentum.marinara.checks;
|
|||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import net.tomatentum.marinara.util.ReflectionUtil;
|
||||||
|
|
||||||
public record AppliedCheck(InteractionCheck<?> check, Annotation annotation) {
|
public record AppliedCheck(InteractionCheck<?> check, Annotation annotation) {
|
||||||
|
|
||||||
public boolean pre() {
|
public boolean pre(Object context) {
|
||||||
|
Method[] methods = Arrays.stream(check.getClass().getMethods())
|
||||||
|
.filter(x -> x.getName().equals("preExec"))
|
||||||
|
.toArray(s -> new Method[s]);
|
||||||
|
Method method = ReflectionUtil.getMostSpecificMethod(methods, context.getClass());
|
||||||
|
method.setAccessible(true);
|
||||||
try {
|
try {
|
||||||
return (boolean) check.getClass().getMethod("preExec", annotation.getClass()).invoke(check, annotation);
|
return (boolean) method.invoke(check, annotation);
|
||||||
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
} catch (IllegalAccessException | InvocationTargetException | SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean post() {
|
public boolean post(Object context) {
|
||||||
|
Method[] methods = Arrays.stream(check.getClass().getMethods())
|
||||||
|
.filter(x -> x.getName().equals("postExec"))
|
||||||
|
.toArray(s -> new Method[s]);
|
||||||
|
Method method = ReflectionUtil.getMostSpecificMethod(methods, context.getClass());
|
||||||
|
method.setAccessible(true);
|
||||||
try {
|
try {
|
||||||
return (boolean) check.getClass().getMethod("postExec", annotation.getClass()).invoke(check, annotation);
|
return (boolean) method.invoke(check, annotation);
|
||||||
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
} catch (IllegalAccessException | InvocationTargetException | SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import java.lang.annotation.Annotation;
|
|||||||
|
|
||||||
public interface InteractionCheck<A extends Annotation> {
|
public interface InteractionCheck<A extends Annotation> {
|
||||||
|
|
||||||
public boolean preExec(A annotation);
|
public boolean preExec(Object context, A annotation);
|
||||||
public boolean postExec(A annotation);
|
public boolean postExec(Object context, A annotation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public abstract class InteractionMethod {
|
|||||||
public abstract InteractionType getType();
|
public abstract InteractionType getType();
|
||||||
|
|
||||||
public void run(Object context) {
|
public void run(Object context) {
|
||||||
this.appliedChecks.forEach(AppliedCheck::pre);
|
this.appliedChecks.forEach(x -> x.pre(context));
|
||||||
|
|
||||||
method.setAccessible(true);
|
method.setAccessible(true);
|
||||||
try {
|
try {
|
||||||
@ -69,7 +69,7 @@ public abstract class InteractionMethod {
|
|||||||
throw new RuntimeException(ex);
|
throw new RuntimeException(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.appliedChecks.forEach(AppliedCheck::post);
|
this.appliedChecks.forEach(x -> x.post(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Method getMethod() {
|
public Method getMethod() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user