com.therdl.client.app.AppController.java Source code

Java tutorial

Introduction

Here is the source code for com.therdl.client.app.AppController.java

Source

package com.therdl.client.app;

import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.autobean.shared.AutoBean;
import com.therdl.client.RdlGinjector;
import com.therdl.client.presenter.*;
import com.therdl.client.presenter.runt.impl.ProfileDescRuntImpl;
import com.therdl.client.view.*;
import com.therdl.client.view.impl.*;
import com.therdl.client.view.widget.AppMenu;
import com.therdl.shared.Global;
import com.therdl.shared.RDLConstants;
import com.therdl.shared.RDLUtils;
import com.therdl.shared.beans.Beanery;
import com.therdl.shared.beans.CurrentUserBean;
import com.therdl.shared.beans.UserBean;
import com.therdl.shared.events.*;

import java.util.List;

/**
 * While the overall application follows the Model View Presenter(MVP) design pattern
 * and the particular schema for MVP here known as Activities and Places
 * see http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html
 * this can be simply expressed as
 * 1. place --> view and
 * 2. activity --> user state/interaction
 * this class manages both Places and Activities and acts as a Controller class in the
 * client/view layer
 * This class controls what view is presented and when it is presented. A particular
 * view is presented during user interaction principally based on  the state of 2 principal actors
 *
 * @ RDLConstants.Tokens.<history Token Type> identifies the view to be presented
 * @ AutoBean<Auth Type>   determines the authorisation state of the view presented
 * it has utility methods and objects
 * @ Beanery beanery, the bean factory
 * @ <XX>View client side views generally UiBinder GUI classes
 * important methods
 * @ bind() manages the client side event handlers for History and authorisation state client
 * side events
 * @ onValueChange(ValueChangeEvent<String> event) ValueChangeEvents are fired when the view is changed by a user
 * see http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsHistory.html
 * for any  ValueChangeEvent think (History event) the type of view is found, the presenter and view are
 * created and by examining the authorisation status of the user put in focus for the user if user is authorised
 * with the correct paramaters (eg menu options) for that users given  authorisation status (eg logged in)
 */
@Singleton
public class AppController implements Presenter, ValueChangeHandler<String> {

    private HasWidgets container;
    private Beanery beanery = GWT.create(Beanery.class);
    private AppMenu appMenu;
    private RdlGinjector injector;

    /**
     * Current authentication rules are anyone can view but only registered user can edit
     * separate authorisation from user state with 2 user beans, current user and authorised user
     * for example auth user bean will have initial password for sign up.
     * The current user bean as a persistent client side bean will/must not contain password info
     * and any time for client side security
     */

    private AutoBean<CurrentUserBean> currentUserBean = beanery.currentUserBean();

    private ExploreView exploreView;

    private WelcomeView welcomeView;
    private ServicesView servicesView;
    private ContentNotFound contentNotFound;
    private SnipEditView snipEditView;

    private SearchView searchView;
    private SearchView storiesView;
    private TribunalView tribunalView;
    private TribunalDetail tribunalDetail;
    private SearchView improvementsView;

    private RegisterView registerView;
    private ContentSearchView contentSearchView;
    private ProfileView profileView;
    private PublicProfileView publicProfileView;

    private ServiceView serviceView;
    private IdeaView ideaView;
    private ThreadView threadView;
    private ImprovementView proposalView;
    private LicenseView licenseView;
    private FaqView faqView;
    private SubscribeView subscribeView;

    private RdlAbstractPresenter defaultPresenter;

    @Inject
    public AppController() {
        bind();
    }

    public void setInjector(RdlGinjector injector) {
        this.injector = injector;
    }

