/** * $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/pages/ReportsEditPage.java $ * $Id: ReportsEditPage.java 131093 2013-11-04 14:59:26Z 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.pages; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.wicket.AttributeModifier; import org.apache.wicket.PageParameters; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.datetime.StyleDateConverter; import org.apache.wicket.datetime.markup.html.form.DateTextField; import org.apache.wicket.extensions.markup.html.form.select.IOptionRenderer; import org.apache.wicket.extensions.markup.html.form.select.Select; import org.apache.wicket.extensions.markup.html.form.select.SelectOption; import org.apache.wicket.extensions.markup.html.form.select.SelectOptions; import org.apache.wicket.extensions.yui.calendar.DateTimeField; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.util.string.Strings; import org.sakaiproject.authz.api.Role; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.site.api.Group; 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.api.report.ReportParams; import org.sakaiproject.sitestats.tool.facade.Locator; import org.sakaiproject.sitestats.tool.wicket.components.CSSFeedbackPanel; import org.sakaiproject.sitestats.tool.wicket.components.FileSelectorPanel; import org.sakaiproject.sitestats.tool.wicket.components.IStylableOptionRenderer; import org.sakaiproject.sitestats.tool.wicket.components.IndicatingAjaxDropDownChoice; import org.sakaiproject.sitestats.tool.wicket.components.LastJobRun; import org.sakaiproject.sitestats.tool.wicket.components.Menus; import org.sakaiproject.sitestats.tool.wicket.components.StylableSelectOptions; import org.sakaiproject.sitestats.tool.wicket.components.StylableSelectOptionsGroup; import org.sakaiproject.sitestats.tool.wicket.models.EventModel; import org.sakaiproject.sitestats.tool.wicket.models.ReportDefModel; import org.sakaiproject.sitestats.tool.wicket.models.ToolModel; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserNotDefinedException; import org.sakaiproject.util.Web; /** * @author Nuno Fernandes */ public class ReportsEditPage extends BasePage { private static final long serialVersionUID = 1L; private static Log LOG = LogFactory.getLog(ReportsEditPage.class); private static final String REPORT_THISSITE = "this"; private static final String REPORT_ALLSITES = "all"; private String realSiteId; private String siteId; private boolean predefined = false; private String reportSiteOpt = REPORT_THISSITE; private boolean visitsEnabled = true; private FeedbackPanel feedback = null; /** Options visiblity */ private boolean visitsVisible = true; private boolean activityVisible = true; private boolean resourcesVisible = true; private boolean presencesVisible = true; /** Report related */ private ReportDefModel reportDefModel; private PrefsData prefsdata = null; private WebPage returnPage; /** Ajax update lock */ private final ReentrantLock ajaxUpdateLock = new ReentrantLock(); private boolean usersLoaded = false; private transient Collator collator = Collator.getInstance(); public ReportsEditPage() { this(null, null, null); } public ReportsEditPage(ReportDefModel reportDef) { this(reportDef, null, null); } public ReportsEditPage(PageParameters pageParameters) { this(null, pageParameters, null); } public ReportsEditPage(ReportDefModel reportDef, PageParameters pageParameters, final WebPage returnPage) { realSiteId = Locator.getFacade().getToolManager().getCurrentPlacement().getContext(); if(pageParameters != null) { siteId = pageParameters.getString("siteId"); predefined = pageParameters.getBoolean("predefined"); } if(siteId == null) { siteId = realSiteId; } if(reportDef != null) { this.reportDefModel = reportDef; }else{ if(predefined) { this.reportDefModel = new ReportDefModel(null, null); }else{ this.reportDefModel = new ReportDefModel(siteId, siteId); } } if(returnPage == null) { this.returnPage = new ReportsPage(pageParameters); }else{ this.returnPage = returnPage; } boolean allowed = Locator.getFacade().getStatsAuthz().isUserAbleToViewSiteStats(siteId); if(allowed) { // options visibility visitsVisible = Locator.getFacade().getStatsManager().isEnableSiteVisits() && Locator.getFacade().getStatsManager().isVisitsInfoAvailable(); activityVisible = Locator.getFacade().getStatsManager().isEnableSiteActivity(); resourcesVisible = false; try{ resourcesVisible = Locator.getFacade().getStatsManager().isEnableResourceStats() && (Locator.getFacade().getSiteService().getSite(siteId).getToolForCommonId(StatsManager.RESOURCES_TOOLID) != null); }catch(Exception e) { resourcesVisible = false; } presencesVisible = Locator.getFacade().getStatsManager().isEnableSitePresences(); // render body renderBody(); }else{ setResponsePage(NotAuthorizedPage.class); } } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.renderJavascriptReference(JQUERYSCRIPT); response.renderJavascriptReference(StatsManager.SITESTATS_WEBAPP + "/script/reports.js"); StringBuilder onDomReady = new StringBuilder(); onDomReady.append("checkWhatSelection();"); onDomReady.append("checkWhenSelection();"); onDomReady.append("checkWhoSelection();"); onDomReady.append("checkHowSelection();"); onDomReady.append("checkReportDetails();"); onDomReady.append("checkHowChartSelection();"); response.renderOnDomReadyJavascript(onDomReady.toString()); } private void renderBody() { StatsManager statsManager = Locator.getFacade().getStatsManager(); // menu add(new Menus("menu", siteId)); // reportAction String action = null; if(getReportDef().isTitleLocalized()) { if(reportDefModel.isNew()) { action = (String) new ResourceModel("report_adding").getObject(); }else{ action = (String) new ResourceModel("report_editing").getObject(); } action = action.replaceAll("\\$\\{title\\}", (String) new ResourceModel(getReportDef().getTitleBundleKey()).getObject()); }else{ if(reportDefModel.isNew()) { action = new StringResourceModel("report_adding", this, reportDefModel).getString(); }else{ action = new StringResourceModel("report_editing", this, reportDefModel).getString(); } } add(new Label("reportAction", action)); // model visitsEnabled = statsManager.isEnableSiteVisits(); if(!visitsEnabled) { getReportParams().setWhat(ReportManager.WHAT_EVENTS_BYTOOL); } setDefaultModel(new CompoundPropertyModel(this)); // last job run add(new LastJobRun("lastJobRun", siteId)); // form Form form = new Form("reportsForm"); form.setOutputMarkupId(true); add(form); // feedback panel (messages) feedback = new CSSFeedbackPanel("messages"); feedback.setOutputMarkupId(true); form.add(feedback); // report details, what, when & who renderReportDetailsUI(form); renderWhatUI(form); renderWhenUI(form); renderWhoUI(form); renderHowUI(form); // buttons final Button generateReport = new Button("generateReport") { @Override public void onSubmit() { if(validReportParameters()) { if(predefined) { getReportParams().setSiteId(siteId); } setResponsePage(new ReportDataPage(reportDefModel, new PageParameters("siteId="+siteId), ReportsEditPage.this)); } super.onSubmit(); } }; form.add(generateReport); final Button saveReport = new Button("saveReport") { @Override public void onSubmit() { if(validReportParameters()) { if(getReportDef().getTitle() == null || getReportDef().getTitle().trim().length() == 0) { error((String) new ResourceModel("report_reporttitle_req").getObject()); }else{ if(predefined) { getReportParams().setSiteId(null); } boolean saved = Locator.getFacade().getReportManager().saveReportDefinition(getReportDef()); String titleStr = null; if(saved) { if(getReportDef().isTitleLocalized()) { titleStr = (String) new ResourceModel("report_save_success").getObject(); titleStr = titleStr.replaceAll("\\$\\{title\\}", (String) new ResourceModel(getReportDef().getTitleBundleKey()).getObject()); }else{ titleStr = new StringResourceModel("report_save_success", getPage(), reportDefModel).getString(); } info(titleStr); setResponsePage(returnPage); }else{ if(getReportDef().isTitleLocalized()) { titleStr = (String) new ResourceModel("report_save_error").getObject(); titleStr = titleStr.replaceAll("\\$\\{title\\}", (String) new ResourceModel(getReportDef().getTitleBundleKey()).getObject()); }else{ titleStr = new StringResourceModel("report_save_error", getPage(), reportDefModel).getString(); } error(titleStr); } } } super.onSubmit(); } }; saveReport.setVisible(!predefined || (predefined && Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage() && realSiteId.equals(siteId))); form.add(saveReport); final Button back = new Button("back") { @Override public void onSubmit() { reportDefModel.detach(); setResponsePage(returnPage); super.onSubmit(); } }; back.setDefaultFormProcessing(false); form.add(back); } @SuppressWarnings("serial") private void renderReportDetailsUI(Form form) { // top WebMarkupContainer reportDetailsTop = new WebMarkupContainer("reportDetailsTop"); WebMarkupContainer reportDetailsShow = new WebMarkupContainer("reportDetailsShow"); reportDetailsTop.add(reportDetailsShow); form.add(reportDetailsTop); WebMarkupContainer fakeReportDetails = new WebMarkupContainer("fakeReportDetails"); reportDetailsTop.add(fakeReportDetails); // details WebMarkupContainer reportDetails = new WebMarkupContainer("reportDetails"); form.add(reportDetails); // details: title TextField title = new TextField("reportDef.title"); reportDetails.add(title); final WebMarkupContainer titleLocalizedContainer = new WebMarkupContainer("titleLocalizedContainer"); titleLocalizedContainer.setOutputMarkupId(true); titleLocalizedContainer.setOutputMarkupPlaceholderTag(true); titleLocalizedContainer.setVisible(getReportDef().isTitleLocalized()); titleLocalizedContainer.add(new Label("titleLocalized")); reportDetails.add(titleLocalizedContainer); title.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { titleLocalizedContainer.setVisible(getReportDef().isTitleLocalized()); target.addComponent(titleLocalizedContainer); target.appendJavascript("setMainFrameHeightNoScroll(window.name);"); } }); // details: description TextArea description = new TextArea("reportDef.description"); reportDetails.add(description); final WebMarkupContainer descriptionLocalizedContainer = new WebMarkupContainer("descriptionLocalizedContainer"); descriptionLocalizedContainer.setOutputMarkupId(true); descriptionLocalizedContainer.setOutputMarkupPlaceholderTag(true); descriptionLocalizedContainer.setVisible(getReportDef().isDescriptionLocalized()); descriptionLocalizedContainer.add(new Label("descriptionLocalized")); reportDetails.add(descriptionLocalizedContainer); description.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { descriptionLocalizedContainer.setVisible(getReportDef().isDescriptionLocalized()); target.addComponent(descriptionLocalizedContainer); target.appendJavascript("setMainFrameHeightNoScroll(window.name);"); } }); // set visibility if(predefined) { if(Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage() && realSiteId.equals(siteId)) { reportDetailsTop.setVisible(true); reportDetailsShow.setVisible(false); reportDetails.setVisible(true); fakeReportDetails.setVisible(false); }else{ reportDetailsTop.setVisible(false); reportDetailsShow.setVisible(false); reportDetails.setVisible(false); } }else{ reportDetailsTop.setVisible(true); reportDetailsShow.setVisible(true); reportDetails.add(new AttributeModifier("style", true, new Model("display: none"))); } } @SuppressWarnings("serial") private void renderWhatUI(Form form) { // ------------------------------------------------------- // left panel // ------------------------------------------------------- // activity List<String> whatOptions = new ArrayList<String>(); if(visitsVisible) { whatOptions.add(ReportManager.WHAT_VISITS); } if(activityVisible) { whatOptions.add(ReportManager.WHAT_EVENTS); } if(resourcesVisible) { whatOptions.add(ReportManager.WHAT_RESOURCES); } if(presencesVisible) { whatOptions.add(ReportManager.WHAT_PRESENCES); } IChoiceRenderer whatChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(ReportManager.WHAT_VISITS.equals(object)) { return new ResourceModel("report_what_visits").getObject(); } if(ReportManager.WHAT_EVENTS.equals(object)) { return new ResourceModel("report_what_events").getObject(); } if(ReportManager.WHAT_RESOURCES.equals(object)) { return new ResourceModel("report_what_resources").getObject(); } if(ReportManager.WHAT_PRESENCES.equals(object)) { return new ResourceModel("report_what_presences").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice what = new DropDownChoice("reportParams.what", whatOptions, whatChoiceRenderer); what.setMarkupId("what"); what.setOutputMarkupId(true); form.add(what); // event selection type List<String> whatEventSelTypeOptions = Arrays.asList(ReportManager.WHAT_EVENTS_BYTOOL, ReportManager.WHAT_EVENTS_BYEVENTS); IChoiceRenderer whatEventSelTypeChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(ReportManager.WHAT_EVENTS_BYTOOL.equals(object)) { return new ResourceModel("report_what_events_bytool").getObject(); } if(ReportManager.WHAT_EVENTS_BYEVENTS.equals(object)) { return new ResourceModel("report_what_events_byevent").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice whatEventSelType = new DropDownChoice("reportParams.whatEventSelType", whatEventSelTypeOptions, whatEventSelTypeChoiceRenderer); whatEventSelType.setEscapeModelStrings(false); whatEventSelType.setMarkupId("whatEventSelType"); whatEventSelType.setOutputMarkupId(true); form.add(whatEventSelType); // tool selection Select whatToolIds = new Select("reportParams.whatToolIds"); RepeatingView selectOptionsRV1 = new RepeatingView("selectOptionsRV1"); whatToolIds.add(selectOptionsRV1); whatToolIds.add(new AttributeModifier("title", true, new ResourceModel("report_multiple_sel_instruction"))); addTools(selectOptionsRV1); form.add(whatToolIds); // event selection Select whatEventIds = new Select("reportParams.whatEventIds"); RepeatingView selectOptionsRV2 = new RepeatingView("selectOptionsRV2"); whatEventIds.add(selectOptionsRV2); whatEventIds.add(new AttributeModifier("title", true, new ResourceModel("report_multiple_sel_instruction"))); addEvents(selectOptionsRV2); form.add(whatEventIds); // resources selection boolean isSiteStatsAdminTool = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage(); boolean showDefaultBaseFoldersOnly = isSiteStatsAdminTool && predefined && realSiteId.equals(siteId); CheckBox whatLimitedAction = new CheckBox("reportParams.whatLimitedAction"); whatLimitedAction.setMarkupId("whatLimitedAction"); whatLimitedAction.setOutputMarkupId(true); form.add(whatLimitedAction); CheckBox whatLimitedResourceIds = new CheckBox("reportParams.whatLimitedResourceIds"); whatLimitedResourceIds.setMarkupId("whatLimitedResourceIds"); whatLimitedResourceIds.setOutputMarkupId(true); form.add(whatLimitedResourceIds); final FileSelectorPanel whatResourceIds = new FileSelectorPanel("reportParams.whatResourceIds", siteId, showDefaultBaseFoldersOnly); whatResourceIds.setMarkupId("whatResourceIds"); whatResourceIds.setOutputMarkupId(true); form.add(whatResourceIds); whatResourceIds.setEnabled(true); // resource actions List<String> resourceActions = new ArrayList<String>(); resourceActions.add(ReportManager.WHAT_RESOURCES_ACTION_NEW); resourceActions.add(ReportManager.WHAT_RESOURCES_ACTION_READ); resourceActions.add(ReportManager.WHAT_RESOURCES_ACTION_REVS); resourceActions.add(ReportManager.WHAT_RESOURCES_ACTION_DEL); DropDownChoice whatResourceAction = new DropDownChoice("reportParams.whatResourceAction", resourceActions, new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(object == null){ return ""; }else{ return (String) new ResourceModel("action_" + ((String) object)).getObject(); } } public String getIdValue(Object object, int index) { return (String) object; } }) { @Override protected CharSequence getDefaultChoice(Object selected) { return ""; } }; whatResourceAction.setMarkupId("whatResourceAction"); whatResourceAction.setOutputMarkupId(true); form.add(whatResourceAction); } @SuppressWarnings("serial") private void renderWhenUI(Form form) { List<String> whenOptions = Arrays.asList( ReportManager.WHEN_ALL, ReportManager.WHEN_LAST7DAYS, ReportManager.WHEN_LAST30DAYS, ReportManager.WHEN_LAST365DAYS, ReportManager.WHEN_CUSTOM ); IChoiceRenderer whenChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(ReportManager.WHEN_ALL.equals(object)) { return new ResourceModel("report_when_all").getObject(); } if(ReportManager.WHEN_LAST7DAYS.equals(object)) { return new ResourceModel("report_when_last7days").getObject(); } if(ReportManager.WHEN_LAST30DAYS.equals(object)) { return new ResourceModel("report_when_last30days").getObject(); } if(ReportManager.WHEN_LAST365DAYS.equals(object)) { return new ResourceModel("report_when_last365days").getObject(); } if(ReportManager.WHEN_CUSTOM.equals(object)) { return new ResourceModel("report_when_custom").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice when = new DropDownChoice("reportParams.when", whenOptions, whenChoiceRenderer); when.setMarkupId("when"); when.setOutputMarkupId(true); form.add(when); // custom dates form.add(new DateTimeField("reportParams.whenFrom") { @Override protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { return new DateTextField(id, dateFieldModel, new StyleDateConverter("S-", true)); } }); form.add(new DateTimeField("reportParams.whenTo") { @Override protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { return new DateTextField(id, dateFieldModel, new StyleDateConverter("S-", true)); } }); } @SuppressWarnings("serial") private void renderWhoUI(Form form) { List<String> groups = getGroups(); final RepeatingView selectOptionsRV = new RepeatingView("selectOptionsRV"); final Select whoUserIds = new MultipleSelect("reportParams.whoUserIds"); // who List<String> whoOptions = new ArrayList<String>(); whoOptions.add(ReportManager.WHO_ALL); whoOptions.add(ReportManager.WHO_ROLE); whoOptions.add(ReportManager.WHO_CUSTOM); whoOptions.add(ReportManager.WHO_NONE); if(groups.size() > 0) { whoOptions.add(2, ReportManager.WHO_GROUPS); } IChoiceRenderer whoChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(ReportManager.WHO_ALL.equals(object)) { return new ResourceModel("report_who_all").getObject(); } if(ReportManager.WHO_ROLE.equals(object)) { return new ResourceModel("report_who_role").getObject(); } if(ReportManager.WHO_GROUPS.equals(object)) { return new ResourceModel("report_who_group").getObject(); } if(ReportManager.WHO_CUSTOM.equals(object)) { return new ResourceModel("report_who_custom").getObject(); } if(ReportManager.WHO_NONE.equals(object)) { return new ResourceModel("report_who_none").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; final IndicatingAjaxDropDownChoice who = new IndicatingAjaxDropDownChoice("reportParams.who", whoOptions, whoChoiceRenderer); who.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { if(ReportManager.WHO_CUSTOM.equals(getReportParams().getWho())) { addUsers(selectOptionsRV); whoUserIds.add(new AttributeModifier("style", true, new Model("width: 300px"))); who.remove(this); whoUserIds.add(new AttributeModifier("onchange", true, new Model("checkWhoSelection();"))); target.addComponent(who); target.addComponent(whoUserIds); } target.appendJavascript("checkWhoSelection();"); } @Override protected CharSequence generateCallbackScript(CharSequence partialCall) { CharSequence ajaxScript = super.generateCallbackScript(partialCall); StringBuilder b = new StringBuilder(); b.append("checkWhoSelection();"); b.append("if(jQuery('#who').val() == 'who-custom') {;"); b.append(ajaxScript); b.append("}"); return b.toString(); } }); who.setMarkupId("who"); who.setOutputMarkupId(true); form.add(who); // users selectOptionsRV.setRenderBodyOnly(true); selectOptionsRV.setEscapeModelStrings(true); whoUserIds.add(selectOptionsRV); whoUserIds.add(new AttributeModifier("title", true, new ResourceModel("report_multiple_sel_instruction"))); whoUserIds.setOutputMarkupId(true); whoUserIds.setOutputMarkupPlaceholderTag(true); whoUserIds.setEscapeModelStrings(true); form.add(whoUserIds); boolean preloadData = ReportManager.WHO_CUSTOM.equals(getReportParams().getWho()); if(preloadData) { addUsers(selectOptionsRV); } // roles List<String> roles = getRoles(); IChoiceRenderer rolesRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { return (String) object; } public String getIdValue(Object object, int index) { return (String) object; } }; Collections.sort(roles, getChoiceRendererComparator(collator, rolesRenderer)); DropDownChoice whoRoleId = new DropDownChoice("reportParams.whoRoleId", roles, rolesRenderer); whoRoleId.setEnabled(roles.size() > 0); if(getReportParams().getWhoRoleId() == null) { if(roles.size() > 0) { getReportParams().setWhoRoleId(roles.get(0)); }else{ getReportParams().setWhoRoleId(""); } } form.add(whoRoleId); // groups WebMarkupContainer whoGroupTr = new WebMarkupContainer("who-groups-tr"); form.add(whoGroupTr); IChoiceRenderer groupsRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { try{ return Locator.getFacade().getSiteService().getSite(siteId).getGroup((String) object).getTitle(); }catch(IdUnusedException e){ return (String) object; } } public String getIdValue(Object object, int index) { return (String) object; } }; Collections.sort(groups, getChoiceRendererComparator(collator, groupsRenderer)); DropDownChoice whoGroupId = new DropDownChoice("reportParams.whoGroupId", groups, groupsRenderer); if(groups.size() == 0) { whoGroupTr.setVisible(false); }else{ if(getReportParams().getWhoGroupId() == null) { if(groups.size() > 0) { getReportParams().setWhoGroupId(groups.get(0)); }else{ getReportParams().setWhoGroupId(""); } } } whoGroupTr.add(whoGroupId); } @SuppressWarnings("serial") private void renderHowUI(Form form) { boolean isSiteStatsAdminTool = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage(); boolean renderSiteSelectOption = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage() && !predefined && realSiteId.equals(siteId); boolean renderSiteSortOption = isSiteStatsAdminTool && !predefined && realSiteId.equals(siteId); boolean renderSortAscendingOption = isSiteStatsAdminTool && predefined && realSiteId.equals(siteId); // common IChoiceRenderer allColumnsChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(object != null) { String id = (String) object; if(ReportManager.HOW_SORT_DEFAULT.equals(id)) { return (String) new ResourceModel("default").getObject(); } if(StatsManager.T_NONE.equals(id)) { return (String) new ResourceModel("none").getObject(); } if(StatsManager.T_SITE.equals(id)) { return (String) new ResourceModel("report_option_site").getObject(); } if(StatsManager.T_USER.equals(id)) { return (String) new ResourceModel("report_option_user").getObject(); } if(StatsManager.T_TOOL.equals(id)) { return (String) new ResourceModel("report_option_tool").getObject(); } if(StatsManager.T_EVENT.equals(id)) { return (String) new ResourceModel("report_option_event").getObject(); } if(StatsManager.T_RESOURCE.equals(id)) { return (String) new ResourceModel("report_option_resource").getObject(); } if(StatsManager.T_RESOURCE_ACTION.equals(id)) { return (String) new ResourceModel("report_option_resourceaction").getObject(); } if(StatsManager.T_DATE.equals(id)) { return (String) new ResourceModel("report_option_date").getObject(); } if(StatsManager.T_TOTAL.equals(id)) { return (String) new ResourceModel("report_option_total").getObject(); } } return (String) new ResourceModel("default").getObject(); } public String getIdValue(Object object, int index) { return (String) object; } }; // site to report WebMarkupContainer siteContainer = new WebMarkupContainer("siteContainer"); siteContainer.setVisible(renderSiteSelectOption); form.add(siteContainer); List<String> reportSiteOptions = Arrays.asList(REPORT_THISSITE, REPORT_ALLSITES); IChoiceRenderer reportSiteRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(REPORT_THISSITE.equals(object)) { return (String) new ResourceModel("report_reportsite_this").getObject(); } if(REPORT_ALLSITES.equals(object)) { return (String) new ResourceModel("report_reportsite_all").getObject(); } return (String) new ResourceModel("report_reportsite_this").getObject(); } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice reportSite = new DropDownChoice("reportSite",new PropertyModel(this, "reportSite") , reportSiteOptions, reportSiteRenderer); reportSite.setMarkupId("reportSite"); reportSite.setOutputMarkupId(true); siteContainer.add(reportSite); if(getReportParams().getSiteId() == null) { this.reportSiteOpt = REPORT_ALLSITES; }else { this.reportSiteOpt = REPORT_THISSITE; } // totals by Select howTotalsBy = new Select("reportParams.howTotalsBy"); howTotalsBy.setRequired(true); howTotalsBy.setMarkupId("howTotalsBy"); howTotalsBy.setOutputMarkupId(true); form.add(howTotalsBy); RepeatingView howTotalsByOptions = new RepeatingView("howTotalsByOptions"); howTotalsBy.add(howTotalsByOptions); addGroupOptions(howTotalsByOptions); // sorting WebMarkupContainer trSortBy = new WebMarkupContainer("trSortBy"); trSortBy.setVisible(renderSortAscendingOption); form.add(trSortBy); CheckBox howSortCheck = new CheckBox("reportParams.howSort"); howSortCheck.setMarkupId("howSortCheck"); howSortCheck.setOutputMarkupId(true); trSortBy.add(howSortCheck); // sort options List<String> sortOptions = null; if(renderSiteSortOption) { sortOptions = Arrays.asList(/*StatsManager.T_USER,*/ StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE, StatsManager.T_TOTAL, StatsManager.T_SITE); }else{ sortOptions = Arrays.asList(/*StatsManager.T_USER,*/ StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE, StatsManager.T_TOTAL); } DropDownChoice howSortBy = new DropDownChoice("reportParams.howSortBy", sortOptions, allColumnsChoiceRenderer); howSortBy.setMarkupId("howSortBy"); howSortBy.setOutputMarkupId(true); trSortBy.add(howSortBy); CheckBox howSortAscending = new CheckBox("reportParams.howSortAscending"); howSortAscending.setMarkupId("howSortAscending"); howSortAscending.setOutputMarkupId(true); trSortBy.add(howSortAscending); // max results CheckBox howMaxResultsCheck = new CheckBox("reportParams.howLimitedMaxResults"); howMaxResultsCheck.setMarkupId("howMaxResultsCheck"); howMaxResultsCheck.setOutputMarkupId(true); form.add(howMaxResultsCheck); TextField howMaxResults = new TextField("reportParams.howMaxResults",int.class) { @Override public String getInput() { String[] input = getInputAsArray(); if(input == null || input.length == 0){ return "0"; }else{ return trim(input[0]); } } }; howMaxResults.setMarkupId("howMaxResults"); howMaxResults.setOutputMarkupId(true); form.add(howMaxResults); // presentation List<String> howPresentationOptions = Arrays.asList(ReportManager.HOW_PRESENTATION_TABLE, ReportManager.HOW_PRESENTATION_CHART, ReportManager.HOW_PRESENTATION_BOTH); IChoiceRenderer howPresentationChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(ReportManager.HOW_PRESENTATION_TABLE.equals(object)) { return new ResourceModel("report_howpresentation_table").getObject(); } if(ReportManager.HOW_PRESENTATION_CHART.equals(object)) { return new ResourceModel("report_howpresentation_chart").getObject(); } if(ReportManager.HOW_PRESENTATION_BOTH.equals(object)) { return new ResourceModel("report_howpresentation_both").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice howPresentation = new DropDownChoice("reportParams.howPresentationMode", howPresentationOptions, howPresentationChoiceRenderer); howPresentation.setMarkupId("howPresentation"); howPresentation.setOutputMarkupId(true); form.add(howPresentation); // chart type List<String> howChartTypeOptions = Arrays.asList( StatsManager.CHARTTYPE_BAR, /*StatsManager.CHARTTYPE_LINE,*/ StatsManager.CHARTTYPE_PIE, StatsManager.CHARTTYPE_TIMESERIES, StatsManager.CHARTTYPE_TIMESERIESBAR); IChoiceRenderer howChartTypeChoiceRenderer = new IChoiceRenderer() { public Object getDisplayValue(Object object) { if(StatsManager.CHARTTYPE_BAR.equals(object)) { return new ResourceModel("report_howchart_bar").getObject(); } if(StatsManager.CHARTTYPE_LINE.equals(object)) { return new ResourceModel("report_howchart_line").getObject(); } if(StatsManager.CHARTTYPE_PIE.equals(object)) { return new ResourceModel("report_howchart_pie").getObject(); } if(StatsManager.CHARTTYPE_TIMESERIES.equals(object)) { return new ResourceModel("report_howchart_timeseries").getObject(); } if(StatsManager.CHARTTYPE_TIMESERIESBAR.equals(object)) { return new ResourceModel("report_howchart_timeseries_bar").getObject(); } return object; } public String getIdValue(Object object, int index) { return (String) object; } }; DropDownChoice howChartType = new DropDownChoice("reportParams.howChartType", howChartTypeOptions, howChartTypeChoiceRenderer); howChartType.setMarkupId("howChartType"); howChartType.setOutputMarkupId(true); form.add(howChartType); // chart source, chart series List<String> howChartSourceOptions = null; List<String> howChartCategorySourceOptions = null; List<String> howChartSeriesSourceOptions = null; if(renderSiteSortOption) { howChartSourceOptions = Arrays.asList(StatsManager.T_SITE, StatsManager.T_USER, StatsManager.T_TOOL, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE); howChartCategorySourceOptions = Arrays.asList(StatsManager.T_NONE, StatsManager.T_SITE, StatsManager.T_USER, StatsManager.T_TOOL, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE); howChartSeriesSourceOptions = Arrays.asList(StatsManager.T_SITE, StatsManager.T_USER, StatsManager.T_TOOL, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_TOTAL); }else{ howChartSourceOptions = Arrays.asList(StatsManager.T_USER, StatsManager.T_TOOL, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE); howChartCategorySourceOptions = Arrays.asList(StatsManager.T_NONE, StatsManager.T_TOOL, StatsManager.T_USER, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_DATE); howChartSeriesSourceOptions = Arrays.asList(StatsManager.T_USER, StatsManager.T_TOOL, StatsManager.T_EVENT, StatsManager.T_RESOURCE, StatsManager.T_RESOURCE_ACTION, StatsManager.T_TOTAL); } DropDownChoice howChartSource = new DropDownChoice("reportParams.howChartSource", howChartSourceOptions, allColumnsChoiceRenderer); howChartSource.setMarkupId("howChartSource"); howChartSource.setOutputMarkupId(true); form.add(howChartSource); DropDownChoice howChartCategorySource = new DropDownChoice("reportParams.howChartCategorySource", howChartCategorySourceOptions, allColumnsChoiceRenderer); howChartCategorySource.setMarkupId("howChartCategorySource"); howChartCategorySource.setOutputMarkupId(true); form.add(howChartCategorySource); DropDownChoice howChartSeriesSource = new DropDownChoice("reportParams.howChartSeriesSource", howChartSeriesSourceOptions, allColumnsChoiceRenderer); howChartSeriesSource.setMarkupId("howChartSeriesSource"); howChartSeriesSource.setOutputMarkupId(true); form.add(howChartSeriesSource); } @SuppressWarnings("serial") private void addTools(final RepeatingView rv) { List<SelectOption> tools = new ArrayList<SelectOption>(); List<ToolInfo> siteTools = Locator.getFacade().getEventRegistryService().getEventRegistry(siteId, getPrefsdata().isListToolEventsOnlyAvailableInSite()); Iterator<ToolInfo> i = siteTools.iterator(); // add tools while(i.hasNext()){ final ToolInfo toolInfo = i.next(); if(isToolSuported(toolInfo)) { tools.add(new SelectOption("option", new ToolModel(toolInfo))); } } WebMarkupContainer optgroupItem = new WebMarkupContainer(rv.newChildId()); optgroupItem.setRenderBodyOnly(true); rv.add(optgroupItem); IStylableOptionRenderer optionRenderer = new IStylableOptionRenderer() { public String getDisplayValue(Object object) { SelectOption opt = (SelectOption) object; return ((ToolModel) opt.getDefaultModel()).getToolName(); } public IModel getModel(Object value) { SelectOption opt = (SelectOption) value; return new Model(((ToolModel) opt.getDefaultModel()).getToolId()); } public String getStyle(Object object) { SelectOption opt = (SelectOption) object; ToolModel toolModel = (ToolModel) opt.getDefaultModel(); String toolId = toolModel.getToolId(); if(!ReportManager.WHAT_EVENTS_ALLTOOLS.equals(toolId)) { String toolIconPath = "background-image: url(" + Locator.getFacade().getEventRegistryService().getToolIcon(toolId) + ");"; String style = "background-position:left center; background-repeat:no-repeat; margin-left:3px; padding-left:20px; "+toolIconPath; return style; } return null; } }; Collections.sort(tools, getOptionRendererComparator(collator, optionRenderer)); // "all" tools (insert in position 0 tools.add(0, new SelectOption("option", new ToolModel(ReportManager.WHAT_EVENTS_ALLTOOLS, ReportManager.WHAT_EVENTS_ALLTOOLS))); StylableSelectOptions selectOptions = new StylableSelectOptions("selectOptions", tools, optionRenderer); selectOptions.setRenderBodyOnly(true); optgroupItem.add(selectOptions); } @SuppressWarnings("serial") private void addEvents(final RepeatingView rv) { List<ToolInfo> siteTools = Locator.getFacade().getEventRegistryService().getEventRegistry(siteId, getPrefsdata().isListToolEventsOnlyAvailableInSite()); Collections.sort(siteTools, getToolInfoComparator(collator)); // add events Iterator<ToolInfo> i = siteTools.iterator(); while(i.hasNext()){ ToolInfo toolInfo = i.next(); if(isToolSuported(toolInfo)) { List<EventInfo> eventInfos = toolInfo.getEvents(); List<SelectOption> events = new ArrayList<SelectOption>(); Iterator<EventInfo> iE = eventInfos.iterator(); while(iE.hasNext()){ EventInfo e = iE.next(); SelectOption opt = new SelectOption("option", new EventModel(e)); events.add(opt); } WebMarkupContainer optgroupItem = new WebMarkupContainer(rv.newChildId()); optgroupItem.setRenderBodyOnly(true); rv.add(optgroupItem); String toolIconPath = "background-image: url(" + Locator.getFacade().getEventRegistryService().getToolIcon(toolInfo.getToolId()) + ");"; String style = "background-position:left top; background-repeat:no-repeat; margin-left:3px; padding-left:20px; "+toolIconPath; String toolName = Locator.getFacade().getEventRegistryService().getToolName(toolInfo.getToolId()); StylableSelectOptionsGroup group = new StylableSelectOptionsGroup("group", new Model(toolName), new Model(style)); optgroupItem.add(group); SelectOptions selectOptions = new SelectOptions("selectOptions", events, new IOptionRenderer() { public String getDisplayValue(Object object) { SelectOption opt = (SelectOption) object; return ((EventModel) opt.getDefaultModel()).getEventName(); } public IModel getModel(Object value) { SelectOption opt = (SelectOption) value; return new Model(((EventModel) opt.getDefaultModel()).getEventId()); } }); selectOptions.setRenderBodyOnly(true); group.add(selectOptions); } } } @SuppressWarnings("serial") private void addUsers(final RepeatingView rv) { if(usersLoaded) { return; } ajaxUpdateLock.lock(); try{ List<SelectOption> users = new ArrayList<SelectOption>(); // anonymous access if(Locator.getFacade().getStatsManager().isShowAnonymousAccessEvents()) { SelectOption anon = new SelectOption("option", new Model("?")); users.add(anon); } // site users Set<String> siteUsers = null; try{ siteUsers = Locator.getFacade().getSiteService().getSite(siteId).getUsers(); }catch(IdUnusedException e){ LOG.warn("Site does not exist: " + siteId); siteUsers = new HashSet<String>(); } Iterator<String> i = siteUsers.iterator(); while(i.hasNext()){ String userId = i.next(); if(userId != null) { SelectOption opt = new SelectOption("option", new Model(userId)); opt.setEscapeModelStrings(true); users.add(opt); } } WebMarkupContainer optgroupItem = new WebMarkupContainer(rv.newChildId()); optgroupItem.setRenderBodyOnly(true); rv.add(optgroupItem); IOptionRenderer optionRenderer = new IOptionRenderer() { public String getDisplayValue(Object object) { SelectOption opt = (SelectOption) object; String userId = (String) opt.getDefaultModel().getObject(); if(("?").equals(userId)) { return Web.escapeHtml( (String) new ResourceModel("user_anonymous_access").getObject() ); }else{ User u = null; try{ u = Locator.getFacade().getUserDirectoryService().getUser(userId); }catch(UserNotDefinedException e){ return Web.escapeHtml(userId); } StringBuilder buff = new StringBuilder(); buff.append(Locator.getFacade().getStatsManager().getUserNameForDisplay(u)); buff.append(" ("); buff.append(u.getDisplayId()); buff.append(")"); return Web.escapeHtml(buff.toString()); } } public IModel getModel(Object value) { SelectOption opt = (SelectOption) value; return new Model( (String) opt.getDefaultModel().getObject() ); } }; Collections.sort(users, getOptionRendererComparator(collator, optionRenderer)); SelectOptions selectOptions = new SelectOptions("selectOptions", users, optionRenderer); selectOptions.setRenderBodyOnly(true); optgroupItem.add(selectOptions); usersLoaded = true; }finally{ ajaxUpdateLock.unlock(); } } @SuppressWarnings("serial") private void addGroupOptions(final RepeatingView rv) { boolean isSiteStatsAdminTool = Locator.getFacade().getStatsAuthz().isSiteStatsAdminPage(); boolean renderAdminOptions = isSiteStatsAdminTool && !predefined && realSiteId.equals(siteId); List<String> totalsOptions = new ArrayList<String>(); totalsOptions.add(StatsManager.T_USER); totalsOptions.add(StatsManager.T_TOOL); totalsOptions.add(StatsManager.T_EVENT); totalsOptions.add(StatsManager.T_RESOURCE); totalsOptions.add(StatsManager.T_RESOURCE_ACTION); totalsOptions.add(StatsManager.T_DATE); if(renderAdminOptions) { totalsOptions.add(StatsManager.T_SITE); } // add grouping options List<SelectOption> selectOptionList = new ArrayList<SelectOption>(); Iterator<String> i = totalsOptions.iterator(); while(i.hasNext()){ String totalOpt = i.next(); SelectOption so = new SelectOption("option", new Model(totalOpt)); so.setEscapeModelStrings(false); selectOptionList.add(so); } WebMarkupContainer optgroupItem = new WebMarkupContainer(rv.newChildId()); optgroupItem.setRenderBodyOnly(true); rv.add(optgroupItem); final IOptionRenderer optionRenderer = new IOptionRenderer() { public String getDisplayValue(Object o) { SelectOption opt = (SelectOption) o; Object object = opt.getDefaultModel().getObject(); if(StatsManager.T_USER.equals(object)) { return (String) new ResourceModel("report_option_user").getObject(); } if(StatsManager.T_TOOL.equals(object)) { return (String) new ResourceModel("report_option_tool").getObject(); } if(StatsManager.T_EVENT.equals(object)) { return (String) new ResourceModel("report_option_event").getObject(); } if(StatsManager.T_RESOURCE.equals(object)) { return (String) new ResourceModel("report_option_resource").getObject(); } if(StatsManager.T_RESOURCE_ACTION.equals(object)) { return (String) new ResourceModel("report_option_resourceaction").getObject(); } if(StatsManager.T_DATE.equals(object)) { return (String) new ResourceModel("report_option_date").getObject(); } if(StatsManager.T_LASTDATE.equals(object)) { return (String) new ResourceModel("report_option_lastdate").getObject(); } if(StatsManager.T_SITE.equals(object)) { return (String) new ResourceModel("report_option_site").getObject(); } return (String) object; } public IModel getModel(Object value) { SelectOption opt = (SelectOption) value; return opt.getDefaultModel(); } }; SelectOptions selectOptions = new SelectOptions("selectOptions", selectOptionList, optionRenderer); selectOptions.setRenderBodyOnly(true); selectOptions.setEscapeModelStrings(false); optgroupItem.add(selectOptions); } private List<String> getGroups() { List<String> groups = new ArrayList<String>(); try{ Collection<Group> groupCollection = Locator.getFacade().getSiteService().getSite(siteId).getGroups(); Iterator<Group> i = groupCollection.iterator(); while(i.hasNext()){ Group g = i.next(); groups.add(g.getId()); } }catch(IdUnusedException e){ LOG.warn("Site does not exist: " + siteId); } return groups; } private List<String> getRoles() { List<String> roles = new ArrayList<String>(); try{ Set<Role> roleSet = Locator.getFacade().getSiteService().getSite(siteId).getRoles(); Iterator<Role> i = roleSet.iterator(); while(i.hasNext()){ Role r = i.next(); roles.add(r.getId()); } }catch(IdUnusedException e){ LOG.warn("Site does not exist: " + siteId); } return roles; } 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 static final Comparator<String> getStringComparator(final Collator collator){ return new Comparator<String>(){ public int compare(String o1, String o2) { return collator.compare(o1, o2); } }; } public static final Comparator<ToolInfo> getToolInfoComparator(final Collator collator){ return new Comparator<ToolInfo>(){ public int compare(ToolInfo o1, ToolInfo o2) { String toolName1 = Locator.getFacade().getEventRegistryService().getToolName(o1.getToolId()); String toolName2 = Locator.getFacade().getEventRegistryService().getToolName(o2.getToolId()); return collator.compare(toolName1, toolName2); } }; } public static final Comparator<Object> getOptionRendererComparator(final Collator collator, final IOptionRenderer renderer){ return new Comparator<Object>(){ public int compare(Object o1, Object o2) { return collator.compare( renderer.getDisplayValue(o1), renderer.getDisplayValue(o2) ); } }; } public static final Comparator<Object> getChoiceRendererComparator(final Collator collator, final IChoiceRenderer renderer){ return new Comparator<Object>(){ public int compare(Object o1, Object o2) { return collator.compare( renderer.getDisplayValue(o1), renderer.getDisplayValue(o2) ); } }; } private PrefsData getPrefsdata() { if(prefsdata == null) { prefsdata = Locator.getFacade().getStatsManager().getPreferences(siteId, true); } return prefsdata; } private boolean validReportParameters() { Site site = null; try{ site = Locator.getFacade().getSiteService().getSite(siteId); }catch(IdUnusedException e){ LOG.error("No site with id: "+siteId); } // check WHAT if(getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS) && getReportParams().getWhatEventSelType().equals(ReportManager.WHAT_EVENTS_BYTOOL) && (getReportParams().getWhatToolIds() == null || getReportParams().getWhatToolIds().size() == 0)){ error((String) new ResourceModel("report_err_notools").getObject()); } if(getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS) && getReportParams().getWhatEventSelType().equals(ReportManager.WHAT_EVENTS_BYEVENTS) && (getReportParams().getWhatEventIds() == null || getReportParams().getWhatEventIds().size() == 0)) { error((String) new ResourceModel("report_err_noevents").getObject()); } if(getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES) && getReportParams().isWhatLimitedResourceIds() && (getReportParams().getWhatResourceIds() == null || getReportParams().getWhatResourceIds().size() == 0)){ error((String) new ResourceModel("report_err_noresources").getObject()); } // check WHEN if(getReportParams().getWhen().equals(ReportManager.WHEN_CUSTOM) && (getReportParams().getWhenFrom() == null || getReportParams().getWhenTo() == null)) { error((String) new ResourceModel("report_err_nocustomdates").getObject()); } // check WHO if(getReportParams().getWho().equals(ReportManager.WHO_ROLE)){ if(site.getUsersHasRole(getReportParams().getWhoRoleId()).isEmpty()) error((String) new ResourceModel("report_err_emptyrole").getObject()); }else if(getReportParams().getWho().equals(ReportManager.WHO_GROUPS)){ if(getReportParams().getWhoGroupId() == null || getReportParams().getWhoGroupId().equals("")) error((String) new ResourceModel("report_err_nogroup").getObject()); else if(site.getGroup(getReportParams().getWhoGroupId()).getUsers().isEmpty()) error((String) new ResourceModel("report_err_emptygroup").getObject()); }else if(getReportParams().getWho().equals(ReportManager.WHO_CUSTOM) && (getReportParams().getWhoUserIds() == null || getReportParams().getWhoUserIds().size() == 0)){ error((String) new ResourceModel("report_err_nousers").getObject()); } // check HOW if(getReportParams().getHowTotalsBy() != null){ if(getReportParams().getHowSortBy().length() == 0) { error((String) new ResourceModel("report_err_totalsbynone").getObject()); } if(getReportParams().getWhat().equals(ReportManager.WHAT_EVENTS) && (getReportParams().getHowTotalsBy().contains(StatsManager.T_RESOURCE) || getReportParams().getHowTotalsBy().contains(StatsManager.T_RESOURCE_ACTION) )) { error((String) new ResourceModel("report_err_totalsbyevent").getObject()); }else if(getReportParams().getWhat().equals(ReportManager.WHAT_RESOURCES) && getReportParams().getHowTotalsBy().contains(StatsManager.T_EVENT)) { error((String) new ResourceModel("report_err_totalsbyresource").getObject()); } } if(getReportParams().isHowSort() && getReportParams().getHowSortBy() != null && !getReportParams().getHowSortBy().equals(ReportManager.HOW_SORT_DEFAULT)){ if(!StatsManager.T_TOTAL.equals(getReportParams().getHowSortBy()) && !getReportParams().getHowTotalsBy().contains(getReportParams().getHowSortBy()) ){ getReportParams().setHowSort(false); getReportParams().setHowSortBy(null); } } return !hasErrorMessage(); } public String getReportSite() { return reportSiteOpt; } public void setReportSite(String reportSiteOpt) { this.reportSiteOpt = reportSiteOpt; if(REPORT_THISSITE.equals(reportSiteOpt)) { getReportParams().setSiteId(siteId); }else if(REPORT_ALLSITES.equals(reportSiteOpt)) { getReportParams().setSiteId(null); } } public String getTitleLocalized() { return (String) new ResourceModel(getReportDef().getTitleBundleKey()).getObject(); } public String getDescriptionLocalized() { return (String) new ResourceModel(getReportDef().getDescriptionBundleKey()).getObject(); } public ReportDef getReportDef() { return (ReportDef) this.reportDefModel.getObject(); } public void setReportParams(ReportParams reportParams) { getReportDef().setReportParams(reportParams); } public ReportParams getReportParams() { return getReportDef().getReportParams(); } /** Subclass of Select that fixes behavior when used with AjaxFormChoiceComponentUpdatingBehavior.*/ static class MultipleSelect extends Select { private static final long serialVersionUID = 1L; public MultipleSelect(String id) { super(id); } @Override public void updateModel() { Object converted = getConvertedInput(); Collection modelCollection = new ArrayList(); modelChanging(); if(converted != null){ modelCollection.addAll((Collection) converted); } modelChanged(); getModel().setObject(modelCollection); } @Override protected void convertInput() { String[] paths = getInputAsArray(); // nothing selected if(paths == null || paths.length == 0){ setConvertedInput(null); return; } // convert List converted = new ArrayList(paths.length); for(int i = 0; i < paths.length; i++){ String path = paths[i]; if(!Strings.isEmpty(path)){ /* * option component path sans select component path = * relative path from group to option since we know the * option is child of select */ path = path.substring(getPath().length() + 1); // retrieve the selected option component SelectOption option = (SelectOption) get(path); if(option == null){ throw new WicketRuntimeException( "submitted http post value [" + Arrays.toString(paths) + "] for SelectOption component [" + getPath() + "] contains an illegal relative path element [" + path + "] which does not point to an SelectOption component. Due to this the Select component cannot resolve the selected SelectOption component pointed to by the illegal value. A possible reason is that component hierarchy changed between rendering and form submission."); } converted.add(option.getDefaultModelObject()); } } if(converted.isEmpty()){ setConvertedInput(null); }else{ setConvertedInput(converted); } } } }