/** * Copyright 2010 the original author or authors. * * This file is part of Zksample2. http://zksample2.sourceforge.net/ * * Zksample2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Zksample2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Zksample2. If not, see <http://www.gnu.org/licenses/gpl.html>. */ package de.forsthaus.webui.logging.loginlog; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.zkoss.util.resource.Labels; import org.zkoss.zk.ui.Path; import org.zkoss.zk.ui.event.Event; import org.zkoss.zul.Borderlayout; import org.zkoss.zul.Cell; import org.zkoss.zul.Center; import org.zkoss.zul.Div; import org.zkoss.zul.FieldComparator; import org.zkoss.zul.Hbox; import org.zkoss.zul.Intbox; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listfoot; import org.zkoss.zul.Listfooter; import org.zkoss.zul.Listhead; import org.zkoss.zul.Listheader; import org.zkoss.zul.Panel; import org.zkoss.zul.Panelchildren; import org.zkoss.zul.Window; import de.forsthaus.backend.bean.DummyBean; import de.forsthaus.backend.bean.ListLongSumBean; import de.forsthaus.backend.service.LoginLoggingService; import de.forsthaus.webui.logging.loginlog.model.SecLoginlogStatisticTotalListModelItemRenderer; import de.forsthaus.webui.util.GFCBaseCtrl; import de.forsthaus.webui.util.ZksampleDateFormat; import de.forsthaus.webui.util.ZksampleMessageUtils; /** * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * This is the controller class for the * /WEB-INF/pages/sec_loginlog/secLoginLogStatistic.zul file.<br> * <br> * This class creates the tabs + panels for the list and statistic panel. * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * * @changes 12/19/2009: sge Splitted the controller for each panel. <br> * * @author bbruhns * @author sgerth */ public class SecLoginlogStatisticCtrl extends GFCBaseCtrl implements Serializable { private static final long serialVersionUID = 4249471372492633246L; private static final Logger logger = Logger.getLogger(SecLoginlogStatisticCtrl.class); /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * All the components that are defined here and have a corresponding * component with the same 'id' in the zul-file are getting autowired by our * 'extends GFCBaseCtrl' GenericForwardComposer. * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ protected Window windowTabPanelLoginStatistic; // autowired protected Panel panelSecLoginLogStatistikCenter; // autowired protected Panelchildren panelchildrenSecLoginLogStatistikCenter; // autowired protected Hbox boxSecLoginLogStatistikCenter; // autowired // protected Box boxSecLoginLogStatistikCenter; // autowired protected Listbox lbTotalCount; protected Listfooter lfTotalCount; protected Listbox lbMonthlyCount; protected Listfooter lfMonthlyCount; protected Listbox lbDailyCount; protected Listfooter lfDailyCount; protected int maxPanelHeight; protected int maxlistBoxHeight; // ServiceDAOs / Domain Classes private transient LoginLoggingService loginLoggingService; /** * default constructor.<br> */ public SecLoginlogStatisticCtrl() { super(); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // +++++++++++++++ Component Events ++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // public void onCreate$windowTabPanelLoginStatistic(Event event) throws Exception { /** * Calculate how many rows have been place in the listbox. Get the * currentDesktopHeight from a hidden Intbox from the index.zul that are * filled by onClientInfo() in the indexCtroller */ final int height = ((Intbox) Path.getComponent("/outerIndexWindow/currentDesktopHeight")).getValue().intValue(); this.maxPanelHeight = height - 140; this.maxlistBoxHeight = this.maxPanelHeight - 25; this.panelSecLoginLogStatistikCenter.setHeight(String.valueOf(this.maxPanelHeight) + "px"); final Calendar aDate = Calendar.getInstance(); aDate.setTime(new Date()); final int currentYear = aDate.get(Calendar.YEAR); final int currentMonth = aDate.get(Calendar.MONTH); this.boxSecLoginLogStatistikCenter.appendChild(doGetTotalCountByCountries()); this.boxSecLoginLogStatistikCenter.appendChild(doGetMonthlyCountByCountries(currentMonth, currentYear)); this.boxSecLoginLogStatistikCenter.appendChild(doGetDailyCountByCountries(new Date())); } /** * when the "help" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btnHelp(Event event) throws InterruptedException { ZksampleMessageUtils.doShowNotImplementedMessage(); } /** * when the "print" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$button_SecLoginlogList_PrintLoginList(Event event) throws InterruptedException { ZksampleMessageUtils.doShowNotImplementedMessage(); } /** * when the "RefreshTotalCountByCountries" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$buttonSecLoginListStatisticTotalCountByCountries(Event event) throws InterruptedException { doRefreshTotalCount(); } /** * when the "RefreshMonthlyCountByCountries" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$buttonSecLoginListStatisticMonthlyCountByCountries(Event event) throws InterruptedException { final Calendar aDate = Calendar.getInstance(); aDate.setTime(new Date()); final int currentYear = aDate.get(Calendar.YEAR); final int currentMonth = aDate.get(Calendar.MONTH); doRefreshMonthlyCount(currentMonth, currentYear); } /** * when the "RefreshDailyCountByCountries" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$buttonSecLoginListStatisticDailyCountByCountries(Event event) throws InterruptedException { doRefreshDailyCount(new Date()); } /** * Generates a listBox who is showing the total logins by country.<br> * * @return */ private Cell doGetTotalCountByCountries() { final List<DummyBean> list = getLoginLoggingService().getTotalCountByCountries(); final int recCount = getLoginLoggingService().getTotalCountOfLogs(); final Div div = new Div(); div.setHeight("100%"); div.setWidth("100%"); final Panel panel = new Panel(); panel.setTitle(Labels.getLabel("panelTotalCount.Title")); panel.setBorder("none"); panel.setHeight("100%"); panel.setWidth("100%"); panel.setParent(div); final Panelchildren panelchildren = new Panelchildren(); panelchildren.setParent(panel); final Borderlayout bl = new Borderlayout(); bl.setHeight(this.maxlistBoxHeight + "px"); bl.setParent(panelchildren); final Center center = new Center(); center.setParent(bl); center.setBorder("0"); this.lbTotalCount = new Listbox(); this.lbTotalCount.setVflex(true); this.lbTotalCount.setMultiple(false); this.lbTotalCount.setWidth("99.5%"); this.lbTotalCount.setHeight("99.5%"); this.lbTotalCount.setParent(center); final Listhead listhead = new Listhead(); listhead.setSizable(true); listhead.setParent(this.lbTotalCount); final Listheader lh1 = new Listheader(); lh1.setSclass("FDListBoxHeader1"); lh1.setWidth("10%"); lh1.setSortAscending(new FieldComparator("country", true)); lh1.setSortDescending(new FieldComparator("country", false)); lh1.setParent(listhead); final Listheader lh2 = new Listheader(Labels.getLabel("listheader_SecLoginlogList_CountryCode2.label")); lh2.setSclass("FDListBoxHeader1"); lh2.setWidth("60%"); lh2.setSortAscending(new FieldComparator("countryName", true)); lh2.setSortDescending(new FieldComparator("countryName", false)); lh2.setParent(listhead); final Listheader lh3 = new Listheader(Labels.getLabel("ListheaderStatisticTotalCountByCountries.TotalCount.Label")); lh3.setSclass("FDListBoxHeader1"); lh3.setWidth("30%"); lh3.setSortAscending(new FieldComparator("totalCount", true)); lh3.setSortDescending(new FieldComparator("totalCount", false)); lh3.setSortDirection("descending"); lh3.setParent(listhead); final Listfoot listfoot = new Listfoot(); listfoot.setHeight("20px"); listfoot.setParent(this.lbTotalCount); final Listfooter lf1 = new Listfooter(); lf1.setParent(listfoot); lf1.setWidth("10%"); lf1.setStyle("font-weight:bold"); lf1.setLabel(Labels.getLabel("message_Sum")); final Listfooter lf2 = new Listfooter(); lf2.setParent(listfoot); lf2.setWidth("60%"); this.lfTotalCount = new Listfooter(); this.lfTotalCount.setParent(listfoot); this.lfTotalCount.setWidth("30%"); this.lfTotalCount.setStyle("font-weight:bold; text-align: right"); this.lbTotalCount.setItemRenderer(new SecLoginlogStatisticTotalListModelItemRenderer()); this.lbTotalCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ if (!StringUtils.isEmpty(String.valueOf(recCount))) { this.lfTotalCount.setLabel(String.valueOf(recCount)); } else this.lfTotalCount.setLabel("0"); Cell cell = new Cell(); cell.setWidth("33%"); cell.setStyle("padding: 0px;"); cell.setHflex("1"); cell.appendChild(div); return cell; } private void doRefreshTotalCount() { final List<DummyBean> list = getLoginLoggingService().getTotalCountByCountries(); final int recCount = getLoginLoggingService().getTotalCountOfLogs(); this.lbTotalCount.setItemRenderer(new SecLoginlogStatisticTotalListModelItemRenderer()); this.lbTotalCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ if (!StringUtils.isEmpty(String.valueOf(recCount))) { this.lfTotalCount.setLabel(String.valueOf(recCount)); } else this.lfTotalCount.setLabel("0"); } /** * Generates a listBox who is showing the monthly logins by country.<br> * * @param aMonth * @param aYear * @return */ private Cell doGetMonthlyCountByCountries(int aMonth, int aYear) { final ListLongSumBean<DummyBean> listIntegerSumBean = getLoginLoggingService().getMonthlyCountByCountries(aMonth, aYear); final List<DummyBean> list = listIntegerSumBean.getList(); final long recCount = listIntegerSumBean.getSum(); final Div div = new Div(); div.setHeight("100%"); div.setWidth("100%"); final Panel panel = new Panel(); panel.setTitle(Labels.getLabel("panelMonthlyCount.Title") + " " + (aMonth + 1) + "/" + aYear); panel.setBorder("none"); panel.setHeight("100%"); panel.setWidth("100%"); panel.setParent(div); final Panelchildren panelchildren = new Panelchildren(); panelchildren.setParent(panel); final Borderlayout bl = new Borderlayout(); bl.setHeight(this.maxlistBoxHeight + "px"); bl.setParent(panelchildren); final Center center = new Center(); center.setParent(bl); center.setBorder("0"); this.lbMonthlyCount = new Listbox(); this.lbMonthlyCount.setVflex(true); this.lbMonthlyCount.setMultiple(false); this.lbMonthlyCount.setWidth("99.5%"); this.lbMonthlyCount.setHeight("99.5%"); // lb.setParent(panelchildrenSecLoginLogStatistikCenter); this.lbMonthlyCount.setParent(center); final Listhead listhead = new Listhead(); listhead.setSizable(true); listhead.setParent(this.lbMonthlyCount); final Listheader lh1 = new Listheader(); lh1.setSclass("FDListBoxHeader1"); lh1.setWidth("10%"); lh1.setSortAscending(new FieldComparator("country", true)); lh1.setSortDescending(new FieldComparator("country", false)); lh1.setParent(listhead); final Listheader lh2 = new Listheader(Labels.getLabel("listheader_SecLoginlogList_CountryCode2.label")); lh2.setSclass("FDListBoxHeader1"); lh2.setWidth("60%"); lh2.setSortAscending(new FieldComparator("countryName", true)); lh2.setSortDescending(new FieldComparator("countryName", false)); lh2.setParent(listhead); final Listheader lh3 = new Listheader(Labels.getLabel("ListheaderStatisticTotalCountByCountries.TotalCount.Label")); lh3.setSclass("FDListBoxHeader1"); lh3.setWidth("30%"); lh3.setSortAscending(new FieldComparator("totalCount", true)); lh3.setSortDescending(new FieldComparator("totalCount", false)); lh3.setSortDirection("descending"); lh3.setParent(listhead); final Listfoot listfoot = new Listfoot(); listfoot.setHeight("20px"); listfoot.setParent(this.lbMonthlyCount); final Listfooter lf1 = new Listfooter(); lf1.setParent(listfoot); lf1.setWidth("10%"); lf1.setStyle("font-weight:bold"); lf1.setLabel(Labels.getLabel("message_Sum")); final Listfooter lf2 = new Listfooter(); lf2.setParent(listfoot); lf2.setWidth("60%"); this.lfMonthlyCount = new Listfooter(); this.lfMonthlyCount.setParent(listfoot); this.lfMonthlyCount.setWidth("30%"); this.lfMonthlyCount.setStyle("font-weight:bold; text-align: right"); this.lbMonthlyCount.setItemRenderer(new SecLoginlogStatisticTotalListModelItemRenderer()); this.lbMonthlyCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ this.lfMonthlyCount.setLabel(String.valueOf(recCount)); Cell cell = new Cell(); cell.setWidth("33%"); cell.setStyle("padding: 0px;"); cell.setHflex("1"); cell.appendChild(div); return cell; } private void doRefreshMonthlyCount(int aMonth, int aYear) { final ListLongSumBean<DummyBean> listIntegerSumBean = getLoginLoggingService().getMonthlyCountByCountries(aMonth, aYear); final List<DummyBean> list = listIntegerSumBean.getList(); final long recCount = listIntegerSumBean.getSum(); this.lbMonthlyCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ this.lfMonthlyCount.setLabel(String.valueOf(recCount)); } /** * Generates a listBox who is showing the logins by country <br> * for a special Date.<br> * * @param aDate * @return div */ private Cell doGetDailyCountByCountries(Date aDate) { final ListLongSumBean<DummyBean> listIntegerSumBean = getLoginLoggingService().getDailyCountByCountries(aDate); final List<DummyBean> list = listIntegerSumBean.getList(); final long recCount = listIntegerSumBean.getSum(); final Div div = new Div(); div.setHeight("100%"); div.setWidth("100%"); final Panel panel = new Panel(); panel.setTitle(Labels.getLabel("panelDailyCount.Title") + ": " + getDateTime(aDate)); panel.setBorder("none"); panel.setHeight("100%"); panel.setWidth("100%"); panel.setParent(div); final Panelchildren panelchildren = new Panelchildren(); panelchildren.setParent(panel); final Borderlayout bl = new Borderlayout(); bl.setHeight(this.maxlistBoxHeight + "px"); bl.setParent(panelchildren); final Center center = new Center(); center.setParent(bl); center.setBorder("0"); this.lbDailyCount = new Listbox(); this.lbDailyCount.setVflex(true); this.lbDailyCount.setMultiple(false); this.lbDailyCount.setWidth("99.5%"); this.lbDailyCount.setHeight("99.5%"); // lb.setParent(panelchildrenSecLoginLogStatistikCenter); this.lbDailyCount.setParent(center); final Listhead listhead = new Listhead(); listhead.setSizable(true); listhead.setParent(this.lbDailyCount); final Listheader lh1 = new Listheader(); lh1.setSclass("FDListBoxHeader1"); lh1.setWidth("10%"); lh1.setSortAscending(new FieldComparator("country", true)); lh1.setSortDescending(new FieldComparator("country", false)); lh1.setParent(listhead); final Listheader lh2 = new Listheader(Labels.getLabel("listheader_SecLoginlogList_CountryCode2.label")); lh2.setSclass("FDListBoxHeader1"); lh2.setWidth("60%"); lh2.setSortAscending(new FieldComparator("countryName", true)); lh2.setSortDescending(new FieldComparator("countryName", false)); lh2.setParent(listhead); final Listheader lh3 = new Listheader(Labels.getLabel("ListheaderStatisticTotalCountByCountries.TotalCount.Label")); lh3.setSclass("FDListBoxHeader1"); lh3.setWidth("30%"); lh3.setSortAscending(new FieldComparator("totalCount", true)); lh3.setSortDescending(new FieldComparator("totalCount", false)); lh3.setSortDirection("descending"); lh3.setParent(listhead); final Listfoot listfoot = new Listfoot(); listfoot.setHeight("20px"); listfoot.setParent(this.lbDailyCount); final Listfooter lf1 = new Listfooter(); lf1.setParent(listfoot); lf1.setWidth("60%"); lf1.setStyle("font-weight:bold"); lf1.setLabel(Labels.getLabel("message_Sum")); final Listfooter lf2 = new Listfooter(); lf2.setParent(listfoot); lf2.setWidth("100%"); this.lfDailyCount = new Listfooter(); this.lfDailyCount.setParent(listfoot); this.lfDailyCount.setWidth("30%"); this.lfDailyCount.setStyle("font-weight:bold; text-align: right"); this.lbDailyCount.setItemRenderer(new SecLoginlogStatisticTotalListModelItemRenderer()); this.lbDailyCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ this.lfDailyCount.setLabel(String.valueOf(recCount)); Cell cell = new Cell(); cell.setWidth("33%"); cell.setStyle("padding: 0px;"); cell.setHflex("1"); cell.appendChild(div); return cell; } private void doRefreshDailyCount(Date aDate) { final ListLongSumBean<DummyBean> listIntegerSumBean = getLoginLoggingService().getDailyCountByCountries(aDate); final List<DummyBean> list = listIntegerSumBean.getList(); final long recCount = listIntegerSumBean.getSum(); this.lbDailyCount.setItemRenderer(new SecLoginlogStatisticTotalListModelItemRenderer()); this.lbDailyCount.setModel(new ListModelList(list)); /** +++ get the SUM of all logs for the ListFooter +++ */ this.lfDailyCount.setLabel(String.valueOf(recCount)); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // ++++++++++++++++ Helpers ++++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // /** * Format the date/time. <br> * * @return String of date/time */ private String getDateTime(Date date) { if (date != null) { return ZksampleDateFormat.getDateFormater().format(date); } return ""; } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // ++++++++++++++++ Setter/Getter ++++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // public LoginLoggingService getLoginLoggingService() { return this.loginLoggingService; } public void setLoginLoggingService(LoginLoggingService loginLoggingService) { this.loginLoggingService = loginLoggingService; } }