/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/widget/VisitsWidget.java $
* $Id: VisitsWidget.java 128561 2013-08-16 01:43:57Z matthew@longsight.com $
*
* Copyright (c) 2006-2009 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.sitestats.tool.wicket.widget;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.ResourceModel;
import org.sakaiproject.javax.PagingPosition;
import org.sakaiproject.sitestats.api.SitePresence;
import org.sakaiproject.sitestats.api.StatsManager;
import org.sakaiproject.sitestats.api.Util;
import org.sakaiproject.sitestats.api.report.Report;
import org.sakaiproject.sitestats.api.report.ReportDef;
import org.sakaiproject.sitestats.api.report.ReportManager;
import org.sakaiproject.sitestats.api.report.ReportParams;
import org.sakaiproject.sitestats.tool.facade.Locator;
public class VisitsWidget extends Panel {
private static final long serialVersionUID = 1L;
private static Log LOG = LogFactory.getLog(VisitsWidget.class);
/** The site id. */
private String siteId = null;
private Set<String> siteUsers = null;
private Set<String> usersWithVisits = null;
/**
* Default constructor.
* @param id The wicket:id
* @param siteId The related site id
*/
public VisitsWidget(String id, final String siteId) {
super(id);
this.siteId = siteId;
setRenderBodyOnly(true);
setOutputMarkupId(true);
// Single values (MiniStat)
List<WidgetMiniStat> widgetMiniStats = new ArrayList<WidgetMiniStat>();
widgetMiniStats.add(getMiniStatVisits());
widgetMiniStats.add(getMiniStatUniqueVisits());
widgetMiniStats.add(getMiniStatEnrolledUsers());
widgetMiniStats.add(getMiniStatEnrolledUsersWithVisits());
widgetMiniStats.add(getMiniStatEnrolledUsersWithoutVisits());
if(Locator.getFacade().getStatsManager().isEnableSitePresences()) {
widgetMiniStats.add(getMiniStatAveragePresenceTime());
}
// Tabs
List<AbstractTab> tabs = new ArrayList<AbstractTab>();
tabs.add(new AbstractTab(new ResourceModel("overview_tab_bydate")) {
private static final long serialVersionUID = 1L;
@Override
public Panel getPanel(String panelId) {
return getWidgetTabByDate(panelId);
}
});
tabs.add(new AbstractTab(new ResourceModel("overview_tab_byuser")) {
private static final long serialVersionUID = 1L;
@Override
public Panel getPanel(String panelId) {
return getWidgetTabByUser(panelId);
}
});
// Final Widget object
String icon = StatsManager.SILK_ICONS_DIR + "user_gray.png";
String title = (String) new ResourceModel("overview_title_visits").getObject();
Widget widget = new Widget("widget", icon, title, widgetMiniStats, tabs);
add(widget);
}
// -------------------------------------------------------------------------------
/** MiniStat:: Visits */
private WidgetMiniStat getMiniStatVisits() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
String val = Long.toString(Locator.getFacade().getStatsManager().getTotalSiteVisits(siteId));
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatVisits() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
return null;
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_visits_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_VISITS_TOTALS);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_DATE);
totalsBy.add(StatsManager.T_VISITS);
totalsBy.add(StatsManager.T_UNIQUEVISITS);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_DATE);
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
rp.setHowChartType(StatsManager.CHARTTYPE_TIMESERIESBAR);
rp.setHowChartSource(StatsManager.T_DATE);
rp.setHowChartSeriesSource(StatsManager.T_NONE);
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_DAY);
r.setReportParams(rp);
return r;
}
};
}
/** MiniStat:: Unique Visits */
private WidgetMiniStat getMiniStatUniqueVisits() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
String val = Long.toString(Locator.getFacade().getStatsManager().getTotalSiteUniqueVisits(siteId));
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatUniqueVisits() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
return null;
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_unique_visits_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_VISITS_TOTALS);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_DATE);
totalsBy.add(StatsManager.T_VISITS);
totalsBy.add(StatsManager.T_UNIQUEVISITS);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_DATE);
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
rp.setHowChartType(StatsManager.CHARTTYPE_TIMESERIESBAR);
rp.setHowChartSource(StatsManager.T_DATE);
rp.setHowChartSeriesSource(StatsManager.T_NONE);
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_DAY);
r.setReportParams(rp);
return r;
}
};
}
/** MiniStat: Enrolled Users */
private WidgetMiniStat getMiniStatEnrolledUsers() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
String val = Long.toString(Locator.getFacade().getStatsManager().getTotalSiteUsers(siteId));
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatEnrolledUsers() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
return null;
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_enrolled_users_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
return null;
}
};
}
/** MiniStat: Enrolled Users with visits */
private WidgetMiniStat getMiniStatEnrolledUsersWithVisits() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
int enrUsersWithVisits = 0;
Set<String> enrUsers = getSiteUsers();
Set<String> usersWithVisits = getUsersWithVisits();
for(String enru : enrUsers) {
if(usersWithVisits.contains(enru)) {
enrUsersWithVisits++;
}
}
String val = String.valueOf(enrUsersWithVisits);
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatEnrolledUsersWithVisits() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
int totalUsersInSite = getSiteUsers().size();
int totalEnrUsersWithVisits = Integer.parseInt(getValue());
double percentage = totalUsersInSite==0 ? 0 : Util.round(100 * totalEnrUsersWithVisits / (double) totalUsersInSite, 0);
return String.valueOf((int) percentage) + '%';
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_enrolled_users_with_visits_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_VISITS);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_TABLE);
r.setReportParams(rp);
return r;
}
};
}
/** MiniStat: Enrolled Users without visits */
private WidgetMiniStat getMiniStatEnrolledUsersWithoutVisits() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
int enrUsersWithoutVisits = 0;
Set<String> enrUsers = getSiteUsers();
Set<String> usersWithVisits = getUsersWithVisits();
for(String enru : enrUsers) {
if(!usersWithVisits.contains(enru)) {
enrUsersWithoutVisits++;
}
}
String val = String.valueOf(enrUsersWithoutVisits);
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatEnrolledUsersWithoutVisits() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
int totalUsersInSite = getSiteUsers().size();
int totalEnrUsersWithoutVisits = Integer.parseInt(getValue());
double percentage = totalUsersInSite==0 ? 0 : Util.round(100 * totalEnrUsersWithoutVisits / (double) totalUsersInSite, 0);
return String.valueOf((int) percentage) + '%';
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_enrolled_users_without_visits_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_VISITS);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_NONE);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_TABLE);
r.setReportParams(rp);
return r;
}
};
}
/** MiniStat: Average presence time */
private WidgetMiniStat getMiniStatAveragePresenceTime() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
// Total time in site
double durationInMs = getTotalTimeInSiteInMs();
// First presence date
Date firstPresenceDate = getFirstPresenceDate();
// Total visits since first presence date
long totalVisits = Locator.getFacade().getStatsManager().getTotalSiteVisits(siteId, firstPresenceDate, null);
// Average presence time (total presence time / total visits)
double durationInMin = durationInMs == 0 ? 0 : Util.round((durationInMs/totalVisits) / 1000 / 60, 1); // in minutes
StringBuilder val = new StringBuilder();
val.append(String.valueOf(durationInMin));
val.append(' ');
val.append(new ResourceModel("minutes_abbr").getObject());
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatAveragePresenceTime() in " + (System.currentTimeMillis() - start) + " ms");
return val.toString();
}
@Override
public String getSecondValue() {
return null;
}
@Override
public String getTooltip() {
return null;
}
@Override
public boolean isWiderText() {
return false;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_presence_time_avg").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_PRESENCES);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_DATE);
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_DATE);
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
rp.setHowChartType(StatsManager.CHARTTYPE_TIMESERIESBAR);
rp.setHowChartSource(StatsManager.T_DATE);
rp.setHowChartSeriesSource(StatsManager.T_NONE);
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_MONTH);
r.setReportParams(rp);
return r;
}
private double getTotalTimeInSiteInMs() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_PRESENCES);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_SITE);
rp.setHowTotalsBy(totalsBy);
r.setReportParams(rp);
Report report = Locator.getFacade().getReportManager().getReport(r, true);
double duration = 0;;
if(report.getReportData().size() > 0) {
duration = (double) ((SitePresence)(report.getReportData().get(0))).getDuration();
}
return duration;
}
private Date getFirstPresenceDate() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
rp.setWhat(ReportManager.WHAT_PRESENCES);
rp.setWhen(ReportManager.WHEN_ALL);
rp.setWho(ReportManager.WHO_ALL);
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_DATE);
rp.setHowTotalsBy(totalsBy);
rp.setHowSort(true);
rp.setHowSortAscending(true);
rp.setHowSortBy(StatsManager.T_DATE);
r.setReportParams(rp);
PagingPosition paging = new PagingPosition();
Report report = Locator.getFacade().getReportManager().getReport(r, true, paging, false);
Date firstDate = new Date();
if(report.getReportData().size() > 0) {
firstDate = ((SitePresence)(report.getReportData().get(0))).getDate();
}
return firstDate;
}
};
}
// -------------------------------------------------------------------------------
/** WidgetTab: By date */
protected WidgetTabTemplate getWidgetTabByDate(String panelId) {
WidgetTabTemplate wTab = new WidgetTabTemplate(panelId, VisitsWidget.this.siteId) {
private static final long serialVersionUID = 1L;
@Override
public List<Integer> getFilters() {
return Arrays.asList(FILTER_DATE, FILTER_ROLE);
}
@Override
public boolean useChartReportDefinitionForTable() {
return true;
}
@Override
public ReportDef getChartReportDefinition() {
return getTableReportDefinition();
}
@Override
public ReportDef getTableReportDefinition() {
String dateFilter = getDateFilter();
String roleFilter = getRoleFilter();
ReportDef r = new ReportDef();
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
// what
if(ReportManager.WHO_ALL.equals(roleFilter)) {
rp.setWhat(ReportManager.WHAT_VISITS_TOTALS);
}else{
rp.setWhat(ReportManager.WHAT_EVENTS);
rp.setWhatEventSelType(ReportManager.WHAT_EVENTS_BYEVENTS);
rp.setWhatEventIds(Arrays.asList(StatsManager.SITEVISIT_EVENTID));
}
// when
rp.setWhen(dateFilter);
// who
if(!ReportManager.WHO_ALL.equals(roleFilter)) {
rp.setWho(ReportManager.WHO_ROLE);
rp.setWhoRoleId(roleFilter);
}
// grouping
List<String> totalsBy = new ArrayList<String>();
if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
totalsBy.add(StatsManager.T_DATEMONTH);
}else{
totalsBy.add(StatsManager.T_DATE);
}
totalsBy.add(StatsManager.T_VISITS);
totalsBy.add(StatsManager.T_UNIQUEVISITS);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
rp.setHowSortBy(StatsManager.T_DATEMONTH);
}else{
rp.setHowSortBy(StatsManager.T_DATE);
}
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
rp.setHowChartType(StatsManager.CHARTTYPE_TIMESERIESBAR);
rp.setHowChartSource(StatsManager.T_DATE);
rp.setHowChartSeriesSource(StatsManager.T_NONE);
if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_MONTH);
}else if(dateFilter.equals(ReportManager.WHEN_LAST30DAYS)) {
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_DAY);
}else{
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_WEEKDAY);
}
r.setReportParams(rp);
return r;
}
};
return wTab;
}
/** WidgetTab: By user */
protected WidgetTabTemplate getWidgetTabByUser(String panelId) {
WidgetTabTemplate wTab = new WidgetTabTemplate(panelId, VisitsWidget.this.siteId) {
private static final long serialVersionUID = 1L;
@Override
public List<Integer> getFilters() {
return Arrays.asList(FILTER_DATE, FILTER_ROLE);
}
@Override
public boolean useChartReportDefinitionForTable() {
return false;
}
@Override
public ReportDef getTableReportDefinition() {
ReportDef r = getChartReportDefinition();
ReportParams rp = r.getReportParams();
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
rp.setHowSortBy(StatsManager.T_TOTAL);
r.setReportParams(rp);
return r;
}
@Override
public ReportDef getChartReportDefinition() {
String dateFilter = getDateFilter();
String roleFilter = getRoleFilter();
ReportDef r = new ReportDef();
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
// what
rp.setWhat(ReportManager.WHAT_EVENTS);
rp.setWhatEventSelType(ReportManager.WHAT_EVENTS_BYEVENTS);
rp.setWhatEventIds(Arrays.asList(StatsManager.SITEVISIT_EVENTID));
// when
rp.setWhen(dateFilter);
// who
if(!ReportManager.WHO_ALL.equals(roleFilter)) {
rp.setWho(ReportManager.WHO_ROLE);
rp.setWhoRoleId(roleFilter);
}
// grouping
List<String> totalsBy = new ArrayList<String>();
if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
totalsBy.add(StatsManager.T_DATEMONTH);
}else{
totalsBy.add(StatsManager.T_DATE);
}
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
/*if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
rp.setHowSortBy(StatsManager.T_DATEMONTH);
}else{
rp.setHowSortBy(StatsManager.T_DATE);
}*/
rp.setHowSortBy(StatsManager.T_TOTAL);
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
/*rp.setHowChartType(StatsManager.CHARTTYPE_TIMESERIES);
rp.setHowChartSource(StatsManager.T_DATE);
rp.setHowChartSeriesSource(StatsManager.T_USER);
if(dateFilter.equals(ReportManager.WHEN_LAST365DAYS) || dateFilter.equals(ReportManager.WHEN_ALL)) {
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_MONTH);
}else if(dateFilter.equals(ReportManager.WHEN_LAST30DAYS)) {
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_DAY);
}else{
rp.setHowChartSeriesPeriod(StatsManager.CHARTTIMESERIES_WEEKDAY);
}*/
rp.setHowChartType(StatsManager.CHARTTYPE_PIE);
rp.setHowChartSource(StatsManager.T_USER);
r.setReportParams(rp);
return r;
}
};
return wTab;
}
// -------------------------------------------------------------------------------
private Set<String> getSiteUsers() {
if(siteUsers == null) {
siteUsers = Locator.getFacade().getStatsManager().getSiteUsers(siteId);
if(siteUsers == null) {
siteUsers = new HashSet<String>();
}
}
return siteUsers;
}
private Set<String> getUsersWithVisits() {
if(usersWithVisits == null) {
usersWithVisits = Locator.getFacade().getStatsManager().getUsersWithVisits(siteId);
if(usersWithVisits == null) {
usersWithVisits = new HashSet<String>();
}
}
return usersWithVisits;
}
}