/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/widget/ActivityWidget.java $
* $Id: ActivityWidget.java 105078 2012-02-24 23:00:38Z ottenhoff@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.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
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.sitestats.api.EventStat;
import org.sakaiproject.sitestats.api.PrefsData;
import org.sakaiproject.sitestats.api.Stat;
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;
import org.sakaiproject.sitestats.tool.wicket.pages.PreferencesPage;
import org.sakaiproject.user.api.UserNotDefinedException;
public class ActivityWidget extends Panel {
private static final long serialVersionUID = 1L;
private static Log LOG = LogFactory.getLog(ActivityWidget.class);
/** The site id. */
private String siteId = null;
private PrefsData prefsdata = null;
/**
* Default constructor.
* @param id The wicket:id
* @param siteId The related site id
*/
public ActivityWidget(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(getMiniStatActivityEvents());
widgetMiniStats.add(getMiniStatMostActiveTool());
widgetMiniStats.add(getMiniStatMostActiveUser());
//widgetMiniStats.add(getMiniStatConfigureLink());
// 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);
}
});
tabs.add(new AbstractTab(new ResourceModel("overview_tab_bytool")) {
private static final long serialVersionUID = 1L;
@Override
public Panel getPanel(String panelId) {
return getWidgetTabByTool(panelId);
}
});
// Final Widget object
String icon = StatsManager.SILK_ICONS_DIR + "chart_pie.png";
String title = (String) new ResourceModel("overview_title_activity").getObject();
Widget widget = new Widget("widget", icon, title, widgetMiniStats, tabs);
add(widget);
}
// -------------------------------------------------------------------------------
/** MiniStat:: Activity events */
private WidgetMiniStat getMiniStatActivityEvents() {
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().getTotalSiteActivity(siteId, getPrefsdata().getToolEventsStringList()));
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatActivityEvents() 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_events_sum").getObject();
}
@Override
public ReportDef getReportDefinition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
// what
rp.setWhat(ReportManager.WHAT_EVENTS);
rp.setWhatEventSelType(ReportManager.WHAT_EVENTS_BYEVENTS);
rp.setWhatEventIds(getPrefsdata().getToolEventsStringList());
// when
rp.setWhen(ReportManager.WHEN_ALL);
// who
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_EVENT);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_EVENT);
rp.setHowSortAscending(true);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_TABLE);
r.setReportParams(rp);
return r;
}
};
}
/** MiniStat:: Most active tool */
private WidgetMiniStat getMiniStatMostActiveTool() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
private String mostActiveTool = null;
private long totalToolActivity = 0;
private long totalActivity = 0;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
processData();
String val = null;
if(mostActiveTool != null) {
val = Locator.getFacade().getEventRegistryService().getToolName(mostActiveTool);
}else{
val = "-";
}
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatMostActiveTool() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
double percentage = totalActivity==0 ? 0 : Util.round(100 * totalToolActivity / (double) totalActivity, 0);
return String.valueOf((int) percentage) + '%';
}
@Override
public String getTooltip() {
if(mostActiveTool != null) {
return Locator.getFacade().getEventRegistryService().getToolName(mostActiveTool);
}else{
return null;
}
}
@Override
public boolean isWiderText() {
return true;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_mostactivetool_sum").getObject();
}
private ReportDef getCommonReportDefition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
// what
rp.setWhat(ReportManager.WHAT_EVENTS);
rp.setWhatEventSelType(ReportManager.WHAT_EVENTS_BYEVENTS);
rp.setWhatEventIds(getPrefsdata().getToolEventsStringList());
// when
rp.setWhen(ReportManager.WHEN_ALL);
// who
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_EVENT);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_EVENT);
rp.setHowSortAscending(true);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_TABLE);
r.setReportParams(rp);
return r;
}
private void processData() {
if(mostActiveTool == null) {
ReportDef rd = getCommonReportDefition();
ReportParams rp = rd.getReportParams();
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_TOOL);
rp.setHowTotalsBy(totalsBy);
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_TOTAL);
rp.setHowSortAscending(false);
Report r = Locator.getFacade().getReportManager().getReport(rd, true, null, false);
try{
boolean first = true;
for(Stat s : r.getReportData()) {
EventStat es = (EventStat) s;
if(first) {
mostActiveTool = es.getToolId();
totalToolActivity = es.getCount();
first = false;
}
totalActivity += es.getCount();
}
}catch(Exception e) {
mostActiveTool = null;
}
}
}
@Override
public ReportDef getReportDefinition() {
ReportDef rd = getCommonReportDefition();
ReportParams rp = rd.getReportParams();
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_TOOL);
rp.setHowTotalsBy(totalsBy);
rp.setHowSortBy(StatsManager.T_TOOL);
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_BOTH);
rp.setHowChartType(StatsManager.CHARTTYPE_PIE);
rp.setHowChartSource(StatsManager.T_TOOL);
return rd;
}
};
}
/** MiniStat:: Most active user */
private WidgetMiniStat getMiniStatMostActiveUser() {
return new WidgetMiniStat() {
private static final long serialVersionUID = 1L;
private String mostActiveUser = null;
private long totalUserActivity = 0;
private long totalActivity = 0;
@Override
public String getValue() {
long start = 0;
if(LOG.isDebugEnabled()) start = System.currentTimeMillis();
processData();
String val = null;
if(mostActiveUser != null) {
String id = null;
if(("-").equals(mostActiveUser) || ("?").equals(mostActiveUser)){
id = "-";
}else{
try{
id = Locator.getFacade().getUserDirectoryService().getUser(mostActiveUser).getDisplayId();
}catch(UserNotDefinedException e1){
id = mostActiveUser;
}
}
val = id;
}else{
val = "-";
}
if(LOG.isDebugEnabled()) LOG.debug("getMiniStatMostActiveUser() in " + (System.currentTimeMillis() - start) + " ms");
return val;
}
@Override
public String getSecondValue() {
double percentage = totalActivity==0 ? 0 : Util.round(100 * totalUserActivity / (double) totalActivity, 0);
return String.valueOf((int) percentage) + '%';
}
@Override
public String getTooltip() {
if(mostActiveUser != null) {
String name = null;
if(("-").equals(mostActiveUser)) {
name = (String) new ResourceModel("user_anonymous").getObject();
}else if(("?").equals(mostActiveUser)) {
name = (String) new ResourceModel("user_anonymous_access").getObject();
}else{
name = Locator.getFacade().getStatsManager().getUserNameForDisplay(mostActiveUser);
}
return name;
}else{
return null;
}
}
@Override
public boolean isWiderText() {
return true;
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_mostactiveuser_sum").getObject();
}
private ReportDef getCommonReportDefition() {
ReportDef r = new ReportDef();
r.setId(0);
r.setSiteId(siteId);
ReportParams rp = new ReportParams(siteId);
// what
rp.setWhat(ReportManager.WHAT_EVENTS);
rp.setWhatEventSelType(ReportManager.WHAT_EVENTS_BYEVENTS);
rp.setWhatEventIds(getPrefsdata().getToolEventsStringList());
// when
rp.setWhen(ReportManager.WHEN_ALL);
// who
rp.setWho(ReportManager.WHO_ALL);
// grouping
List<String> totalsBy = new ArrayList<String>();
totalsBy.add(StatsManager.T_USER);
rp.setHowTotalsBy(totalsBy);
// sorting
rp.setHowSort(true);
rp.setHowSortBy(StatsManager.T_TOTAL);
rp.setHowSortAscending(false);
// chart
rp.setHowPresentationMode(ReportManager.HOW_PRESENTATION_TABLE);
r.setReportParams(rp);
return r;
}
private void processData() {
if(mostActiveUser == null) {
Report r = Locator.getFacade().getReportManager().getReport(getCommonReportDefition(), true, null, false);
try{
boolean first = true;
for(Stat s : r.getReportData()) {
EventStat es = (EventStat) s;
if(first) {
mostActiveUser = es.getUserId();
totalUserActivity = es.getCount();
first = false;
}
totalActivity += es.getCount();
}
}catch(Exception e) {
mostActiveUser = null;
}
}
}
@Override
public ReportDef getReportDefinition() {
return getCommonReportDefition();
}
};
}
/** MiniStat:: Link for Preferences */
private WidgetMiniStat getMiniStatConfigureLink() {
return new WidgetMiniStatLink() {
private static final long serialVersionUID = 1L;
@Override
public Page getPageLink() {
return new PreferencesPage(new PageParameters("siteId="+siteId));
}
@Override
public String getLabel() {
return (String) new ResourceModel("overview_title_configure_activity").getObject();
}
@Override
public String getPageLinkTooltip() {
return (String) new ResourceModel("overview_title_configure_activity_tip").getObject();
};
};
}
// -------------------------------------------------------------------------------
/** WidgetTab: By date */
protected WidgetTabTemplate getWidgetTabByDate(String panelId) {
WidgetTabTemplate wTab = new WidgetTabTemplate(panelId, ActivityWidget.this.siteId) {
private static final long serialVersionUID = 1L;
@Override
public List<Integer> getFilters() {
return Arrays.asList(FILTER_DATE, FILTER_ROLE, FILTER_TOOL);
}
@Override
public boolean useChartReportDefinitionForTable() {
return true;
}
@Override
public ReportDef getTableReportDefinition() {
return getChartReportDefinition();
}
@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(getToolEventsFilter());
// 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);
}
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, ActivityWidget.this.siteId) {
private static final long serialVersionUID = 1L;
@Override
public List<Integer> getFilters() {
return Arrays.asList(FILTER_DATE, FILTER_ROLE, FILTER_TOOL);
}
@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);
rp.setHowChartType(StatsManager.CHARTTYPE_PIE);
rp.setHowChartSource(StatsManager.T_USER);
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(getToolEventsFilter());
// 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.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;
}
/** WidgetTab: By tool */
protected WidgetTabTemplate getWidgetTabByTool(String panelId) {
WidgetTabTemplate wTab = new WidgetTabTemplate(panelId, ActivityWidget.this.siteId) {
private static final long serialVersionUID = 1L;
@Override
public List<Integer> getFilters() {
return Arrays.asList(FILTER_DATE, FILTER_ROLE, FILTER_TOOL);
}
@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_TOOL);
rp.setHowTotalsBy(totalsBy);
rp.setHowSortBy(StatsManager.T_TOTAL);
rp.setHowChartType(StatsManager.CHARTTYPE_PIE);
rp.setHowChartSource(StatsManager.T_TOOL);
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(getToolEventsFilter());
// 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_TOOL);
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_PIE);
rp.setHowChartSource(StatsManager.T_TOOL);
r.setReportParams(rp);
return r;
}
};
return wTab;
}
// -------------------------------------------------------------------------------
// -------------------------------------------------------------------------------
private PrefsData getPrefsdata() {
if(prefsdata == null) {
prefsdata = Locator.getFacade().getStatsManager().getPreferences(siteId, true);
}
return prefsdata;
}
}