org.roda.wui.client.management.UserDataPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.wui.client.management.UserDataPanel.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE file at the root of the source
 * tree and available online at
 *
 * https://github.com/keeps/roda
 */
/**
 *
 */
package org.roda.wui.client.management;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.roda.core.data.v2.user.Group;
import org.roda.core.data.v2.user.User;
import org.roda.wui.client.browse.bundle.UserExtraBundle;
import org.roda.wui.client.common.utils.AsyncCallbackUtils;
import org.roda.wui.client.common.utils.FormUtilities;
import org.roda.wui.common.client.ClientLogger;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.widgets.wcag.WCAGUtilities;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

import config.i18n.client.ClientMessages;

/**
 * @author Luis Faria
 *
 */
public class UserDataPanel extends Composite implements HasValueChangeHandlers<User> {

    interface MyUiBinder extends UiBinder<Widget, UserDataPanel> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    private static final ClientMessages messages = GWT.create(ClientMessages.class);

    @UiField
    TextBox username;

    @UiField
    Label usernameError;

    @UiField(provided = true)
    PasswordPanel password;

    @UiField
    Label passwordError;

    @UiField
    TextBox fullname;

    @UiField
    Label fullnameError;

    @UiField
    TextBox email;

    @UiField
    Label emailError;

    @UiField
    FlowPanel extra;

    @UiField
    FlowPanel groupSelectPanel;

    @UiField(provided = true)
    GroupSelect groupSelect;

    @UiField
    FlowPanel permissionsSelectPanel;

    @UiField
    PermissionsPanel permissionsPanel;

    @SuppressWarnings("unused")
    private ClientLogger logger = new ClientLogger(getClass().getName());

    private boolean enableGroupSelect;

    private boolean editmode;

    // has to be true to detected new field changes
    private boolean changed = true;
    private boolean checked = false;
    private UserExtraBundle userExtraBundle = null;

    @UiField
    HTML errors;

    /**
     * Create a new user data panel
     *
     * @param editmode
     *          if user name should be editable
     * @param enableGroupSelect
     *          if the list of groups to which the user belong to should be
     *          editable
     *
     */
    public UserDataPanel(boolean editmode, boolean enableGroupSelect) {
        this(true, editmode, enableGroupSelect, true);
    }

    /**
     * Create a new user data panel
     *
     * @param editmode
     *          if user name should be editable
     * @param enableGroupSelect
     *          if the list of groups to which the user belong to should be
     *          editable
     *
     */
    public UserDataPanel(boolean visible, boolean editmode, boolean enableGroupSelect) {
        this(visible, editmode, enableGroupSelect, true);
    }

    /**
     * Create a new user data panel
     *
     * @param visible
     * @param editmode
     * @param enableGroupSelect
     * @param enablePermissions
     */
    public UserDataPanel(boolean visible, boolean editmode, boolean enableGroupSelect, boolean enablePermissions) {

        password = new PasswordPanel(editmode);
        groupSelect = new GroupSelect();

        initWidget(uiBinder.createAndBindUi(this));

        this.editmode = editmode;
        super.setVisible(visible);
        this.enableGroupSelect = enableGroupSelect;

        errors.setVisible(false);

        groupSelectPanel.setVisible(enableGroupSelect);
        permissionsSelectPanel.setVisible(enablePermissions);

        ValueChangeHandler<String> valueChangedHandler = new ValueChangeHandler<String>() {

            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                onChange();
            }
        };

        ChangeHandler changeHandler = new ChangeHandler() {

            @Override
            public void onChange(ChangeEvent event) {
                UserDataPanel.this.onChange();
            }
        };

        KeyUpHandler keyUpHandler = new KeyUpHandler() {

            @Override
            public void onKeyUp(KeyUpEvent event) {
                onChange();
            }
        };

        username.addKeyDownHandler(new UserAndGroupKeyDownHandler());

        username.addChangeHandler(changeHandler);
        username.addKeyUpHandler(keyUpHandler);
        password.addValueChangeHandler(valueChangedHandler);
        fullname.addChangeHandler(changeHandler);
        fullname.addKeyUpHandler(keyUpHandler);

        permissionsPanel.addValueChangeHandler(new ValueChangeHandler<List<String>>() {

            @Override
            public void onValueChange(ValueChangeEvent<List<String>> event) {
                onChange();
            }
        });

        groupSelect.addValueChangeHandler(new ValueChangeHandler<List<Group>>() {

            @Override
            public void onValueChange(ValueChangeEvent<List<Group>> event) {
                updatePermissions(event.getValue());
                onChange();
            }
        });

