001/* 002 * (C) Copyright 2010-2011 Nuxeo SAS (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * tdelprat 016 */ 017package org.nuxeo.ecm.admin; 018 019import static org.jboss.seam.ScopeType.CONVERSATION; 020 021import java.io.Serializable; 022import java.util.ArrayList; 023import java.util.List; 024 025import javax.faces.model.SelectItem; 026 027import org.apache.commons.logging.Log; 028import org.apache.commons.logging.LogFactory; 029import org.jboss.seam.ScopeType; 030import org.jboss.seam.annotations.Factory; 031import org.jboss.seam.annotations.Name; 032import org.jboss.seam.annotations.Scope; 033import org.jboss.seam.contexts.Contexts; 034import org.nuxeo.ecm.platform.audit.api.AuditReader; 035import org.nuxeo.ecm.platform.audit.api.LogEntry; 036import org.nuxeo.ecm.platform.web.common.session.NuxeoHttpSessionMonitor; 037import org.nuxeo.ecm.platform.web.common.session.SessionInfo; 038import org.nuxeo.runtime.api.Framework; 039 040/** 041 * Seam Bean to export some stats about user's activity 042 * 043 * @author <a href="mailto:td@nuxeo.com">Thierry Delprat</a> 044 */ 045@Name("usersActivityInfo") 046@Scope(CONVERSATION) 047public class UsersActivityManager implements Serializable { 048 049 private static final long serialVersionUID = 1L; 050 051 protected static final Log log = LogFactory.getLog(UsersActivityManager.class); 052 053 protected String selectedAuditTimeRange; 054 055 protected String selectedAuditCategory; 056 057 protected String selectedHttpSessionsTimeRange; 058 059 protected int currentAuditPage = 1; 060 061 protected static int pageSize = 25; 062 063 // ********************************* 064 // Audit Management 065 066 public List<SelectItem> getAuditTimeRanges() { 067 List<SelectItem> ranges = new ArrayList<SelectItem>(); 068 069 for (int i = 1; i < 13; i++) { 070 ranges.add(new SelectItem(i + "h", "label.timerange." + i + "h")); 071 } 072 for (int i = 1; i < 8; i++) { 073 ranges.add(new SelectItem(i * 24 + "h", "label.timerange." + i + "d")); 074 } 075 for (int i = 2; i < 6; i++) { 076 ranges.add(new SelectItem(24 * 7 * i + "h", "label.timerange." + i + "w")); 077 } 078 return ranges; 079 } 080 081 public List<SelectItem> getAuditCategories() { 082 List<SelectItem> ranges = new ArrayList<SelectItem>(); 083 084 ranges.add(new SelectItem("NuxeoAuthentication", "label.audit.auth")); 085 ranges.add(new SelectItem("eventDocumentCategory", "label.audit.doc")); 086 ranges.add(new SelectItem("eventLifeCycleCategory", "label.audit.lifecycle")); 087 ranges.add(new SelectItem("all", "label.audit.all")); 088 return ranges; 089 } 090 091 public String getSelectedAuditTimeRange() { 092 if (selectedAuditTimeRange == null) { 093 selectedAuditTimeRange = "1h"; 094 } 095 return selectedAuditTimeRange; 096 } 097 098 public void setSelectedAuditTimeRange(String dateRange) { 099 selectedAuditTimeRange = dateRange; 100 currentAuditPage = 1; 101 Contexts.getEventContext().remove("userLoginEvents"); 102 } 103 104 public String getSelectedAuditCategory() { 105 if (selectedAuditCategory == null) { 106 selectedAuditCategory = "all"; 107 } 108 return selectedAuditCategory; 109 } 110 111 public void setSelectedAuditCategory(String category) { 112 selectedAuditCategory = category; 113 currentAuditPage = 1; 114 Contexts.getEventContext().remove("userLoginEvents"); 115 } 116 117 public int getCurrentAuditPage() { 118 return currentAuditPage; 119 } 120 121 public void nextAuditPage() { 122 currentAuditPage += 1; 123 Contexts.getEventContext().remove("userLoginEvents"); 124 } 125 126 public void prevAuditPage() { 127 currentAuditPage -= 1; 128 if (currentAuditPage <= 0) { 129 currentAuditPage = 1; 130 } 131 Contexts.getEventContext().remove("userLoginEvents"); 132 } 133 134 @Factory(value = "userLoginEvents", scope = ScopeType.EVENT) 135 public List<LogEntry> getLoginInfo() { 136 137 AuditReader reader = Framework.getService(AuditReader.class); 138 139 String[] cat = { getSelectedAuditCategory() }; 140 if (getSelectedAuditCategory().equals("all")) { 141 cat = new String[0]; 142 } 143 return reader.queryLogsByPage(new String[0], selectedAuditTimeRange, cat, null, currentAuditPage, pageSize); 144 } 145 146 // ********************** 147 // User's Http Sessions 148 149 public List<SelectItem> getHttpSessionsTimeRanges() { 150 List<SelectItem> ranges = new ArrayList<SelectItem>(); 151 152 ranges.add(new SelectItem(5 * 60 + "s", "label.timerange." + 5 + "m")); 153 ranges.add(new SelectItem(10 * 60 + "s", "label.timerange." + 10 + "m")); 154 ranges.add(new SelectItem(20 * 60 + "s", "label.timerange." + 20 + "m")); 155 ranges.add(new SelectItem(30 * 60 + "s", "label.timerange." + 30 + "m")); 156 ranges.add(new SelectItem(60 * 60 + "s", "label.timerange." + 1 + "h")); 157 ranges.add(new SelectItem(2 * 60 * 60 + "s", "label.timerange." + 2 + "h")); 158 ranges.add(new SelectItem(4 * 60 * 60 + "s", "label.timerange." + 4 + "h")); 159 ranges.add(new SelectItem("all", "label.timerange.all")); 160 161 return ranges; 162 } 163 164 public String getSelectedHttpSessionsTimeRange() { 165 if (selectedHttpSessionsTimeRange == null) { 166 selectedHttpSessionsTimeRange = "1800s"; 167 } 168 return selectedHttpSessionsTimeRange; 169 } 170 171 public void setSelectedHttpSessionsTimeRange(String dateRange) { 172 selectedHttpSessionsTimeRange = dateRange; 173 Contexts.getEventContext().remove("userHttpSessions"); 174 } 175 176 @Factory(value = "nbActiveUserHttpSessions", scope = ScopeType.EVENT) 177 public int getUserSessionsCount() { 178 return NuxeoHttpSessionMonitor.instance().getSortedSessions().size(); 179 } 180 181 @Factory(value = "nbUserRequests", scope = ScopeType.EVENT) 182 public long getUserRequestCount() { 183 return NuxeoHttpSessionMonitor.instance().getGlobalRequestCounter(); 184 } 185 186 @Factory(value = "userHttpSessions", scope = ScopeType.EVENT) 187 public List<SessionInfo> getUserSessions() { 188 if (getSelectedHttpSessionsTimeRange().equals("all")) { 189 return NuxeoHttpSessionMonitor.instance().getSortedSessions(); 190 } else { 191 long maxInactivity = Long.parseLong(selectedHttpSessionsTimeRange.replace("s", "")); 192 return NuxeoHttpSessionMonitor.instance().getSortedSessions(maxInactivity); 193 } 194 } 195 196}