From 35b2c24e747598b57d2d961efaf5d24b5c73c650 Mon Sep 17 00:00:00 2001 From: Nikolche Mihajlovski Date: Tue, 1 May 2018 18:54:22 +0200 Subject: [PATCH] Redesigned the server setup components. --- docs/examples/httpcustom.adoc | 2 +- .../main/java/org/rapidoid/util/LazyInit.java | 10 + .../src/main/java/org/rapidoid/util/Msc.java | 1 - .../src/main/resources/built-in-config.yml | 4 +- .../src/main/resources/rapidoid-classes.txt | 2 +- .../rapidoid/gui/reqinfo/ReqInfoUtils.java | 32 +- .../java/org/rapidoid/http/impl/ReqImpl.java | 2 +- .../org/rapidoid/docs/httpcustom/Main.java | 2 +- .../http/HttpAdminAndDevServerTest.java | 15 +- .../rapidoid/http/HttpAdminServerTest.java | 4 +- .../http/IsolatedIntegrationTest.java | 1 + .../ConfigurationTest/testBuiltInConfig/root | 2 +- .../ConfigurationTest/testMySqlProfile/root | 2 +- .../testPostgresProfile/root | 2 +- .../DefaultConfigTest/docs/1__GET_ | 2 +- .../{GET_b => 9090__GET_b} | 0 .../{GET_c => 9090__GET_c} | 0 .../{GET_d => 9090__GET_d} | 0 .../main/java/org/rapidoid/setup/Admin.java | 82 +-- .../src/main/java/org/rapidoid/setup/App.java | 7 +- .../java/org/rapidoid/setup/DefaultSetup.java | 28 +- .../java/org/rapidoid/setup/HttpHandlers.java | 10 +- .../main/java/org/rapidoid/setup/OnRoute.java | 4 +- .../main/java/org/rapidoid/setup/Setup.java | 508 +++--------------- .../java/org/rapidoid/setup/SetupImpl.java | 494 +++++++++++++++++ .../main/java/org/rapidoid/setup/Setups.java | 8 +- .../main/java/org/rapidoid/goodies/Boot.java | 124 ++++- .../java/org/rapidoid/http/MiniHttpTest.java | 35 +- 28 files changed, 751 insertions(+), 632 deletions(-) rename rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/{GET_b => 9090__GET_b} (100%) rename rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/{GET_c => 9090__GET_c} (100%) rename rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/{GET_d => 9090__GET_d} (100%) create mode 100644 rapidoid-rest/src/main/java/org/rapidoid/setup/SetupImpl.java rename rapidoid-commons/src/main/java/org/rapidoid/util/AppInfo.java => rapidoid-web/src/test/java/org/rapidoid/http/MiniHttpTest.java (63%) diff --git a/docs/examples/httpcustom.adoc b/docs/examples/httpcustom.adoc index b6181e3fcd..38e92a854c 100644 --- a/docs/examples/httpcustom.adoc +++ b/docs/examples/httpcustom.adoc @@ -31,7 +31,7 @@ public class Main { App.scan(); Boot.jmx(App.setup()); - Boot.adminCenter(App.adminSetup()); + Boot.adminCenter(App.setup()); // continue with normal setup On.get("/x").json("x"); diff --git a/rapidoid-commons/src/main/java/org/rapidoid/util/LazyInit.java b/rapidoid-commons/src/main/java/org/rapidoid/util/LazyInit.java index 1d1ae19393..a220c9ca07 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/util/LazyInit.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/util/LazyInit.java @@ -27,6 +27,7 @@ import java.io.Closeable; import java.io.IOException; import java.util.concurrent.Callable; +import java.util.function.Consumer; @Authors("Nikolche Mihajlovski") @Since("5.2.4") @@ -118,4 +119,13 @@ public T getValue() { public boolean isInitialized() { return initializedValue != null; } + + public synchronized void ifPresent(Consumer action) { + T value = initializedValue; + + if (value != null) { + action.accept(value); + } + } + } diff --git a/rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java b/rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java index 4fe23bd0b5..dbcd11a8c5 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java @@ -841,7 +841,6 @@ public static void reset() { Log.reset(); Crypto.reset(); Res.reset(); - AppInfo.reset(); Conf.reset(); Groups.reset(); Jobs.reset(); diff --git a/rapidoid-commons/src/main/resources/built-in-config.yml b/rapidoid-commons/src/main/resources/built-in-config.yml index 9fa022612d..2a5943a9d8 100644 --- a/rapidoid-commons/src/main/resources/built-in-config.yml +++ b/rapidoid-commons/src/main/resources/built-in-config.yml @@ -3,8 +3,8 @@ on: address: 0.0.0.0 admin: - port: ${on.port} - address: ${on.address} + port: 9090 + address: 0.0.0.0 app: contextPath: '' diff --git a/rapidoid-commons/src/main/resources/rapidoid-classes.txt b/rapidoid-commons/src/main/resources/rapidoid-classes.txt index 96e2b215fe..cb874edf47 100644 --- a/rapidoid-commons/src/main/resources/rapidoid-classes.txt +++ b/rapidoid-commons/src/main/resources/rapidoid-classes.txt @@ -728,6 +728,7 @@ org.rapidoid.setup.ReloadUtil org.rapidoid.setup.ServerSetup org.rapidoid.setup.ServiceBootstrap org.rapidoid.setup.Setup +org.rapidoid.setup.SetupImpl org.rapidoid.setup.Setups org.rapidoid.setup.WatchForChanges org.rapidoid.test.Doc @@ -751,7 +752,6 @@ org.rapidoid.timeseries.TimeSeries org.rapidoid.timeseries.TSValue org.rapidoid.util.AbstractMapImpl org.rapidoid.util.AnsiColor -org.rapidoid.util.AppInfo org.rapidoid.util.BenchmarkOperation org.rapidoid.util.Bufs org.rapidoid.util.ByType diff --git a/rapidoid-gui/src/main/java/org/rapidoid/gui/reqinfo/ReqInfoUtils.java b/rapidoid-gui/src/main/java/org/rapidoid/gui/reqinfo/ReqInfoUtils.java index f993c33ddb..30a13b2d44 100644 --- a/rapidoid-gui/src/main/java/org/rapidoid/gui/reqinfo/ReqInfoUtils.java +++ b/rapidoid-gui/src/main/java/org/rapidoid/gui/reqinfo/ReqInfoUtils.java @@ -23,8 +23,6 @@ import org.rapidoid.RapidoidThing; import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; -import org.rapidoid.u.U; -import org.rapidoid.util.AppInfo; import org.rapidoid.util.Msc; @Authors("Nikolche Mihajlovski") @@ -33,38 +31,12 @@ public class ReqInfoUtils extends RapidoidThing { public static String adminUrl() { IReqInfo req = ReqInfo.get(); - int appPort = AppInfo.appPort; - int adminPort = AppInfo.adminPort; - boolean appAndAdminOnSamePort = adminPort == appPort; - - if (U.notEmpty(req.host())) { - String hostname = req.host().split(":")[0]; - - if (AppInfo.isAdminServerActive) { - String path = req.contextPath() + Msc.specialUriPrefix(); - return appAndAdminOnSamePort ? path : "http://" + hostname + ":" + adminPort + path; - } - } - - return null; + return req.contextPath() + Msc.specialUriPrefix(); } public static String appUrl() { IReqInfo req = ReqInfo.get(); - int appPort = AppInfo.appPort; - int adminPort = AppInfo.adminPort; - boolean appAndAdminOnSamePort = adminPort == appPort; - - if (U.notEmpty(req.host())) { - String hostname = req.host().split(":")[0]; - - if (AppInfo.isAppServerActive) { - String path = req.contextPath() + "/"; - return appAndAdminOnSamePort ? path : "http://" + hostname + ":" + appPort + path; - } - } - - return null; + return req.contextPath() + "/"; } } diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java index 0470cb0574..7bc2144d7c 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java @@ -87,7 +87,7 @@ public class ReqImpl extends RapidoidThing implements Req, Constants, HttpMetada private final Map> files; - private final Map attrs = Collections.synchronizedMap(new HashMap()); + private final Map attrs = Collections.synchronizedMap(new HashMap<>()); private volatile Map data; diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/httpcustom/Main.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/httpcustom/Main.java index 503baa5d77..110b771020 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/httpcustom/Main.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/httpcustom/Main.java @@ -45,7 +45,7 @@ public static void main(String[] args) { App.scan(); Boot.jmx(App.setup()); - Boot.adminCenter(App.adminSetup()); + Boot.adminCenter(App.setup()); // continue with normal setup On.get("/x").json("x"); diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminAndDevServerTest.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminAndDevServerTest.java index fb0c5ad8f7..953069aadb 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminAndDevServerTest.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminAndDevServerTest.java @@ -35,26 +35,31 @@ public class HttpAdminAndDevServerTest extends IsolatedIntegrationTest { @Test public void testAdminOnAppServer() { sameSetup(); - sameRequests(8080); + sendRequests(9090); + + Admin.setup().halt(); } @Test public void testAdminServerConfig() { int port = 8881; - Conf.section("admin").set("port", port); + Conf.ADMIN.set("port", port); sameSetup(); - sameRequests(port); + sendRequests(port); + + Admin.setup().halt(); } private void sameSetup() { On.get("/a").html((Req x) -> "default " + U.join(":", x.uri(), x.zone(), x.contextPath())); - Admin.get("/b").roles().json((Req x) -> "admin " + U.join(":", x.uri(), x.zone(), x.contextPath())); + + Admin.get("/b").zone("admin").roles().json((Req x) -> "admin " + U.join(":", x.uri(), x.zone(), x.contextPath())); Admin.get("/c").json((Req x) -> "unauthorized"); Admin.get("/d").html((Req x) -> "unauthorized"); } - private void sameRequests(int port) { + private void sendRequests(int port) { onlyGet("/a"); // app onlyGet(port, "/b"); // admin onlyGet(port, "/c"); // admin - unauthorized diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminServerTest.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminServerTest.java index 9a28b27726..e0c4ca6c74 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminServerTest.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/HttpAdminServerTest.java @@ -31,8 +31,10 @@ public class HttpAdminServerTest extends IsolatedIntegrationTest { @Test public void testAdminServer() { - Admin.port(9898); + Admin.port(9898).address("127.0.0.1"); + Admin.get("/").json(() -> "ok"); + onlyGet(9898, "/"); } diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/IsolatedIntegrationTest.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/IsolatedIntegrationTest.java index ea664003aa..88aee27ab7 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/http/IsolatedIntegrationTest.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/http/IsolatedIntegrationTest.java @@ -88,6 +88,7 @@ public void openContext() { My.reset(); App.resetGlobalState(); + On.changes().ignore(); On.setup().activate(); diff --git a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testBuiltInConfig/root b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testBuiltInConfig/root index 0480ce8137..ce9dacdb1b 100644 --- a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testBuiltInConfig/root +++ b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testBuiltInConfig/root @@ -4,7 +4,7 @@ "address" : "127.0.0.1" }, "admin" : { - "port" : "8080", + "port" : 9090, "address" : "127.0.0.1" }, "app" : { diff --git a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testMySqlProfile/root b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testMySqlProfile/root index 4b6a9835dd..8e3d04b831 100644 --- a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testMySqlProfile/root +++ b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testMySqlProfile/root @@ -15,7 +15,7 @@ "address" : "127.0.0.1" }, "admin" : { - "port" : "8080", + "port" : 9090, "address" : "127.0.0.1" }, "app" : { diff --git a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testPostgresProfile/root b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testPostgresProfile/root index 7cc7377e99..e6f2af4bd4 100644 --- a/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testPostgresProfile/root +++ b/rapidoid-integration-tests/src/test/resources/test-results/ConfigurationTest/testPostgresProfile/root @@ -5,7 +5,7 @@ "address" : "127.0.0.1" }, "admin" : { - "port" : "8080", + "port" : 9090, "address" : "127.0.0.1" }, "app" : { diff --git a/rapidoid-integration-tests/src/test/resources/test-results/DefaultConfigTest/docs/1__GET_ b/rapidoid-integration-tests/src/test/resources/test-results/DefaultConfigTest/docs/1__GET_ index d79fa9ef1c..ae1c41f4ae 100644 --- a/rapidoid-integration-tests/src/test/resources/test-results/DefaultConfigTest/docs/1__GET_ +++ b/rapidoid-integration-tests/src/test/resources/test-results/DefaultConfigTest/docs/1__GET_ @@ -109,7 +109,7 @@ Content-Length: 15132 port - 8080 + 9090 address diff --git a/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_b b/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_b similarity index 100% rename from rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_b rename to rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_b diff --git a/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_c b/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_c similarity index 100% rename from rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_c rename to rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_c diff --git a/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_d b/rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_d similarity index 100% rename from rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/GET_d rename to rapidoid-integration-tests/src/test/resources/test-results/HttpAdminAndDevServerTest/testAdminOnAppServer/9090__GET_d diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/Admin.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/Admin.java index 1385276eed..4139f913ce 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/Admin.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/Admin.java @@ -24,76 +24,65 @@ import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; import org.rapidoid.config.Conf; -import org.rapidoid.config.Config; -import org.rapidoid.http.HttpRoutes; -import org.rapidoid.http.ReqHandler; -import org.rapidoid.http.ReqRespHandler; -import org.rapidoid.http.customize.Customization; -import org.rapidoid.http.handler.HttpHandler; -import org.rapidoid.http.impl.RouteOptions; +import org.rapidoid.security.Role; +import org.rapidoid.util.LazyInit; @Authors("Nikolche Mihajlovski") @Since("5.1.0") public class Admin extends RapidoidThing { + private static final LazyInit setup = new LazyInit<>(Admin::createAdminSetup); + + private static Setup createAdminSetup() { + return Setups.create("admin"); + } + public static synchronized Setup setup() { - return Setups.admin(); + return setup.get(); } public static synchronized OnRoute route(String verb, String path) { - return setup().on(verb, path); + return setup().on(verb, path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute any(String path) { - return setup().any(path); + return setup().any(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute get(String path) { - return setup().get(path); + return setup().get(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute post(String path) { - return setup().post(path); + return setup().post(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute put(String path) { - return setup().put(path); + return setup().put(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute delete(String path) { - return setup().delete(path); + return setup().delete(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute patch(String path) { - return setup().patch(path); + return setup().patch(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute options(String path) { - return setup().options(path); + return setup().options(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute head(String path) { - return setup().head(path); + return setup().head(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute trace(String path) { - return setup().trace(path); + return setup().trace(path).roles(Role.ADMINISTRATOR); } public static synchronized OnRoute page(String path) { - return setup().page(path); - } - - public static synchronized Setup req(ReqHandler handler) { - return setup().req(handler); - } - - public static synchronized Setup req(ReqRespHandler handler) { - return setup().req(handler); - } - - public static synchronized Setup req(HttpHandler handler) { - return setup().req(handler); + return setup().page(path).roles(Role.ADMINISTRATOR); } public static synchronized ServerSetup port(int port) { @@ -104,35 +93,4 @@ public static synchronized ServerSetup address(String address) { return new ServerSetup(Conf.ADMIN).address(address); } - public static synchronized OnError error(Class error) { - return setup().error(error); - } - - public static Setup deregister(String verb, String path) { - return setup().deregister(verb, path); - } - - public static Setup deregister(Object... controllers) { - return setup().deregister(controllers); - } - - public static Config config() { - return setup().config(); - } - - public static Customization custom() { - return setup().custom(); - } - - public static HttpRoutes routes() { - return setup().routes(); - } - - public static RouteOptions defaults() { - return setup().defaults(); - } - - public static OnChanges changes() { - return OnChanges.INSTANCE; - } } diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/App.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/App.java index 8da62be72a..b321f3d5e8 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/App.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/App.java @@ -248,8 +248,7 @@ private static void resetAppStateBeforeRestart() { Setups.reloadAll(); - Conf.reset(); // reset the config again - Setups.initDefaults(); // this changes the config + Setups.initDefaults(); Conf.reset(); // reset the config again } @@ -361,10 +360,6 @@ public static Setup setup() { return Setups.main(); } - public static Setup adminSetup() { - return Setups.admin(); - } - public static Screen gui() { return setup().gui(); } diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/DefaultSetup.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/DefaultSetup.java index b5f8e0b249..0511716939 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/DefaultSetup.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/DefaultSetup.java @@ -25,11 +25,10 @@ import org.rapidoid.commons.RapidoidInitializer; import org.rapidoid.config.Conf; import org.rapidoid.config.Config; +import org.rapidoid.http.FastHttp; import org.rapidoid.http.customize.Customization; import org.rapidoid.http.impl.HttpRoutesImpl; import org.rapidoid.ioc.IoC; -import org.rapidoid.security.Role; -import org.rapidoid.u.U; import org.rapidoid.util.Msc; import org.rapidoid.web.Screen; import org.rapidoid.web.ScreenBean; @@ -39,44 +38,27 @@ public class DefaultSetup extends RapidoidInitializer { private static final String MAIN_ZONE = Msc.isPlatform() ? "platform" : "main"; - private static final String ADMIN_ZONE = Msc.isPlatform() ? "platform" : "admin"; private static final Config MAIN_CFG = Msc.isPlatform() ? Conf.RAPIDOID : Conf.ON; - private static final Config ADMIN_CFG = Msc.isPlatform() ? Conf.RAPIDOID_ADMIN : Conf.ADMIN; private static final Screen gui = new ScreenBean(); final Setup main; - final Setup admin; DefaultSetup() { - boolean onSameServer = appAndAdminOnSameServer(); + Customization customization = new Customization("main", My.custom(), Conf.ROOT); + HttpRoutesImpl routes = new HttpRoutesImpl("main", customization); - Customization appCustomization = new Customization("main", My.custom(), Conf.ROOT); - Customization adminCustomization = onSameServer ? appCustomization : new Customization("admin", My.custom(), Conf.ROOT); - - HttpRoutesImpl appRoutes = new HttpRoutesImpl("main", appCustomization); - HttpRoutesImpl adminRoutes = onSameServer ? appRoutes : new HttpRoutesImpl("admin", adminCustomization); - - main = new Setup("main", MAIN_ZONE, IoC.defaultContext(), MAIN_CFG, appCustomization, appRoutes, gui); - admin = new Setup("admin", ADMIN_ZONE, IoC.defaultContext(), ADMIN_CFG, adminCustomization, adminRoutes, gui); + FastHttp http = new FastHttp(routes, MAIN_CFG, gui); + main = new SetupImpl("main", MAIN_ZONE, http, IoC.defaultContext(), MAIN_CFG, customization, routes, gui, true); Setups.register(main); - Setups.register(admin); initDefaults(); } void initDefaults() { gui.reset(); - admin.defaults().roles(Role.ADMINISTRATOR); - } - - static boolean appAndAdminOnSameServer() { - String mainPort = MAIN_CFG.entry("port").str().getOrNull(); - String adminPort = ADMIN_CFG.entry("port").str().getOrNull(); - - return U.eq(mainPort, adminPort); } } diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/HttpHandlers.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/HttpHandlers.java index d19751ab73..35d664d692 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/HttpHandlers.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/HttpHandlers.java @@ -102,32 +102,32 @@ private static HttpHandler from(Setup setup, NParamLambda handler, RouteOptions } } - static void registerStatic(Setup setup, String verb, String path, RouteOptions options, byte[] response) { + static void registerStatic(SetupImpl setup, String verb, String path, RouteOptions options, byte[] response) { setup.routes().on(verb, path, new StaticHttpHandler(options, response)); setup.autoActivate(); } - static void registerPredefined(Setup setup, String verb, String path, RouteOptions options, Object response) { + static void registerPredefined(SetupImpl setup, String verb, String path, RouteOptions options, Object response) { FastHttp http = setup.http(); HttpRoutes routes = setup.routes(); routes.on(verb, path, new PredefinedResponseHandler(http, routes, options, response)); setup.autoActivate(); } - static void register(Setup setup, String verb, String path, RouteOptions options, Callable handler) { + static void register(SetupImpl setup, String verb, String path, RouteOptions options, Callable handler) { FastHttp http = setup.http(); HttpRoutes routes = setup.routes(); routes.on(verb, path, new CallableHttpHandler(http, routes, options, handler)); setup.autoActivate(); } - static void register(Setup setup, String verb, String path, RouteOptions options, NParamLambda lambda) { + static void register(SetupImpl setup, String verb, String path, RouteOptions options, NParamLambda lambda) { HttpHandler handler = HttpHandlers.from(setup, lambda, options); setup.routes().on(verb, path, handler); setup.autoActivate(); } - static void register(Setup setup, String verb, String path, RouteOptions options, Method method, Object instance) { + static void register(SetupImpl setup, String verb, String path, RouteOptions options, Method method, Object instance) { FastHttp http = setup.http(); HttpRoutes routes = setup.routes(); routes.on(verb, path, new MethodReqHandler(http, routes, options, method, instance)); diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/OnRoute.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/OnRoute.java index 1ad986b5f2..daf35f1f03 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/OnRoute.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/OnRoute.java @@ -41,7 +41,7 @@ @Since("4.3.0") public class OnRoute extends RapidoidThing { - private final Setup setup; + private final SetupImpl setup; private final String verb; @@ -49,7 +49,7 @@ public class OnRoute extends RapidoidThing { private final RouteOptions options; - public OnRoute(Setup setup, String verb, String path) { + public OnRoute(SetupImpl setup, String verb, String path) { this.setup = setup; this.verb = verb; this.path = path; diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/Setup.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/Setup.java index 7ba24dccbd..6870aa1d4e 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/Setup.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/Setup.java @@ -20,501 +20,115 @@ package org.rapidoid.setup; -import org.rapidoid.annotation.Authors; -import org.rapidoid.annotation.Since; -import org.rapidoid.commons.AnyObj; -import org.rapidoid.commons.RapidoidInitializer; import org.rapidoid.config.Config; -import org.rapidoid.env.Env; -import org.rapidoid.env.RapidoidEnv; import org.rapidoid.http.FastHttp; import org.rapidoid.http.HttpRoutes; import org.rapidoid.http.ReqHandler; import org.rapidoid.http.ReqRespHandler; import org.rapidoid.http.customize.Customization; -import org.rapidoid.http.customize.ViewResolver; import org.rapidoid.http.handler.HttpHandler; -import org.rapidoid.http.handler.optimized.DelegatingParamsAwareReqHandler; -import org.rapidoid.http.handler.optimized.DelegatingParamsAwareReqRespHandler; -import org.rapidoid.http.impl.AbstractViewResolver; -import org.rapidoid.http.impl.HttpRoutesImpl; import org.rapidoid.http.impl.RouteOptions; import org.rapidoid.http.processor.HttpProcessor; import org.rapidoid.ioc.Beans; -import org.rapidoid.ioc.IoC; import org.rapidoid.ioc.IoCContext; -import org.rapidoid.lambda.NParamLambda; -import org.rapidoid.log.Log; import org.rapidoid.net.Server; -import org.rapidoid.u.U; -import org.rapidoid.util.*; import org.rapidoid.web.Screen; import org.rapidoid.web.WebSetup; import java.util.Map; -import static org.rapidoid.setup.Setups.admin; -import static org.rapidoid.setup.Setups.main; -import static org.rapidoid.util.Constants.*; +public interface Setup extends WebSetup { -@Authors("Nikolche Mihajlovski") -@Since("5.1.0") -public class Setup extends RapidoidInitializer implements WebSetup { + void destroy(); - private static final String DEFAULT_ADDRESS = "0.0.0.0"; - private static final int DEFAULT_PORT = Msc.isPlatform() ? 8888 : 8080; + FastHttp http(); - private final String name; + void activate(); - private final String zone; - private final Config serverConfig; - private final IoCContext ioCContext; - private final Screen gui; + OnRoute on(String verb, String path); - private final Customization customization; + OnRoute any(String path); - private final HttpRoutesImpl routes; - private volatile RouteOptions defaults = new RouteOptions(); + OnRoute get(String path); - private volatile Integer port; - private volatile String address; + OnRoute post(String path); - private volatile HttpProcessor processor; - private volatile boolean listening; - private volatile Server server; - private volatile boolean activated; - private volatile boolean reloaded; - private volatile boolean autoActivating = !Setups.isAppSetupAtomic(); - private volatile Runnable onInit; + OnRoute put(String path); - private final Once bootstrappedBeans = new Once(); + OnRoute delete(String path); - private final LazyInit lazyHttp = new LazyInit<>(this::initHttp); + OnRoute patch(String path); - Setup(String name, String zone, IoCContext ioCContext, - Config serverConfig, Customization customization, HttpRoutesImpl routes, Screen gui) { + OnRoute options(String path); - this.name = name; - this.zone = zone; + OnRoute head(String path); - this.ioCContext = ioCContext; - this.serverConfig = serverConfig; - this.customization = customization; - this.routes = routes; - this.gui = gui; - this.defaults.zone(zone); - } + OnRoute trace(String path); - public void destroy() { - halt(); - Setups.deregister(this); - } + OnRoute page(String path); - private FastHttp initHttp() { - if (isAdminAndSameAsApp() && main().lazyHttp.isInitialized()) { - return main().http(); + Setup req(ReqHandler handler); - } else if (isAppAndSameAsAdmin() && admin().lazyHttp.isInitialized()) { - return admin().http(); - } + Setup req(ReqRespHandler handler); - if (isAppOrAdminOnSameServer()) { - U.must(main().routes == admin().routes); - return new FastHttp(main().routes, main().serverConfig, main().gui); - } else { - return new FastHttp(routes, serverConfig, gui); - } - } + Setup req(HttpHandler handler); - public FastHttp http() { - return lazyHttp.get(); - } + Setup beans(Object... beans); - private synchronized void listen() { + Setup port(int port); - if (!listening && !reloaded) { + Setup address(String address); - App.inferCallers(); + Setup processor(HttpProcessor processor); - listening = true; + Setup shutdown(); - HttpProcessor proc = processor != null ? processor : http(); + Setup halt(); - if (Env.dev() && !On.changes().isIgnored() && MscOpts.hasRapidoidWatch()) { - proc = new AppRestartProcessor(this, proc); - On.changes().byDefaultRestart(); - } + void reset(); - if (delegateAdminToApp()) { - server = main().server(); + Server server(); - } else if (delegateAppToAdmin()) { - server = admin().server(); - } + Map attributes(); - if (server == null) { - int targetPort; + Setup scan(String... packages); - if (isAppOrAdminOnSameServer()) { - targetPort = main().port(); - server = proc.listen(main().address(), targetPort); - } else { - targetPort = port(); - server = proc.listen(address(), targetPort); - } + Setup deregister(String verb, String path); - Log.info("!Server has started", "setup", name(), "!home", "http://localhost:" + targetPort); - Log.info("!Static resources will be served from the following locations", "setup", name(), "!locations", custom().staticFilesPath()); - } - } - } + Setup deregister(Object... controllers); - private boolean isAppOrAdminOnSameServer() { - return DefaultSetup.appAndAdminOnSameServer() && (isApp() || isAdmin()); - } + IoCContext context(); - private boolean delegateAdminToApp() { - return isAdminAndSameAsApp() && main().server != null; - } - - private boolean delegateAppToAdmin() { - return isAppAndSameAsAdmin() && admin().server != null; - } - - private boolean isAppAndSameAsAdmin() { - return isApp() && DefaultSetup.appAndAdminOnSameServer(); - } - - private boolean isAdminAndSameAsApp() { - return isAdmin() && DefaultSetup.appAndAdminOnSameServer(); - } - - public boolean isAdmin() { - return this == admin(); - } - - public boolean isApp() { - return this == main(); - } - - void autoActivate() { - if (autoActivating) activate(); - } - - public synchronized void activate() { - RapidoidEnv.touch(); - - if (activated) { - return; - } - activated = true; + void reload(); - Runnable initializer = onInit; - if (initializer != null) initializer.run(); - - if (!reloaded) { - listen(); - } - - if (isApp()) { - AppInfo.isAppServerActive = true; - AppInfo.appPort = port(); - } - - if (isAdmin()) { - AppInfo.isAdminServerActive = true; - AppInfo.adminPort = port(); - } - } - - public OnRoute on(String verb, String path) { - return new OnRoute(this, verb.toUpperCase(), path); - } - - public OnRoute any(String path) { - return on(ANY, path); - } - - public OnRoute get(String path) { - return on(GET, path); - } - - public OnRoute post(String path) { - return on(POST, path); - } - - public OnRoute put(String path) { - return on(PUT, path); - } - - public OnRoute delete(String path) { - return on(DELETE, path); - } - - public OnRoute patch(String path) { - return on(PATCH, path); - } - - public OnRoute options(String path) { - return on(OPTIONS, path); - } - - public OnRoute head(String path) { - return on(HEAD, path); - } - - public OnRoute trace(String path) { - return on(TRACE, path); - } - - public OnRoute page(String path) { - return on(GET_OR_POST, path); - } - - public Setup req(ReqHandler handler) { - routes.addGenericHandler(new DelegatingParamsAwareReqHandler(http(), routes, opts(), handler)); - autoActivate(); - return this; - } - - public Setup req(ReqRespHandler handler) { - routes.addGenericHandler(new DelegatingParamsAwareReqRespHandler(http(), routes, opts(), handler)); - autoActivate(); - return this; - } - - public Setup req(HttpHandler handler) { - routes.addGenericHandler(handler); - autoActivate(); - return this; - } - - public Setup beans(Object... beans) { - RapidoidEnv.touch(); - beans = AnyObj.flat(beans); - - for (Object bean : beans) { - U.notNull(bean, "bean"); - - if (bean instanceof NParamLambda) { - throw U.rte("Expected a bean, but found lambda: " + bean); - } - } - - App.filterAndInvokeMainClasses(beans); - - PojoHandlersSetup.from(this, beans).register(); - - return this; - } - - public Setup port(int port) { - this.port = port; - return this; - } - - public Setup address(String address) { - this.address = address; - return this; - } - - public Setup processor(HttpProcessor processor) { - U.must(!listening, "The server was already initialized!"); - this.processor = processor; - return this; - } - - public synchronized Setup shutdown() { - if (this.server != null) { - if (this.server.isActive()) { - this.server.shutdown(); - } - this.server = null; - } - - reset(); - - return this; - } - - public synchronized Setup halt() { - if (this.server != null) { - if (this.server.isActive()) { - this.server.halt(); - } - this.server = null; - } - - reset(); - - return this; - } - - public void reset() { - http().resetConfig(); - listening = false; - reloaded = false; - port = null; - lazyHttp.reset(); - address = null; - processor = null; - activated = false; - ioCContext.reset(); - server = null; - autoActivating = !Setups.isAppSetupAtomic(); - - gui.reset(); - - defaults = new RouteOptions(); - defaults().zone(zone); - - if (isApp()) { - AppInfo.isAppServerActive = false; - AppInfo.appPort = 0; - } - - if (isAdmin()) { - AppInfo.isAdminServerActive = false; - AppInfo.adminPort = 0; - } - - bootstrappedBeans.reset(); - - Setups.initDefaults(); - } - - public Server server() { - return server; - } - - public Map attributes() { - return http().attributes(); - } - - @SuppressWarnings("unchecked") - public Setup scan(String... packages) { - if (!bootstrappedBeans.go()) return this; - - beans(App.findBeans(packages).toArray()); - - return this; - } - - public Setup deregister(String verb, String path) { - routes.remove(verb, path); - return this; - } - - public Setup deregister(Object... controllers) { - PojoHandlersSetup.from(this, controllers).deregister(); - return this; - } - - public IoCContext context() { - return ioCContext; - } - - public void reload() { - reloaded = true; - bootstrappedBeans.reset(); - ioCContext.reset(); - http().resetConfig(); - defaults = new RouteOptions(); - defaults.zone(zone); - attributes().clear(); - - ViewResolver viewResolver = custom().viewResolver(); - if (viewResolver instanceof AbstractViewResolver) { - ((AbstractViewResolver) viewResolver).reset(); - } - } - - public Config config() { - return serverConfig; - } - - public Customization custom() { - return customization; - } - - public HttpRoutes routes() { - return routes; - } - - private RouteOptions opts() { - return new RouteOptions(); - } - - public String name() { - return name; - } - - public RouteOptions defaults() { - return defaults; - } - - public String zone() { - return zone; - } - - public Screen gui() { - return gui; - } - - public boolean isRunning() { - return activated; - } - - public int port() { - if (port == null) { - port = serverConfig.entry("port").or(DEFAULT_PORT); - } - - U.must(port >= 0, "The port of server setup '%s' is negative!", name()); - - return port; - } - - public String address() { - if (address == null) { - address = serverConfig.entry("address").or(DEFAULT_ADDRESS); - } - - U.must(U.notEmpty(address), "The address of server setup '%s' is empty!", name()); - - return address; - } - - public OnError error(Class error) { - return new OnError(customization, error); - } - - public void register(Beans beans) { - beans(beans.getAnnotated(U.set(IoC.ANNOTATIONS))); - } - - @Override - public String toString() { - return "Setup{" + - "name='" + name + '\'' + - ", zone='" + zone + '\'' + - ", serverConfig=" + serverConfig + - ", customization=" + customization + - ", routes=" + routes + - '}'; - } - - public void onInit(Runnable onInit) { - this.onInit = onInit; - } - - public boolean autoActivating() { - return autoActivating; - } - - public Setup autoActivating(boolean autoActivating) { - this.autoActivating = autoActivating; - return this; - } + Config config(); + + Customization custom(); + + HttpRoutes routes(); + + String name(); + + RouteOptions defaults(); + + String zone(); + + Screen gui(); + + boolean isRunning(); + + int port(); + + String address(); + + OnError error(Class error); + + void register(Beans beans); + + void onInit(Runnable onInit); + + boolean autoActivating(); + + Setup autoActivating(boolean autoActivating); } diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/SetupImpl.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/SetupImpl.java new file mode 100644 index 0000000000..2e47059f1c --- /dev/null +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/SetupImpl.java @@ -0,0 +1,494 @@ +/*- + * #%L + * rapidoid-rest + * %% + * Copyright (C) 2014 - 2018 Nikolche Mihajlovski and contributors + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +package org.rapidoid.setup; + +import org.rapidoid.annotation.Authors; +import org.rapidoid.annotation.Since; +import org.rapidoid.commons.AnyObj; +import org.rapidoid.commons.RapidoidInitializer; +import org.rapidoid.config.Config; +import org.rapidoid.env.Env; +import org.rapidoid.env.RapidoidEnv; +import org.rapidoid.http.FastHttp; +import org.rapidoid.http.HttpRoutes; +import org.rapidoid.http.ReqHandler; +import org.rapidoid.http.ReqRespHandler; +import org.rapidoid.http.customize.Customization; +import org.rapidoid.http.customize.ViewResolver; +import org.rapidoid.http.handler.HttpHandler; +import org.rapidoid.http.handler.optimized.DelegatingParamsAwareReqHandler; +import org.rapidoid.http.handler.optimized.DelegatingParamsAwareReqRespHandler; +import org.rapidoid.http.impl.AbstractViewResolver; +import org.rapidoid.http.impl.HttpRoutesImpl; +import org.rapidoid.http.impl.RouteOptions; +import org.rapidoid.http.processor.HttpProcessor; +import org.rapidoid.ioc.Beans; +import org.rapidoid.ioc.IoC; +import org.rapidoid.ioc.IoCContext; +import org.rapidoid.lambda.NParamLambda; +import org.rapidoid.log.Log; +import org.rapidoid.net.Server; +import org.rapidoid.u.U; +import org.rapidoid.util.Msc; +import org.rapidoid.util.MscOpts; +import org.rapidoid.util.Once; +import org.rapidoid.web.Screen; + +import java.util.Map; + +import static org.rapidoid.util.Constants.*; + +@Authors("Nikolche Mihajlovski") +@Since("5.1.0") +public class SetupImpl extends RapidoidInitializer implements Setup { + + private static final String DEFAULT_ADDRESS = "0.0.0.0"; + private static final int DEFAULT_PORT = Msc.isPlatform() ? 8888 : 8080; + + private final String name; + + private final String zone; + private final Config serverConfig; + private final FastHttp http; + private final IoCContext ioCContext; + private final Screen gui; + + private final Customization customization; + + private final HttpRoutesImpl routes; + private volatile RouteOptions defaults = new RouteOptions(); + + private volatile Integer port; + private volatile String address; + + private volatile HttpProcessor processor; + private volatile boolean listening; + private volatile Server server; + private volatile boolean activated; + private volatile boolean reloaded; + private volatile boolean autoActivating = !Setups.isAppSetupAtomic(); + private volatile Runnable onInit; + + private final boolean isApp; + + private final Once bootstrappedBeans = new Once(); + + SetupImpl(String name, String zone, FastHttp http, + IoCContext ioCContext, Config serverConfig, Customization customization, + HttpRoutesImpl routes, Screen gui, + boolean isApp) { + + this.name = name; + this.zone = zone; + this.http = http; + + this.ioCContext = ioCContext; + this.serverConfig = serverConfig; + this.customization = customization; + this.routes = routes; + this.gui = gui; + this.isApp = isApp; + + this.defaults.zone(zone); + } + + @Override + public void destroy() { + halt(); + Setups.deregister(this); + } + + @Override + public FastHttp http() { + return http; + } + + private synchronized void listen() { + if (!listening && !reloaded) { + + App.inferCallers(); + + listening = true; + + HttpProcessor proc = processor != null ? processor : http(); + + if (Env.dev() && !On.changes().isIgnored() && MscOpts.hasRapidoidWatch()) { + proc = new AppRestartProcessor(this, proc); + On.changes().byDefaultRestart(); + } + + if (server == null) { + int targetPort = port(); + server = proc.listen(address(), targetPort); + + Log.info("!Server has started", "setup", name(), "!home", "http://localhost:" + targetPort); + Log.info("!Static resources will be served from the following locations", "setup", name(), "!locations", custom().staticFilesPath()); + } + } + } + + void autoActivate() { + if (autoActivating) activate(); + } + + @Override + public synchronized void activate() { + RapidoidEnv.touch(); + + if (activated) { + return; + } + activated = true; + + Runnable initializer = onInit; + if (initializer != null) initializer.run(); + + if (!reloaded) { + listen(); + } + } + + @Override + public OnRoute on(String verb, String path) { + return new OnRoute(this, verb.toUpperCase(), path); + } + + @Override + public OnRoute any(String path) { + return on(ANY, path); + } + + @Override + public OnRoute get(String path) { + return on(GET, path); + } + + @Override + public OnRoute post(String path) { + return on(POST, path); + } + + @Override + public OnRoute put(String path) { + return on(PUT, path); + } + + @Override + public OnRoute delete(String path) { + return on(DELETE, path); + } + + @Override + public OnRoute patch(String path) { + return on(PATCH, path); + } + + @Override + public OnRoute options(String path) { + return on(OPTIONS, path); + } + + @Override + public OnRoute head(String path) { + return on(HEAD, path); + } + + @Override + public OnRoute trace(String path) { + return on(TRACE, path); + } + + @Override + public OnRoute page(String path) { + return on(GET_OR_POST, path); + } + + @Override + public Setup req(ReqHandler handler) { + routes.addGenericHandler(new DelegatingParamsAwareReqHandler(http(), routes, opts(), handler)); + autoActivate(); + return this; + } + + @Override + public Setup req(ReqRespHandler handler) { + routes.addGenericHandler(new DelegatingParamsAwareReqRespHandler(http(), routes, opts(), handler)); + autoActivate(); + return this; + } + + @Override + public Setup req(HttpHandler handler) { + routes.addGenericHandler(handler); + autoActivate(); + return this; + } + + @Override + public Setup beans(Object... beans) { + RapidoidEnv.touch(); + beans = AnyObj.flat(beans); + + for (Object bean : beans) { + U.notNull(bean, "bean"); + + if (bean instanceof NParamLambda) { + throw U.rte("Expected a bean, but found lambda: " + bean); + } + } + + App.filterAndInvokeMainClasses(beans); + + PojoHandlersSetup.from(this, beans).register(); + + return this; + } + + @Override + public Setup port(int port) { + this.port = port; + return this; + } + + @Override + public Setup address(String address) { + this.address = address; + return this; + } + + @Override + public Setup processor(HttpProcessor processor) { + U.must(!listening, "The server was already initialized!"); + this.processor = processor; + return this; + } + + @Override + public synchronized Setup shutdown() { + if (this.server != null) { + if (this.server.isActive()) { + this.server.shutdown(); + } + this.server = null; + } + + reset(); + + return this; + } + + @Override + public synchronized Setup halt() { + if (this.server != null) { + if (this.server.isActive()) { + this.server.halt(); + } + this.server = null; + } + + reset(); + + return this; + } + + @Override + public void reset() { + http().resetConfig(); + listening = false; + reloaded = false; + port = null; + address = null; + processor = null; + activated = false; + ioCContext.reset(); + autoActivating = !Setups.isAppSetupAtomic(); + + gui.reset(); + + defaults = new RouteOptions(); + defaults().zone(zone); + + bootstrappedBeans.reset(); + + Setups.initDefaults(); + } + + @Override + public Server server() { + return server; + } + + @Override + public Map attributes() { + return http().attributes(); + } + + @Override + @SuppressWarnings("unchecked") + public Setup scan(String... packages) { + if (!bootstrappedBeans.go()) return this; + + beans(App.findBeans(packages).toArray()); + + return this; + } + + @Override + public Setup deregister(String verb, String path) { + routes.remove(verb, path); + return this; + } + + @Override + public Setup deregister(Object... controllers) { + PojoHandlersSetup.from(this, controllers).deregister(); + return this; + } + + @Override + public IoCContext context() { + return ioCContext; + } + + @Override + public void reload() { + reloaded = true; + bootstrappedBeans.reset(); + ioCContext.reset(); + http().resetConfig(); + defaults = new RouteOptions(); + defaults.zone(zone); + attributes().clear(); + + ViewResolver viewResolver = custom().viewResolver(); + if (viewResolver instanceof AbstractViewResolver) { + ((AbstractViewResolver) viewResolver).reset(); + } + } + + @Override + public Config config() { + return serverConfig; + } + + @Override + public Customization custom() { + return customization; + } + + @Override + public HttpRoutes routes() { + return routes; + } + + private RouteOptions opts() { + return new RouteOptions(); + } + + @Override + public String name() { + return name; + } + + @Override + public RouteOptions defaults() { + return defaults; + } + + @Override + public String zone() { + return zone; + } + + @Override + public Screen gui() { + return gui; + } + + @Override + public boolean isRunning() { + return activated; + } + + @Override + public int port() { + if (port == null) { + port = serverConfig.entry("port").or(DEFAULT_PORT); + } + + U.must(port >= 0, "The port of server setup '%s' is negative!", name()); + + return port; + } + + @Override + public String address() { + if (address == null) { + address = serverConfig.entry("address").or(DEFAULT_ADDRESS); + } + + U.must(U.notEmpty(address), "The address of server setup '%s' is empty!", name()); + + return address; + } + + @Override + public OnError error(Class error) { + return new OnError(customization, error); + } + + @Override + public void register(Beans beans) { + beans(beans.getAnnotated(U.set(IoC.ANNOTATIONS))); + } + + @Override + public String toString() { + return "Setup{" + + "name='" + name + '\'' + + ", zone='" + zone + '\'' + + ", serverConfig=" + serverConfig + + ", customization=" + customization + + ", routes=" + routes + + '}'; + } + + @Override + public void onInit(Runnable onInit) { + this.onInit = onInit; + } + + @Override + public boolean autoActivating() { + return autoActivating; + } + + @Override + public Setup autoActivating(boolean autoActivating) { + this.autoActivating = autoActivating; + return this; + } + + private boolean isApp() { + return isApp; + } + +} diff --git a/rapidoid-rest/src/main/java/org/rapidoid/setup/Setups.java b/rapidoid-rest/src/main/java/org/rapidoid/setup/Setups.java index d97b5ca4fa..04227ac294 100644 --- a/rapidoid-rest/src/main/java/org/rapidoid/setup/Setups.java +++ b/rapidoid-rest/src/main/java/org/rapidoid/setup/Setups.java @@ -29,6 +29,7 @@ import org.rapidoid.config.Config; import org.rapidoid.ctx.Ctxs; import org.rapidoid.data.JSON; +import org.rapidoid.http.FastHttp; import org.rapidoid.http.customize.Customization; import org.rapidoid.http.impl.HttpRoutesImpl; import org.rapidoid.ioc.IoC; @@ -74,8 +75,9 @@ public static Setup create(String name) { Customization customization = new Customization(name, My.custom(), config); HttpRoutesImpl routes = new HttpRoutesImpl(name, customization); Screen gui = new ScreenBean(); + FastHttp http = new FastHttp(routes, config, gui); - Setup setup = new Setup(name, "main", ioc, config, customization, routes, gui); + Setup setup = new SetupImpl(name, "main", http, ioc, config, customization, routes, gui, false); instances.add(setup); return setup; @@ -85,10 +87,6 @@ public static Setup main() { return DEFAULT.get().main; } - public static Setup admin() { - return DEFAULT.get().admin; - } - public static synchronized void haltAll() { instances().forEach(Setup::halt); } diff --git a/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java b/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java index b857149114..1e862cd72f 100644 --- a/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java @@ -32,7 +32,6 @@ import org.rapidoid.security.Role; import org.rapidoid.setup.App; import org.rapidoid.setup.Setup; -import org.rapidoid.setup.Setups; import org.rapidoid.util.Msc; import org.rapidoid.util.MscOpts; @@ -58,44 +57,127 @@ public static void adminCenter(Setup setup) { } public static void auth(Setup setup) { - setup.post(uri("login")).roles().json(new LoginHandler()); - setup.get(uri("logout")).roles(Role.LOGGED_IN).json(new LogoutHandler()); + setup.post(uri("login")) + .roles() + .json(new LoginHandler()); + + setup.get(uri("logout")) + .roles(Role.LOGGED_IN) + .json(new LogoutHandler()); } public static void lifecycle(Setup setup) { - setup.page(uri("terminate")).zone(CENTER).menu("System", "Terminate / Restart").mvc(new TerminateHandler()); + setup.page(uri("terminate")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Terminate / Restart") + .mvc(new TerminateHandler()); } public static void overview(Setup setup) { - setup.page(uri("")).zone(CENTER).zone(CENTER).menu("System", "Memory").mvc(new OverviewHandler()); + setup.page(uri("")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Memory") + .mvc(new OverviewHandler()); } public static void application(Setup setup) { - setup.page(uri("routes")).zone(CENTER).menu("Routes").mvc(new RoutesHandler()); - setup.page(uri("config")).zone(CENTER).menu("Configuration").mvc(new ConfigHandler()); - setup.page(uri("beans")).zone(CENTER).menu("Application", "Beans").mvc(new BeansHandler()); - setup.get(uri("classpath")).zone(CENTER).menu("Application", "Classpath").mvc(new ClasspathHandler()); + setup.page(uri("routes")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("Routes") + .mvc(new RoutesHandler()); + + setup.page(uri("config")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("Configuration") + .mvc(new ConfigHandler()); + + setup.page(uri("beans")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("Application", "Beans") + .mvc(new BeansHandler()); + + setup.get(uri("classpath")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("Application", "Classpath") + .mvc(new ClasspathHandler()); } public static void metrics(Setup setup) { Metrics.bootstrap(); - setup.page(uri("metrics")).zone(CENTER).menu("Metrics").mvc(new GraphsHandler()); - setup.get(uri("graphs/{id:.*}")).json(new GraphDataHandler()); + + setup.page(uri("metrics")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("Metrics") + .mvc(new GraphsHandler()); + + setup.get(uri("graphs/{id:.*}")) + .roles(Role.ADMINISTRATOR) + .json(new GraphDataHandler()); } public static void jmx(Setup setup) { - setup.page(uri("jmx/mempool")).zone(CENTER).menu("System", "Memory pool").mvc(JMX.memoryPool()); - setup.page(uri("jmx/threads")).zone(CENTER).menu("System", "JVM Threads").mvc(JMX.threads()); - setup.page(uri("jmx/os")).zone(CENTER).menu("System", "Operating system").mvc(JMX.os()); - setup.page(uri("jmx/gc")).zone(CENTER).menu("System", "Garbage collection").mvc(JMX.gc()); - setup.page(uri("jmx/memory")).zone(CENTER).menu("System", "Memory").mvc(JMX.memory()); - setup.page(uri("jmx/runtime")).zone(CENTER).menu("System", "Runtime").mvc(JMX.runtime()); - setup.page(uri("jmx/classes")).zone(CENTER).menu("System", "Classes").mvc(JMX.classes()); - setup.page(uri("jmx/compilation")).zone(CENTER).menu("System", "Compilation").mvc(JMX.compilation()); + setup.page(uri("jmx/mempool")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Memory pool") + .mvc(JMX.memoryPool()); + + setup.page(uri("jmx/threads")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "JVM Threads") + .mvc(JMX.threads()); + + setup.page(uri("jmx/os")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Operating system") + .mvc(JMX.os()); + + setup.page(uri("jmx/gc")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Garbage collection") + .mvc(JMX.gc()); + + setup.page(uri("jmx/memory")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Memory") + .mvc(JMX.memory()); + + setup.page(uri("jmx/runtime")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Runtime") + .mvc(JMX.runtime()); + + setup.page(uri("jmx/classes")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Classes") + .mvc(JMX.classes()); + + setup.page(uri("jmx/compilation")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Compilation") + .mvc(JMX.compilation()); } public static void entities(Setup setup) { - setup.page(uri("entities")).zone(CENTER).menu("System", "Memory").mvc(new EntitiesHandler()); + setup.page(uri("entities")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Memory") + .mvc(new EntitiesHandler()); if (MscOpts.hasJPA()) { for (Class type : JPA.getEntityJavaTypes()) { @@ -128,7 +210,7 @@ public static void all() { oauth(setup); openapi(setup); - adminCenter(Setups.admin()); + adminCenter(setup); } private static String uri(String path) { diff --git a/rapidoid-commons/src/main/java/org/rapidoid/util/AppInfo.java b/rapidoid-web/src/test/java/org/rapidoid/http/MiniHttpTest.java similarity index 63% rename from rapidoid-commons/src/main/java/org/rapidoid/util/AppInfo.java rename to rapidoid-web/src/test/java/org/rapidoid/http/MiniHttpTest.java index 52ecca2862..7f98f19263 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/util/AppInfo.java +++ b/rapidoid-web/src/test/java/org/rapidoid/http/MiniHttpTest.java @@ -1,6 +1,6 @@ /*- * #%L - * rapidoid-commons + * rapidoid-web * %% * Copyright (C) 2014 - 2018 Nikolche Mihajlovski and contributors * %% @@ -18,29 +18,36 @@ * #L% */ -package org.rapidoid.util; +package org.rapidoid.http; -import org.rapidoid.RapidoidThing; +import org.junit.Test; import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; +import org.rapidoid.setup.On; @Authors("Nikolche Mihajlovski") -@Since("5.1.0") -public class AppInfo extends RapidoidThing { +@Since("6.0.0") +public class MiniHttpTest extends HttpTestCommons { - public static volatile boolean isAppServerActive; + @Test + public void testA() { + On.get("/a").plain("A"); - public static volatile boolean isAdminServerActive; + eq(Self.get("/a").fetchRaw(), "A"); + } + + @Test + public void testB() { + On.get("/b").plain("B"); - public static volatile int appPort; + eq(Self.get("/b").fetchRaw(), "B"); + } - public static volatile int adminPort; + @Test + public void testC() { + On.get("/c").plain("C"); - public static void reset() { - isAppServerActive = false; - isAdminServerActive = false; - appPort = 0; - adminPort = 0; + eq(Self.get("/c").fetchRaw(), "C"); } }