org.statefulj.webapp.controller.UserController.java Source code

Java tutorial

Introduction

Here is the source code for org.statefulj.webapp.controller.UserController.java

Source

/***
 * 
 * Copyright 2014 Andrew Hall
 *
 * 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.
 * 
 */
package org.statefulj.webapp.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.text.WordUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.statefulj.framework.core.annotations.StatefulController;
import org.statefulj.framework.core.annotations.Transition;
import org.statefulj.framework.core.annotations.Transitions;
import org.statefulj.webapp.controller.exceptions.DuplicateUserException;
import org.statefulj.webapp.form.RegistrationForm;
import org.statefulj.webapp.model.User;

import static org.statefulj.webapp.model.User.*;

import org.statefulj.webapp.services.UserService;
import org.statefulj.webapp.services.UserSessionService;

@StatefulController(clazz = User.class, startState = UNREGISTERED, finderId = "userSessionService")
public class UserController {

    // Events
    //
    final String HOMEPAGE_EVENT = "springmvc:/";
    final String LOGIN_PAGE_EVENT = "springmvc:/login";
    final String DETAILS_PAGE_EVENT = "springmvc:/user";
    final String REGISTRATION_PAGE_EVENT = "springmvc:/registration";
    final String CONFIRMATION_PAGE_EVENT = "springmvc:/confirmation";
    final String LOAN_PAGE_EVENT = "springmvc:/accounts/loan";
    final String SAVINGS_PAGE_EVENT = "springmvc:/accounts/savings";
    final String CHECKING_PAGE_EVENT = "springmvc:/accounts/checking";

    final String REGISTER_EVENT = "springmvc:post:/registration";
    final String CONFIRMATION_EVENT = "springmvc:post:/user/confirmation";
    final String DELETE_EVENT = "springmvc:/user/delete";

    final String SUCCESSFUL_CONFIRMATION_EVENT = "successful-confirmation";

    @Resource
    UserService userService;

    @Resource
    UserSessionService userSessionService;

    // -- UNREGISTERED -- //

    @Transition(from = UNREGISTERED, event = HOMEPAGE_EVENT)
    public String homePage() {
        return "index";
    }

    @Transition(from = UNREGISTERED, event = LOGIN_PAGE_EVENT)
    public String loginPage() {
        return "login";
    }

    @Transition(from = UNREGISTERED, event = REGISTRATION_PAGE_EVENT)
    public String registrationPage() {
        return "registration";
    }

    @Transition(from = UNREGISTERED, event = REGISTER_EVENT, to = REGISTERED_UNCONFIRMED)
    public String newUser(User user, String event, HttpServletRequest request, @Valid RegistrationForm regForm,
            BindingResult result, Model model) {

        // If the Registration Form is invalid, display the Registration Form
        //
        if (result.hasErrors() || !regForm.getPassword().equals(regForm.getPasswordConfirmation())) {
            model.addAttribute("message", "Ooops... Try again");
            model.addAttribute("reg", regForm);
            return "registration";
        } else {

            // Copy from Registration Form to the User
            //
            user.setFirstName(regForm.getFirstName());
            user.setLastName(regForm.getLastName());
            user.setEmail(regForm.getEmail());
            user.setPassword(regForm.getPassword());
            user.setToken(RandomUtils.nextInt(1, 99999999));

            // Save to the db - if there is a problem, fail before logging in
            //
            try {
                userService.save(user);
            } catch (DuplicateKeyException e) {
                throw new DuplicateUserException();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            // Login the newly registered User
            //
            userSessionService.login(request.getSession(), user);

            // Redirect to confirmation page
            //
            return "redirect:/confirmation";
        }
    }

    // -- REGISTERED_UNCONFIRMED -- //

    @Transition(from = REGISTERED_UNCONFIRMED, event = DETAILS_PAGE_EVENT)
    public String redirectToConfirmation(User user) {
        return "redirect:/confirmation";
    }

    @Transition(from = REGISTERED_UNCONFIRMED, event = CONFIRMATION_PAGE_EVENT)
    public String confirmationPage(User user, String event, Model model) {
        model.addAttribute("user", user);
        return "confirmation";
    }

    @Transition(from = REGISTERED_UNCONFIRMED, event = CONFIRMATION_EVENT)
    public String confirmUser(User user, String event, @RequestParam int token) {

        // If a valid token, emit a "successful-confirmation" event, this will
        // transition the User into a REGISTERED_CONFIRMED state
        //
        if (user.getToken() == token) {
            return "event:" + SUCCESSFUL_CONFIRMATION_EVENT;
        } else {
            return "redirect:/user?msg=bad+token";
        }
    }

    @Transitions({
            // If we get a "successful-confirmation" event, transition into REGISTERD_CONFIRMED
            //
            @Transition(from = REGISTERED_UNCONFIRMED, event = SUCCESSFUL_CONFIRMATION_EVENT, to = REGISTERED_CONFIRMED),

            // If we're logged in, don't display either login or registration pages
            //
            @Transition(event = HOMEPAGE_EVENT), @Transition(event = LOGIN_PAGE_EVENT),
            @Transition(event = REGISTRATION_PAGE_EVENT) })
    public String redirectToUser() {
        return "redirect:/user";
    }

    @Transition(from = REGISTERED_CONFIRMED, event = CONFIRMATION_PAGE_EVENT)
    public String redirectToUser(User user, String event, Model model) {
        return "redirect:/user";
    }

    // -- REGISTERED_CONFIRMED -- //

    @Transition(from = REGISTERED_CONFIRMED, event = DETAILS_PAGE_EVENT)
    public String userPage(User user, String event, Model model) {
        model.addAttribute("user", user);
        model.addAttribute("event", event);
        return "user";
    }

    @Transitions({ @Transition(from = REGISTERED_CONFIRMED, event = LOAN_PAGE_EVENT),
            @Transition(from = REGISTERED_CONFIRMED, event = SAVINGS_PAGE_EVENT),
            @Transition(from = REGISTERED_CONFIRMED, event = CHECKING_PAGE_EVENT) })
    public String createAccountForm(User user, String event, Model model) {
        String createAccountUri = "/accounts";
        String[] parts = event.split("/");
        String type = WordUtils.capitalize(parts[2]);

        model.addAttribute("createAccountUri", createAccountUri);
        model.addAttribute("type", type);

        return "createAccount";
    }

    @Transition(from = REGISTERED_CONFIRMED, event = DELETE_EVENT, to = DELETED)
    public String deleteUser(User user, String event) {
        return "redirect:/logout";
    }

    // -- Error Handling -- //

    @ExceptionHandler(DuplicateUserException.class)
    public ModelAndView handleError(DuplicateUserException e) {
        ModelAndView mv = new ModelAndView();
        mv.getModel().put("message", "Ooops... That User is already registered.  Try a different email");
        mv.getModel().put("reg", new RegistrationForm());
        return mv;
    }
}