    /**
     * Binds the event handler instances to their specific events
     *
     * @ LogOutEvent  for user log out flow
     * @ SnipViewEvent this event creates a new SnipView, is noteworthy as it is fired after
     * a JSNI callback from the Closure SnipListWidget code
     */
    private void bind() {

        History.addValueChangeHandler(this);

        Log.info("AppController bind() addValueChangeHandler");

        // logout event handler
        GuiEventBus.EVENT_BUS.addHandler(LogOutEvent.TYPE, new LogOutEventEventHandler() {
            @Override
            public void onLogOutEvent(LogOutEvent onLogOutEvent) {
                currentUserBean = RDLUtils.resetCurrentUserBeanFields(currentUserBean);
                Cookies.removeCookie("sid");
                History.newItem(RDLConstants.Tokens.LOG_OUT);
                History.fireCurrentHistoryState();
            }
        });

        // SnipView event handler
        GuiEventBus.EVENT_BUS.addHandler(SnipViewEvent.TYPE, new SnipViewEventHandler() {

            @Override
            public void onSnipSelectEvent(SnipViewEvent event) {
                if (Global.moduleName.equals(RDLConstants.Modules.IDEAS))
                    History.newItem(RDLConstants.Tokens.SNIP_VIEW + ":" + event.getSnipId());
                else if (Global.moduleName.equals(RDLConstants.Modules.STORIES))
                    History.newItem(RDLConstants.Tokens.THREAD_VIEW + ":" + event.getSnipId());
                else if (Global.moduleName.equals(RDLConstants.Modules.IMPROVEMENTS))
                    History.newItem(RDLConstants.Tokens.PROPOSAL_VIEW + ":" + event.getSnipId());
                else if (Global.moduleName.equals(RDLConstants.Modules.SERVICES))
                    History.newItem(RDLConstants.Tokens.SERVICE_VIEW + ":" + event.getSnipId());
            }
        });
    }

    /**
     * present the Welcome landing page for a unAuthorised user
     *
     * @param rootContainer the Presenter View
     */

    @Override
    public void go(final HasWidgets rootContainer) {
        this.container = rootContainer;
        this.currentUserBean.as().setAuth(false);
        this.currentUserBean.as().setRegistered(false);
        if (defaultPresenter == null) {
            defaultPresenter = new RdlAbstractPresenter(this) {
                @Override
                public void go(HasWidgets container, AutoBean<CurrentUserBean> currentUserBean) {
                    //noop implementation
                }
            };
            appMenu = new AppMenu(defaultPresenter);
        }
        if ("".equals(History.getToken())) {
            History.newItem(RDLConstants.Tokens.EXPLORE);
        } else {
            History.fireCurrentHistoryState();
        }
    }

    @Override
    public void go(HasWidgets container, AutoBean<CurrentUserBean> currentUserBean) {
        this.go(container);
    }

    /**
     * This binds the history tokens with the different application states
     *
     * @param event ValueChangeEvent  see http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsHistory.html
     *              for ValueChangeEvent think HistoryEvent
     *              String tokens are extracted from the HistoryEvents, this allows the correct view to be constructed and presented
     *              this method provides the machinery
     */
    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        String token = event.getValue();
        Log.info("AppController onValueChange token before split is  " + token);
        String[] tokenSplit = token.split(":");

