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