Add Route Interceptor system

This commit is contained in:
jeffcheasey88 2024-03-13 11:07:47 +01:00
parent 2f8f158e2a
commit d6ca7c5092
3 changed files with 31 additions and 4 deletions

View file

@ -0,0 +1,9 @@
package dev.peerat.framework;
import java.util.regex.Matcher;
public interface RouteInterceptor{
boolean intercept(Matcher matcher, Context context, HttpReader reader, HttpWriter writer);
}

View file

@ -1,6 +1,8 @@
package dev.peerat.framework; package dev.peerat.framework;
import java.lang.reflect.Method;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -11,6 +13,7 @@ public class RouteMapper<U extends User>{
private Router<U> router; private Router<U> router;
private Response[] responses; private Response[] responses;
private Method[] methods;
private Route[] routes; private Route[] routes;
private Pattern[] patterns; private Pattern[] patterns;
private int[] calls; private int[] calls;
@ -19,13 +22,15 @@ public class RouteMapper<U extends User>{
public RouteMapper(Router<U> router){ public RouteMapper(Router<U> router){
this.router = router; this.router = router;
this.responses = new Response[0]; this.responses = new Response[0];
this.methods = new Method[0];
this.routes = new Route[0]; this.routes = new Route[0];
this.patterns = new Pattern[0]; this.patterns = new Pattern[0];
} }
public void register(Response response, Route route, Pattern pattern){ public void register(Response response, Method method, Route route, Pattern pattern){
int length = responses.length+1; int length = responses.length+1;
this.responses = addElement(responses, new Response[length], response); this.responses = addElement(responses, new Response[length], response);
this.methods = addElement(methods, new Method[length], method);
this.routes = addElement(routes, new Route[length], route); this.routes = addElement(routes, new Route[length], route);
this.patterns = addElement(patterns, new Pattern[length], pattern); this.patterns = addElement(patterns, new Pattern[length], pattern);
if(this.calls != null) this.calls = new int[length]; if(this.calls != null) this.calls = new int[length];
@ -36,7 +41,7 @@ public class RouteMapper<U extends User>{
this.dif = 2; this.dif = 2;
} }
public boolean exec(Context context, HttpReader reader, HttpWriter writer) throws Exception{ public boolean exec(Context context, HttpReader reader, HttpWriter writer, List<RouteInterceptor> interceptors) throws Exception{
Response result = null; Response result = null;
Matcher matcher = null; Matcher matcher = null;
@ -69,6 +74,9 @@ public class RouteMapper<U extends User>{
} }
} }
if(result != null){ if(result != null){
for(RouteInterceptor interceptor : interceptors){
if(!interceptor.intercept(matcher, context, reader, writer)) return true;
}
result.exec(matcher, context, reader, writer); result.exec(matcher, context, reader, writer);
return true; return true;
} }
@ -86,6 +94,7 @@ public class RouteMapper<U extends User>{
if(index < 1) return; if(index < 1) return;
if(call > this.calls[index-1]){ if(call > this.calls[index-1]){
switchElement(responses, index, index-1); switchElement(responses, index, index-1);
switchElement(methods, index, index-1);
switchElement(routes, index, index-1); switchElement(routes, index, index-1);
switchElement(patterns, index, index-1); switchElement(patterns, index, index-1);

View file

@ -3,6 +3,8 @@ package dev.peerat.framework;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -29,6 +31,7 @@ public class Router<U extends User>{
private Locker<Context> logger; private Locker<Context> logger;
private RouteMapper<U>[] mappers; private RouteMapper<U>[] mappers;
private List<RouteInterceptor> interceptors;
private Response noFileFound; private Response noFileFound;
private RsaJsonWebKey rsaJsonWebKey; private RsaJsonWebKey rsaJsonWebKey;
private JwtConsumer jwtConsumer; private JwtConsumer jwtConsumer;
@ -41,6 +44,7 @@ public class Router<U extends User>{
this.logger = new Locker<>(); this.logger = new Locker<>();
int types = RequestType.values().length; int types = RequestType.values().length;
this.mappers = new RouteMapper[types]; this.mappers = new RouteMapper[types];
this.interceptors = new ArrayList<>();
for(RequestType type : RequestType.values()) this.mappers[type.ordinal()] = new RouteMapper<>(this); for(RequestType type : RequestType.values()) this.mappers[type.ordinal()] = new RouteMapper<>(this);
this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048); this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
this.headers = new String[types][0]; this.headers = new String[types][0];
@ -76,7 +80,7 @@ public class Router<U extends User>{
Response.class.getDeclaredMethods()[0].getParameterTypes()); Response.class.getDeclaredMethods()[0].getParameterTypes());
Route route = method.getAnnotation(Route.class); Route route = method.getAnnotation(Route.class);
this.mappers[route.type().ordinal()].register(response, route, Pattern.compile(route.path())); this.mappers[route.type().ordinal()].register(response, method, route, Pattern.compile(route.path()));
}catch(Exception e){ }catch(Exception e){
throw new IllegalArgumentException(e); throw new IllegalArgumentException(e);
} }
@ -88,6 +92,11 @@ public class Router<U extends User>{
return this; return this;
} }
public Router<U> addInterceptor(RouteInterceptor interceptor){
this.interceptors.add(interceptor);
return this;
}
public Router<U> activeReOrdering(){ public Router<U> activeReOrdering(){
for(RouteMapper<?> mapper : this.mappers) mapper.activeReOrdering(); for(RouteMapper<?> mapper : this.mappers) mapper.activeReOrdering();
return this; return this;
@ -98,7 +107,7 @@ public class Router<U extends User>{
} }
void exec(Context context, HttpReader reader, HttpWriter writer) throws Exception{ void exec(Context context, HttpReader reader, HttpWriter writer) throws Exception{
if(this.mappers[context.getType().ordinal()].exec(context, reader, writer)) return; if(this.mappers[context.getType().ordinal()].exec(context, reader, writer, this.interceptors)) return;
if(noFileFound != null) noFileFound.exec(null, context, reader, writer); if(noFileFound != null) noFileFound.exec(null, context, reader, writer);
} }