From 45b638df1fa026f80cf2e95e5eb2c153fad11c3d Mon Sep 17 00:00:00 2001 From: Nikolche Mihajlovski Date: Sun, 27 May 2018 18:39:34 +0200 Subject: [PATCH] Fluent API to boot the services. --- .../com/example/GettingStartedExample.java | 5 +- .../src/main/resources/rapidoid-classes.txt | 1 + .../org/rapidoid/docs/httpcustom/Main.java | 4 +- .../org/rapidoid/docs/jpascaffold/Main.java | 8 +- .../java/org/rapidoid/docs/security/Main.java | 3 +- .../main/java/org/rapidoid/goodies/Boot.java | 198 ++------------ .../java/org/rapidoid/goodies/Booter.java | 258 ++++++++++++++++++ 7 files changed, 299 insertions(+), 178 deletions(-) create mode 100644 rapidoid-web/src/main/java/org/rapidoid/goodies/Booter.java diff --git a/examples/getting-started/src/main/java/com/example/GettingStartedExample.java b/examples/getting-started/src/main/java/com/example/GettingStartedExample.java index 667657645b..7a9cd9a5a8 100644 --- a/examples/getting-started/src/main/java/com/example/GettingStartedExample.java +++ b/examples/getting-started/src/main/java/com/example/GettingStartedExample.java @@ -18,8 +18,9 @@ public static void main(String[] args) { Log.info("Starting application"); App.scan(); // bootstrap beans (controllers, services etc.) - Boot.jpa(); // bootstrap JPA - Boot.auth(App.setup()); // bootstrap Auth + + Boot.jpa() // bootstrap JPA + .auth(); // bootstrap Auth On.get("/books").json(() -> JPA.of(Book.class).all()); // get all books diff --git a/rapidoid-commons/src/main/resources/rapidoid-classes.txt b/rapidoid-commons/src/main/resources/rapidoid-classes.txt index 1693d250a3..3005547e13 100644 --- a/rapidoid-commons/src/main/resources/rapidoid-classes.txt +++ b/rapidoid-commons/src/main/resources/rapidoid-classes.txt @@ -187,6 +187,7 @@ org.rapidoid.expire.Expire org.rapidoid.expire.Expiring org.rapidoid.goodies.BeansHandler org.rapidoid.goodies.Boot +org.rapidoid.goodies.Booter org.rapidoid.goodies.ClasspathHandler org.rapidoid.goodies.ConfigHandler org.rapidoid.goodies.DetailsHandler 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 110b771020..b6dc34f83b 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 @@ -44,8 +44,8 @@ public static void main(String[] args) { // now bootstrap some components, e.g. classpath scanning (beans) App.scan(); - Boot.jmx(App.setup()); - Boot.adminCenter(App.setup()); + Boot.jmx() + .adminCenter(); // continue with normal setup On.get("/x").json("x"); diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/jpascaffold/Main.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/jpascaffold/Main.java index b78b9bf04e..ce9c621242 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/jpascaffold/Main.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/jpascaffold/Main.java @@ -35,10 +35,10 @@ public class Main extends GUI { public static void main(String[] args) { App.run(args, "users.admin.password=a"); // demo-only password - Boot.jpa(); - Boot.auth(App.setup()); - Boot.entities(App.setup()); - Boot.overview(App.setup()); + Boot.jpa() + .auth() + .entities() + .overview(); App.gui() .search(true) diff --git a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/security/Main.java b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/security/Main.java index a36a15062c..66fc0b256a 100644 --- a/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/security/Main.java +++ b/rapidoid-integration-tests/src/test/java/org/rapidoid/docs/security/Main.java @@ -30,7 +30,8 @@ public class Main { public static void main(String[] args) { App.bootstrap(args); - Boot.auth(App.setup()); + + Boot.auth(); On.get("/").html((req, resp) -> "this is public!"); 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 46c6c634e9..00d1e995bf 100644 --- a/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/Boot.java @@ -20,211 +20,71 @@ package org.rapidoid.goodies; -import org.rapidoid.ModuleBootstrapParams; -import org.rapidoid.RapidoidModules; import org.rapidoid.RapidoidThing; import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; -import org.rapidoid.config.BasicConfig; -import org.rapidoid.gui.GUI; -import org.rapidoid.http.HttpUtils; -import org.rapidoid.insight.Metrics; -import org.rapidoid.jpa.JPA; -import org.rapidoid.security.Role; import org.rapidoid.setup.App; import org.rapidoid.setup.Setup; -import org.rapidoid.u.U; -import org.rapidoid.util.Msc; -import org.rapidoid.util.MscOpts; @Authors("Nikolche Mihajlovski") @Since("6.0.0") @SuppressWarnings("WeakerAccess") public class Boot extends RapidoidThing { - public static final JMXGoodies JMX = new JMXGoodies(); - - public static final String CENTER = "center"; - - public static void adminCenter(Setup setup) { - Msc.logSection("Registering Admin Center:"); - - overview(setup); - entities(setup); - application(setup); - lifecycle(setup); - jmx(setup); - metrics(setup); - auth(setup); + public static Booter on(Setup setup) { + return new Booter(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()); + private static Booter main() { + return on(App.setup()); } - public static void lifecycle(Setup setup) { - setup.page(uri("terminate")) - .roles(Role.ADMINISTRATOR) - .zone(CENTER) - .menu("System", "Terminate / Restart") - .mvc(new TerminateHandler()); + public static Booter adminCenter() { + return main().adminCenter(); } - public static void overview(Setup setup) { - setup.page(uri("")) - .roles(Role.ADMINISTRATOR) - .zone(CENTER) - .menu("System", "Overview") - .mvc(new OverviewHandler()); + public static Booter auth() { + return main().auth(); } - public static void application(Setup setup) { - 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 Booter lifecycle() { + return main().lifecycle(); } - public static void metrics(Setup setup) { - Metrics.bootstrap(); - - 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 Booter overview() { + return main().overview(); } - public static void jmx(Setup setup) { - 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 Booter application() { + return main().application(); } - public static void entities(Setup setup) { - setup.page(uri("entities")) - .roles(Role.ADMINISTRATOR) - .zone(CENTER) - .menu("System", "Entities") - .mvc(new EntitiesHandler()); - - if (MscOpts.hasJPA()) { - for (Class type : JPA.getEntityJavaTypes()) { - String uri = GUI.typeUri(type); - - BasicConfig zone = HttpUtils.zone(setup.custom(), setup.zone()); - String contextPath = zone.entry("home").or(uri("")); - - X.scaffold(type) - .baseUri(Msc.uri(contextPath, uri)) - .roles(Role.ADMINISTRATOR) - .on(setup); - } - } + public static Booter metrics() { + return main().metrics(); } - public static void oauth(Setup setup) { - ModuleBootstrapParams params = new ModuleBootstrapParams().setup(setup); - RapidoidModules.get("OAuth").bootstrap(params); + public static Booter jmx() { + return main().jmx(); } - public static void openapi(Setup setup) { - ModuleBootstrapParams params = new ModuleBootstrapParams().setup(setup); - RapidoidModules.get("OpenAPI").bootstrap(params); + public static Booter entities() { + return main().entities(); } - public static void jpa(String... packages) { - if (U.isEmpty(packages)) packages = App.path(); - - JPA.bootstrap(packages); + public static Booter oauth() { + return main().oauth(); } - public static void all() { - Setup setup = App.setup(); - - jpa(); - auth(setup); - oauth(setup); - openapi(setup); + public static Booter openapi() { + return main().openapi(); + } - adminCenter(setup); + public static Booter jpa(String... packages) { + return main().jpa(packages); } - private static String uri(String path) { - return Msc.specialUri(path); + public static Booter all() { + return main().all(); } } diff --git a/rapidoid-web/src/main/java/org/rapidoid/goodies/Booter.java b/rapidoid-web/src/main/java/org/rapidoid/goodies/Booter.java new file mode 100644 index 0000000000..edbcd13c02 --- /dev/null +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/Booter.java @@ -0,0 +1,258 @@ +/*- + * #%L + * rapidoid-web + * %% + * 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.goodies; + +import org.rapidoid.ModuleBootstrapParams; +import org.rapidoid.RapidoidModules; +import org.rapidoid.RapidoidThing; +import org.rapidoid.annotation.Authors; +import org.rapidoid.annotation.Since; +import org.rapidoid.config.BasicConfig; +import org.rapidoid.gui.GUI; +import org.rapidoid.http.HttpUtils; +import org.rapidoid.insight.Metrics; +import org.rapidoid.jpa.JPA; +import org.rapidoid.security.Role; +import org.rapidoid.setup.App; +import org.rapidoid.setup.Setup; +import org.rapidoid.u.U; +import org.rapidoid.util.Msc; +import org.rapidoid.util.MscOpts; + +@Authors("Nikolche Mihajlovski") +@Since("6.0.0") +@SuppressWarnings("WeakerAccess") +public class Booter extends RapidoidThing { + + public static final JMXGoodies JMX = new JMXGoodies(); + + private static final String CENTER = "center"; + + private final Setup setup; + + public Booter(Setup setup) { + this.setup = setup; + } + + public Booter adminCenter() { + Msc.logSection("Registering Admin Center:"); + + overview(); + entities(); + application(); + lifecycle(); + jmx(); + metrics(); + auth(); + + return this; + } + + public Booter auth() { + setup.post(uri("login")) + .roles() + .json(new LoginHandler()); + + setup.get(uri("logout")) + .roles(Role.LOGGED_IN) + .json(new LogoutHandler()); + + return this; + } + + public Booter lifecycle() { + setup.page(uri("terminate")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Terminate / Restart") + .mvc(new TerminateHandler()); + + return this; + } + + public Booter overview() { + setup.page(uri("")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Overview") + .mvc(new OverviewHandler()); + + return this; + } + + public Booter application() { + 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()); + + return this; + } + + public Booter metrics() { + Metrics.bootstrap(); + + 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()); + + return this; + } + + public Booter jmx() { + 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()); + + return this; + } + + public Booter entities() { + setup.page(uri("entities")) + .roles(Role.ADMINISTRATOR) + .zone(CENTER) + .menu("System", "Entities") + .mvc(new EntitiesHandler()); + + if (MscOpts.hasJPA()) { + for (Class type : JPA.getEntityJavaTypes()) { + String uri = GUI.typeUri(type); + + BasicConfig zone = HttpUtils.zone(setup.custom(), setup.zone()); + String contextPath = zone.entry("home").or(uri("")); + + X.scaffold(type) + .baseUri(Msc.uri(contextPath, uri)) + .roles(Role.ADMINISTRATOR) + .on(setup); + } + } + + return this; + } + + public Booter oauth() { + ModuleBootstrapParams params = new ModuleBootstrapParams().setup(setup); + RapidoidModules.get("OAuth").bootstrap(params); + + return this; + } + + public Booter openapi() { + ModuleBootstrapParams params = new ModuleBootstrapParams().setup(setup); + RapidoidModules.get("OpenAPI").bootstrap(params); + + return this; + } + + public Booter jpa(String... packages) { + if (U.isEmpty(packages)) packages = App.path(); + + JPA.bootstrap(packages); + + return this; + } + + public Booter all() { + jpa(); + auth(); + oauth(); + openapi(); + + adminCenter(); + + return this; + } + + private String uri(String path) { + return Msc.specialUri(path); + } + +}