de.forsthaus.webui.InitApplicationCtrl.java Source code

Java tutorial

Introduction

Here is the source code for de.forsthaus.webui.InitApplicationCtrl.java

Source

/**
 * 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;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Map;
import java.util.Random;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.zkoss.spring.SpringUtil;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Hr;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zkmax.zul.Tablechildren;
import org.zkoss.zkmax.zul.Tablelayout;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Button;
import org.zkoss.zul.Caption;
import org.zkoss.zul.Center;
import org.zkoss.zul.Chart;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.DialModel;
import org.zkoss.zul.DialModelScale;
import org.zkoss.zul.Div;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Groupbox;
import org.zkoss.zul.Html;
import org.zkoss.zul.Label;
import org.zkoss.zul.North;
import org.zkoss.zul.Panel;
import org.zkoss.zul.Panelchildren;
import org.zkoss.zul.Row;
import org.zkoss.zul.Rows;
import org.zkoss.zul.Separator;
import org.zkoss.zul.South;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.Window;

import de.forsthaus.backend.model.Branche;
import de.forsthaus.backend.model.Customer;
import de.forsthaus.backend.service.BrancheService;
import de.forsthaus.backend.service.CommonService;
import de.forsthaus.backend.service.CustomerService;
import de.forsthaus.example.RandomDataEngine;
import de.forsthaus.statistic.FDStatistic;
import de.forsthaus.webui.dashboard.module.DashboardApplicationNewsListCtrl;
import de.forsthaus.webui.util.MultiLineMessageBox;
import de.forsthaus.webui.util.WindowBaseCtrl;
import de.forsthaus.webui.util.ZksampleDateFormat;

/**
 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 * This is the controller class for the prePage /index.zul file.<br>
 * <br>
 * This page is unSecured as the entry page for the application.<br>
 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 * 
 * @changes 05/15/2009: sge Migrating the list models for paging. <br>
 *          07/24/2009: sge changings for clustering.<br>
 *          11/07/2009: bbr changed to extending from GFCBaseCtrl<br>
 *          (GenericForwardComposer) for spring-managed creation.<br>
 *          11/20/2009: sge added recordcount for new table ip"country.<br>
 *          24/11/2014: sge changed layout with a little bit bootstrap and
 *          inform readers for the new ZKBoost app and eBook<br>
 * 
 * @author bbruhns
 * @author Stephan Gerth
 */
public class InitApplicationCtrl extends WindowBaseCtrl implements Serializable {

    private final static Logger logger = Logger.getLogger(InitApplicationCtrl.class);
    private static final long serialVersionUID = 1L;

    /*
     * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     * 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 startWindow; // autowired
    protected North bl_north; // autowire
    protected South bl_south; // autowire
    protected Center bl_center; // autowire

    private Tablelayout tableLayout;
    private Tablechildren tableChildrenRecords;
    private Tablechildren tableChildrenStatistic;
    private Tablechildren tableChildrenButtons;
    private Div div_Buttons;
    private Vbox Vbox_Buttons;
    private Panelchildren panelChildren_Buttons;

    private Button btn100;
    private Button btn1000;

    // ServiceDAOs / Domain Classes
    private transient CustomerService customerService;
    private transient BrancheService brancheService;
    private transient CommonService commonService;

    private String orientation;

    /**
     * default constructor.<br>
     */
    public InitApplicationCtrl() {
        super();
    }

    public void onCreate$startWindow(Event event) throws Exception {

        doOnCreateCommon(this.startWindow); // do the autowire stuff

        // test ZksampleCookieUtils.getAllCookies();
        // test System.out.println("Used Theme = " +
        // ZksampleCookieUtils.getCookie("Theme"));

        createMainGrid();

        // countDemoData();

        showApplicationNews();

        /* Monitor the application */
        showStatistic();

        createButtons();

        showUsersOnlineChart();

        bl_center.invalidate();
    }

