All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.rapidoid.goodies.Goodies Maven / Gradle / Ivy

There is a newer version: 5.5.5
Show newest version
package org.rapidoid.goodies;

import org.rapidoid.RapidoidThing;
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.config.Conf;
import org.rapidoid.config.Config;
import org.rapidoid.crypto.Crypto;
import org.rapidoid.gui.GUI;
import org.rapidoid.http.HttpUtils;
import org.rapidoid.insight.Metrics;
import org.rapidoid.jpa.JPA;
import org.rapidoid.log.Log;
import org.rapidoid.security.Roles;
import org.rapidoid.setup.Setup;
import org.rapidoid.util.AnsiColor;
import org.rapidoid.util.Msc;

import java.lang.management.ManagementFactory;

/*
 * #%L
 * rapidoid-web
 * %%
 * Copyright (C) 2014 - 2016 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 {

	private static volatile String generatedAdminPassword;

	public static MultiDetailsHandler memoryPool() {
		return new MultiDetailsHandler("Memory pool", ManagementFactory.getMemoryPoolMXBeans(), "name", "type", "memoryManagerNames", "usage", "peakUsage", "collectionUsage");
	}

	public static DetailsHandler classes() {
		return new DetailsHandler("Classes", ManagementFactory.getClassLoadingMXBean(), "-objectName");
	}

	public static DetailsHandler os() {
		return new DetailsHandler("Operating system", ManagementFactory.getOperatingSystemMXBean(), "-objectName");
	}

	public static DetailsHandler threads() {
		return new DetailsHandler("JVM Threads", ManagementFactory.getThreadMXBean(), "-objectName", "-allThreadIds");
	}

	public static DetailsHandler compilation() {
		return new DetailsHandler("Compilation", ManagementFactory.getCompilationMXBean(), "-objectName");
	}

	public static DetailsHandler runtime() {
		return new DetailsHandler("Runtime", ManagementFactory.getRuntimeMXBean(), "-objectName", "-classPath", "-bootClassPath", "-systemProperties");
	}

	public static MultiDetailsHandler gc() {
		return new MultiDetailsHandler("Garbage collection", ManagementFactory.getGarbageCollectorMXBeans(), "-objectName", "-memoryPools", "-lastGcInfo");
	}

	public static DetailsHandler memory() {
		return new DetailsHandler("Memory", ManagementFactory.getMemoryMXBean(), "-objectName");
	}

	public static GraphsHandler graphs() {
		return new GraphsHandler();
	}

	public static GraphDataHandler graphData() {
		return new GraphDataHandler();
	}

	public static LoginHandler login() {
		return new LoginHandler();
	}

	public static LogoutHandler logout() {
		return new LogoutHandler();
	}

	public static ConfigHandler config() {
		return new ConfigHandler();
	}

	public static EntitiesHandler entities() {
		return new EntitiesHandler();
	}

	public static RoutesHandler routes() {
		return new RoutesHandler();
	}

	public static BeansHandler beans() {
		return new BeansHandler();
	}

	public static OverviewHandler overview() {
		return new OverviewHandler();
	}

	public static ClasspathHandler classpath() {
		return new ClasspathHandler();
	}

	public static DeployHandler deploy() {
		return new DeployHandler();
	}

	public static JarUploadHandler jarUpload() {
		return new JarUploadHandler();
	}

	public static TerminateHandler terminate() {
		return new TerminateHandler();
	}

	public static void bootstrap(Setup setup) {
		if (setup.isAdmin()) {
			adminCenter(setup);
		} else if (setup.isApp()) {
			bootstrapAppGoodies(setup);
		}
	}

	public static void auth(Setup setup) {
		setup.post("/_login").roles().json(Goodies.login());
		setup.get("/_logout").roles(Roles.LOGGED_IN).json(Goodies.logout());
	}

	public static void bootstrapAppGoodies(Setup setup) {
		if (!setup.goodies()) {
			Log.warn("Goodies are disabled for setup: " + setup.name());
			return;
		}

		Msc.logSection("Registering App goodies:");

		auth(setup);
	}

	public static void adminCenter(Setup setup) {
		if (!setup.goodies()) {
			Log.warn("Goodies are disabled for setup: " + setup.name());
			return;
		}

		Msc.logSection("Registering Admin goodies:");

		Metrics.bootstrap();

		setup.page("/_/").mvc(Goodies.overview());

		if (Msc.hasJPA()) {
			jpaGoodies(setup);
		}

		setup.page("/_/routes").mvc(Goodies.routes());
		setup.page("/_/beans").mvc(Goodies.beans());
		setup.page("/_/config").mvc(Goodies.config());

		setup.page("/_/jmx/memory").mvc(Goodies.memory());
		setup.page("/_/jmx/mempool").mvc(Goodies.memoryPool());
		setup.page("/_/jmx/classes").mvc(Goodies.classes());
		setup.page("/_/jmx/os").mvc(Goodies.os());
		setup.page("/_/jmx/threads").mvc(Goodies.threads());
		setup.page("/_/jmx/compilation").mvc(Goodies.compilation());
		setup.page("/_/jmx/runtime").mvc(Goodies.runtime());
		setup.page("/_/jmx/gc").mvc(Goodies.gc());

		setup.page("/_/metrics").mvc(Goodies.graphs());
		setup.get("/_/graphs/{id:.*}").json(Goodies.graphData());

		setup.get("/_/classpath").mvc(Goodies.classpath());
		setup.get("/_/deploy").mvc(Goodies.deploy());
		setup.post("/_/jar").json(Goodies.jarUpload());
		setup.page("/_/terminate").mvc(Goodies.terminate());

		auth(setup);

		if (Conf.USERS.isEmpty()) {
			String pass = generatedAdminPassword();
			Config admin = Conf.USERS.sub("admin");
			admin.set("roles", "administrator");
			admin.set("password", pass);
			Msc.logSection("ADMIN CREDENTIALS: username = " + AnsiColor.bold("admin") + ", password = " + AnsiColor.bold(pass));
		}
	}

	public static synchronized String generatedAdminPassword() {
		if (generatedAdminPassword == null) {
			generatedAdminPassword = Crypto.randomStr(16);
		}

		return generatedAdminPassword;
	}

	private static void jpaGoodies(Setup setup) {
		setup.page("/_/entities").mvc(Goodies.entities());

		for (Class type : JPA.getEntityJavaTypes()) {
			String uri = GUI.typeUri(type);
			String contextPath = HttpUtils.getContextPath(setup.custom(), setup.segment());
			X.scaffold(setup, Msc.uri(contextPath, uri), type);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy