Add Route Interceptor system
This commit is contained in:
parent
2f8f158e2a
commit
d6ca7c5092
3 changed files with 31 additions and 4 deletions
9
src/dev/peerat/framework/RouteInterceptor.java
Normal file
9
src/dev/peerat/framework/RouteInterceptor.java
Normal 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);
|
||||
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
package dev.peerat.framework;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
@ -11,6 +13,7 @@ public class RouteMapper<U extends User>{
|
|||
private Router<U> router;
|
||||
|
||||
private Response[] responses;
|
||||
private Method[] methods;
|
||||
private Route[] routes;
|
||||
private Pattern[] patterns;
|
||||
private int[] calls;
|
||||
|
@ -19,13 +22,15 @@ public class RouteMapper<U extends User>{
|
|||
public RouteMapper(Router<U> router){
|
||||
this.router = router;
|
||||
this.responses = new Response[0];
|
||||
this.methods = new Method[0];
|
||||
this.routes = new Route[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;
|
||||
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.patterns = addElement(patterns, new Pattern[length], pattern);
|
||||
if(this.calls != null) this.calls = new int[length];
|
||||
|
@ -36,7 +41,7 @@ public class RouteMapper<U extends User>{
|
|||
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;
|
||||
Matcher matcher = null;
|
||||
|
||||
|
@ -69,6 +74,9 @@ public class RouteMapper<U extends User>{
|
|||
}
|
||||
}
|
||||
if(result != null){
|
||||
for(RouteInterceptor interceptor : interceptors){
|
||||
if(!interceptor.intercept(matcher, context, reader, writer)) return true;
|
||||
}
|
||||
result.exec(matcher, context, reader, writer);
|
||||
return true;
|
||||
}
|
||||
|
@ -86,6 +94,7 @@ public class RouteMapper<U extends User>{
|
|||
if(index < 1) return;
|
||||
if(call > this.calls[index-1]){
|
||||
switchElement(responses, index, index-1);
|
||||
switchElement(methods, index, index-1);
|
||||
switchElement(routes, index, index-1);
|
||||
switchElement(patterns, index, index-1);
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ package dev.peerat.framework;
|
|||
import java.lang.reflect.Method;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -29,6 +31,7 @@ public class Router<U extends User>{
|
|||
|
||||
private Locker<Context> logger;
|
||||
private RouteMapper<U>[] mappers;
|
||||
private List<RouteInterceptor> interceptors;
|
||||
private Response noFileFound;
|
||||
private RsaJsonWebKey rsaJsonWebKey;
|
||||
private JwtConsumer jwtConsumer;
|
||||
|
@ -41,6 +44,7 @@ public class Router<U extends User>{
|
|||
this.logger = new Locker<>();
|
||||
int types = RequestType.values().length;
|
||||
this.mappers = new RouteMapper[types];
|
||||
this.interceptors = new ArrayList<>();
|
||||
for(RequestType type : RequestType.values()) this.mappers[type.ordinal()] = new RouteMapper<>(this);
|
||||
this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
|
||||
this.headers = new String[types][0];
|
||||
|
@ -76,7 +80,7 @@ public class Router<U extends User>{
|
|||
Response.class.getDeclaredMethods()[0].getParameterTypes());
|
||||
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){
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
|
@ -88,6 +92,11 @@ public class Router<U extends User>{
|
|||
return this;
|
||||
}
|
||||
|
||||
public Router<U> addInterceptor(RouteInterceptor interceptor){
|
||||
this.interceptors.add(interceptor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Router<U> activeReOrdering(){
|
||||
for(RouteMapper<?> mapper : this.mappers) mapper.activeReOrdering();
|
||||
return this;
|
||||
|
@ -98,7 +107,7 @@ public class Router<U extends User>{
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue