/**
* 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.
* <p>
*/
package org.olat.admin.sysinfo;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.olat.basesecurity.AuthHelper;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.Windows;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.Window;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.table.BooleanColumnDescriptor;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.gui.components.table.StaticColumnDescriptor;
import org.olat.core.gui.components.table.Table;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableEvent;
import org.olat.core.gui.components.table.TableGuiConfiguration;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.logging.activity.OlatLoggingAction;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.Formatter;
import org.olat.core.util.SessionInfo;
import org.olat.core.util.UserSession;
import org.olat.core.util.Util;
import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.coordinate.LockEntry;
import org.olat.util.logging.activity.LoggingResourceable;
/**
* Initial Date: 01.09.2004
* @author Mike Stock
*/
public class UserSessionController extends BasicController {
OLog log = Tracing.createLoggerFor(this.getClass());
private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(SysinfoController.class);
private VelocityContainer myContent;
private TableController tableCtr;
private Formatter f;
private UserSessionTableModel usessTableModel;
private DialogBoxController dialogController;
private int selRow;
private Link backLink;
private Link sessKillButton;
/**
* Controlls user session in admin view.
*
* @param ureq
* @param wControl
*/
public UserSessionController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl);
f = Formatter.getInstance(ureq.getLocale());
myContent = createVelocityContainer("sessions");
backLink = LinkFactory.createLinkBack(myContent, this);
sessKillButton = LinkFactory.createButton("sess.kill", myContent, this);
TableGuiConfiguration tableConfig = new TableGuiConfiguration();
tableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator(), null);
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.last", 0, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.first", 1, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.identity", 2, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.authprovider", 3, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.fqdn", 4, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.access", 5, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("sess.duration", 6, null, ureq.getLocale()));
tableCtr.addColumnDescriptor(new BooleanColumnDescriptor("sess.mode", 7, null, translate("sess.mode.ajax"), translate("sess.mode.standard")));
tableCtr.addColumnDescriptor(new StaticColumnDescriptor("sess.details", "table.action", translate("sess.details")));
listenTo(tableCtr);
reset();
myContent.put("sessiontable", tableCtr.getInitialComponent());
putInitialPanel(myContent);
}
/**
* Re-initialize this controller. Fetches sessions again.
*/
public void reset() {
List authUserSessions = new ArrayList(UserSession.getAuthenticatedUserSessions());
usessTableModel = new UserSessionTableModel(authUserSessions);
tableCtr.setTableDataModel(usessTableModel);
myContent.setPage(VELOCITY_ROOT + "/sessions.html");
}
/**
* @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
* org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
*/
public void event(UserRequest ureq, Component source, Event event) {
if (source == backLink){
reset();
}
else if (source == sessKillButton){
dialogController = activateYesNoDialog(ureq, null, translate("sess.kill.sure"), dialogController);
return;
}
}
/**
* @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
* org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
*/
public void event(UserRequest ureq, Controller source, Event event) {
if (source == dialogController) {
if (DialogBoxUIFactory.isYesEvent(event)) {
UserSession usess = (UserSession) usessTableModel.getObject(selRow);
SessionInfo sessInfo = usess.getSessionInfo();
if (usess.isAuthenticated()) {
HttpSession session = sessInfo.getSession();
if (session!=null) {
try{
session.invalidate();
} catch(IllegalStateException ise) {
// thrown when session already invalidated. fine. ignore.
}
}
showInfo("sess.kill.done", sessInfo.getLogin() );
}
reset();
}
}
else if (source == tableCtr) {
if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
TableEvent te = (TableEvent) event;
selRow = te.getRowId();
// session info (we only have authenticated sessions here
UserSession usess = (UserSession) usessTableModel.getObject(selRow);
//if (!usess.isAuthenticated()) throw new AssertException("usersession was not authenticated!?");
myContent.setPage(VELOCITY_ROOT + "/sessionDetails.html");
myContent.contextPut("us", usess);
SessionInfo sessInfo = usess.getSessionInfo();
myContent.contextPut("si", sessInfo);
boolean isAuth = usess.isAuthenticated();
myContent.contextPut("isauth", isAuth? "yes" : "-- NOT AUTHENTICATED!");
long creatTime = -1;
long lastAccessTime = -1;
boolean success = false;
if (isAuth) {
try {
HttpSession se = sessInfo.getSession();
creatTime = se.getCreationTime();
lastAccessTime = se.getLastAccessedTime();
success = true;
} catch (Exception ise) {
// nothing to do
}
}
if (success) {
myContent.contextPut("created", f.formatDateAndTime(new Date(creatTime)));
myContent.contextPut("lastaccess", f.formatDateAndTime(new Date(lastAccessTime)));
} else {
myContent.contextPut("created", " -- this session has been invalidated --");
myContent.contextPut("lastaccess", " -- this session has been invalidated --");
}
if (success) {
// lock information
String username = sessInfo.getLogin();
ArrayList lockList = new ArrayList();
List<LockEntry> locks = CoordinatorManager.getCoordinator().getLocker().adminOnlyGetLockEntries();
Formatter f = Formatter.getInstance(ureq.getLocale());
for (LockEntry entry : locks) {
if (entry.getOwner().getName().equals(username)) {
lockList.add(entry.getKey()+" "+f.formatDateAndTime(new Date(entry.getLockAquiredTime())));
}
}
myContent.contextPut("locklist", lockList);
// user environment
myContent.contextPut("env", usess.getIdentityEnvironment());
// GUI statistics
Windows ws = Windows.getWindows(usess);
StringBuilder sb = new StringBuilder();
for (Iterator iterator = ws.getWindowIterator(); iterator.hasNext();) {
Window window = (Window) iterator.next();
sb.append("- Window ").append(window.getDispatchID()).append(" dispatch info: ").append(window.getLatestDispatchComponentInfo()).append("<br />");
}
sb.append("<br />");
myContent.contextPut("guistats", sb.toString());
}
}
}
}
protected void doDispose() {
// DialogBoxController and TableController get disposed by BasicController
usessTableModel = null;
}
}