    /**
     * Creates the main grid for showing the table record counts and <br>
     * the applications statistic data.<br>
     */
    private void createMainGrid() {

        Div div = new Div();
        div.setParent(this.bl_center);

        final Hr hr = new Hr();
        hr.setParent(div);

        /*
         * Borderlayout around the grid for make it scrollable to see all table
         * records if the browser window are to small.
         */
        final Borderlayout bl = new Borderlayout();
        bl.setParent(div);
        final Center ct = new Center();
        ct.setAutoscroll(true);
        ct.setStyle("background-color: #EBEBEB");
        ct.setBorder("none");
        ct.setFlex(true);
        ct.setParent(bl);
        final Div divCt = new Div();
        divCt.setParent(ct);

        this.tableLayout = new Tablelayout();
        this.tableLayout.setColumns(3);
        this.tableLayout.setParent(divCt);

        this.tableChildrenRecords = new Tablechildren();
        this.tableChildrenRecords.setRowspan(1);
        this.tableChildrenRecords.setWidth("600px");
        this.tableChildrenRecords.setStyle("padding-left: 5px;");
        this.tableChildrenRecords.setParent(this.tableLayout);

        this.tableChildrenStatistic = new Tablechildren();
        this.tableChildrenStatistic.setRowspan(1);
        this.tableChildrenStatistic.setWidth("450px");
        this.tableChildrenStatistic.setStyle("padding-left: 5px;");
        this.tableChildrenStatistic.setParent(this.tableLayout);

        this.tableChildrenButtons = new Tablechildren();
        this.tableChildrenButtons.setRowspan(1);
        this.tableChildrenButtons.setWidth("240px");
        this.tableChildrenButtons.setStyle("padding-left: 5px;");
        this.tableChildrenButtons.setParent(this.tableLayout);

        final Panel pb = new Panel();
        pb.setWidth("240px");
        pb.setBorder("none");
        pb.setStyle("align:left; color:red");
        pb.setParent(this.tableChildrenButtons);

        this.panelChildren_Buttons = new Panelchildren();
        this.panelChildren_Buttons.setParent(pb);

        final Separator sep = new Separator();
        sep.setParent(divCt);
        final Separator sep2 = new Separator();
        sep2.setParent(divCt);

        final Div divFooter = new Div();
        divFooter.setAlign("center");
        divFooter.setParent(this.bl_south);

        final Hr hr2 = new Hr();
        hr2.setParent(divFooter);

        final Label footerLabel = new Label();
        footerLabel.setValue(" Help to prevent the global warming by writing cool software.");
        footerLabel.setStyle("align:center; padding-top:0px; font-family:Verdana;  font-size: 0.6em; ");
        footerLabel.setParent(divFooter);
    }

    /**
     * Shows the application news.<br>
     */
    private void showApplicationNews() {

        final Panel panel = new Panel();
        panel.setTitle("");
        panel.setBorder("none");
        panel.setParent(this.tableChildrenRecords);

        final Panelchildren panelchildren = new Panelchildren();
        panelchildren.setParent(panel);
        panelchildren.setStyle("padding: 0px; background-color: #EBEBEB;");

        panelchildren.appendChild(DashboardApplicationNewsListCtrl.show(350, false, 600000));
    }

