From d4fcf57144f8b3a1329032b48d2992c400dab8db Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Sat, 18 Mar 2023 15:14:03 +0100 Subject: [PATCH] Upgrade Route System --- src/be/jeffcheasey88/peeratcode/Main.java | 17 ++------------ .../peeratcode/routes/BadgeDetails.java | 10 ++------- .../peeratcode/routes/ChapterElement.java | 8 ++----- .../peeratcode/routes/ChapterList.java | 19 +++++++--------- .../peeratcode/routes/Leaderboard.java | 22 ++++++++----------- .../peeratcode/routes/PlayerDetails.java | 20 ++++++----------- .../peeratcode/routes/PuzzleElement.java | 7 ++---- .../peeratcode/routes/PuzzleResponse.java | 17 ++------------ .../peeratcode/routes/Register.java | 12 ++-------- .../peeratcode/routes/Result.java | 13 +++-------- .../peeratcode/webserver/Route.java | 16 ++++++++++++++ .../peeratcode/webserver/Router.java | 2 +- 12 files changed, 56 insertions(+), 107 deletions(-) create mode 100644 src/be/jeffcheasey88/peeratcode/webserver/Route.java diff --git a/src/be/jeffcheasey88/peeratcode/Main.java b/src/be/jeffcheasey88/peeratcode/Main.java index a086611..0100274 100644 --- a/src/be/jeffcheasey88/peeratcode/Main.java +++ b/src/be/jeffcheasey88/peeratcode/Main.java @@ -28,6 +28,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; @@ -41,12 +42,6 @@ public class Main { Router router = new Router(new DatabaseRepository(config), config.getTokenIssuer(), config.getTokenExpiration()); router.setDefault(new Response(){ - - @Override - public Pattern getPattern(){ - return null; - } - @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 404, "Access-Control-Allow-Origin: *"); @@ -57,10 +52,7 @@ public class Main { }); router.register(new Response(){ - @Override - public Pattern getPattern() { - return Pattern.compile("^(.*)$"); - } + @Route(path = "^(.*)$", type = "OPTIONS") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, @@ -68,11 +60,6 @@ public class Main { "Access-Control-Allow-Methods: *", "Access-Control-Allow-Headers: *"); } - - @Override - public String getType() { - return "OPTIONS"; - } }); initRoutes(router); diff --git a/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java b/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java index 4d200d3..e96aa5e 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java +++ b/src/be/jeffcheasey88/peeratcode/routes/BadgeDetails.java @@ -1,21 +1,18 @@ package be.jeffcheasey88.peeratcode.routes; import be.jeffcheasey88.peeratcode.model.Badge; -import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; 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.User; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; import java.util.Base64; -import java.util.SortedSet; import java.util.regex.Matcher; -import java.util.regex.Pattern; public class BadgeDetails implements Response { @@ -25,6 +22,7 @@ public class BadgeDetails implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/badge\\/([0-9]+)$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); @@ -44,8 +42,4 @@ public class BadgeDetails implements Response { } } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/badge\\/([0-9]+)$"); - } } \ No newline at end of file diff --git a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java index 69fe8f0..9823918 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/ChapterElement.java @@ -7,13 +7,13 @@ 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.User; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import java.util.regex.Matcher; -import java.util.regex.Pattern; public class ChapterElement implements Response { @@ -23,6 +23,7 @@ public class ChapterElement implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/chapter\\/([0-9]+)$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); @@ -46,11 +47,6 @@ public class ChapterElement implements Response { } } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/chapter\\/([0-9]+)$"); - } - private int extractId(Matcher matcher) { return Integer.parseInt(matcher.group(1)); } diff --git a/src/be/jeffcheasey88/peeratcode/routes/ChapterList.java b/src/be/jeffcheasey88/peeratcode/routes/ChapterList.java index e65bff4..14691d8 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/ChapterList.java +++ b/src/be/jeffcheasey88/peeratcode/routes/ChapterList.java @@ -1,20 +1,20 @@ package be.jeffcheasey88.peeratcode.routes; +import java.util.List; +import java.util.regex.Matcher; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + import be.jeffcheasey88.peeratcode.model.Chapter; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; 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.User; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class ChapterList implements Response { private final DatabaseRepository databaseRepo; @@ -23,6 +23,7 @@ public class ChapterList implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/chapters$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); @@ -39,8 +40,4 @@ public class ChapterList implements Response { } } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/chapters$"); - } } diff --git a/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java b/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java index 5f744bd..18ec65b 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Leaderboard.java @@ -1,21 +1,21 @@ package be.jeffcheasey88.peeratcode.routes; +import java.util.Base64; +import java.util.SortedSet; +import java.util.regex.Matcher; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; 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.User; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import java.util.Base64; -import java.util.SortedSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class Leaderboard implements Response { private final DatabaseRepository databaseRepo; @@ -24,6 +24,7 @@ public class Leaderboard implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/leaderboard$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, "Access-Control-Allow-Origin: *"); @@ -43,9 +44,4 @@ public class Leaderboard implements Response { } writer.write(playersJSON.toJSONString().replace("\\", "")); } - - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/leaderboard$"); - } } diff --git a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java index 697ba26..6f1839b 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PlayerDetails.java @@ -1,22 +1,19 @@ package be.jeffcheasey88.peeratcode.routes; +import java.util.Base64; +import java.util.regex.Matcher; + +import org.json.simple.JSONObject; + import be.jeffcheasey88.peeratcode.model.Player; import be.jeffcheasey88.peeratcode.repository.DatabaseRepository; 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.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; - public class PlayerDetails implements Response { private final DatabaseRepository databaseRepo; @@ -25,6 +22,7 @@ public class PlayerDetails implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/player\\/?(.+)?$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { Player player; @@ -53,8 +51,4 @@ public class PlayerDetails implements Response { } } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/player\\/?(.+)?$"); - } } diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java index d4224f9..8736e64 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleElement.java @@ -12,6 +12,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.User; public class PuzzleElement implements Response { @@ -22,6 +23,7 @@ public class PuzzleElement implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/puzzle\\/([0-9]+)$") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { HttpUtil.responseHeaders(writer, 200, @@ -39,11 +41,6 @@ public class PuzzleElement implements Response { } } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/puzzle\\/([0-9]+)$"); - } - private int extractId(Matcher matcher) { return Integer.parseInt(matcher.group(1)); } diff --git a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java index 16b5b74..2280102 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java +++ b/src/be/jeffcheasey88/peeratcode/routes/PuzzleResponse.java @@ -7,7 +7,6 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.json.simple.JSONObject; @@ -18,6 +17,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.User; public class PuzzleResponse implements Response { @@ -27,6 +27,7 @@ public class PuzzleResponse implements Response { this.databaseRepo = databaseRepo; } + @Route(path = "^\\/puzzleResponse\\/([0-9]+)$", type = "POST", needLogin = true) @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { ReceivedResponse received = new ReceivedResponse(matcher, reader); @@ -56,20 +57,6 @@ public class PuzzleResponse implements Response { } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/puzzleResponse\\/([0-9]+)$"); - } - - @Override - public String getType() { - return "POST"; - } - - @Override - public boolean needLogin(){ - return true; - } } class ReceivedResponse { diff --git a/src/be/jeffcheasey88/peeratcode/routes/Register.java b/src/be/jeffcheasey88/peeratcode/routes/Register.java index 5c45562..5e65bf4 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Register.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Register.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 Register implements Response { this.router = router; } + @Route(path = "^\\/register$", type = "POST") @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { if(user != null){ @@ -81,14 +83,4 @@ public class Register implements Response { Files.createDirectories(Paths.get(String.format(Player.PATH_TO_CODE, pseudo))); } - @Override - public Pattern getPattern() { - return Pattern.compile("^\\/register$"); - } - - @Override - public String getType() { - return "POST"; - } - } diff --git a/src/be/jeffcheasey88/peeratcode/routes/Result.java b/src/be/jeffcheasey88/peeratcode/routes/Result.java index ec57a1f..787d842 100644 --- a/src/be/jeffcheasey88/peeratcode/routes/Result.java +++ b/src/be/jeffcheasey88/peeratcode/routes/Result.java @@ -8,6 +8,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.User; public class Result implements Response{ @@ -17,7 +18,8 @@ public class Result implements Response{ public Result(DatabaseRepository repo){ this.repo = repo; } - + + @Route(path = "^\\/result\\/(\\d+)$", needLogin = true) @Override public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception { int puzzle = Integer.parseInt(matcher.group(1)); @@ -31,13 +33,4 @@ public class Result implements Response{ } } - @Override - public Pattern getPattern(){ - return Pattern.compile("^\\/result\\/(\\d+)$"); - } - - @Override - public boolean needLogin(){ - return true; - } } diff --git a/src/be/jeffcheasey88/peeratcode/webserver/Route.java b/src/be/jeffcheasey88/peeratcode/webserver/Route.java new file mode 100644 index 0000000..fcfea70 --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/webserver/Route.java @@ -0,0 +1,16 @@ +package be.jeffcheasey88.peeratcode.webserver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Route { + + String path() default "^.*$"; + String type() default "GET"; + boolean needLogin() default false; + +} diff --git a/src/be/jeffcheasey88/peeratcode/webserver/Router.java b/src/be/jeffcheasey88/peeratcode/webserver/Router.java index ccb7bc2..1aa6c00 100644 --- a/src/be/jeffcheasey88/peeratcode/webserver/Router.java +++ b/src/be/jeffcheasey88/peeratcode/webserver/Router.java @@ -41,7 +41,7 @@ public class Router{ public void register(Response response){ try { - Method method = response.getClass().getDeclaredMethod("exec"); + Method method = response.getClass().getDeclaredMethod("exec", Response.class.getDeclaredMethods()[0].getParameterTypes()); Route route = method.getAnnotation(Route.class); this.responses.put(response, route);