/** * $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/providers/ReportDefsProvider.java $ * $Id: ReportDefsProvider.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.providers; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.wicket.injection.web.InjectorHolder; import org.apache.wicket.markup.repeater.data.IDataProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SitePage; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.sitestats.api.StatsManager; import org.sakaiproject.sitestats.api.event.ToolInfo; 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.models.ReportDefModel; public class ReportDefsProvider implements IDataProvider { private static final long serialVersionUID = 1L; public final static int MODE_MYREPORTS = 0; public final static int MODE_PREDEFINED_REPORTS = 1; public final static int MODE_MY_AND_PREDEFINED_REPORTS = 2; private String siteId; private int mode; private boolean filterWithToolsInSite; private boolean includeHidden; private List<ReportDef> data; public ReportDefsProvider(String siteId, int mode, boolean filterWithToolsInSite, boolean includeHidden) { InjectorHolder.getInjector().inject(this); this.siteId = siteId; this.mode = mode; this.filterWithToolsInSite = filterWithToolsInSite; this.includeHidden = includeHidden; } public Iterator iterator(int first, int count) { return getReportDefs().iterator(); } public List<ReportDef> getReportDefs() { if(data == null) { switch(mode) { case MODE_MYREPORTS: data = Locator.getFacade().getReportManager().getReportDefinitions(siteId, false, includeHidden); break; case MODE_PREDEFINED_REPORTS: data = Locator.getFacade().getReportManager().getReportDefinitions(null, false, includeHidden); break; case MODE_MY_AND_PREDEFINED_REPORTS: data = Locator.getFacade().getReportManager().getReportDefinitions(siteId, true, includeHidden); break; } if(filterWithToolsInSite) { data = filterWithToolsInSite(data); } data = fixReportParamsSiteIdForPredefinedReports(data); Collections.sort(data, getReportDefComparator()); } return data; } public IModel model(Object object) { return new ReportDefModel((ReportDef) object); } public int size() { return getReportDefs().size(); } public void detach() { data = null; } private List<ReportDef> fixReportParamsSiteIdForPredefinedReports(List<ReportDef> list) { List<ReportDef> fixed = new ArrayList<ReportDef>(); for(ReportDef rd : list) { if(rd.getSiteId() == null) { // fix siteId for predefined reports rd.getReportParams().setSiteId(siteId); fixed.add(rd); }else{ fixed.add(rd); } } return fixed; } private List<ReportDef> filterWithToolsInSite(List<ReportDef> list) { List<ReportDef> filtered = new ArrayList<ReportDef>(); if(list != null) { try{ Site site = Locator.getFacade().getSiteService().getSite(siteId); for(ReportDef rd : list){ if(canIncludeReport(rd, site)){ filtered.add(rd); } } }catch(Exception e){ filtered = list; } } return filtered; } private boolean canIncludeReport(ReportDef reportDef, Site site) { List<ToolConfiguration> siteTools = new ArrayList<ToolConfiguration>(); for(Iterator<SitePage> iPages = site.getPages().iterator(); iPages.hasNext();){ SitePage page = iPages.next(); siteTools.addAll(page.getTools()); } if(ReportManager.WHAT_VISITS.equals(reportDef.getReportParams().getWhat())) { // keep visit based reports if site visits are enabled if(Locator.getFacade().getStatsManager().isEnableSiteVisits()) { return true; } }else if(ReportManager.WHAT_RESOURCES.equals(reportDef.getReportParams().getWhat())) { // keep resource based reports if Resources tool is present for(ToolConfiguration tc : siteTools) { if(tc.getToolId().equals(StatsManager.RESOURCES_TOOLID)) { return true; } } }else if(ReportManager.WHAT_PRESENCES.equals(reportDef.getReportParams().getWhat())) { // keep presence based reports if site presences are enabled if(Locator.getFacade().getStatsManager().isEnableSitePresences()) { return true; } }else{ // at least one tool from the selection must be present if(ReportManager.WHAT_EVENTS_BYEVENTS.equals(reportDef.getReportParams().getWhatEventSelType())) { for(ToolConfiguration tc : siteTools) { Map<String,ToolInfo> map = Locator.getFacade().getEventRegistryService().getEventIdToolMap(); for(String eventId : reportDef.getReportParams().getWhatEventIds()) { if(tc.getToolId().equals(map.get(eventId).getToolId())) { return true; } } } }else if(ReportManager.WHAT_EVENTS_BYTOOL.equals(reportDef.getReportParams().getWhatEventSelType())) { if(reportDef.getReportParams().getWhatToolIds().contains(ReportManager.WHAT_EVENTS_ALLTOOLS)) { return true; }else{ for(ToolConfiguration tc : siteTools) { if(reportDef.getReportParams().getWhatToolIds().contains(tc.getToolId())) { return true; } } } } } return false; } public final Comparator<ReportDef> getReportDefComparator() { return new Comparator<ReportDef>() { private final transient Collator collator = Collator.getInstance(); public int compare(ReportDef o1, ReportDef o2) { String title1 = null; String title2 = null; if(o1.isTitleLocalized()) { title1 = (String) new ResourceModel(o1.getTitleBundleKey()).getObject(); }else{ title1 = o1.getTitle(); } if(o2.isTitleLocalized()) { title2 = (String) new ResourceModel(o2.getTitleBundleKey()).getObject(); }else{ title2 = o2.getTitle(); } return collator.compare(title1, title2); } }; } }