    /**
     * Shows the count of records of all tables.<br>
     */
    private void countDemoData() {

        final Panel panel = new Panel();
        panel.setTitle("");
        panel.setWidth("260px");
        panel.setBorder("none");
        panel.setStyle("align:left; color:red; ");
        panel.setParent(this.tableChildrenRecords);

        final Panelchildren panelchildren = new Panelchildren();
        panelchildren.setParent(panel);
        panelchildren.setStyle("background-color: #EBEBEB;");

        final Groupbox gb = new Groupbox();
        gb.setMold("3d");
        gb.setContentStyle("padding: 2px");
        gb.setParent(panelchildren);

        final Caption caption = new Caption();
        caption.setImage("/images/icons/database_blue_16x16.gif");
        caption.setLabel("Demo-Data in PostgreSQL v9.0.2");
        caption.setStyle("color: #000000;font-weight:bold; text-align:left ");
        caption.setParent(gb);

        final Grid grid = new Grid();
        grid.setWidth("100%");
        // grid.setParent(panelchildren);
        grid.setParent(gb);

        final Columns columns = new Columns();
        columns.setSizable(true);
        columns.setParent(grid);

        final Column column1 = new Column();
        column1.setWidth("65%");
        column1.setLabel("Table");
        column1.setParent(columns);
        final Column column2 = new Column();
        column2.setWidth("35%");
        column2.setLabel("records");
        column2.setParent(columns);

        final Rows rows = new Rows();
        rows.setParent(grid);

        /**
         * For performance boosting, we get now all the table recordCounts out
         * from ONE Service Call and get back the results in a map.
         */
        final Map<String, Object> map = getCommonService().getAllTablesRecordCounts();

        if (map.containsKey("HibernateStatistics")) {
            addNewRow(rows, Labels.getLabel("table.hibernate_entity_statistics"), map.get("HibernateStatistics"));
        }
        if (map.containsKey("Customer")) {
            addNewRow(rows, "Customer", map.get("Customer"));
            // addNewRow(rows, "Customer1", 12345678);
        }
        if (map.containsKey("Branch")) {
            addNewRow(rows, "Branch", map.get("Branch"));
        }
        if (map.containsKey("Offices")) {
            addNewRow(rows, "Offices", map.get("Offices"));
        }
        if (map.containsKey("Article")) {
            addNewRow(rows, "Article", map.get("Article"));
        }
        if (map.containsKey("Order")) {
            addNewRow(rows, "Order", map.get("Order"));
        }
        if (map.containsKey("Orderposition")) {
            addNewRow(rows, "Orderposition", map.get("Orderposition"));
        }
        if (map.containsKey("GuestBook")) {
            addNewRow(rows, "GuestBook", map.get("GuestBook"));
        }
        if (map.containsKey("SecGroup")) {
            addNewRow(rows, "SecGroup", map.get("SecGroup"));
        }
        if (map.containsKey("SecGroupright")) {
            addNewRow(rows, "SecGroupright", map.get("SecGroupright"));
        }
        if (map.containsKey("SecRight")) {
            addNewRow(rows, "SecRight", map.get("SecRight"));
        }
        if (map.containsKey("SecRole")) {
            addNewRow(rows, "SecRole", map.get("SecRole"));
        }
        if (map.containsKey("SecRolegroup")) {
            addNewRow(rows, "SecRolegroup", map.get("SecRolegroup"));
        }
        if (map.containsKey("SecUserrole")) {
            addNewRow(rows, "SecUserrole", map.get("SecUserrole"));
        }
        if (map.containsKey("SecUser")) {
            addNewRow(rows, "SecUser", map.get("SecUser"));
        }
        if (map.containsKey("SecLoginlog")) {
            addNewRow(rows, "SecLoginlog", map.get("SecLoginlog"));
        }
        if (map.containsKey("CountryCode")) {
            addNewRow(rows, "CountryCode", map.get("CountryCode"));
        }
        if (map.containsKey("IpToCountry")) {
            addNewRow(rows, "IpToCountry", map.get("IpToCountry"));
        }
        if (map.containsKey("CalendarEvents")) {
            addNewRow(rows, "CalendarEvents", map.get("CalendarEvents"));
        }
        if (map.containsKey("YouTubeLinks")) {
            addNewRow(rows, "YouTubeLinks", map.get("YouTubeLinks"));
        }

    }

    /**
     * Shows the zk application statistic data. <br>
     */
    private void showStatistic() {

        /**
         * These Statistic Class is activated in the zk.xml
         */
        // Statistic stat = de.forsthaus.statistic.Statistic.getStatistic();
        // new Statistic class since 20.08.2010
        final FDStatistic stat = de.forsthaus.statistic.FDStatistic.getStatistic();

        final Panel panel = new Panel();
        panel.setWidth("400px");
        panel.setBorder("normal");
        panel.setStyle("align:left; color:red;");
        panel.setParent(this.tableChildrenStatistic);

        final Panelchildren panelchildren = new Panelchildren();
        panelchildren.setParent(panel);
        panelchildren.setStyle("background-color: #EBEBEB;");

        final Caption caption = new Caption();
        caption.setParent(panel);
        caption.setImage("/images/icons/monitorView.gif");
        caption.setLabel("Application Statistic");
        caption.setStyle("color: #000000;font-weight:bold; text-align:left ");

        final Grid grid = new Grid();
        grid.setWidth("100%");
        grid.setParent(panelchildren);

        final Columns columns = new Columns();
        columns.setSizable(true);
        columns.setParent(grid);

        final Column column1 = new Column();
        column1.setWidth("65%");
        column1.setLabel("Subject");
        column1.setParent(columns);
        final Column column2 = new Column();
        column2.setWidth("35%");
        column2.setLabel("value");
        column2.setParent(columns);

        final Rows rows = new Rows();
        rows.setParent(grid);

        // short date
        String date = ZksampleDateFormat.getDateTimeFormater().format(stat.getStartTime());

        addNewRow(rows, "Application Start-Time", date);
        addNewRow(rows, "Application runing hours", getRoundedDouble(stat.getRuningHours()));

        addNewRow(rows, "Count of active Desktops", String.valueOf(stat.getActiveDesktopCount()));
        addNewRow(rows, "Count of active Sessions", String.valueOf(stat.getActiveSessionCount()));
        addNewRow(rows, "Count of active Updates", String.valueOf(stat.getActiveUpdateCount()));

        addNewRow(rows, "Average Count of active Desktops/hour", getRoundedDouble(stat.getAverageDesktopCount())); // String.valueOf(stat.getAverageDesktopCount()));
        addNewRow(rows, "Average Count of active Sessions/hour", getRoundedDouble(stat.getAverageSessionCount()));
        addNewRow(rows, "Average Count of active Updates/hour", getRoundedDouble(stat.getAverageUpdateCount()));

        addNewRow(rows, "Count of total Desktops since start", String.valueOf(stat.getTotalDesktopCount()));
        addNewRow(rows, "Count of total Sessions since start", String.valueOf(stat.getTotalSessionCount()));
        addNewRow(rows, "Count of total Updates since start", String.valueOf(stat.getTotalUpdateCount()));

        // Get the number of processors that are available for the JAVA VM
        final int countCPU = Runtime.getRuntime().availableProcessors();
        addNewRow(rows, "available CPUs to the JAVA VM", countCPU, "red");
    }

    /**
     * Round a double value to a string with two digits.
     * 
     * @param d
     * @return
     */
    private String getRoundedDouble(double d) {
        String result = "";

        final DecimalFormat df = new DecimalFormat("0.00");
        result = df.format(d);

        return result;
    }

    /**
     * Creates and shows the buttons for creating additionally <br>
     * customer demo data.<br>
     */
    private void createButtons() {

        final Panel panel = new Panel();
        // panel.setTitle("Demo Customers");
        panel.setWidth("240px");
        panel.setBorder("normal");
        panel.setStyle("align:left; color:red;");
        panel.setParent(this.panelChildren_Buttons);

        final Panelchildren panelchildren = new Panelchildren();
        panelchildren.setParent(panel);
        panelchildren.setStyle("background-color: #EBEBEB;");

        final Caption caption = new Caption();
        caption.setParent(panel);
        caption.setImage("/images/icons/advice_16x16.gif");
        caption.setLabel("Demo Customers");
        caption.setStyle("color: #000000;font-weight:bold; text-align:left ");

        final Grid grid = new Grid();
        grid.setWidth("100%");
        grid.setParent(panelchildren);

        final Columns columns = new Columns();
        columns.setSizable(true);
        columns.setParent(grid);

        final Column column1 = new Column();
        column1.setWidth("100%");
        column1.setLabel("values are randomly created");
        column1.setParent(columns);

        final Rows rows = new Rows();
        rows.setParent(grid);

        final Row row = new Row();
        row.setParent(rows);

        this.Vbox_Buttons = new Vbox();
        this.Vbox_Buttons.setParent(panelchildren);

        this.div_Buttons = new Div();
        this.div_Buttons.setWidth("100%");
        this.div_Buttons.setHeight("100%");
        this.div_Buttons.setStyle("padding: 10px;");
        this.div_Buttons.setParent(this.Vbox_Buttons);

        /* 100. Button */
        final Div divBtn1 = new Div();
        divBtn1.setStyle("align: center");
        divBtn1.setParent(this.div_Buttons);

        this.btn100 = new Button();
        this.btn100.setId("btn100");
        this.btn100.setLabel("insert 100");
        this.btn100.setImage("/images/icons/import_16x16.gif");
        this.btn100.setTooltiptext("Insert 100 randomly created customer records");
        this.btn100.setParent(divBtn1);

        this.btn100.addEventListener("onClick", new OnClick100Eventlistener());

        /* Separator */
        createNewSeparator(this.div_Buttons, "horizontal", false, "5", "");
        createNewSeparator(this.div_Buttons, "horizontal", false, "5", "");

        /* 1.000 Button */
        final Div divBtn2 = new Div();
        divBtn2.setStyle("align: center;");
        divBtn2.setParent(this.div_Buttons);

        this.btn1000 = new Button();
        this.btn1000.setId("btn1000");
        this.btn1000.setLabel("insert 1.000");
        this.btn1000.setImage("/images/icons/import_16x16.gif");
        this.btn1000.setTooltiptext("Insert 1.000 randomly created customer records");
        this.btn1000.setParent(divBtn2);

        this.btn1000.addEventListener("onClick", new OnClick1000Eventlistener());

        createNewSeparator(this.div_Buttons, "horizontal", false, "5", "");

        this.Vbox_Buttons.setParent(row);

        createNewSeparator(this.panelChildren_Buttons, "horizontal", false, "5", "#EBEBEB");

    }

    /**
     * Creates and shows the Chart for Users online .<br>
     * The number of users are randomly generated.<br>
     */
    private void showUsersOnlineChart() {

        final Panel panel = new Panel();
        panel.setWidth("240px");
        panel.setHeight("265px");
        panel.setBorder("normal");
        panel.setParent(this.panelChildren_Buttons);

        final Panelchildren panelchildren = new Panelchildren();
        panelchildren.setParent(panel);
        panelchildren.setStyle("background-color: #EBEBEB;");

        final Caption caption = new Caption();
        caption.setParent(panel);
        caption.setImage("/images/icons/console_view.gif");
        caption.setLabel("Users online");
        caption.setStyle("color: #000000;font-weight:bold; text-align:left ");

        final Div div = new Div();
        div.setStyle("padding: 4px;");
        div.setWidth("100%");
        div.setHeight("100%");
        div.setParent(panelchildren);

        // Chart Dial
        final Random random = new Random();
        final int val = random.nextInt(100);

        final DialModel dialmodel = new DialModel();
        final DialModelScale scale = dialmodel.newScale(0.0, 500.0, -120.0, -300.0, 100.0, 4);// scale's

        // configuration data
        scale.setText("Users");
        scale.newRange(450, 500, "#FF0000", 0.83, 0.89);
        scale.newRange(360, 450, "#FFC426", 0.83, 0.89);
        scale.setValue(val);

        final Chart chart = new Chart();
        chart.setType("dial");
        chart.setWidth("228px");
        chart.setHeight("200px");
        chart.setThreeD(true);
        chart.setFgAlpha(128);
        chart.setBgColor("#FFFFFF");
        chart.setModel(dialmodel);
        chart.setParent(div);

    }

    /**
     * Creates a new separator to a parent component.<br>
     * 
     * @param parent
     * @param orientation
     * @param isBarVisible
     * @param spacing
     * @param bkgrColor
     * @return
     */
    private Separator createNewSeparator(Component parent, String orientation, boolean isBarVisible, String spacing,
            String bkgrColor) {

        final Separator sep = new Separator();

        sep.setOrient(orientation);
        sep.setBar(isBarVisible);

        if (!StringUtils.trim(bkgrColor).isEmpty()) {
            sep.setStyle("background-color:" + bkgrColor);
        }

        if (StringUtils.isEmpty(spacing)) {
            sep.setSpacing(0 + "px");
        } else {
            sep.setSpacing(spacing + "px");
        }

        sep.setParent(parent);

        return sep;
    }

    /**
     * Add a new row to the grid.<br>
     * 
     * @param rowParent
     * @param tableName
     * @param value
     */
    private void addNewRow(Rows rowParent, String tableName, Object value) {

        Row row = new Row();

        Html html_TableName = new Html(tableName);
        html_TableName.setStyle("padding-left: 5px;");
        Div divKey = new Div();
        divKey.setAlign("left");
        divKey.appendChild(html_TableName);

        Html html_RecordCount = null;

        if (value instanceof BigDecimal) {
            BigDecimal myDec = (BigDecimal) value;
            myDec = myDec.setScale(2, BigDecimal.ROUND_HALF_UP);

            // Format the value to money
            NumberFormat formatter = new DecimalFormat("#,##0.00");
            String money = formatter.format(myDec);

            html_RecordCount = new Html(money);
        } else if (value instanceof Integer) {
            // Format the value
            NumberFormat formatter = new DecimalFormat("###,###.###");
            String formattedInteger = formatter.format(value);
            html_RecordCount = new Html(String.valueOf(value));
        } else
            html_RecordCount = new Html(String.valueOf(value));

        html_RecordCount.setStyle("padding-right: 5px;");
        Div divValue = new Div();
        divValue.setAlign("right");
        divValue.appendChild(html_RecordCount);

        row.appendChild(divKey);
        row.appendChild(divValue);
        row.setParent(rowParent);

    }

    /**
     * Add a new row to the grid.<br>
     * 
     * @param rowParent
     * @param tableName
     * @param value
     * @param color
     */
    private void addNewRow(Rows rowParent, String tableName, Object value, String color) {

        Row row = new Row();

        Html html_TableName = new Html(tableName);
        html_TableName.setStyle("padding-left: 5px; color: " + color + ";");
        Div divKey = new Div();
        divKey.setAlign("left");
        divKey.appendChild(html_TableName);

        Html html_RecordCount = null;

        if (value instanceof BigDecimal) {
            BigDecimal myDec = (BigDecimal) value;
            myDec = myDec.setScale(2, BigDecimal.ROUND_HALF_UP);

            // Format the value to money
            NumberFormat formatter = new DecimalFormat("#,##0.00");

            String money = formatter.format(myDec);

            html_RecordCount = new Html(money);
        } else if (value instanceof Integer) {
            // Format the value
            NumberFormat formatter = new DecimalFormat("###,###.###");
            String formattedInteger = formatter.format(value);
            html_RecordCount = new Html(String.valueOf(value));
        } else
            html_RecordCount = new Html(String.valueOf(value));

        html_RecordCount.setStyle("padding-right: 5px; color: " + color + ";");
        Div divValue = new Div();
        divValue.setAlign("right");
        divValue.appendChild(html_RecordCount);

        row.appendChild(divKey);
        row.appendChild(divValue);
        row.setParent(rowParent);

    }

    /**
     * EventListener for the inserted 1000 customers Button.<br>
     * The creation of the records runs in an Echo-event that shows the user a
     * busy message.
     */
    public final class OnClick1000Eventlistener implements EventListener {

        @Override
        public void onEvent(Event event) throws Exception {
            // we create the records in an Echo-event to show a message to the
            // user for this long running operation.
            Clients.showBusy(Labels.getLabel("message.Information.LongOperationIsRunning"), true);
            Events.echoEvent("onCreate1000Customers", InitApplicationCtrl.this.startWindow, null);
        }
    }

    /**
     * Calls the long running method that creates the records and closes the
     * echo event message if ready.
     * 
     * @param event
     * @throws Exception
     */
    public void onCreate1000Customers(Event event) throws Exception {

        createDemoCustomers(1000); // the long running process
        Clients.clearBusy(); // showBusy("", false); // close the message
    }

    /**
     * EventListener for the inserted 100 customers Button.<br>
     * The creation of the records runs in an Echo-event that shows the user a
     * busy message.
     */
    public final class OnClick100Eventlistener implements EventListener {
        @Override
        public void onEvent(Event event) throws Exception {
            // we create the records in an Echo-event to show a message to the
            // user for this long running operation.
            Clients.showBusy(Labels.getLabel("message.Information.LongOperationIsRunning"), true);
            Events.echoEvent("onCreate100Customers", InitApplicationCtrl.this.startWindow, null);
        }
    }

    /**
     * Calls the long running method that creates the records and closes the
     * echo event message if ready.
     * 
     * @param event
     * @throws Exception
     */
    public void onCreate100Customers(Event event) throws Exception {

        createDemoCustomers(100);
        Clients.clearBusy(); // showBusy("", false); // close the message
    }

    /**
     * Gets the total records of customers table.<br>
     * 
     * @return total count of customer records.
     */
    private int getTotalCountRecordsForCustomer() {

        int recCount = 0;
        recCount = getCustomerService().getCountAllCustomers();

        return recCount;
    }

    /**
     * Creates new demo customer records with randoms values.<br>
     * 
     * @param newRecords
     *            Number of records to insert.
     * @throws InterruptedException
     */
    public void createDemoCustomers(int newRecords) throws InterruptedException {

        /* check if over 200.000 records in DB */
        if (getTotalCountRecordsForCustomer() >= 250000) {

            /* close the echo event bussy message */
            Clients.showBusy("", false);

            final String message = Labels.getLabel("Demo.not_more_than_250000_records");
            final String title = Labels.getLabel("message.Information");
            MultiLineMessageBox.doSetTemplate();
            MultiLineMessageBox.show(message, title, MultiLineMessageBox.OK, "INFORMATION", true);

            return;
        }

        /* fix demo branch with id=1000 */
        final Branche branche = getBrancheService().getBrancheById(1000);

        final int countRecords = newRecords;

        final RandomDataEngine randomDataEngine = new RandomDataEngine();

        for (int j = 0; j < countRecords; j++) {
            final Customer customer = getCustomerService().getNewCustomer();

            customer.setKunName1(randomDataEngine.getRandomManFirstname());
            customer.setKunName2(randomDataEngine.getRandomLastname());
            customer.setKunMatchcode(customer.getKunName2().toUpperCase());
            customer.setKunOrt(randomDataEngine.getRandomCity());
            customer.setBranche(branche);
            customer.setKunMahnsperre(false);

            // if no customer no. is set by user than take
            // the max PrimaryKey + 1
            if (customer.getKunNr().isEmpty()) {
                customer.setKunNr(String.valueOf(getCustomerService().getMaxCustomerId() + 1));
            }

            getCustomerService().saveOrUpdate(customer);
        }

        tableChildrenRecords.getChildren().clear();
        countDemoData();
    }

    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++//
    // ++++++++++++++++++ getter / setter +++++++++++++++++++//
    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++//

    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }

    public CustomerService getCustomerService() {
        if (this.customerService == null) {
            this.customerService = (CustomerService) SpringUtil.getBean("customerService");
            setCustomerService(this.customerService);
        }
        return this.customerService;
    }

    public void setBrancheService(BrancheService brancheService) {
        this.brancheService = brancheService;
    }

    public BrancheService getBrancheService() {
        if (this.brancheService == null) {
            this.brancheService = (BrancheService) SpringUtil.getBean("brancheService");
            setBrancheService(this.brancheService);
        }
        return this.brancheService;
    }

    public void setCommonService(CommonService commonService) {
        this.commonService = commonService;
    }

    public CommonService getCommonService() {
        if (this.commonService == null) {
            this.commonService = (CommonService) SpringUtil.getBean("commonService");
            setCommonService(this.commonService);
        }
        return this.commonService;
    }

}