eu.uqasar.web.pages.admin.teams.TeamImportPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.uqasar.web.pages.admin.teams.TeamImportPage.java

Source

package eu.uqasar.web.pages.admin.teams;

/*
 * #%L
 * U-QASAR
 * %%
 * Copyright (C) 2012 - 2015 U-QASAR Consortium
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import eu.uqasar.exception.auth.register.UserMailAlreadyExistsException;
import eu.uqasar.exception.auth.register.UserNameAlreadyExistsException;
import eu.uqasar.exception.notification.NotificationException;
import eu.uqasar.model.role.Role;
import eu.uqasar.model.settings.ldap.LdapSettings;
import eu.uqasar.model.user.Team;
import eu.uqasar.model.user.TeamMembership;
import eu.uqasar.model.user.User;
import eu.uqasar.service.AuthenticationService;
import eu.uqasar.service.notification.message.auth.register.RegistrationMessageService;
import eu.uqasar.service.settings.LdapSettingsService;
import eu.uqasar.service.user.TeamMembershipService;
import eu.uqasar.service.user.TeamService;
import eu.uqasar.service.user.UserService;
import eu.uqasar.util.ldap.LdapGroup;
import eu.uqasar.util.ldap.LdapManager;
import eu.uqasar.util.ldap.LdapUser;
import eu.uqasar.web.UQSession;
import eu.uqasar.web.UQasar;
import eu.uqasar.web.components.AnchorableBookmarkablePageLink;
import eu.uqasar.web.components.CSSAppender;
import eu.uqasar.web.pages.admin.AdminBasePage;
import eu.uqasar.web.pages.admin.settings.LdapSettingsPage;
import eu.uqasar.web.pages.admin.settings.panels.LdapGroupListPanel;
import eu.uqasar.web.upload.UserProfilePictureUploadHelper;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import javax.inject.Inject;
import javax.naming.NamingException;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.jboss.solder.logging.Logger;

/**
 *
 *
 */
public class TeamImportPage extends AdminBasePage {

    private static final Logger logger = Logger.getLogger(TeamImportPage.class);

    private Label groupRetrievalInfo;
    private final SubmitLink importButton;
    private LdapSettings ldapSettings;
    private LdapManager manager;
    private LdapGroupListPanel ldapGroupsList;
    private final Role userRole = Role.User;
    private final Role groupRole = Role.User;
    private final Boolean needToConfirmRegistration = false;

    @Inject
    LdapSettingsService settingsService;

    @Inject
    private AuthenticationService authenticationService;

    @Inject
    private UserService userService;

    @Inject
    private TeamService teamService;

    @Inject
    private TeamMembershipService teamMembershipService;

    @Inject
    private RegistrationMessageService registrationMessageService;

    @Inject
    private UserProfilePictureUploadHelper userPictureHelper;

    public TeamImportPage(PageParameters pageParameters) {
        super(pageParameters);
        add(new AnchorableBookmarkablePageLink("change.group.settings", LdapSettingsPage.class, "groupSettings"));
        add(new AnchorableBookmarkablePageLink("change.user.settings", LdapSettingsPage.class, "userSettings"));

        Form<Void> groupForm = new Form("form");
        IndicatingAjaxButton retrieveGroups = new IndicatingAjaxButton("retrieveGroups") {

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                try {
                    ldapGroupsList.setHeaderFixed(true);
                    ldapGroupsList.setSelectionEnabled(true);
                    manager = ldapGroupsList.update(ldapSettings);
                    groupRetrievalInfo.setDefaultModel(new StringResourceModel("label.retrieval.success", this,
                            null, ldapGroupsList.getNoOfCurrentlyListedEntities()));
                    groupRetrievalInfo.add(new CSSAppender("success"));
                } catch (Throwable ex) {
                    ldapGroupsList.reset();
                    logger.warn(ex.getMessage(), ex);
                    StringWriter errors = new StringWriter();
                    ex.printStackTrace(new PrintWriter(errors));
                    groupRetrievalInfo.setDefaultModel(Model.of(errors.toString()));
                    groupRetrievalInfo.add(new CSSAppender("error"));
                }
                target.add(groupRetrievalInfo);
                target.add(ldapGroupsList);
            }
        };
        groupForm.add(retrieveGroups);
        groupRetrievalInfo = new Label("groupRetrievalInfo");
        groupForm.add(groupRetrievalInfo.setOutputMarkupId(true));

