From aaa9e99a959b80847d93cbeb2051e5358d8fd850 Mon Sep 17 00:00:00 2001 From: Tomas Longo Date: Sun, 11 Jan 2015 22:59:29 +0100 Subject: [PATCH 1/3] Add Routes to spark based on json config. --- .gitignore | 1 + conf/routes.json | 9 +++ .../de/tlongo/roscoe/core/ConfigManager.java | 75 +++++++++++++++++++ .../java/de/tlongo/roscoe/core/Roscoe.java | 56 ++++++++++++++ .../de/tlongo/roscoe/core/RoscoeRoute.java | 35 +++++++++ .../tlongo/roscoe/routes/HelloWorldRoute.java | 16 ++++ 6 files changed, 192 insertions(+) create mode 100644 conf/routes.json create mode 100644 src/main/java/de/tlongo/roscoe/core/ConfigManager.java create mode 100644 src/main/java/de/tlongo/roscoe/core/Roscoe.java create mode 100644 src/main/java/de/tlongo/roscoe/core/RoscoeRoute.java create mode 100644 src/main/java/de/tlongo/roscoe/routes/HelloWorldRoute.java diff --git a/.gitignore b/.gitignore index 0cc2124..8090138 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.iml .idea/ +build/ diff --git a/conf/routes.json b/conf/routes.json new file mode 100644 index 0000000..843813d --- /dev/null +++ b/conf/routes.json @@ -0,0 +1,9 @@ +{ + "routes": [ + { + "method":"GET", + "route":"/hello", + "implementation":"de.tlongo.roscoe.routes.HelloWorldRoute" + } + ] +} \ No newline at end of file diff --git a/src/main/java/de/tlongo/roscoe/core/ConfigManager.java b/src/main/java/de/tlongo/roscoe/core/ConfigManager.java new file mode 100644 index 0000000..c61ca73 --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/core/ConfigManager.java @@ -0,0 +1,75 @@ +package de.tlongo.roscoe.core; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by tomas on 11.01.15. + */ +public class ConfigManager { + Logger logger = LoggerFactory.getLogger(ConfigManager.class); + String roscoeRoot; + File configDir; + JsonObject routesConfig; + + public ConfigManager() { + roscoeRoot = System.getProperty("roscoe.root"); + configDir = new File(roscoeRoot + "/conf"); + try { + routesConfig = new JsonParser().parse(new FileReader(configDir + "/routes.json")).getAsJsonObject(); + } catch (FileNotFoundException e) { + logger.error("Could not load routes config {}", configDir + ("/routes.json")); + throw new RuntimeException("Could not load routes config."); + } + } + + public List getRoutes() { + final List routes = new ArrayList<>(); + JsonArray jsonRoutesArray = routesConfig.getAsJsonArray("routes"); + + logger.debug("Loading Routes from config..."); + jsonRoutesArray.forEach(route -> { + JsonObject jsonRoute = route.getAsJsonObject(); + + String routeUrl = jsonRoute.get("route").getAsString(); + String routeImplementation = jsonRoute.get("implementation").getAsString(); + String routeMethod = jsonRoute.get("method").getAsString(); + + try { + Class routeClass = Class.forName(routeImplementation); + + RoscoeRoute roscoeRoute = (RoscoeRoute)routeClass.newInstance(); + roscoeRoute.setMethod(routeMethod); + roscoeRoute.setRouteUrl(routeUrl); + + logger.debug("Loaded Route {}", roscoeRoute); + + routes.add(roscoeRoute); + } catch (ClassNotFoundException e) { + handleClassLoadingError(routeUrl, routeImplementation); + } catch (InstantiationException e) { + handleClassLoadingError(routeUrl, routeImplementation); + } catch (IllegalAccessException e) { + handleClassLoadingError(routeUrl, routeImplementation); + } + + }); + logger.debug("Found {} routes in config", routes.size()); + + return routes; + } + + private void handleClassLoadingError(String routeName, String routeImplementation) { + logger.error("Could not load implementation ({}) for Route {}", routeName, routeImplementation); + throw new RuntimeException("Error loading route from config."); + } +} diff --git a/src/main/java/de/tlongo/roscoe/core/Roscoe.java b/src/main/java/de/tlongo/roscoe/core/Roscoe.java new file mode 100644 index 0000000..8af1caf --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/core/Roscoe.java @@ -0,0 +1,56 @@ +package de.tlongo.roscoe.core; + +/** + * Created by tomas on 02.01.15. + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spark.Route; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static spark.Spark.*; +public class Roscoe { + Logger logger = LoggerFactory.getLogger(Roscoe.class); + + public static void main(String[] args) { + new Roscoe().go(); + + /** + * Start the web app by reading the config and creating the routes. + */ + + // 1. Determine the framework route and export to a property + // a. if none is specified in the config, determine it by yourself + // b. create and store paths to folders under the fw root + // - templates + // - views + // - assets + // + // 2. Create the routes + // a. For every route in the config, create a spark-route and register it. + + + + + } + + private void go() { + File file = new File("."); + logger.debug("Roscoe Root at: ", file.toPath().toAbsolutePath().toString()); + System.setProperty("roscoe.root", file.toPath().toAbsolutePath().toString()); + + Map> routes = new HashMap<>(); + ConfigManager configManager = new ConfigManager(); + + configManager.getRoutes().forEach(route -> { + if (route.getMethod().equals("GET")) { + get(route.getRouteUrl(), route); + } + }); + } +} diff --git a/src/main/java/de/tlongo/roscoe/core/RoscoeRoute.java b/src/main/java/de/tlongo/roscoe/core/RoscoeRoute.java new file mode 100644 index 0000000..724a222 --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/core/RoscoeRoute.java @@ -0,0 +1,35 @@ +package de.tlongo.roscoe.core; + +import spark.Route; + +/** + * Created by tomas on 11.01.15. + */ +public abstract class RoscoeRoute implements Route { + String routeUrl; + String method; + + public void setRouteUrl(String routeUrl) { + this.routeUrl = routeUrl; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getRouteUrl() { + return routeUrl; + } + + public String getMethod() { + return method; + } + + @Override + public String toString() { + return "RoscoeRoute{" + + "routeUrl='" + routeUrl + '\'' + + ", method='" + method + '\'' + + '}'; + } +} diff --git a/src/main/java/de/tlongo/roscoe/routes/HelloWorldRoute.java b/src/main/java/de/tlongo/roscoe/routes/HelloWorldRoute.java new file mode 100644 index 0000000..9b9acef --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/routes/HelloWorldRoute.java @@ -0,0 +1,16 @@ +package de.tlongo.roscoe.routes; + +import de.tlongo.roscoe.core.RoscoeRoute; +import spark.Request; +import spark.Response; + +/** + * Created by tomas on 11.01.15. + */ +public class HelloWorldRoute extends RoscoeRoute { + + @Override + public Object handle(Request request, Response response) { + return "Congratulations. You succesfully set up Roscoe"; + } +} From cb4eeeaa8a1ef9803f50a71d5f0baff0ca99fd41 Mon Sep 17 00:00:00 2001 From: Tomas Longo Date: Sun, 11 Jan 2015 23:08:14 +0100 Subject: [PATCH 2/3] Added recognition for HTTP-Methods: POST, PUT, DELETE --- conf/routes.json | 17 ++++++++++++++++- src/main/java/de/tlongo/roscoe/core/Roscoe.java | 6 ++++++ .../tlongo/roscoe/routes/SampleDeleteRoute.java | 16 ++++++++++++++++ .../tlongo/roscoe/routes/SamplePostRoute.java | 16 ++++++++++++++++ .../de/tlongo/roscoe/routes/SamplePutRoute.java | 16 ++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/tlongo/roscoe/routes/SampleDeleteRoute.java create mode 100644 src/main/java/de/tlongo/roscoe/routes/SamplePostRoute.java create mode 100644 src/main/java/de/tlongo/roscoe/routes/SamplePutRoute.java diff --git a/conf/routes.json b/conf/routes.json index 843813d..6dce2cc 100644 --- a/conf/routes.json +++ b/conf/routes.json @@ -2,8 +2,23 @@ "routes": [ { "method":"GET", - "route":"/hello", + "route":"/helloworld", "implementation":"de.tlongo.roscoe.routes.HelloWorldRoute" + }, + { + "method":"POST", + "route":"/helloworld", + "implementation":"de.tlongo.roscoe.routes.SamplePostRoute" + }, + { + "method":"PUT", + "route":"/helloworld", + "implementation":"de.tlongo.roscoe.routes.SamplePutRoute" + }, + { + "method":"DELETE", + "route":"/helloworld", + "implementation":"de.tlongo.roscoe.routes.SampleDeleteRoute" } ] } \ No newline at end of file diff --git a/src/main/java/de/tlongo/roscoe/core/Roscoe.java b/src/main/java/de/tlongo/roscoe/core/Roscoe.java index 8af1caf..2b7bfb2 100644 --- a/src/main/java/de/tlongo/roscoe/core/Roscoe.java +++ b/src/main/java/de/tlongo/roscoe/core/Roscoe.java @@ -50,6 +50,12 @@ private void go() { configManager.getRoutes().forEach(route -> { if (route.getMethod().equals("GET")) { get(route.getRouteUrl(), route); + } else if (route.getMethod().equals("POST")) { + post(route.getRouteUrl(), route); + } else if (route.getMethod().equals("PUT")) { + put(route.getRouteUrl(), route); + } if (route.getMethod().equals("DELETE")) { + delete(route.getRouteUrl(), route); } }); } diff --git a/src/main/java/de/tlongo/roscoe/routes/SampleDeleteRoute.java b/src/main/java/de/tlongo/roscoe/routes/SampleDeleteRoute.java new file mode 100644 index 0000000..aeef13d --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/routes/SampleDeleteRoute.java @@ -0,0 +1,16 @@ +package de.tlongo.roscoe.routes; + +import de.tlongo.roscoe.core.RoscoeRoute; +import spark.Request; +import spark.Response; + +/** + * Created by tomas on 11.01.15. + */ +public class SampleDeleteRoute extends RoscoeRoute { + + @Override + public Object handle(Request request, Response response) { + return "This is a sample delete route."; + } +} diff --git a/src/main/java/de/tlongo/roscoe/routes/SamplePostRoute.java b/src/main/java/de/tlongo/roscoe/routes/SamplePostRoute.java new file mode 100644 index 0000000..46d1fe0 --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/routes/SamplePostRoute.java @@ -0,0 +1,16 @@ +package de.tlongo.roscoe.routes; + +import de.tlongo.roscoe.core.RoscoeRoute; +import spark.Request; +import spark.Response; + +/** + * Created by tomas on 11.01.15. + */ +public class SamplePostRoute extends RoscoeRoute { + + @Override + public Object handle(Request request, Response response) { + return "This is a sample post route."; + } +} diff --git a/src/main/java/de/tlongo/roscoe/routes/SamplePutRoute.java b/src/main/java/de/tlongo/roscoe/routes/SamplePutRoute.java new file mode 100644 index 0000000..b50c3cb --- /dev/null +++ b/src/main/java/de/tlongo/roscoe/routes/SamplePutRoute.java @@ -0,0 +1,16 @@ +package de.tlongo.roscoe.routes; + +import de.tlongo.roscoe.core.RoscoeRoute; +import spark.Request; +import spark.Response; + +/** + * Created by tomas on 11.01.15. + */ +public class SamplePutRoute extends RoscoeRoute { + + @Override + public Object handle(Request request, Response response) { + return "This is a sample put route."; + } +} From 0d7de7d370ede65f5b5bbceba203a1ca512f6b3e Mon Sep 17 00:00:00 2001 From: Tomas Longo Date: Sun, 11 Jan 2015 23:10:26 +0100 Subject: [PATCH 3/3] Cleaning --- src/main/java/de/tlongo/roscoe/core/Roscoe.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/de/tlongo/roscoe/core/Roscoe.java b/src/main/java/de/tlongo/roscoe/core/Roscoe.java index 2b7bfb2..e81080a 100644 --- a/src/main/java/de/tlongo/roscoe/core/Roscoe.java +++ b/src/main/java/de/tlongo/roscoe/core/Roscoe.java @@ -6,12 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import spark.Route; import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import static spark.Spark.*; public class Roscoe { @@ -44,7 +40,6 @@ private void go() { logger.debug("Roscoe Root at: ", file.toPath().toAbsolutePath().toString()); System.setProperty("roscoe.root", file.toPath().toAbsolutePath().toString()); - Map> routes = new HashMap<>(); ConfigManager configManager = new ConfigManager(); configManager.getRoutes().forEach(route -> {