com.jitlogic.zico.client.views.admin.UserManagementPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.jitlogic.zico.client.views.admin.UserManagementPanel.java

Source

/**
 * Copyright 2012-2015 Rafal Lewczuk <rafal.lewczuk@jitlogic.com>
 * <p/>
 * This 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.
 * <p/>
 * This software 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.
 * <p/>
 * You should have received a copy of the GNU General Public License
 * along with this software. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jitlogic.zico.client.views.admin;

import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.*;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.IdentityColumn;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.CellPreviewEvent;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SingleSelectionModel;
import com.jitlogic.zico.client.api.HostService;
import com.jitlogic.zico.client.api.UserService;
import com.jitlogic.zico.client.resources.Resources;
import com.jitlogic.zico.client.inject.PanelFactory;
import com.jitlogic.zico.shared.data.HostInfo;
import com.jitlogic.zico.shared.data.UserInfo;
import com.jitlogic.zico.widgets.client.*;
import org.fusesource.restygwt.client.Method;
import org.fusesource.restygwt.client.MethodCallback;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class UserManagementPanel extends Composite {
    interface UserManagementPanelUiBinder extends UiBinder<Widget, UserManagementPanel> {
    }

    private static UserManagementPanelUiBinder ourUiBinder = GWT.create(UserManagementPanelUiBinder.class);

    @UiField
    DockLayoutPanel panel;

    @UiField
    ToolButton btnRefresh;

    @UiField
    ToolButton btnAdd;

    @UiField
    ToolButton btnEdit;

    @UiField
    ToolButton btnRemove;

    @UiField
    ToolButton btnPassword;

    @UiField(provided = true)
    DataGrid<UserInfo> userGrid;

    private UserService userService;
    private HostService hostService;

    private PanelFactory panelFactory;

    private ListDataProvider<UserInfo> userStore;
    private SingleSelectionModel<UserInfo> selectionModel;

    private PopupMenu contextMenu;

    private List<String> hostNames = new ArrayList<String>();

    private MessageDisplay md;

    private static final String MDS = "UserManagementPanel";

    @Inject
    public UserManagementPanel(UserService userService, HostService hostService, PanelFactory panelFactory,
            MessageDisplay md) {
        this.userService = userService;
        this.hostService = hostService;
        this.panelFactory = panelFactory;
        this.md = md;

        createUserGrid();
        ourUiBinder.createAndBindUi(this);

        initWidget(panel);

        loadHosts();
        createContextMenu();
        refreshUsers(null);
    }

    private final static ProvidesKey<UserInfo> KEY_PROVIDER = new ProvidesKey<UserInfo>() {
        @Override
        public Object getKey(UserInfo item) {
            return item.getUserName();
        }
    };

    private static final Cell<UserInfo> USERNAME_CELL = new AbstractCell<UserInfo>() {
        @Override
        public void render(Context context, UserInfo value, SafeHtmlBuilder sb) {
            sb.append(SafeHtmlUtils.fromString(value.getUserName()));
        }
    };

    private static final Cell<UserInfo> REALNAME_CELL = new AbstractCell<UserInfo>() {
        @Override
        public void render(Context context, UserInfo value, SafeHtmlBuilder sb) {
            sb.append(SafeHtmlUtils.fromString(value.getRealName()));
        }
    };

    private static final Cell<UserInfo> USERROLE_CELL = new AbstractCell<UserInfo>() {
        @Override
        public void render(Context context, UserInfo value, SafeHtmlBuilder sb) {
            sb.append(SafeHtmlUtils.fromString(value.isAdmin() ? "ADMIN" : "VIEWER"));
        }
    };

    private static final Cell<UserInfo> USERHOSTS_CELL = new AbstractCell<UserInfo>() {
        @Override
        public void render(Context context, UserInfo value, SafeHtmlBuilder sb) {
            if (value.isAdmin()) {
                sb.appendHtmlConstant(
                        "<span style=\"color: gray;\"> ** all hosts visible due to administrator privileges ** </span>");
            } else {
                List<String> hosts = value.getAllowedHosts();
                if (hosts != null) {
                    for (int i = 0; i < hosts.size(); i++) {
                        if (i > 0) {
                            sb.appendHtmlConstant(",");
                        }
                        sb.append(SafeHtmlUtils.fromString(hosts.get(i)));
                    }
                }
            }
        }
    };

    private void createUserGrid() {
        userGrid = new DataGrid<UserInfo>(1024 * 1024, ZicoDataGridResources.INSTANCE, KEY_PROVIDER);
        selectionModel = new SingleSelectionModel<UserInfo>(KEY_PROVIDER);
        userGrid.setSelectionModel(selectionModel);

        Column<UserInfo, UserInfo> colUsername = new IdentityColumn<UserInfo>(USERNAME_CELL);
        userGrid.addColumn(colUsername, new ResizableHeader<UserInfo>("Username", userGrid, colUsername));
        userGrid.setColumnWidth(colUsername, 128, Style.Unit.PX);

        Column<UserInfo, UserInfo> colUserRole = new IdentityColumn<UserInfo>(USERROLE_CELL);
        userGrid.addColumn(colUserRole, new ResizableHeader<UserInfo>("Role", userGrid, colUserRole));
        userGrid.setColumnWidth(colUserRole, 64, Style.Unit.PX);

        Column<UserInfo, UserInfo> colRealName = new IdentityColumn<UserInfo>(REALNAME_CELL);
        userGrid.addColumn(colRealName, new ResizableHeader<UserInfo>("Real Name", userGrid, colRealName));
        userGrid.setColumnWidth(colRealName, 256, Style.Unit.PX);

        Column<UserInfo, UserInfo> colUserHosts = new IdentityColumn<UserInfo>(USERHOSTS_CELL);
        userGrid.addColumn(colUserHosts, "Allowed hosts");
        userGrid.setColumnWidth(colUserHosts, 100, Style.Unit.PCT);

        userStore = new ListDataProvider<UserInfo>(KEY_PROVIDER);
        userStore.addDataDisplay(userGrid);

        userGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<UserInfo>() {
            @Override
            public void onCellPreview(CellPreviewEvent<UserInfo> event) {
                NativeEvent nev = event.getNativeEvent();
                String eventType = nev.getType();
                if ((BrowserEvents.KEYDOWN.equals(eventType) && nev.getKeyCode() == KeyCodes.KEY_ENTER)
                        || BrowserEvents.DBLCLICK.equals(nev.getType())) {
                    selectionModel.setSelected(event.getValue(), true);
                    editUser(null);
                }
                if (BrowserEvents.CONTEXTMENU.equals(eventType)) {
                    selectionModel.setSelected(event.getValue(), true);
                    if (event.getValue() != null) {
                        contextMenu.setPopupPosition(event.getNativeEvent().getClientX(),
                                event.getNativeEvent().getClientY());
                        contextMenu.show();
                    }
                }

            }
        });

        userGrid.addDomHandler(new DoubleClickHandler() {
            @Override
            public void onDoubleClick(DoubleClickEvent event) {
                event.preventDefault();
            }
        }, DoubleClickEvent.getType());
        userGrid.addDomHandler(new ContextMenuHandler() {
            @Override
            public void onContextMenu(ContextMenuEvent event) {
                event.preventDefault();
            }
        }, ContextMenuEvent.getType());
    }

    private void createContextMenu() {
        contextMenu = new PopupMenu();

        MenuItem mnuRefresh = new MenuItem("Refresh", Resources.INSTANCE.refreshIcon(),
                new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        refreshUsers(null);
                    }
                });
        contextMenu.addItem(mnuRefresh);

        contextMenu.addSeparator();

        MenuItem mnuAddUser = new MenuItem("Add user", Resources.INSTANCE.addIcon(),
                new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        addUser(null);
                    }
                });
        contextMenu.addItem(mnuAddUser);

        MenuItem mnuRemoveUser = new MenuItem("Remove user", Resources.INSTANCE.removeIcon(),
                new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        removeUser(null);
                    }
                });
        contextMenu.addItem(mnuRemoveUser);

        MenuItem mnuEditUser = new MenuItem("Edit user", Resources.INSTANCE.editIcon(),
                new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        editUser(null);
                    }
                });
        contextMenu.addItem(mnuEditUser);

        contextMenu.addSeparator();

        MenuItem mnuChangePassword = new MenuItem("Change password", Resources.INSTANCE.keyIcon(),
                new Scheduler.ScheduledCommand() {
                    @Override
                    public void execute() {
                        changePassword(null);
                    }
                });
        contextMenu.addItem(mnuChangePassword);
    }

    @UiHandler("btnEdit")
    void editUser(ClickEvent e) {
        UserInfo user = selectionModel.getSelectedObject();
        if (user != null) {
            new UserEditDialog(userService, user, this, hostNames, md).asPopupWindow().show();
        }
    }

    @UiHandler("btnAdd")
    void addUser(ClickEvent e) {
        new UserEditDialog(userService, null, this, hostNames, md).asPopupWindow().show();
    }

    @UiHandler("btnRemove")
    void removeUser(ClickEvent e) {
        final UserInfo user = selectionModel.getSelectedObject();
        if (user != null) {
            ConfirmDialog dialog = new ConfirmDialog("Removing user", "Remove user " + user.getUserName() + " ?")
                    .withBtn("Yes", new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                            userStore.getList().remove(user);
                            md.info(MDS, "Removing user " + user.getUserName());
                            userService.delete(user.getUserName(), new MethodCallback<Void>() {
                                @Override
                                public void onFailure(Method method, Throwable e) {
                                    md.error(MDS, "Cannot remove user " + user.getUserName(), e);
                                }

                                @Override
                                public void onSuccess(Method method, Void response) {
                                    md.clear(MDS);
                                }
                            });
                        }
                    }).withBtn("No");
            dialog.show();
        }
    }

    @UiHandler("btnPassword")
    void changePassword(ClickEvent e) {
        UserInfo user = selectionModel.getSelectedObject();
        if (user != null) {
            PasswordChangeDialog dialog = panelFactory.passwordChangeView(user.getUserName(), true);
            dialog.asPopupWindow().show();
        }
    }

    @UiHandler("btnRefresh")
    void refreshUsers(ClickEvent e) {
        userStore.getList().clear();
        userService.list(new MethodCallback<List<UserInfo>>() {
            @Override
            public void onFailure(Method method, Throwable e) {
                md.error(MDS, "Error loading user data", e);
            }

            @Override
            public void onSuccess(Method method, List<UserInfo> users) {
                userStore.getList().addAll(users);
            }
        });
    }

    private void loadHosts() {
        hostService.list(new MethodCallback<List<HostInfo>>() {
            @Override
            public void onFailure(Method method, Throwable e) {
                md.error(MDS, "Error loading user data", e);
            }

            @Override
            public void onSuccess(Method method, List<HostInfo> hosts) {
                hostNames.clear();
                for (HostInfo h : hosts) {
                    hostNames.add(h.getName());
                }
                Collections.sort(hostNames);

            }
        });
    }

}