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:td@nuxeo.com">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}