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"; + } +}