cc.kune.core.client.groups.newgroup.NewGroupPresenter.java Source code

Java tutorial

Introduction

Here is the source code for cc.kune.core.client.groups.newgroup.NewGroupPresenter.java

Source

/*
 *
 * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
 * one or more contributor license agreements (see COPYRIGHT for details).
 * The CA licenses this file to you under the GNU Affero General Public
 * License version 3, (the "License"); you may not use this file except in
 * compliance with the License. This file is part of kune.
 *
 * 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 cc.kune.core.client.groups.newgroup;

import cc.kune.common.client.errors.UIException;
import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.common.client.notify.NotifyUser;
import cc.kune.common.client.ui.dialogs.BSBasicDialog;
import cc.kune.common.shared.i18n.I18nTranslationService;
import cc.kune.common.shared.utils.TextUtils;
import cc.kune.core.client.auth.SignIn;
import cc.kune.core.client.errors.GroupLongNameInUseException;
import cc.kune.core.client.errors.GroupShortNameInUseException;
import cc.kune.core.client.events.MyGroupsChangedEvent;
import cc.kune.core.client.resources.CoreMessages;
import cc.kune.core.client.rpcservices.AsyncCallbackSimple;
import cc.kune.core.client.rpcservices.GroupServiceAsync;
import cc.kune.core.client.state.Session;
import cc.kune.core.client.state.SiteTokens;
import cc.kune.core.client.state.StateManager;
import cc.kune.core.client.state.TokenUtils;
import cc.kune.core.client.state.impl.SessionChecker;
import cc.kune.core.shared.dto.GroupDTO;
import cc.kune.core.shared.dto.GroupType;
import cc.kune.core.shared.dto.LicenseDTO;
import cc.kune.core.shared.dto.ReservedWordsRegistryDTO;
import cc.kune.core.shared.dto.StateAbstractDTO;
import cc.kune.gspace.client.actions.ShowHelpContainerEvent;
import cc.kune.gspace.client.options.GroupOptions;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.Presenter;
import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit;
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent;

// TODO: Auto-generated Javadoc
/**
 * The Class NewGroupPresenter.
 *
 * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
 */