        importButton = new SubmitLink("import") {
            @Override
            public void onSubmit() {
                List<String> successGroups = new ArrayList<>((int) ldapGroupsList.getNoOfCurrentlyListedEntities());
                List<String> errorGroups = new ArrayList<>((int) ldapGroupsList.getNoOfCurrentlyListedEntities());
                for (LdapGroup group : ldapGroupsList.getCurrentlySelectedEntities()) {
                    if (tryToRegister(group)) {
                        successGroups.add(group.getName());
                    } else {
                        errorGroups.add(group.getName());
                    }
                }
                if (!errorGroups.isEmpty()) {
                    final String users = StringUtils.join(errorGroups, ", ");
                    final String message = new StringResourceModel("message.import.result.error",
                            TeamImportPage.this, null, errorGroups.size(), users).getString();
                    error(message);
                }
                if (!successGroups.isEmpty()) {
                    final String users = StringUtils.join(successGroups, ", ");
                    final String message = new StringResourceModel("message.import.result.success",
                            TeamImportPage.this, null, successGroups.size(), users).getString();
                    success(message);
                }
            }
        };
        importButton.setOutputMarkupId(true);
        groupForm.add(importButton);

        ldapGroupsList = new LdapGroupListPanel("groupsList", manager) {
            @Override
            public void selectionChanged(AjaxRequestTarget target) {
                updateImportButton();
                target.add(importButton);
            }
        };
        groupForm.add(ldapGroupsList);

        groupForm.add(new DropDownChoice<>("userRole", new PropertyModel<>(this, "userRole"),
                Arrays.asList(Role.userAssignableRoles())));
        groupForm.add(new DropDownChoice<>("groupRole", new PropertyModel<>(this, "groupRole"),
                Arrays.asList(Role.teamAssignableRoles())));
        groupForm.add(
                new CheckBox("registrationMail", new PropertyModel<Boolean>(this, "needToConfirmRegistration")));

        add(groupForm);
        addOrReplace(feedbackPanel);
    }

    private boolean tryToRegister(LdapGroup ldapGroup) {
        if (!teamService.ldapBasedGroupExists(ldapGroup)) {
            Team team = new Team();
            team.setName(ldapGroup.getName());
            team.setDescription(ldapGroup.getDescription());
            team = teamService.create(team);
            List<LdapUser> members;
            try {
                members = ldapGroup.getMembers();
                for (LdapUser ldapUser : members) {
                    User user = userService.getLdapBasedUser(ldapUser);
                    if (user == null) {
                        user = tryToRegister(ldapUser);
                    }
                    if (user != null) {
                        TeamMembership member = new TeamMembership();
                        member.setUser(user);
                        member.setTeam(team);
                        member.setRole(groupRole);
                        teamMembershipService.create(member);
                    }
                }
            } catch (NamingException ex) {
                java.util.logging.Logger.getLogger(TeamImportPage.class.getName()).log(Level.SEVERE, null, ex);
            }
            return true;
        }
        return false;
    }

    private User tryToRegister(LdapUser ldapUser) {
        User newUser = ldapUser.toUser();
        try {
            authenticationService.checkMailAlreadyRegistered(newUser.getMail());
            authenticationService.checkUserNameAlreadyRegistered(newUser.getUserName());
            newUser.setPreferredLocale(UQasar.getSession().getLocale());
            newUser.setRole(this.userRole);

            User registeredUser = authenticationService.registerLdapBasedUser(newUser, needToConfirmRegistration);
            if (registeredUser != null) {
                if (ldapUser.getProfilePicture() != null && ldapUser.getProfilePicture().length > 0) {
                    userPictureHelper.processLdapUserPictureUpload(ldapUser.getProfilePicture(), registeredUser);
                }
                if (needToConfirmRegistration) {
                    registrationMessageService.sendRegistrationConfirmationMessage(registeredUser);
                } else {
                    registrationMessageService.sendRegistrationConfirmedMessage(registeredUser);
                }
            }
            return registeredUser;
        } catch (UserMailAlreadyExistsException ex) {
            UQSession.get()
                    .error(new StringResourceModel("error.user.exists.mail", this, Model.of(newUser)).getString());
        } catch (UserNameAlreadyExistsException ex) {
            UQSession.get().error(
                    new StringResourceModel("error.user.exists.userName", this, Model.of(newUser)).getString());
        } catch (NotificationException ex) {
            UQSession.get()
                    .error(new StringResourceModel("error.user.register.notification", this, Model.of(newUser))
                            .getString());
        }
        return null;
    }

    @Override
    protected void onConfigure() {
        super.onConfigure();
        ldapSettings = LdapSettings.getDefault();
        ldapSettings = settingsService.get(ldapSettings);
        updateImportButton();
    }

    private void updateImportButton() {
        importButton.setEnabled(ldapGroupsList.getNoOfCurrentlyListedEntities() > 0
                && ldapGroupsList.getCurrentlySelectedEntities().size() > 0);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.render(CssHeaderItem.forUrl("assets/css/admin/user.css"));
    }
}