com.local.ask.controller.spring.PostController.java Source code

Java tutorial

Introduction

Here is the source code for com.local.ask.controller.spring.PostController.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.local.ask.controller.spring;

import com.local.ask.exception.UrlException;
import com.local.ask.form.AnswerForm;
import com.local.ask.form.PollChoiceForm;
import com.local.ask.form.QuestionForm;
import com.local.ask.model.Answer;
import com.local.ask.model.PollVote;
import com.local.ask.model.Question;
import com.local.ask.model.User;
import javax.validation.Valid;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.apache.shiro.session.Session;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 *
 * @author Olayinka
 */
@Controller
public class PostController extends BaseController {

    @RequestMapping(value = "/post/question/{id}", method = RequestMethod.GET)
    public String loadQuestion(@PathVariable int id, Model m) throws UrlException {
        if (!SecurityUtils.getSubject().hasRole("user")) {
            SecurityUtils.getSubject().getSession().setAttribute("fallBack", "/post/question/" + id);
        }
        Question q = dbHelper.getQuestion(id);
        if (q == null || !q.isQuestion()) {
            throw new UrlException("This question doesn't exist");
        }
        m.addAttribute("question", q);
        m.addAttribute("tags", q.getTagUseds());
        Session session = SecurityUtils.getSubject().getSession();
        if (session.getAttribute("seen_" + q.getId()) == null) {
            q.setViewCount(q.getViewCount() + 1);
            dbHelper.updateQuestion(q);
            session.setAttribute("seen_" + q.getId(), true);
        }
        if (session.getAttribute("answerForm" + id) == null) {
            m.addAttribute("answerForm", new AnswerForm());
        } else {
            m.addAttribute("answerForm", session.getAttribute("answerForm" + id));
        }

        m.addAttribute("qtag", true);
        m.addAttribute("isUsersQuestion", false);
        if (SecurityUtils.getSubject().hasRole("user")) {
            User currentUser = dbHelper.getCurrentUser();

            if (currentUser != null && currentUser.getId().equals(q.getUser().getId())) {
                m.addAttribute("isUsersQuestion", true);
            }
        }
        return "question_page";
    }

    @RequestMapping(value = "/post/poll/{id}", method = RequestMethod.GET)
    public String loadPoll(@PathVariable int id, Model m) throws UrlException {
        if (!SecurityUtils.getSubject().hasRole("user")) {
            SecurityUtils.getSubject().getSession().setAttribute("fallBack", "/post/question/" + id);
        }
        Question q = dbHelper.getQuestion(id);
        if (q == null || q.isQuestion()) {
            throw new UrlException("This question doesn't exist");
        }
        Session session = SecurityUtils.getSubject().getSession();
        if (session.getAttribute("seen_" + q.getId()) == null) {
            q.setViewCount(q.getViewCount() + 1);
            session.setAttribute("seen_" + q.getId(), true);
            dbHelper.updateQuestion(q);
        }
        PollVote pollVote = dbHelper.getUserPollVote(q);
        if (pollVote != null) {
            m.addAttribute("hasVoted", true);
        } else {
            m.addAttribute("hasVoted", false);
        }
        m.addAttribute("question", q);
        m.addAttribute("tags", q.getTagUseds());
        m.addAttribute("pollChoiceForm", new PollChoiceForm());
        m.addAttribute("qtag", true);
        return "question_page";
    }

    @RequestMapping(value = "/post/question/{id}", method = RequestMethod.POST)
    public String submitAnswerForm(@PathVariable int id, @Valid AnswerForm answerForm, BindingResult result,
            Model m) throws UrlException {
        if (!SecurityUtils.getSubject().hasRole("user")) {
            SecurityUtils.getSubject().getSession().setAttribute("fallBack", "/post/question/" + id);
            SecurityUtils.getSubject().getSession().setAttribute("answerForm", answerForm);
            return REDIRECT + "/login";
        }
        if (result.hasErrors()) {
            SecurityUtils.getSubject().getSession().setAttribute("answerForm" + id, answerForm);
            System.out.println(answerForm.toString());
        }
        dbHelper.addAnswer(id, answerForm.getBody());
        return loadQuestion(id, m);
    }

    @RequiresUser
    @RequestMapping(value = "/post/poll/{id}", method = RequestMethod.POST)
    public String submitPollForm(@PathVariable int id, PollChoiceForm pollChoiceForm, BindingResult result, Model m)
            throws UrlException {
        dbHelper.castPollVote(pollChoiceForm.getChoice());
        return loadPoll(id, m);
    }

    @RequestMapping(value = "/ask", method = RequestMethod.GET)
    public String loadAskForm(Model m) {
        return "ask_question";
    }

    @RequiresUser
    @RequestMapping(value = "/ask", method = RequestMethod.POST)
    public String loadAskForm(@Valid QuestionForm questionForm, BindingResult result, Model m) {
        if (result.hasErrors()) {
            return "ask_question";
        } else {
            dbHelper.addPost(questionForm);
            return REDIRECT_HOME;
        }
    }

    @RequiresUser
    @RequestMapping(value = "accept/{qId}/{aId}")
    public String acceptAnswer(@PathVariable Integer qId, @PathVariable Integer aId, Model m) {
        User user = dbHelper.getCurrentUser();
        Question question = dbHelper.getQuestion(qId);
        Answer answer = dbHelper.getAnswer(aId);
        if (answer != null && question != null && user.getId().equals(question.getUser().getId())
                && question.getId().equals(answer.getQuestion().getId()) && !question.isSolved()) {
            answer.setStatus(Integer.valueOf(-1).byteValue());
            question.setStatus("SOLVED");
            dbHelper.updateAnswer(answer);
            dbHelper.updateQuestion(question);
        }
        return REDIRECT + "/post/question/" + qId;
    }

}