diff --git a/src/dev/peerat/framework/Router.java b/src/dev/peerat/framework/Router.java index 6e5c5fd..fd0d1d1 100644 --- a/src/dev/peerat/framework/Router.java +++ b/src/dev/peerat/framework/Router.java @@ -1,23 +1,31 @@ package dev.peerat.framework; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; import java.security.Key; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; +import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import org.jose4j.jwa.AlgorithmConstraints.ConstraintType; +import org.jose4j.jwk.JsonWebKey.OutputControlLevel; import org.jose4j.jwk.RsaJsonWebKey; import org.jose4j.jwk.RsaJwkGenerator; -import org.jose4j.jwk.JsonWebKey.OutputControlLevel; import org.jose4j.jws.AlgorithmIdentifiers; import org.jose4j.jws.JsonWebSignature; import org.jose4j.jwt.JwtClaims; @@ -28,10 +36,6 @@ import org.jose4j.lang.JoseException; public class Router{ - public static void main(String[] args) { - - } - private Locker logger; private Locker exceptions; private RouteMapper[] mappers; @@ -105,6 +109,70 @@ public class Router{ } return this; } + + public Router registerPackages(Object... injections){ + String clazz = Thread.currentThread().getStackTrace()[2].getClassName(); + String pack = clazz.substring(0, clazz.lastIndexOf('.')); + return registerPackages(pack, injections); + } + + public Router registerPackages(String name, Object... injections){ + InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream(name.replace(".", "/")); + try{ + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + String line; + Map, Object> cache = new HashMap<>(); + while((line = reader.readLine()) != null){ + if(line.endsWith(".class")){ + Class clazz = Class.forName(name+"."+line.substring(0, line.lastIndexOf('.'))); + if(Response.class.isAssignableFrom(clazz)){ + if(clazz.equals(Response.class)) continue; + Constructor[] constructors = clazz.getDeclaredConstructors(); + if(constructors.length != 1) continue; + injectDependencies(constructors[0], cache, injections); + } + }else{ + registerPackages(name+"."+line); + } + } + reader.close(); + }catch(Exception e){ + e.printStackTrace(); + } + return this; + } + + private void injectDependencies(Constructor constructor, Map, Object> cache, Object... injections){ + Class[] parameterTypes = constructor.getParameterTypes(); + Object[] parameters = new Object[parameterTypes.length]; + for(int i = 0; i < parameterTypes.length; i++){ + Class type = parameterTypes[i]; + Object dependency = cache.get(type); + if(dependency != null){ + parameters[i] = dependency; + }else{ + for(Object injection : injections){ + if(type.isAssignableFrom(injection.getClass())){ + if(cache.containsKey(type)){ + throw new IllegalArgumentException("Double dependency for type "+type); + }else{ + cache.put(type, injection); + parameters[i] = injection; + } + } + } + if(parameters[i] == null) throw new IllegalArgumentException("No dependency for type "+type); + } + } + try { + Response response = (Response) constructor.newInstance(parameters); + register(response); + System.out.println("registerd "+response.getClass()); + } catch (Exception e){ + e.printStackTrace(); + } + + } public Router setDefault(Response response){ this.noFileFound = response;