diff --git a/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java b/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java index fd9a4b1..4d200d3 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java +++ b/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java @@ -34,10 +34,10 @@ public class BadgeDetails implements Response { JSONObject badgeJSON = new JSONObject(); if (badge != null) { badgeJSON.put("name", badge.getName()); - if(badge.getLogo() != null) badgeJSON.put("logo", new String(Base64.getEncoder().encode(badge.getLogo()))); + if(badge.getLogo() != null) badgeJSON.put("logo", Base64.getEncoder().encodeToString(badge.getLogo())); badgeJSON.put("level", badge.getLevel()); } - writer.write(badgeJSON.toJSONString()); + writer.write(badgeJSON.toJSONString().replace("\\", "")); } else { HttpUtil.responseHeaders(writer, 400, "Access-Control-Allow-Origin: *"); @@ -48,4 +48,4 @@ public class BadgeDetails implements Response { public Pattern getPattern() { return Pattern.compile("^\\/badge\\/([0-9]+)$"); } -} +} \ No newline at end of file diff --git a/src/be/jeffcheasey88/peeratcode/routes/Login.java b/src/be/jeffcheasey88/peeratcode/routes/Login.java index 3faf511..ae33b8d 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Login.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Login.java @@ -14,6 +14,7 @@ import be.jeffcheasey88.peeratcode.webserver.HttpReader; import be.jeffcheasey88.peeratcode.webserver.HttpUtil; import be.jeffcheasey88.peeratcode.webserver.HttpWriter; import be.jeffcheasey88.peeratcode.webserver.Response; +import be.jeffcheasey88.peeratcode.webserver.Route; import be.jeffcheasey88.peeratcode.webserver.Router; import be.jeffcheasey88.peeratcode.webserver.User; @@ -27,6 +28,7 @@ public class Login implements Response { this.router = router; } + @Route(path = "^\\/login$", type = "POST") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { if(user != null){ @@ -49,14 +51,4 @@ public class Login implements Response { HttpUtil.responseHeaders(writer, 403, "Access-Control-Allow-Origin: *"); } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/login$"); - } - - @Override - public String getType(){ - return "POST"; - } - } diff --git a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java index 4f602aa..d7b2a6d 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java @@ -8,9 +8,12 @@ import be.jeffcheasey88.peeratcode.webserver.HttpWriter; import be.jeffcheasey88.peeratcode.webserver.Response; import be.jeffcheasey88.peeratcode.webserver.User; +import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import java.util.Arrays; import java.util.Base64; +import java.util.SortedSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,9 +57,4 @@ public class PlayerDetails implements Response { public Pattern getPattern() { return Pattern.compile("^\\/player\\/(.+)?$"); } - - @Override - public boolean needLogin(){ - return true; - } } diff --git a/src/be/jeffcheasey88/peeratcode/webserver/Response.java b/src/be/jeffcheasey88/peeratcode/webserver/Response.java index 15bd790..2d7eec6 100644 --- a/src/be/jeffcheasey88/peeratcode/webserver/Response.java +++ b/src/be/jeffcheasey88/peeratcode/webserver/Response.java @@ -7,9 +7,4 @@ public interface Response{ void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception ; - Pattern getPattern(); - - default String getType(){ return "GET"; } - - default boolean needLogin() { return false; } } \ No newline at end of file diff --git a/src/be/jeffcheasey88/peeratcode/webserver/Router.java b/src/be/jeffcheasey88/peeratcode/webserver/Router.java index 58e8668..ccb7bc2 100644 --- a/src/be/jeffcheasey88/peeratcode/webserver/Router.java +++ b/src/be/jeffcheasey88/peeratcode/webserver/Router.java @@ -1,8 +1,11 @@ package be.jeffcheasey88.peeratcode.webserver; -import java.util.ArrayList; -import java.util.List; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.jose4j.jwk.RsaJsonWebKey; import org.jose4j.jwk.RsaJwkGenerator; @@ -15,7 +18,8 @@ import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; public class Router{ - private List responses; + private Map responses; + private Map patterns; private Response noFileFound; private RsaJsonWebKey rsaJsonWebKey; private DatabaseRepository repo; @@ -26,7 +30,8 @@ public class Router{ this.repo = repo; this.token_issuer = token_issuer; this.token_expiration = token_expiration; - this.responses = new ArrayList<>(); + this.responses = new HashMap<>(); + this.patterns = new HashMap<>(); this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048); } @@ -35,7 +40,15 @@ public class Router{ } public void register(Response response){ - this.responses.add(response); + try { + Method method = response.getClass().getDeclaredMethod("exec"); + Route route = method.getAnnotation(Route.class); + + this.responses.put(response, route); + this.patterns.put(response, Pattern.compile(route.path())); + } catch (Exception e){ + throw new IllegalArgumentException(e); + } } public void setDefault(Response response){ @@ -43,12 +56,12 @@ public class Router{ } public void exec(String type, String path, User user, HttpReader reader, HttpWriter writer) throws Exception { - for(Response response : this.responses){ - if(type.equals(response.getType())){ - Matcher matcher = response.getPattern().matcher(path); + for(Entry routes : this.responses.entrySet()){ + if(routes.getValue().type().equals(type)){ + Matcher matcher = this.patterns.get(routes.getKey()).matcher(path); if(matcher.matches()){ - if(user == null && response.needLogin()) return; - response.exec(matcher, user, reader, writer); + if(user == null && routes.getValue().needLogin()) return; + routes.getKey().exec(matcher, user, reader, writer); return; } }