        usernameError.setVisible(false);
        passwordError.setVisible(false);
        fullnameError.setVisible(false);
        emailError.setVisible(false);
    }

    @SuppressWarnings("unused")
    private int setSelected(ListBox listbox, String text) {
        int index = -1;
        if (text != null) {
            for (int i = 0; i < listbox.getItemCount(); i++) {
                if (listbox.getValue(i).equals(text)) {
                    index = i;
                    break;
                }
            }
            if (index >= 0) {
                listbox.setSelectedIndex(index);
            } else {
                listbox.addItem(text);
                index = listbox.getItemCount() - 1;
                listbox.setSelectedIndex(index);
            }
        } else {
            listbox.setSelectedIndex(-1);
        }
        return index;
    }

    /**
     * Set user information of user
     *
     * @param user
     */
    public void setUser(User user) {
        this.username.setText(user.getName());
        this.fullname.setText(user.getFullName());
        this.email.setText(user.getEmail());

        this.setMemberGroups(user.getGroups());
        this.setPermissions(user.getDirectRoles(), user.getAllRoles());

        UserManagementService.Util.getInstance().retrieveUserExtraBundle(user.getName(),
                new AsyncCallback<UserExtraBundle>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        AsyncCallbackUtils.defaultFailureTreatment(caught);
                    }

                    @Override
                    public void onSuccess(UserExtraBundle userExtra) {
                        UserDataPanel.this.userExtraBundle = userExtra;
                        createForm(userExtra);
                    }
                });
    }

    public void setExtraBundle(UserExtraBundle bundle) {
        UserDataPanel.this.userExtraBundle = bundle;
        createForm(bundle);
    }

    private void setPermissions(final Set<String> directRoles, final Set<String> allRoles) {
        permissionsPanel.init(new AsyncCallback<Boolean>() {

            @Override
            public void onSuccess(Boolean result) {
                Set<String> indirectRoles = new HashSet<>(allRoles);
                indirectRoles.removeAll(directRoles);

                permissionsPanel.checkPermissions(directRoles, false);
                permissionsPanel.checkPermissions(indirectRoles, true);
                WCAGUtilities.getInstance().makeAccessible(permissionsSelectPanel.getElement());
            }

            @Override
            public void onFailure(Throwable caught) {
                AsyncCallbackUtils.defaultFailureTreatment(caught);
                HistoryUtils.newHistory(MemberManagement.RESOLVER);
            }
        });
    }

    private void updatePermissions(List<Group> groups) {
        permissionsPanel.clear();
        permissionsPanel.checkPermissions(new HashSet<String>(permissionsPanel.getUserSelections()), false);
        for (Group group : groups) {
            permissionsPanel.checkPermissions(group.getAllRoles(), true);
        }
    }

    /**
     * Get user defined by this panel. This panel defines: name, fullname, title,
     * organization name, postal address, postal code, locality, country, email,
     * phone number, fax and which groups this user belongs to.
     *
     * @return the user modified by this panel
     */
    public User getUser() {
        User user = new User();
        user.setId(username.getText());
        user.setName(username.getText());
        user.setFullName(fullname.getText());
        user.setEmail(email.getText());

        if (enableGroupSelect) {
            user.setGroups(this.getMemberGroups());
        }

        user.setDirectRoles(permissionsPanel.getDirectRoles());
        return user;
    }

    public void createForm(UserExtraBundle bundle) {
        extra.clear();
        FormUtilities.create(extra, bundle.getValues(), false);

    }

    /**
     * Set the groups of which this user is member of
     *
     * @param groups
     */
    public void setMemberGroups(final Set<String> groups) {
        if (enableGroupSelect) {
            groupSelect.init(new AsyncCallback<Boolean>() {

                @Override
                public void onSuccess(Boolean result) {
                    groupSelect.setMemberGroups(groups);
                    WCAGUtilities.getInstance().makeAccessible(groupSelectPanel.getElement());
                }

                @Override
                public void onFailure(Throwable caught) {
                    AsyncCallbackUtils.defaultFailureTreatment(caught);
                }
            });
        }
    }

    /**
     * Get the groups of which this user is member of
     *
     * @return a list of group names
     */
    public Set<String> getMemberGroups() {
        return enableGroupSelect ? groupSelect.getMemberGroups() : null;
    }

    /**
     * Get the password
     *
     * @return the password if changed, or null if it remains the same
     */
    public String getPassword() {
        return password.getValue();
    }

    /**
     * Check if password changed
     *
     * @return true if password changed, false otherwise
     */
    public boolean isPasswordChanged() {
        return password.isChanged();
    }

    /**
     * Is user data panel valid
     *
     * @return true if valid
     */
    public boolean isValid() {
        List<String> errorList = new ArrayList<>();
        if (username.getText().length() == 0) {
            username.addStyleName("isWrong");
            usernameError.setText(messages.mandatoryField());
            usernameError.setVisible(true);
            Window.scrollTo(username.getAbsoluteLeft(), username.getAbsoluteTop());
            errorList.add(messages.isAMandatoryField(messages.username()));
        } else {
            username.removeStyleName("isWrong");
            usernameError.setVisible(false);
        }

        if (!password.matchConfirmation()) {
            if (errorList.isEmpty()) {
                Window.scrollTo(password.getAbsoluteLeft(), password.getAbsoluteTop());
            }
            errorList.add(messages.passwordDoesNotMatchConfirmation());
        } else if (password.isSmall()) {
            if (errorList.isEmpty()) {
                Window.scrollTo(password.getAbsoluteLeft(), password.getAbsoluteTop());
            }
            errorList.add(messages.passwordIsTooSmall());
        }

        if (fullname.getText().length() == 0) {
            fullname.addStyleName("isWrong");
            fullnameError.setText(messages.mandatoryField());
            fullnameError.setVisible(true);
            if (errorList.isEmpty()) {
                Window.scrollTo(fullname.getAbsoluteLeft(), fullname.getAbsoluteTop());
            }
            errorList.add(messages.isAMandatoryField(messages.fullname()));
        } else {
            fullname.removeStyleName("isWrong");
            fullnameError.setVisible(false);
        }

        if (email.getText() == null || "".equals(email.getText().trim())) {
            email.addStyleName("isWrong");
            emailError.setText(messages.mandatoryField());
            emailError.setVisible(true);
            if (errorList.isEmpty()) {
                Window.scrollTo(email.getAbsoluteLeft(), email.getAbsoluteTop());
            }
            errorList.add(messages.isAMandatoryField(messages.email()));
        } else if (!email.getText().matches(
                "^[_A-Za-z0-9-%+]+(\\.[_A-Za-z0-9-%+]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)")) {
            email.addStyleName("isWrong");
            emailError.setText(messages.wrongMailFormat());
            emailError.setVisible(true);
            if (errorList.isEmpty()) {
                Window.scrollTo(email.getAbsoluteLeft(), email.getAbsoluteTop());
            }
            errorList.add(messages.emailNotValid());
        } else {
            email.removeStyleName("isWrong");
            emailError.setVisible(false);
        }

        List<String> extraErrors = FormUtilities.validate(userExtraBundle.getValues(), extra);
        errorList.addAll(extraErrors);
        checked = true;

        if (!errorList.isEmpty()) {
            errors.setVisible(true);
            StringBuilder errorString = new StringBuilder();
            for (String error : errorList) {
                errorString.append("<span class='error'>").append(error).append("</span>");
                errorString.append("<br/>");
            }
            errors.setHTML(errorString.toString());
        } else {
            errors.setVisible(false);
        }
        return errorList.isEmpty() ? true : false;
    }

    /**
     * Is user name read only
     *
     * @return true if read only
     */
    public boolean isUsernameReadOnly() {
        return username.isReadOnly();
    }

    /**
     * Set user name read only
     *
     * @param readonly
     */
    public void setUsernameReadOnly(boolean readonly) {
        username.setReadOnly(readonly);
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (enableGroupSelect) {
            groupSelect.setVisible(visible);
        }
    }

    public void clear() {
        username.setText("");
        password.clear();
        fullname.setText("");
        email.setText("");
    }

    /**
     * Is user data panel editable, i.e. on create user mode
     *
     * @return true if editable
     */
    public boolean isEditmode() {
        return editmode;
    }

    /**
     * Is user data panel has been changed
     *
     * @return changed
     */
    public boolean isChanged() {
        return changed;
    }

    @Override
    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<User> handler) {
        return addHandler(handler, ValueChangeEvent.getType());
    }

    protected void onChange() {
        changed = true;
        if (checked) {
            isValid();
        }
        ValueChangeEvent.fire(this, getValue());
    }

    public User getValue() {
        return getUser();
    }

    public UserExtraBundle getExtra() {
        return userExtraBundle;
    }
}