package org.rapidoid.goodies;
import org.rapidoid.RapidoidThing;
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.cls.Cls;
import org.rapidoid.dbadmin.DbAdmin;
import org.rapidoid.dbadmin.ManageableRdbms;
import org.rapidoid.goodies.discovery.DiscoveryIndexHandler;
import org.rapidoid.goodies.discovery.DiscoveryRegistrationHandler;
import org.rapidoid.goodies.discovery.DiscoveryState;
import org.rapidoid.group.Groups;
import org.rapidoid.gui.GUI;
import org.rapidoid.http.HttpUtils;
import org.rapidoid.http.HttpVerb;
import org.rapidoid.insight.Metrics;
import org.rapidoid.jpa.JPA;
import org.rapidoid.security.Role;
import org.rapidoid.setup.On;
import org.rapidoid.setup.Setup;
import org.rapidoid.u.U;
import org.rapidoid.util.Msc;
import org.rapidoid.util.MscOpts;
import java.lang.reflect.Method;
/*
* #%L
* rapidoid-web
* %%
* Copyright (C) 2014 - 2017 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%
*/
@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public class Goodies extends RapidoidThing {
public static final JMXGoodies JMX = new JMXGoodies();
public static void bootstrap(Setup setup) {
if (setup.isAdmin()) {
adminCenter(setup);
} else if (setup.isApp()) {
bootstrapAppGoodies(setup);
}
}
public static void bootstrapAppGoodies(Setup setup) {
Msc.logSection("Registering App services:");
auth(setup);
}
public static void adminCenter(Setup setup) {
Msc.logSection("Registering Admin Center:");
Metrics.bootstrap();
overview(setup);
entities(setup);
application(setup);
lifecycle(setup);
processes(setup);
manageables(setup);
jmx(setup);
metrics(setup);
auth(setup);
status(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());
}
public static void ping(Setup setup) {
setup.get(uri("ping")).plain("OK");
}
public static void lifecycle(Setup setup) {
setup.page(uri("terminate")).mvc(new TerminateHandler());
}
public static void overview(Setup setup) {
setup.page(uri("")).mvc(new OverviewHandler());
}
public static void application(Setup setup) {
setup.page(uri("routes")).mvc(new RoutesHandler());
setup.page(uri("beans")).mvc(new BeansHandler());
setup.page(uri("config")).mvc(new ConfigHandler());
setup.get(uri("classpath")).mvc(new ClasspathHandler());
}
public static void metrics(Setup setup) {
setup.page(uri("metrics")).mvc(new GraphsHandler());
setup.get(uri("graphs/{id:.*}")).json(new GraphDataHandler());
}
public static void processes(Setup setup) {
setup.page(uri("processes")).mvc(new ProcessesHandler());
setup.page(uri("processes/{id}")).mvc(new ProcessDetailsHandler());
}
public static void manageables(Setup setup) {
setup.page(uri("manageables")).mvc(new ManageablesOverviewPage());
setup.page(uri("manageables/{type}/{id}/*")).mvc(new ManageableDetailsPage());
}
public static void dbAdmin(Setup setup) {
DbAdmin.bootstrap();
String baseUri = uri("db");
ManageablesOverviewPage overview = new ManageablesOverviewPage()
.groups(Groups.find(ManageableRdbms.class))
.baseUri(baseUri);
setup.page(baseUri).mvc(overview);
ManageableDetailsPage details = new ManageableDetailsPage()
.baseUri(baseUri);
setup.page(baseUri + "/{type}/{id}/*").mvc(details);
}
public static void jmx(Setup setup) {
setup.page(uri("jmx/memory")).mvc(JMX.memory());
setup.page(uri("jmx/mempool")).mvc(JMX.memoryPool());
setup.page(uri("jmx/classes")).mvc(JMX.classes());
setup.page(uri("jmx/os")).mvc(JMX.os());
setup.page(uri("jmx/threads")).mvc(JMX.threads());
setup.page(uri("jmx/compilation")).mvc(JMX.compilation());
setup.page(uri("jmx/runtime")).mvc(JMX.runtime());
setup.page(uri("jmx/gc")).mvc(JMX.gc());
}
public static void entities(Setup setup) {
setup.page(uri("entities")).mvc(new EntitiesHandler());
if (MscOpts.hasJPA()) {
for (Class<?> type : JPA.getEntityJavaTypes()) {
String uri = GUI.typeUri(type);
String contextPath = HttpUtils.zone(setup.custom(), setup.zone()).entry("home").or(uri(""));
X.scaffold(setup, Msc.uri(contextPath, uri), type);
}
}
}
public static void oauth(Setup setup) {
Class<?> oauthClass = Cls.getClassIfExists("org.rapidoid.oauth.OAuth");
U.must(oauthClass != null, "Cannot find the OAuth components, is module 'rapidoid-oauth' missing?");
Method bootstrap = Cls.getMethod(oauthClass, "bootstrap", Setup.class);
Cls.invokeStatic(bootstrap, setup);
}
public static void welcome(Setup setup) {
if (!setup.routes().hasRouteOrResource(HttpVerb.GET, "/")) {
On.get("/").view("_welcome").mvc(new WelcomeHandler());
}
}
public static void status(Setup setup) {
setup.get(uri("status")).json(new StatusHandler());
}
public static void discovery(Setup setup) {
DiscoveryState state = new DiscoveryState();
setup.post(uri("discovery/{scope}/register")).json(new DiscoveryRegistrationHandler(state));
setup.get(uri("discovery/{scope}")).json(new DiscoveryIndexHandler(state));
}
public static void echo(Setup setup) {
setup.get(uri("echo")).json(new EchoHandler());
}
static String uri(String path) {
return Msc.specialUri(path);
}
}