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;
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue