fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers.java Source code

Java tutorial

Introduction

Here is the source code for fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers.java

Source

/*
 * Data Hub Service (DHuS) - For Space data distribution.
 * Copyright (C) 2013,2014,2015 GAEL Systems
 *
 * This file is part of DHuS software sources.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package fr.gael.dhus.gwt.client.page.statistics;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimpleRadioButton;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.datepicker.client.CalendarUtil;

import fr.gael.dhus.gwt.client.AccessDeniedRedirectionCallback;
import fr.gael.dhus.gwt.client.GWTClient;
import fr.gael.dhus.gwt.client.page.AbstractPage;
import fr.gael.dhus.gwt.services.StatisticsServiceAsync;
import fr.gael.dhus.gwt.services.UserServiceAsync;
import fr.gael.dhus.gwt.share.RoleData;
import fr.gael.dhus.gwt.share.UserData;

public class StatisticsUsers extends AbstractPage {
    private static StatisticsServiceAsync statisticsService = StatisticsServiceAsync.Util.getInstance();
    private static UserServiceAsync userService = UserServiceAsync.Util.getInstance();

    private static RootPanel totalUsers;
    private static RootPanel restrictedUsersLabel;
    private static RootPanel deletedUsers;

    private static List<String> selectedUsers = new ArrayList<String>();

    private enum GRAPHES {
        ACTIVE_USERS_PER_DOMAIN, ACTIVE_USERS_PER_USAGE, RESTRICTED_USERS, USERS_PER_DOMAIN, USERS_PER_USAGE;
    }

    private static RootPanel restrictedUsersButton;
    private static RootPanel activeUsersPerDomainButton;
    private static RootPanel usersPerDomainButton;
    private static RootPanel activeUsersPerUsageButton;
    private static RootPanel usersPerUsageButton;

    private static SimpleRadioButton dayOption;
    private static SimpleRadioButton hourOption;
    private static RootPanel dayLabel;
    private static RootPanel hourLabel;

    private static GRAPHES activeGraph;

    private static TextBox startDate;
    private static TextBox endDate;
    private static RootPanel refreshButton;

    public StatisticsUsers() {
        // name is automatically prefixed in JS by "statistics_"
        super.name = "Users";
        super.roles = Arrays.asList(RoleData.STATISTICS);
    }

    @Override
    public native JavaScriptObject getJSInitFunction()
    /*-{
       return function() {
     @fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers::init()();
       }
    }-*/;

    @Override
    public native JavaScriptObject getJSRefreshFunction()
    /*-{
       return function() {      
     @fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers::refresh()();
       }
    }-*/;

    @Override
    public void load() {
        // This page can only be loaded from Statistics Page
    }

    private static native void showStatisticsUsers()
    /*-{
       $wnd.showStatisticsUsers(function ( sSource, aoData, fnCallback, oSettings ) {   
        @fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers::getUsers(*)
           (oSettings._iDisplayStart, oSettings._iDisplayLength, 
            oSettings.oPreviousSearch.sSearch, fnCallback)},
            function (user) {
        @fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers::checkUser(*)(user)
        },
        function () {
        @fr.gael.dhus.gwt.client.page.statistics.StatisticsUsers::refreshScale(*)()
        });
    }-*/;

    private static native void setRestrictedUsersDataset(String[][] array)
    /*-{
       $wnd.setRestrictedUsersDataset(array);
    }-*/;

    private static native void setUsersPerDomainDataset(String[][] array)
    /*-{
       $wnd.setUsersPerDomainDataset(array);
    }-*/;

    private static native void setUsersPerUsageDataset(String[][] array)
    /*-{
       $wnd.setUsersPerUsageDataset(array);
    }-*/;

    private static native void setActiveUsersPerDomainDataset(String[][] array, String start, String end,
            boolean perHour)
    /*-{
       $wnd.setActiveUsersPerDomainDataset(array, start, end, perHour);
    }-*/;

    private static native void setActiveUsersPerUsageDataset(String[][] array, String start, String end,
            boolean perHour)
    /*-{
       $wnd.setActiveUsersPerUsageDataset(array, start, end, perHour);
    }-*/;

    private static native void refreshUsersTable()
    /*-{
       $wnd.statisticsUsers_refreshUsers();
    }-*/;

    @Override
    public void refreshMe() {
        refresh();
    }

    private static void refresh() {
        refreshUsersTable();
        totalUsers.getElement().setInnerText("unknown");
        restrictedUsersLabel.getElement().setInnerText("unknown");
        deletedUsers.getElement().setInnerText("unknown");

        statisticsService.getTotalUsers(new AccessDeniedRedirectionCallback<Integer>() {
            @Override
            public void onSuccess(Integer result) {
                totalUsers.getElement().setInnerText("" + result);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });

        statisticsService.getTotalDeletedUsers(new AccessDeniedRedirectionCallback<Integer>() {
            @Override
            public void onSuccess(Integer result) {
                deletedUsers.getElement().setInnerText("" + result);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });

        statisticsService.getTotalRestrictedUsers(new AccessDeniedRedirectionCallback<Integer>() {
            @Override
            public void onSuccess(Integer result) {
                restrictedUsersLabel.getElement().setInnerText("" + result);
                restrictedUsersButton.setVisible(result > 0);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });

        // basic graph
        refreshGraph();
    }

    @Override
    public void unload() {
        if (loaded) {
            reset();
        }
        super.unload();
    }

    private static void refreshGraph() {
        switch (activeGraph) {
        case ACTIVE_USERS_PER_DOMAIN:
            activeUsersPerDomainRefresh();
            break;
        case ACTIVE_USERS_PER_USAGE:
            activeUsersPerUsageRefresh();
            break;
        case RESTRICTED_USERS:
            restrictedUsersRefresh();
            break;
        case USERS_PER_DOMAIN:
            usersPerDomainRefresh();
            break;
        case USERS_PER_USAGE:
            usersPerUsageRefresh();
            break;
        default:
            break;
        }
    }

    private static void activeUsersPerDomainRefresh() {
        DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd hh:mm:ss");
        final Date start = dtf.parse(startDate.getValue() + " 00:00:00"); // for db request, to select all start day
        Date end = dtf.parse(endDate.getValue() + " 23:59:59"); // for db request, to select all end day

        statisticsService.getActiveUsersPerDomain(start, end, hourOption.getValue(),
                new AccessDeniedRedirectionCallback<String[][]>() {
                    @Override
                    public void onSuccess(String[][] result) {
                        setActiveUsersPerDomainDataset(result, startDate.getValue(), endDate.getValue(),
                                hourOption.getValue());
                    }

                    @Override
                    public void _onFailure(Throwable caught) {
                    }
                });
    }

    private static void activeUsersPerUsageRefresh() {
        DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd hh:mm:ss");
        final Date start = dtf.parse(startDate.getValue() + " 00:00:00"); // for db request, to select all start day
        Date end = dtf.parse(endDate.getValue() + " 23:59:59"); // for db request, to select all end day

        statisticsService.getActiveUsersPerUsage(start, end, hourOption.getValue(),
                new AccessDeniedRedirectionCallback<String[][]>() {
                    @Override
                    public void onSuccess(String[][] result) {
                        setActiveUsersPerUsageDataset(result, startDate.getValue(), endDate.getValue(),
                                hourOption.getValue());
                    }

                    @Override
                    public void _onFailure(Throwable caught) {
                    }
                });
    }

    private static void restrictedUsersRefresh() {
        statisticsService.getRestrictedUsers(new AccessDeniedRedirectionCallback<String[][]>() {
            @Override
            public void onSuccess(String[][] result) {
                setRestrictedUsersDataset(result);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });
    }

    private static void usersPerDomainRefresh() {
        statisticsService.getUsersPerDomain(new AccessDeniedRedirectionCallback<String[][]>() {
            @Override
            public void onSuccess(String[][] result) {
                setUsersPerDomainDataset(result);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });
    }

    private static void usersPerUsageRefresh() {
        statisticsService.getUsersPerUsage(new AccessDeniedRedirectionCallback<String[][]>() {
            @Override
            public void onSuccess(String[][] result) {
                setUsersPerUsageDataset(result);
            }

            @Override
            public void _onFailure(Throwable caught) {
            }
        });
    }

    private static void deselectPreviousGraph() {
        switch (activeGraph) {
        case ACTIVE_USERS_PER_DOMAIN:
            activeUsersPerDomainButton.getElement().removeClassName("statisticsUsers_selected");
            break;
        case ACTIVE_USERS_PER_USAGE:
            activeUsersPerUsageButton.getElement().removeClassName("statisticsUsers_selected");
            break;
        case RESTRICTED_USERS:
            restrictedUsersButton.getElement().removeClassName("statisticsUsers_selected");
            break;
        case USERS_PER_DOMAIN:
            usersPerDomainButton.getElement().removeClassName("statisticsUsers_selected");
            break;
        case USERS_PER_USAGE:
            usersPerUsageButton.getElement().removeClassName("statisticsUsers_selected");
            break;
        default:
            break;
        }
    }

    private static void init() {
        showStatisticsUsers();

        totalUsers = RootPanel.get("statisticsUsers_totalUsers");
        restrictedUsersLabel = RootPanel.get("statisticsUsers_restrictedUsers");
        deletedUsers = RootPanel.get("statisticsUsers_deletedUsers");

        activeUsersPerDomainButton = RootPanel.get("statisticsUsers_activeUsersPerDomainButton");
        activeUsersPerUsageButton = RootPanel.get("statisticsUsers_activeUsersPerUsageButton");
        restrictedUsersButton = RootPanel.get("statisticsUsers_restrictedUsersButton");
        usersPerDomainButton = RootPanel.get("statisticsUsers_usersPerDomainButton");
        usersPerUsageButton = RootPanel.get("statisticsUsers_usersPerUsageButton");

        dayOption = SimpleRadioButton.wrap(RootPanel.get("statisticsUsers_scaleDay").getElement());
        hourOption = SimpleRadioButton.wrap(RootPanel.get("statisticsUsers_scaleHour").getElement());

        dayLabel = RootPanel.get("statisticsUsers_scaleDayLabel");
        hourLabel = RootPanel.get("statisticsUsers_scaleHourLabel");

        RootPanel dayOptionBloc = RootPanel.get("statisticsUsers_scaleDayOption");
        dayOptionBloc.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                dayOption.setValue(true);
                refreshGraph();
            }
        }, ClickEvent.getType());
        RootPanel hourOptionBloc = RootPanel.get("statisticsUsers_scaleHourOption");
        hourOptionBloc.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                hourOption.setValue(true);
                refreshGraph();
            }
        }, ClickEvent.getType());

        activeUsersPerDomainButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deselectPreviousGraph();
                activeGraph = GRAPHES.ACTIVE_USERS_PER_DOMAIN;
                activeUsersPerDomainButton.getElement().addClassName("statisticsUsers_selected");
                activeUsersPerDomainRefresh();
            }
        }, ClickEvent.getType());
        activeUsersPerUsageButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deselectPreviousGraph();
                activeGraph = GRAPHES.ACTIVE_USERS_PER_USAGE;
                activeUsersPerUsageButton.getElement().addClassName("statisticsUsers_selected");
                activeUsersPerUsageRefresh();
            }
        }, ClickEvent.getType());
        restrictedUsersButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deselectPreviousGraph();
                activeGraph = GRAPHES.RESTRICTED_USERS;
                restrictedUsersButton.getElement().addClassName("statisticsUsers_selected");
                restrictedUsersRefresh();
            }
        }, ClickEvent.getType());
        usersPerDomainButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deselectPreviousGraph();
                activeGraph = GRAPHES.USERS_PER_DOMAIN;
                usersPerDomainButton.getElement().addClassName("statisticsUsers_selected");
                usersPerDomainRefresh();
            }
        }, ClickEvent.getType());
        usersPerUsageButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deselectPreviousGraph();
                activeGraph = GRAPHES.USERS_PER_USAGE;
                usersPerUsageButton.getElement().addClassName("statisticsUsers_selected");
                usersPerUsageRefresh();
            }
        }, ClickEvent.getType());

        startDate = TextBox.wrap(RootPanel.get("statisticsUsers_dateFieldDate").getElement());
        endDate = TextBox.wrap(RootPanel.get("statisticsUsers_dateFieldDateEnd").getElement());

        refreshButton = RootPanel.get("statisticsUsers_refresh");

        refreshButton.addDomHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                refreshGraph();
            }
        }, ClickEvent.getType());

        reset();
        refresh();
    }

    private static void reset() {
        Date today = new Date();
        DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");
        endDate.setValue(dtf.format(today));
        CalendarUtil.addDaysToDate(today, -30);
        startDate.setValue(dtf.format(today));
        refreshScale();
        dayOption.setValue(true);
        activeGraph = GRAPHES.ACTIVE_USERS_PER_DOMAIN;
        deselectPreviousGraph();
        activeUsersPerDomainButton.getElement().addClassName("statisticsUsers_selected");
    }

    private static void refreshScale() {
        DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");
        Date start = dtf.parse(startDate.getValue());
        Date end = dtf.parse(endDate.getValue());
        int nbDays = CalendarUtil.getDaysBetween(start, end) + 1;
        dayLabel.getElement().setInnerText("Per day (" + nbDays + " results)");
        hourLabel.getElement().setInnerText("Per hour (" + nbDays * 24 + " results)");
    }

    private static void checkUser(String user) {
        if (selectedUsers != null && selectedUsers.contains(user)) {
            selectedUsers.remove(user);
        } else {
            if (selectedUsers.size() >= 10) {
                Window.alert("Cannot select more than 10 users for statistics.");
                refreshUsersTable();
                return;
            }
            selectedUsers.add(user);
        }
        refreshGraph();
        refreshUsersTable();
    }

    private static void getUsers(final int start, final int length, final String search,
            final JavaScriptObject function) {
        DOM.setStyleAttribute(RootPanel.getBodyElement(), "cursor", "wait");

        GWTClient.callback(function,
                JsonUtils.safeEval("{\"aaData\": [],\"iTotalRecords\" : 0, \"iTotalDisplayRecords\" : 0}"));

        userService.countAll(search, new AccessDeniedRedirectionCallback<Integer>() {

            @Override
            public void _onFailure(Throwable caught) {
                DOM.setStyleAttribute(RootPanel.getBodyElement(), "cursor", "default");
                Window.alert("There was an error while counting users");
            }

            @Override
            public void onSuccess(final Integer total) {
                userService.getAllUsers(start, length, search,
                        new AccessDeniedRedirectionCallback<List<UserData>>() {
                            @Override
                            public void _onFailure(Throwable caught) {
                                DOM.setStyleAttribute(RootPanel.getBodyElement(), "cursor", "default");
                                Window.alert("There was an error while searching for '" + search + "'");
                            }

                            @Override
                            public void onSuccess(List<UserData> users) {
                                String json = "{\"aaData\": [";

                                for (UserData user : users) {
                                    boolean checked = (selectedUsers != null
                                            && selectedUsers.contains(user.getUsername()));
                                    ;
                                    json += "[{\"checked\":" + checked + ", \"name\":\"" + user.getUsername()
                                            + "\" }, \"" + user.getUsername() + "\"],";
                                }
                                if (users.size() >= 1) {
                                    json = json.substring(0, json.length() - 1);
                                }
                                json += "],\"iTotalRecords\" : " + total + ", \"iTotalDisplayRecords\" : " + total
                                        + "}";

                                GWTClient.callback(function, JsonUtils.safeEval(json));
                                DOM.setStyleAttribute(RootPanel.getBodyElement(), "cursor", "default");
                            }
                        });
            }
        });
    }
}