/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.admin.sysinfo; import java.io.File; import java.io.IOException; import java.lang.management.MemoryType; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.olat.admin.sysinfo.manager.SessionStatsManager; import org.olat.admin.sysinfo.model.SessionsStats; import org.olat.basesecurity.BaseSecurity; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.DefaultController; import org.olat.core.gui.control.WindowControl; import org.olat.core.helpers.Settings; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; /** * Description:<br> * all you wanted to know about your running OLAT system * * @author Felix Jost */ public class SysinfoController extends FormBasicController { private final BaseSecurity securityManager; private final SessionStatsManager sessionStatsManager; /** * @param ureq * @param wControl */ public SysinfoController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl, "sysinfo"); securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); sessionStatsManager = CoreSpringFactory.getImpl(SessionStatsManager.class); initForm(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { Formatter format = Formatter.getInstance(getLocale()); //runtime informations FormLayoutContainer runtimeCont = FormLayoutContainer.createDefaultFormLayout("runtime", getTranslator()); formLayout.add(runtimeCont); formLayout.add("runtime", runtimeCont); String startup = format.formatDateAndTime(new Date(WebappHelper.getTimeOfServerStartup())); uifactory.addStaticTextElement("runtime.startup", "runtime.startup", startup, runtimeCont); String time = format.formatDateAndTime(new Date()) + " (" + Calendar.getInstance().getTimeZone().getDisplayName(false, TimeZone.SHORT, ureq.getLocale()) + ")"; uifactory.addStaticTextElement("runtime.time", "runtime.time", time, runtimeCont); //memory uifactory.addMemoryView("memoryHeap", "runtime.memory", MemoryType.HEAP, runtimeCont); uifactory.addMemoryView("memoryNonHeap", "runtime.memory.permGen", MemoryType.NON_HEAP, runtimeCont); //controllers int controllerCnt = DefaultController.getControllerCount(); uifactory.addStaticTextElement("controllercount", "runtime.controllercount", Integer.toString(controllerCnt), runtimeCont); int numOfDispatchingThreads = sessionStatsManager.getConcurrentCounter(); uifactory.addStaticTextElement("dispatchingthreads", "runtime.dispatchingthreads", Integer.toString(numOfDispatchingThreads), runtimeCont); //sessions and clicks String sessionAndClicksPage = velocity_root + "/session_clicks.html"; FormLayoutContainer sessionAndClicksCont = FormLayoutContainer.createCustomFormLayout("session_clicks", getTranslator(), sessionAndClicksPage); runtimeCont.add(sessionAndClicksCont); sessionAndClicksCont.setLabel("sess.and.clicks", null); Calendar lastLoginMonthlyLimit = Calendar.getInstance(); //users monthly lastLoginMonthlyLimit.add(Calendar.MONTH, -1); Long userLastMonth = securityManager.countUniqueUserLoginsSince(lastLoginMonthlyLimit.getTime()); lastLoginMonthlyLimit.add(Calendar.MONTH, -5); // -1 -5 = -6 for half a year Long userLastSixMonths = securityManager.countUniqueUserLoginsSince(lastLoginMonthlyLimit.getTime()); lastLoginMonthlyLimit.add(Calendar.MONTH, -11); // -1 -11 = -12 for one year Long userLastYear = securityManager.countUniqueUserLoginsSince(lastLoginMonthlyLimit.getTime()); sessionAndClicksCont.contextPut("users1month", userLastMonth.toString()); sessionAndClicksCont.contextPut("users6month", userLastSixMonths.toString()); sessionAndClicksCont.contextPut("usersyear", userLastYear.toString()); //users daily Calendar lastLoginDailyLimit = Calendar.getInstance(); lastLoginDailyLimit.add(Calendar.DAY_OF_YEAR, -1); Long userLastDay = securityManager.countUniqueUserLoginsSince(lastLoginDailyLimit.getTime()); lastLoginDailyLimit.add(Calendar.DAY_OF_YEAR, -6); // -1 - 6 = -7 for last week Long userLast6Days = securityManager.countUniqueUserLoginsSince(lastLoginDailyLimit.getTime()); sessionAndClicksCont.contextPut("userslastday", userLastDay.toString()); sessionAndClicksCont.contextPut("userslastweek", userLast6Days.toString()); //last 5 minutes long activeSessions = sessionStatsManager.getActiveSessions(300); sessionAndClicksCont.contextPut("count5Minutes", String.valueOf(activeSessions)); SessionsStats stats = sessionStatsManager.getSessionsStatsLast(300); sessionAndClicksCont.contextPut("click5Minutes", String.valueOf(stats.getAuthenticatedClickCalls())); sessionAndClicksCont.contextPut("poll5Minutes", String.valueOf(stats.getAuthenticatedPollerCalls())); sessionAndClicksCont.contextPut("request5Minutes", String.valueOf(stats.getRequests())); sessionAndClicksCont.contextPut("minutes", String.valueOf(5)); //last minute activeSessions = sessionStatsManager.getActiveSessions(60); sessionAndClicksCont.contextPut("count1Minute", String.valueOf(activeSessions)); stats = sessionStatsManager.getSessionsStatsLast(60); sessionAndClicksCont.contextPut("click1Minute", String.valueOf(stats.getAuthenticatedClickCalls())); sessionAndClicksCont.contextPut("poll1Minute", String.valueOf(stats.getAuthenticatedPollerCalls())); sessionAndClicksCont.contextPut("request1Minute", String.valueOf(stats.getRequests())); sessionAndClicksCont.contextPut("oneMinute", "1"); //server informations FormLayoutContainer serverCont = FormLayoutContainer.createDefaultFormLayout("server", getTranslator()); formLayout.add(serverCont); formLayout.add("server", serverCont); //version uifactory.addStaticTextElement("version", "sysinfo.version", Settings.getFullVersionInfo(), serverCont); uifactory.addStaticTextElement("version.hg", "sysinfo.version.hg", WebappHelper.getChangeSet(), serverCont); String buildDate = format.formatDateAndTime(Settings.getBuildDate()); uifactory.addStaticTextElement("version.date", "sysinfo.version.date", buildDate, serverCont); //cluster boolean clusterMode = "Cluster".equals(Settings.getClusterMode()); MultipleSelectionElement clusterEl = uifactory.addCheckboxesHorizontal("cluster", "sysinfo.cluster", serverCont, new String[]{"xx"}, new String[]{""}); clusterEl.setEnabled(false); clusterEl.select("xx", clusterMode); String nodeId = StringHelper.containsNonWhitespace(Settings.getNodeInfo()) ? Settings.getNodeInfo() : "N1"; uifactory.addStaticTextElement("node", "sysinfo.node", nodeId, serverCont); File baseDir = new File(WebappHelper.getContextRoot()); String baseDirPath = null; try { baseDirPath = baseDir.getCanonicalPath(); } catch (IOException e1) { baseDirPath = baseDir.getAbsolutePath(); } uifactory.addStaticTextElement("sysinfo.basedir", "sysinfo.basedir", baseDirPath, serverCont); uifactory.addStaticTextElement("sysinfo.olatdata", "sysinfo.olatdata", WebappHelper.getUserDataRoot(), serverCont); } @Override protected void doDispose() { // } @Override protected void formOK(UserRequest ureq) { // } }