diff --git a/src/dev/peerat/framework/RouteInterceptor.java b/src/dev/peerat/framework/RouteInterceptor.java new file mode 100644 index 0000000..34c7069 --- /dev/null +++ b/src/dev/peerat/framework/RouteInterceptor.java @@ -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); + +} diff --git a/src/dev/peerat/framework/RouteMapper.java b/src/dev/peerat/framework/RouteMapper.java index cf323ef..85f15b1 100644 --- a/src/dev/peerat/framework/RouteMapper.java +++ b/src/dev/peerat/framework/RouteMapper.java @@ -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{ private Router router; private Response[] responses; + private Method[] methods; private Route[] routes; private Pattern[] patterns; private int[] calls; @@ -19,13 +22,15 @@ public class RouteMapper{ public RouteMapper(Router 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{ this.dif = 2; } - public boolean exec(Context context, HttpReader reader, HttpWriter writer) throws Exception{ + public boolean exec(Context context, HttpReader reader, HttpWriter writer, List interceptors) throws Exception{ Response result = null; Matcher matcher = null; @@ -69,6 +74,9 @@ public class RouteMapper{ } } 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{ 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); diff --git a/src/dev/peerat/framework/Router.java b/src/dev/peerat/framework/Router.java index a222eca..106ecd0 100644 --- a/src/dev/peerat/framework/Router.java +++ b/src/dev/peerat/framework/Router.java @@ -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{ private Locker logger; private RouteMapper[] mappers; + private List interceptors; private Response noFileFound; private RsaJsonWebKey rsaJsonWebKey; private JwtConsumer jwtConsumer; @@ -41,6 +44,7 @@ public class Router{ 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{ 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{ return this; } + public Router addInterceptor(RouteInterceptor interceptor){ + this.interceptors.add(interceptor); + return this; + } + public Router activeReOrdering(){ for(RouteMapper mapper : this.mappers) mapper.activeReOrdering(); return this; @@ -98,7 +107,7 @@ public class Router{ } 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); }