        String moduleName = null;
        if (tokenSplit.length != 0) {
            moduleName = tokenSplit[0];
        }
        Log.info("App controller module name: " + moduleName);
        if (moduleName != null) {
            switch (moduleName) {
            case RDLConstants.Tokens.EXPLORE:
                showExploreView(tokenSplit);
                break;
            case RDLConstants.Tokens.WELCOME:
                showWelcomeView(tokenSplit);
                break;
            case RDLConstants.Tokens.SUBSCRIBE:
                showSubscribeView();
                break;
            case RDLConstants.Tokens.SERVICE_VIEW:
                showServiceView(token);
                break;
            case RDLConstants.Tokens.SNIP_VIEW:
                showSnipView(token);
                break;
            case RDLConstants.Tokens.THREAD_VIEW:
                showThreadView(token);
                break;
            case RDLConstants.Tokens.SERVICES:
                showSnervices(token);
                break;
            case RDLConstants.Tokens.SNIPS:
                showSnips(token);
                break;
            case RDLConstants.Tokens.STORIES:
                showStories(token);
                break;
            case RDLConstants.Tokens.TRIBUNAL:
                showTribunal(token);
                break;
            case RDLConstants.Tokens.TRIBUNAL_DETAIL:
                showTribunalDetail(token);
                break;
            case RDLConstants.Tokens.THREAD_EDIT:
                showThreadEdit(token);
                break;
            case RDLConstants.Tokens.IMPROVEMENTS:
                showImprovements(token);
                break;
            case RDLConstants.Tokens.PROPOSAL_EDIT:
                showProposalEdit(token);
                break;
            case RDLConstants.Tokens.PROPOSAL_VIEW:
                showProposalView(token);
                break;
            case RDLConstants.Tokens.SERVICE_EDIT:
                showServiceEdit(token);
                break;
            case RDLConstants.Tokens.SNIP_EDIT:
                showSnipEdit(token);
                break;
            case RDLConstants.Tokens.SIGN_UP:
                showSignUp();
                break;
            case RDLConstants.Tokens.PROFILE:
                showProfile();
                break;
            case RDLConstants.Tokens.PUBLIC_PROFILE:
                showPublicProfile(tokenSplit);
                break;
            case RDLConstants.Tokens.LICENSE:
                showLicense();
                break;
            case RDLConstants.Tokens.FAQ:
                showFaq();
                break;
            case RDLConstants.Tokens.CONTENT_SEARCH:
                showContentSearch(tokenSplit);
                break;
            case RDLConstants.Tokens.ERROR:
                showContentNotFound();
                break;
            case RDLConstants.Tokens.LOG_OUT:
                showLogOut();
                break;
            default:
                showExploreView(null);
                break;
            }
        }
    }

    private void showExploreView(String[] tokenSplit) {
        Log.info("AppController Tokens.EXPLORE");
        if (exploreView == null) {
            exploreView = new ExploreViewImpl(appMenu);
        }
        final ExplorePresenter explorePresenter = new ExplorePresenter(exploreView, this, tokenSplit);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                explorePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showWelcomeView(String[] tokenSplit) {
        Log.info("AppController Tokens.WELCOME");
        if (welcomeView == null) {
            welcomeView = new WelcomeViewImpl(appMenu);
        }
        final WelcomePresenter welcomePresenter = new WelcomePresenter(welcomeView, this, tokenSplit);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                welcomePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showSubscribeView() {
        Log.info("AppController Tokens.SUBSCRIBE");
        if (subscribeView == null) {
            subscribeView = new SubscribeViewImpl(appMenu);
        }
        final SubscribePresenter subscribePresenter = new SubscribePresenter(subscribeView, this);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                subscribePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showServiceView(String token) {
        Global.moduleName = RDLConstants.Modules.SERVICES;
        Log.info("AppController Tokens.SERVICE_VIEW");
        if (serviceView == null) {
            serviceView = new ServiceViewImpl(currentUserBean, appMenu);
        }
        final ServicesViewPresenter servicesViewPresenter = new ServicesViewPresenter(serviceView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.SERVICE_VIEW);
            }

            public void onSuccess() {
                servicesViewPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showSnipView(String token) {
        Global.moduleName = RDLConstants.Modules.IDEAS;
        Log.info("AppController Tokens.SNIP_VIEW");
        if (ideaView == null) {
            ideaView = new IdeaViewImpl(currentUserBean, appMenu);
        }
        final IdeaViewPresenter ideaViewPresenter = new IdeaViewPresenter(ideaView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.SNIPS);
            }

            public void onSuccess() {
                ideaViewPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showThreadView(String token) {
        Global.moduleName = RDLConstants.Modules.STORIES;
        Log.info("AppController Tokens.THREAD_VIEW token: " + token);
        if (threadView == null) {
            threadView = new ThreadViewImpl(currentUserBean, appMenu);
        }
        final ThreadViewPresenter threadViewPresenter = new ThreadViewPresenter(threadView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {
                threadViewPresenter.go(container, currentUserBean);
            }

            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.THREAD_VIEW);
            }
        });
    }

    private void showSnervices(String token) {
        Global.moduleName = RDLConstants.Modules.SERVICES;
        Log.info("AppController Tokens.SERVICES");
        if (servicesView == null) {
            servicesView = new ServicesViewImpl(currentUserBean, appMenu);
        }

        final ServicesPresenter servicesPresenter = new ServicesPresenter(servicesView, this);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.SERVICES);
            }

            public void onSuccess() {
                servicesPresenter.go(container, currentUserBean);
            }
        });

    }

    private void showSnips(String token) {
        Global.moduleName = RDLConstants.Modules.IDEAS;
        Log.info("AppController Tokens.IDEAS");
        if (searchView == null) {
            searchView = new SnipSearchViewImpl(currentUserBean, appMenu);
        }

        final SnipSearchPresenter snipSearchPresenter = new SnipSearchPresenter(searchView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.SNIPS);
            }

            public void onSuccess() {
                snipSearchPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showStories(String token) {
        Global.moduleName = RDLConstants.Modules.STORIES;
        Log.info("AppController Tokens.STORIES");
        if (storiesView == null) {
            storiesView = new StoriesViewImpl(currentUserBean, appMenu);
        }
        final SnipSearchPresenter storiesPresenter = new SnipSearchPresenter(storiesView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.WELCOME);
            }

            public void onSuccess() {
                storiesPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showTribunal(String token) {
        Global.moduleName = RDLConstants.Modules.TRIBUNAL;
        Log.info("AppController Tokens.TRIBUNAL");
        if (tribunalView == null) {
            tribunalView = new TribunalViewImpl(currentUserBean, appMenu);
        }
        final TribunalPresenter tribunalPresenter = new TribunalPresenter(tribunalView, this);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.WELCOME);
            }

            public void onSuccess() {
                tribunalPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showTribunalDetail(String token) {
        Global.moduleName = RDLConstants.Modules.TRIBUNAL;
        Log.info("AppController Tokens.TRIBUNAL_DETAIL");
        if (tribunalDetail == null) {
            tribunalDetail = new TribunalDetailImpl(currentUserBean, appMenu);
        }
        final TribunalDetailPresenter tribunalDetailPresenter = new TribunalDetailPresenter(tribunalDetail, this,
                token);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.WELCOME);
            }

            public void onSuccess() {
                tribunalDetailPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showThreadEdit(String token) {
        Global.moduleName = RDLConstants.Modules.STORIES;
        if (snipEditView == null) {
            snipEditView = new SnipEditViewImpl(currentUserBean, appMenu);
        }
        final SnipEditPresenter snipEditPresenter = new SnipEditPresenter(snipEditView, this, token);
        Log.info("Doing async call...");
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.THREAD_VIEW);
            }

            public void onSuccess() {
                if (currentUserBean.as().isAuth()) {
                    Log.info("Invoking snip edit presenter...");
                    snipEditPresenter.go(container, currentUserBean);
                } else {
                    History.newItem(RDLConstants.Tokens.ERROR);
                }
            }
        });
    }

    private void showImprovements(String token) {
        Global.moduleName = RDLConstants.Modules.IMPROVEMENTS;
        Log.info("AppController Tokens.IMPROVEMENTS");
        if (improvementsView == null) {
            improvementsView = new ImprovementsViewImpl(currentUserBean, appMenu);
        }
        final SnipSearchPresenter improvementsPresenter = new SnipSearchPresenter(improvementsView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.WELCOME);
            }

            public void onSuccess() {
                improvementsPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showProposalEdit(String token) {
        Global.moduleName = RDLConstants.Modules.IMPROVEMENTS;
        if (snipEditView == null) {
            snipEditView = new SnipEditViewImpl(currentUserBean, appMenu);
        }
        final SnipEditPresenter snipEditPresenter = new SnipEditPresenter(snipEditView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                if (currentUserBean.as().isAuth()) {
                    snipEditPresenter.go(container, currentUserBean);
                } else {
                    History.newItem(RDLConstants.Tokens.WELCOME);
                }
            }
        });
    }

    private void showServiceEdit(String token) {
        Global.moduleName = RDLConstants.Modules.SERVICES;
        if (snipEditView == null) {
            snipEditView = new SnipEditViewImpl(currentUserBean, appMenu);
        }
        final SnipEditPresenter snipEditPresenter = new SnipEditPresenter(snipEditView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                if (currentUserBean.as().isAuth()) {
                    snipEditPresenter.go(container, currentUserBean);
                }
            }
        });
    }

    private void showSnipEdit(String token) {
        Global.moduleName = RDLConstants.Modules.IDEAS;
        if (snipEditView == null) {
            snipEditView = new SnipEditViewImpl(currentUserBean, appMenu);
        }
        final SnipEditPresenter snipEditPresenter = new SnipEditPresenter(snipEditView, this, token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                if (currentUserBean.as().isAuth()) {
                    snipEditPresenter.go(container, currentUserBean);
                }
            }
        });
    }

    private void showSignUp() {
        currentUserBean = RDLUtils.resetCurrentUserBeanFields(currentUserBean);
        if (registerView == null) {
            registerView = new RegisterViewImpl(appMenu);

        }

        final RegisterPresenter registerPresenter = new RegisterPresenter(registerView, this);
        Log.info("AppController Tokens.SIGN_UP ");
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                registerPresenter.go(container, currentUserBean);

            }
        });
    }

    private void showProfile() {
        if (profileView == null) {
            Log.info("AppController profileView == null ");
            profileView = new ProfileViewImpl(currentUserBean, appMenu);
        }

        final ProfilePresenter profilePresenter = new ProfilePresenter(profileView, this,
                new ProfileDescRuntImpl());
        Log.info("AppController Tokens.PROFILE ");
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                profilePresenter.go(container, currentUserBean);

            }
        });
    }

    private void showPublicProfile(String[] tokenSplit) {
        if (publicProfileView == null) {
            publicProfileView = new PublicProfileViewImpl(currentUserBean, appMenu);
        }
        final PublicProfilePresenter publicProfilePresenter = new PublicProfilePresenter(publicProfileView, this,
                tokenSplit.length > 1 ? tokenSplit[1] : null);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                publicProfilePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showLicense() {
        if (licenseView == null) {
            licenseView = new LicenseViewImpl(currentUserBean, appMenu);
        }
        Global.moduleName = RDLConstants.Modules.LICENSE;
        final LicensePresenter licensePresenter = new LicensePresenter(licenseView, this);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                licensePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showFaq() {
        if (faqView == null) {
            faqView = new FaqViewImpl(currentUserBean, appMenu);
        }
        Global.moduleName = RDLConstants.Modules.FAQ;
        final FaqPresenter faqPresenter = new FaqPresenter(faqView, this);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                faqPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showContentSearch(String[] tokenSplit) {
        if (contentSearchView == null) {
            Log.info("AppController contentSearchView == null ");
            contentSearchView = new ContentSearchViewImpl(appMenu);
        }
        final ContentSearchPresenter contentSearchPresenter = new ContentSearchPresenter(contentSearchView, this,
                tokenSplit.length > 1 ? tokenSplit[1] : null);
        Log.info("AppController Tokens.CONTENT_SEARCH ");
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                contentSearchPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showContentNotFound() {
        Log.info("AppController Tokens.ERROR ");
        if (contentNotFound == null) {
            contentNotFound = new ContentNotFoundImpl(appMenu);
        }
        final ContentNotFoundPresenter contentNotFoundPresenter = new ContentNotFoundPresenter(contentNotFound,
                this);
        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                contentNotFoundPresenter.go(container, currentUserBean);
            }
        });
    }

    private void showLogOut() {
        Log.info("AppController Tokens.LOG_OUT ");

        if (welcomeView == null) {
            welcomeView = new WelcomeViewImpl(appMenu);
        }

        final WelcomePresenter welcomePresenter = new WelcomePresenter(welcomeView, this, null);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
            }

            public void onSuccess() {
                welcomePresenter.go(container, currentUserBean);
            }
        });
    }

    private void showProposalView(String token) {
        Global.moduleName = RDLConstants.Modules.IMPROVEMENTS;
        Log.info("AppController Tokens.PROPOSAL_VIEW");
        if (proposalView == null) {
            proposalView = new ImprovementViewImpl(currentUserBean, appMenu);
        }
        final ImprovementViewPresenter improvementViewPresenter = new ImprovementViewPresenter(proposalView, this,
                token);

        GWT.runAsync(new RunAsyncCallback() {
            public void onFailure(Throwable caught) {
                Log.info("AppController GWT.runAsync onFailure " + RDLConstants.Tokens.THREAD_VIEW);
            }

            public void onSuccess() {
                improvementViewPresenter.go(container, currentUserBean);
            }
        });
    }

    public AutoBean<CurrentUserBean> getCurrentUserBean() {
        return currentUserBean;
    }

    /**
     * sets the currentUserBean for the  view in the WelcomePresenter dologin method
     * the values below are all strings extracted from a simple form input
     *
     * @param name       String  for user name
     * @param email      String  for user email
     * @param state      boolean for state information
     * @param titleBeans user titles
     */
    public void setCurrentUserBean(String name, String email, boolean state, List<UserBean.TitleBean> titleBeans,
            boolean isRDLSupporter, String token, Integer rep, String dateCreated) {
        this.currentUserBean.as().setAuth(state);
        this.currentUserBean.as().setName(name);
        this.currentUserBean.as().setEmail(email);
        this.currentUserBean.as().setTitles(titleBeans);
        this.currentUserBean.as().setIsRDLSupporter(isRDLSupporter);
        this.currentUserBean.as().setToken(token);
        this.currentUserBean.as().setRep(rep);
        this.currentUserBean.as().setDateCreated(dateCreated);
    }

    /**
     * set in the RegisterPresenter onResponseReceived for  the server callback 'submitNewUser'
     * the values below are all strings extracted from a simple form input
     *
     * @param name  String for user name
     * @param email String for user email
     * @param state booleam for state information
     */
    public void setCurrentUserBean(String name, String email, boolean state, String token) {
        this.currentUserBean.as().setAuth(state);
        this.currentUserBean.as().setName(name);
        this.currentUserBean.as().setEmail(email);
        this.currentUserBean.as().setToken(token);
    }

    public HasWidgets getRootContainer() {
        return container;
    }

    public AppMenu getAppMenu() {
        return appMenu;
    }

    public RdlAbstractPresenter getDefaultPresenter() {
        return defaultPresenter;
    }
}