de.appsolve.padelcampus.controller.RootController.java Source code

Java tutorial

Introduction

Here is the source code for de.appsolve.padelcampus.controller.RootController.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 de.appsolve.padelcampus.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.appsolve.padelcampus.constants.ModuleType;
import de.appsolve.padelcampus.data.JSEvent;
import de.appsolve.padelcampus.data.Mail;
import de.appsolve.padelcampus.db.dao.EventDAOI;
import de.appsolve.padelcampus.db.dao.ModuleDAOI;
import de.appsolve.padelcampus.db.dao.PageEntryDAOI;
import de.appsolve.padelcampus.db.model.Event;
import de.appsolve.padelcampus.db.model.Module;
import de.appsolve.padelcampus.db.model.PageEntry;
import de.appsolve.padelcampus.exceptions.ResourceNotFoundException;
import org.apache.log4j.Logger;
import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import static de.appsolve.padelcampus.constants.Constants.BLOG_PAGE_SIZE;
import static de.appsolve.padelcampus.constants.Constants.PATH_HOME;
import static org.springframework.web.bind.annotation.RequestMethod.POST;

/**
 * @author dominik
 */
@Controller()
@RequestMapping()
public class RootController extends BaseController {

    private static final Logger LOG = Logger.getLogger(RootController.class);

    @Autowired
    ModuleDAOI moduleDAO;

    @Autowired
    EventDAOI eventDAO;

    @Autowired
    PageEntryDAOI pageEntryDAO;

    @Autowired
    ObjectMapper objectMapper;

    @RequestMapping("/")
    public ModelAndView getIndex(HttpServletRequest request) {
        String userAgent = request.getHeader(HttpHeaders.USER_AGENT);
        if (!StringUtils.isEmpty(userAgent) && userAgent.startsWith("ProPadel")) {
            return getHomePage();
        }
        HttpSession session = request.getSession(true);
        Object landingPageChecked = session.getAttribute("LANDINGPAGE_PAGE_CHECKED");
        if (landingPageChecked == null) {
            List<Module> modules = moduleDAO.findByModuleType(ModuleType.LandingPage);
            if (!modules.isEmpty()) {
                Module landingPageModule = modules.get(0);
                List<PageEntry> rootEntries = pageEntryDAO.findByModule(landingPageModule);
                if (!rootEntries.isEmpty()) {
                    ModelAndView mav = new ModelAndView("root");
                    mav.addObject("Module", landingPageModule);
                    mav.addObject("PageEntries", rootEntries);
                    mav.addObject("skipNavbar", true);
                    return mav;
                }
            }
        }
        return getHomePage();
    }

    @RequestMapping("/{moduleId}")
    public ModelAndView getIndex(@PathVariable("moduleId") String moduleTitle,
            @PageableDefault(size = BLOG_PAGE_SIZE) Pageable pageable) {
        switch (moduleTitle) {
        case "autodisover":
        case "serviceworker":
        case "apple-app-site-association":
        case ".well-known":
            return new ModelAndView("error/404");
        case PATH_HOME:
        case "netbeans-tomcat-status-test":
            return getHomePage();
        default:
            return getModuleView(moduleTitle, pageable);
        }
    }

    @RequestMapping(method = POST)
    public ModelAndView postIndex(HttpServletRequest request,
            @PageableDefault(size = BLOG_PAGE_SIZE) Pageable pageable, @PathVariable("moduleId") String moduleTitle,
            @ModelAttribute("Mail") Mail mail, BindingResult bindingResult) {
        ModelAndView defaultView = getModuleView(moduleTitle, pageable);
        return sendMail(request, defaultView, mail, bindingResult);
    }

    private ModelAndView getHomePage() {
        ModelAndView mav = new ModelAndView("index");
        mav.addObject("Mail", new Mail());
        List<Module> modules = moduleDAO.findByModuleType(ModuleType.HomePage);
        if (!modules.isEmpty()) {
            Module homePageModule = modules.get(0);
            mav.addObject("Module", homePageModule);
            addPageEntries(homePageModule, mav);
        }
        return mav;
    }

    private ModelAndView getModuleView(String moduleTitle, Pageable pageable) {
        Module module = moduleDAO.findByUrlTitle(moduleTitle);
        if (module == null) {
            LOG.error("Module does not exist: " + moduleTitle);
            throw new ResourceNotFoundException();
        }
        switch (module.getModuleType()) {
        case Blog:
            ModelAndView blogView = new ModelAndView("blog/index");
            Page<PageEntry> page = pageEntryDAO.findByModule(module, pageable);
            blogView.addObject("PageEntries", page.getContent());
            blogView.addObject("Page", page);
            blogView.addObject("Module", module);
            return blogView;
        default:
            ModelAndView mav = new ModelAndView("page/index");
            addPageEntries(module, mav);
            mav.addObject("Module", module);
            mav.addObject("Mail", new Mail());
            return mav;
        }
    }

    private void addPageEntries(Module module, ModelAndView mav) {
        List<PageEntry> pageEntries = pageEntryDAO.findByModule(module);
        mav.addObject("PageEntries", pageEntries);
        for (PageEntry pageEntry : pageEntries) {
            if (pageEntry.getShowEventCalendar()) {
                List<Event> events = eventDAO.findAllActiveStartingWith(LocalDate.now());
                List<JSEvent> jsEvents = new ArrayList<>();
                for (Event event : events) {
                    jsEvents.add(new JSEvent(event));
                }
                try {
                    mav.addObject("Events", objectMapper.writeValueAsString(jsEvents));
                } catch (JsonProcessingException e) {
                    LOG.error(e);
                }
                break;
            }
            if (pageEntry.getShowEventOverview()) {
                LocalDate today = LocalDate.now();
                List<Event> currentEvents = eventDAO.findAllActiveStartingWith(today);
                Map<Integer, ArrayList<Event>> eventMap = new TreeMap<>();
                for (Event event : currentEvents) {
                    int monthOfYear = event.getStartDate().getMonthOfYear() - 1;
                    if (eventMap.get(monthOfYear) == null) {
                        eventMap.put(monthOfYear, new ArrayList<>());
                    }
                    eventMap.get(monthOfYear).add(event);
                }

                // add passed events of current month AFTER upcoming events of current month
                LocalDate firstOfMonth = today.withDayOfMonth(1);
                int currentMonth = firstOfMonth.getMonthOfYear() - 1;
                List<Event> passedEvents = eventDAO.findAllActiveStartingWithEndingBefore(firstOfMonth, today);
                if (passedEvents != null && !passedEvents.isEmpty()) {
                    if (eventMap.get(currentMonth) == null) {
                        eventMap.put(currentMonth, new ArrayList<>());
                    }
                    eventMap.get(currentMonth).addAll(passedEvents);
                }

                mav.addObject("EventMap", eventMap);
                mav.addObject("Today", today);
            }
        }
    }
}