/** * $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/widget/WidgetTabTemplate.java $ * $Id: WidgetTabTemplate.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.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.wicket.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.link.StatelessLink; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.ResourceModel; import org.sakaiproject.authz.api.Role; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.site.api.Site; import org.sakaiproject.sitestats.api.PrefsData; import org.sakaiproject.sitestats.api.StatsManager; import org.sakaiproject.sitestats.api.event.EventInfo; import org.sakaiproject.sitestats.api.event.ToolInfo; import org.sakaiproject.sitestats.api.parser.EventParserTip; import org.sakaiproject.sitestats.api.report.ReportDef; import org.sakaiproject.sitestats.api.report.ReportManager; import org.sakaiproject.sitestats.tool.facade.Locator; import org.sakaiproject.sitestats.tool.wicket.components.AjaxLazyLoadImage; import org.sakaiproject.sitestats.tool.wicket.components.IndicatingAjaxDropDownChoice; import org.sakaiproject.sitestats.tool.wicket.components.SakaiDataTable; import org.sakaiproject.sitestats.tool.wicket.models.ReportDefModel; import org.sakaiproject.sitestats.tool.wicket.pages.OverviewPage; import org.sakaiproject.sitestats.tool.wicket.pages.ReportDataPage; import org.sakaiproject.sitestats.tool.wicket.providers.ReportsDataProvider; public abstract class WidgetTabTemplate extends Panel { private static final long serialVersionUID = 1L; private static Log LOG = LogFactory.getLog(WidgetTabTemplate.class); public final static int MAX_TABLE_ROWS = 5; public final static Integer FILTER_DATE = Integer.valueOf(0); public final static Integer FILTER_ROLE = Integer.valueOf(1); public final static Integer FILTER_USER = Integer.valueOf(2); public final static Integer FILTER_TOOL = Integer.valueOf(3); public final static Integer FILTER_RESOURCE_ACTION = Integer.valueOf(4); private AjaxLazyLoadImage chart = null; private WebMarkupContainer tableTd = null; private SakaiDataTable table = null; private Link tableLink = null; private WebMarkupContainer tableJs = null; private ReportsDataProvider chartDataProvider = null; private ReportsDataProvider tableDataProvider = null; private PrefsData prefsdata = null; private int chartWidth = 0; private String siteId = null; private boolean renderChart = false; private boolean renderTable = false; private boolean tabTemplateRendered = false; private transient Set<Role> roles = null; private String dateFilter = ReportManager.WHEN_LAST7DAYS; private String roleFilter = ReportManager.WHO_ALL; private String toolFilter = ReportManager.WHAT_EVENTS_ALLTOOLS; private String resactionFilter = null; public WidgetTabTemplate(String id, String siteId) { super(id); this.siteId = siteId; } public abstract ReportDef getChartReportDefinition(); public abstract ReportDef getTableReportDefinition(); public abstract boolean useChartReportDefinitionForTable(); public abstract List<Integer> getFilters(); @Override protected void onBeforeRender() { // update data setDefaultModel(new CompoundPropertyModel(this)); removeAll(); // get report data ReportDef chartRD = getChartReportDefinition(); ReportDef tableRD = getTableReportDefinition(); if(chartRD != null) { renderChart = true; chartDataProvider = new ReportsDataProvider(getPrefsdata(), chartRD, false); } if(tableRD != null) { renderTable = true; if(!useChartReportDefinitionForTable()) { tableDataProvider = new ReportsDataProvider(getPrefsdata(), tableRD, false); } } // render data renderFilters(); renderChart(); renderTable(); tabTemplateRendered = true; super.onBeforeRender(); } private void renderChart() { WebMarkupContainer chartTd = new WebMarkupContainer("chartTd"); chartTd.setOutputMarkupId(true); chart = new AjaxLazyLoadImage("chart", OverviewPage.class) { private static final long serialVersionUID = 1L; @Override public byte[] getImageData() { return getChartImage(chartWidth, 200); } @Override public byte[] getImageData(int width, int height) { return getChartImage(width, height); } private byte[] getChartImage(int width, int height) { PrefsData prefsData = Locator.getFacade().getStatsManager().getPreferences(siteId, false); int _width = (width <= 0) ? 350 : width; int _height = (height <= 0) ? 200: height; return Locator.getFacade().getChartService().generateChart( chartDataProvider.getReport(), _width, _height, prefsData.isChartIn3D(), prefsData.getChartTransparency(), prefsData.isItemLabelsVisible() ); } }; chart.setAutoDetermineChartSizeByAjax("#"+chartTd.getMarkupId()); chart.setOutputMarkupId(true); chartTd.add(chart); if(!renderChart) { chartTd.setVisible(false); }else if(renderChart && !renderTable) { chartTd.add(new SimpleAttributeModifier("colspan", "2")); } add(chartTd); } private void renderTable() { tableTd = new WebMarkupContainer("tableTd"); createTable(); if(!renderTable) { tableTd.setVisible(false); }else if(renderTable && !renderChart) { tableTd.add(new SimpleAttributeModifier("colspan", "2")); } tableLink = new StatelessLink("link") { private static final long serialVersionUID = 1L; @Override public void onClick() { ReportDef rd = null; if(useChartReportDefinitionForTable()) { rd = getChartReportDefinition(); }else{ rd = getTableReportDefinition(); } String siteId = rd.getSiteId(); ReportDefModel reportDefModel = new ReportDefModel(rd); setResponsePage(new ReportDataPage(reportDefModel, new PageParameters("siteId="+siteId), getWebPage())); } }; tableLink.setOutputMarkupId(true); tableTd.add(tableLink); tableJs = new WebMarkupContainer("tableJs") { private static final long serialVersionUID = 1L; @Override protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { StringBuilder js = new StringBuilder(); js.append("jQuery('#"); js.append(table.getMarkupId()); js.append("').fadeIn();"); js.append("jQuery('#"); js.append(tableLink.getMarkupId()); js.append("').fadeIn();"); replaceComponentTagBody(markupStream, openTag, js.toString()); } }; tableJs.setOutputMarkupId(true); tableTd.add(tableJs); tableTd.setOutputMarkupId(true); add(tableTd); } private void createTable() { if(useChartReportDefinitionForTable()) { table = new SakaiDataTable( "table", ReportDataPage.getTableColumns(getChartReportDefinition().getReportParams(), false), chartDataProvider, false ); }else{ table = new SakaiDataTable( "table", ReportDataPage.getTableColumns(getTableReportDefinition().getReportParams(), false), tableDataProvider, false ); } table.setRowsPerPage(MAX_TABLE_ROWS); table.setOutputMarkupId(true); tableTd.add(table); } private void renderFilters() { List<Integer> filters = getFilters(); // DATE Filter List<String> dateFilterOptions = Arrays.asList( ReportManager.WHEN_ALL, ReportManager.WHEN_LAST365DAYS, ReportManager.WHEN_LAST30DAYS, ReportManager.WHEN_LAST7DAYS ); IChoiceRenderer dateFilterRenderer = new IChoiceRenderer() { private static final long serialVersionUID = 1L; public Object getDisplayValue(Object object) { if(ReportManager.WHEN_ALL.equals(object)) { return new ResourceModel("overview_filter_date_all").getObject(); } if(ReportManager.WHEN_LAST365DAYS.equals(object)) { return new ResourceModel("report_when_last365days").getObject(); } if(ReportManager.WHEN_LAST30DAYS.equals(object)) { return new ResourceModel("report_when_last30days").getObject(); } if(ReportManager.WHEN_LAST7DAYS.equals(object)) { return new ResourceModel("report_when_last7days").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; IndicatingAjaxDropDownChoice dateFilter = new IndicatingAjaxDropDownChoice("dateFilter", dateFilterOptions, dateFilterRenderer); dateFilter.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { updateData(target); } }); dateFilter.setOutputMarkupId(true); add(dateFilter); dateFilter.setVisible(filters.contains(FILTER_DATE)); // ROLE Filter List<String> roleFilterOptions = new ArrayList<String>(); roleFilterOptions.add(ReportManager.WHO_ALL); try{ Site site = Locator.getFacade().getSiteService().getSite(siteId); roles = site.getRoles(); Iterator<Role> i = roles.iterator(); while(i.hasNext()){ Role r = i.next(); roleFilterOptions.add(r.getId()); } }catch(IdUnusedException e){ LOG.warn("Site does not exist: " + siteId); } IChoiceRenderer roleFilterRenderer = new IChoiceRenderer() { private static final long serialVersionUID = 1L; public Object getDisplayValue(Object object) { if(ReportManager.WHO_ALL.equals(object)) { return new ResourceModel("overview_filter_role_all").getObject(); }else{ return (String) object; } } public String getIdValue(Object object, int index) { return (String) object; } }; IndicatingAjaxDropDownChoice roleFilter = new IndicatingAjaxDropDownChoice("roleFilter", roleFilterOptions, roleFilterRenderer); roleFilter.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { updateData(target); } }); roleFilter.setOutputMarkupId(true); add(roleFilter); roleFilter.setVisible(filters.contains(FILTER_ROLE)); // TOOL Filter List<String> toolFilterOptions = new ArrayList<String>(); toolFilterOptions.add(ReportManager.WHAT_EVENTS_ALLTOOLS); toolFilterOptions.addAll(getToolIds()); IChoiceRenderer toolFilterRenderer = new IChoiceRenderer() { private static final long serialVersionUID = 1L; public Object getDisplayValue(Object object) { if(ReportManager.WHAT_EVENTS_ALLTOOLS.equals(object)) { return new ResourceModel("overview_filter_tool_all").getObject(); }else{ return Locator.getFacade().getEventRegistryService().getToolName((String) object); } } public String getIdValue(Object object, int index) { return (String) object; } }; IndicatingAjaxDropDownChoice toolFilter = new IndicatingAjaxDropDownChoice("toolFilter", toolFilterOptions, toolFilterRenderer); toolFilter.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { updateData(target); } }); toolFilter.setOutputMarkupId(true); add(toolFilter); toolFilter.setVisible(filters.contains(FILTER_TOOL)); // RESOURCE_ACTION Filter List<String> resactionFilterOptions = Arrays.asList( null, ReportManager.WHAT_RESOURCES_ACTION_NEW, ReportManager.WHAT_RESOURCES_ACTION_READ, ReportManager.WHAT_RESOURCES_ACTION_REVS, ReportManager.WHAT_RESOURCES_ACTION_DEL ); IChoiceRenderer resactionFilterRenderer = new IChoiceRenderer() { private static final long serialVersionUID = 1L; public Object getDisplayValue(Object object) { if(object == null || "".equals(object)) { return new ResourceModel("overview_filter_resaction_all").getObject(); }else{ return (String) new ResourceModel("action_" + ((String) object)).getObject(); } } public String getIdValue(Object object, int index) { if(object == null || "".equals(object)) { return ""; }else{ return (String) object; } } }; IndicatingAjaxDropDownChoice resactionFilter = new IndicatingAjaxDropDownChoice("resactionFilter", resactionFilterOptions, resactionFilterRenderer) { private static final long serialVersionUID = 1L; @Override protected CharSequence getDefaultChoice(Object selected) { return ""; } }; resactionFilter.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { updateData(target); } }); resactionFilter.setOutputMarkupId(true); add(resactionFilter); resactionFilter.setVisible(filters.contains(FILTER_RESOURCE_ACTION)); } private void updateData(AjaxRequestTarget target) { if(renderChart) { chartDataProvider.setReportDef(getChartReportDefinition()); target.addComponent(chart); } if(renderTable) { if(useChartReportDefinitionForTable()) { chartDataProvider.setReportDef(getChartReportDefinition()); }else{ tableDataProvider.setReportDef(getTableReportDefinition()); } tableTd.remove(table); createTable(); target.addComponent(tableTd); } target.appendJavascript("setMainFrameHeightNoScroll(window.name, 0, 300);"); } private List<String> getToolIds() { List<String> toolIds = new ArrayList<String>(); for(ToolInfo ti : getPrefsdata().getToolEventsDef()) { if(isToolSuported(ti) && ti.isSelected()) { toolIds.add(ti.getToolId()); } } return toolIds; } private boolean isToolSuported(final ToolInfo toolInfo) { if(Locator.getFacade().getStatsManager().isEventContextSupported()){ return true; }else{ List<ToolInfo> siteTools = Locator.getFacade().getEventRegistryService().getEventRegistry(siteId, getPrefsdata().isListToolEventsOnlyAvailableInSite()); Iterator<ToolInfo> i = siteTools.iterator(); while (i.hasNext()){ ToolInfo t = i.next(); if(t.getToolId().equals(toolInfo.getToolId())){ EventParserTip parserTip = t.getEventParserTip(); if(parserTip != null && parserTip.getFor().equals(StatsManager.PARSERTIP_FOR_CONTEXTID)){ return true; } } } } return false; } public boolean isRole(String role) { for(Role r : roles) { if(r.getId().equals(role)) { return true; } } return false; } private PrefsData getPrefsdata() { if(prefsdata == null) { prefsdata = Locator.getFacade().getStatsManager().getPreferences(siteId, false); } return prefsdata; } public void setDateFilter(String dateFilter) { this.dateFilter = dateFilter; } public String getDateFilter() { return dateFilter; } public void setRoleFilter(String roleFilter) { this.roleFilter = roleFilter; } public String getRoleFilter() { return roleFilter; } public void setToolFilter(String toolFilter) { this.toolFilter = toolFilter; } public String getToolFilter() { return toolFilter; } public List<String> getToolEventsFilter() { if(ReportManager.WHAT_EVENTS_ALLTOOLS.equals(toolFilter)) { return getPrefsdata().getToolEventsStringList(); }else{ List<String> eventIds = new ArrayList<String>(); for(ToolInfo ti : getPrefsdata().getToolEventsDef()) { if(isToolSuported(ti) && ti.isSelected() && ti.getToolId().equals(toolFilter)) { for(EventInfo ei : ti.getEvents()) { if(ei.isSelected()) { eventIds.add(ei.getEventId()); } } break; } } return eventIds; } } public void setResactionFilter(String resactionFilter) { if("".equals(resactionFilter)) { this.resactionFilter = null; }else{ this.resactionFilter = resactionFilter; } } public String getResactionFilter() { return resactionFilter; } }