public class NewGroupPresenter extends Presenter<NewGroupView, NewGroupPresenter.NewGroupProxy>
        implements NewGroup {

    /**
     * The Interface NewGroupProxy.
     *
     * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
     */
    @ProxyCodeSplit
    public interface NewGroupProxy extends Proxy<NewGroupPresenter> {
    }

    /** The group options. */
    private final GroupOptions groupOptions;

    /** The group service. */
    private final Provider<GroupServiceAsync> groupService;

    /** The i18n. */
    private final I18nTranslationService i18n;

    /** The just created a group. */
    private boolean justCreatedAGroup;

    /** The session. */
    private final Session session;

    private final SessionChecker sessionChecker;

    /** The sign in. */
    private final Provider<SignIn> signIn;

    /** The state manager. */
    private final StateManager stateManager;

    /**
     * Instantiates a new new group presenter.
     *
     * @param eventBus
     *          the event bus
     * @param view
     *          the view
     * @param proxy
     *          the proxy
     * @param i18n
     *          the i18n
     * @param session
     *          the session
     * @param stateManager
     *          the state manager
     * @param groupService
     *          the group service
     * @param signIn
     *          the sign in
     * @param groupOptions
     *          the group options
     */
    @Inject
    public NewGroupPresenter(final EventBus eventBus, final NewGroupView view, final NewGroupProxy proxy,
            final I18nTranslationService i18n, final Session session, final StateManager stateManager,
            final Provider<GroupServiceAsync> groupService, final Provider<SignIn> signIn,
            final GroupOptions groupOptions, final SessionChecker sessionChecker) {
        super(eventBus, view, proxy);
        this.i18n = i18n;
        this.session = session;
        this.stateManager = stateManager;
        this.groupService = groupService;
        this.signIn = signIn;
        this.groupOptions = groupOptions;
        this.sessionChecker = sessionChecker;
    }

    /*
     * (non-Javadoc)
     * 
     * @see cc.kune.core.client.groups.newgroup.NewGroup#doNewGroup()
     */
    @Override
    public void doNewGroup() {
        justCreatedAGroup = false;
        sessionChecker.check(new AsyncCallbackSimple<Void>() {
            @Override
            public void onSuccess(final Void result) {
                if (session.isLogged()) {
                    NotifyUser.showProgress();
                    getView().show();
                    getView().focusOnLongName();
                    NotifyUser.hideProgress();
                } else {
                    // signIn.get().showSignInDialog();
                    signIn.get().setErrorMessage(i18n.t(CoreMessages.REGISTER_TO_CREATE_A_GROUP), NotifyLevel.info);
                    stateManager.gotoHistoryToken(
                            TokenUtils.addRedirect(SiteTokens.SIGN_IN, session.getCurrentStateToken().toString()));
                }
            }
        });
    }

    /**
     * Automatically generate a "short name" for a group, after typing the
     * "long name":.
     *
     * @return the string
     */
    protected String generateShortName() {
        String autoGenShort = getView().getLongName();
        // If there is a short-name, no automatic generation (for not stepping on
        // manually inserted modifications, and doing it just once)
        // If under 3 chars, incorrect LongName => no automatic generation
        if (getView().getShortName() == null && autoGenShort != null && autoGenShort.length() > 2) {
            // to lower-case, transformed accented letters into English characters:
            autoGenShort = TextUtils.deAccent(autoGenShort.toLowerCase());
            // remove not alphanumeric characters
            autoGenShort = autoGenShort.replaceAll("[^a-zA-Z0-9]", "");
            // guarantee <30 chars:
            if (autoGenShort.length() > 30) {
                autoGenShort = autoGenShort.substring(0, 29);
            }
            if (!autoGenShort.isEmpty() && autoGenShort.length() > 2) {
                getView().setShortName(autoGenShort);
                return autoGenShort;
            }
        }
        return null;
    }

    /**
     * Gets the type of group.
     *
     * @return the type of group
     */
    private GroupType getTypeOfGroup() {
        // Duplicate in GroupOptGeneralPanel
        if (getView().isProject()) {
            return GroupType.PROJECT;
        } else if (getView().isOrganization()) {
            return GroupType.ORGANIZATION;
        } else if (getView().isClosed()) {
            return GroupType.CLOSED;
        } else {
            return GroupType.COMMUNITY;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.gwtplatform.mvp.client.HandlerContainerImpl#onBind()
     */
    @Override
    protected void onBind() {
        super.onBind();
        getView().getFirstBtn().addClickHandler(new ClickHandler() {
            @Override
            public void onClick(final ClickEvent event) {
                onRegister();
            }
        });
        getView().getSecondBtn().addClickHandler(new ClickHandler() {
            @Override
            public void onClick(final ClickEvent event) {
                onCancel();
            }
        });
        getView().getClose().addCloseHandler(new CloseHandler<BSBasicDialog>() {
            @Override
            public void onClose(final CloseEvent<BSBasicDialog> event) {
                NewGroupPresenter.this.onClose();
            }
        });
        // When you leave the field "long name", auto-generate the "short name":
        getView().getLongNameField().addHandler(new BlurHandler() {
            @Override
            public void onBlur(final BlurEvent event) {
                generateShortName();
            }
        }, BlurEvent.getType());
    }

    /**
     * On cancel.
     */
    public void onCancel() {
        getView().hide();
        getView().unMask();
    }

    /**
     * On close.
     */
    public void onClose() {
        reset();
        if (!justCreatedAGroup) {
            stateManager.redirectOrRestorePreviousToken(false);
        }
    }

    /**
     * On register.
     */
    private void onRegister() {
        getView().hideMessage();
        final ReservedWordsRegistryDTO reservedWords = session.getInitData().getReservedWords();
        if (reservedWords.contains(getView().getShortName())) {
            getView().setShortNameFailed(i18n.t(CoreMessages.NAME_RESTRICTED));
            getView().setMessage(i18n.t(CoreMessages.NAME_RESTRICTED), NotifyLevel.error);
        } else if (reservedWords.contains(getView().getLongName())) {
            getView().setLongNameFailed(i18n.t(CoreMessages.NAME_RESTRICTED));
            getView().setMessage(i18n.t(CoreMessages.NAME_RESTRICTED), NotifyLevel.error);
        } else if (getView().isFormValid()) {
            getView().maskProcessing();
            final String shortName = getView().getShortName().toLowerCase();
            final String longName = getView().getLongName();
            final String publicDesc = getView().getPublicDesc();
            final LicenseDTO license = session.getDefLicense();
            final GroupDTO group = new GroupDTO(shortName, longName, getTypeOfGroup());
            group.setDefaultLicense(license);

            final AsyncCallback<StateAbstractDTO> callback = new AsyncCallback<StateAbstractDTO>() {
                @Override
                public void onFailure(final Throwable caught) {
                    if (caught instanceof GroupShortNameInUseException) {
                        getView().unMask();
                        final String msg = i18n.t(CoreMessages.NAME_IN_ALREADY_IN_USE);
                        getView().setShortNameFailed(msg);
                        setMessage(msg, NotifyLevel.error);
                    } else if (caught instanceof GroupLongNameInUseException) {
                        getView().unMask();
                        final String msg = i18n.t(CoreMessages.NAME_IN_ALREADY_IN_USE);
                        getView().setLongNameFailed(msg);
                        setMessage(msg, NotifyLevel.error);
                    } else {
                        getView().unMask();
                        setMessage(i18n.t("Error creating group"), NotifyLevel.error);
                        throw new UIException("Other kind of exception in group registration", caught);
                    }
                }

                @Override
                public void onSuccess(final StateAbstractDTO state) {
                    justCreatedAGroup = true;
                    stateManager.setRetrievedStateAndGo(state);
                    getView().hide();
                    getView().unMask();
                    MyGroupsChangedEvent.fire(getEventBus());
                    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                        @Override
                        public void execute() {
                            groupOptions.showTooltip();
                            new Timer() {
                                @Override
                                public void run() {
                                    ShowHelpContainerEvent.fire(getEventBus(), state.getStateToken().getTool());
                                }
                            }.schedule(2000);
                        }
                    });
                }
            };
            groupService.get().createNewGroup(session.getUserHash(), group, publicDesc, getView().getTags(), null,
                    callback);
        }
    }

    /**
     * Reset.
     */
    private void reset() {
        getView().clearData();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.gwtplatform.mvp.client.Presenter#revealInParent()
     */
    @Override
    protected void revealInParent() {
        RevealRootContentEvent.fire(this, this);
    }

    /**
     * Sets the message.
     *
     * @param message
     *          the message
     * @param level
     *          the level
     */
    public void setMessage(final String message, final NotifyLevel level) {
        getView().setMessage(message, level);
    }
}