cz.swi2.mendeluis.app.web.controllers.PortletsController.java Source code

Java tutorial

Introduction

Here is the source code for cz.swi2.mendeluis.app.web.controllers.PortletsController.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 cz.swi2.mendeluis.app.web.controllers;

import cz.swi2.mendeluis.dataaccesslayer.domain.Placement;
import cz.swi2.mendeluis.dataaccesslayer.domain.User;
import cz.swi2.mendeluis.dto.PortletDTO;
import cz.swi2.mendeluis.dto.UserDTO;
import cz.swi2.mendeluis.dto.UserPortletCreateDTO;
import cz.swi2.mendeluis.dto.UserPortletDTO;
import cz.swi2.mendeluis.dto.UserPortletEditDTO;
import cz.swi2.mendeluis.service.config.ServiceConfiguration;
import cz.swi2.mendeluis.facade.IPortletFacade;
import cz.swi2.mendeluis.facade.IUserFacade;
import cz.swi2.mendeluis.facade.IUserPortletFacade;
import cz.swi2.mendeluis.service.UserService;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
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.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.util.UriComponentsBuilder;

/**
 * A list of user portlets + edit info form + attaching new portlet. 
 *
 * @author ivo
 */
@Controller
@RequestMapping("/portlets")
@ComponentScan(basePackages = "cz.swi2.mendeluis.service")
public class PortletsController {

    final static Logger log = LoggerFactory.getLogger(PortletsController.class);

    @Autowired
    IPortletFacade portletFacade;

    @Autowired
    IUserPortletFacade userPortletFacade;

    @Autowired
    IUserFacade userFacade;

    /* --- LIST --- */

    /**
     * Shows a list of portlets attached to the current user. 
     */
    @RequestMapping(value = "", method = RequestMethod.GET)
    public String index(Model model, Principal principal) {

        UserDTO user = userFacade.getLoggedUser();

        List<UserPortletDTO> userPortletDTOs = userPortletFacade.getAllUserPortlets(user);

        List<UserPortletDTO> results = new ArrayList<>();
        for (UserPortletDTO p : userPortletDTOs) {
            results.add(p);
        }

        model.addAttribute("portlets", results);
        return "portlets/list";
    }

    /**
     * Remove the attached portlet from the current user. 
     */
    @PreAuthorize("hasPermission(#id, 'UserPortlet', 'isOwner')")
    @RequestMapping(value = "remove/{id}", method = RequestMethod.GET)
    public String remove(@PathVariable int id, RedirectAttributes redirectAttributes, Principal principal) {

        userPortletFacade.deleteUserPortlet(id);

        redirectAttributes.addFlashAttribute("alert_success", "Portlet was detached.");
        return "redirect:/portlets/";
    }

    /**
     * Set the user portlet visibility. 
     */
    @PreAuthorize("hasPermission(#id, 'UserPortlet', 'isOwner')")
    @RequestMapping(value = "setVisibility/{id}", params = { "hidden" }, method = RequestMethod.GET)
    public String setVisibility(@PathVariable int id, @RequestParam(value = "hidden") int hidden,
            RedirectAttributes redirectAttributes, Principal principal) {
        UserPortletDTO up = userPortletFacade.getUserPortletWithId(id);
        userPortletFacade.setVisibility(up, (hidden == 1));

        if (hidden == 1) {
            redirectAttributes.addFlashAttribute("alert_success", "Portlet is hidden.");
        } else {
            redirectAttributes.addFlashAttribute("alert_success", "Portlet is now visible.");
        }

        return "redirect:/portlets/";
    }

    /**
     * Move the portlet in the given direction. 
     */
    @PreAuthorize("hasPermission(#id, 'UserPortlet', 'isOwner')")
    @RequestMapping(value = "move/{id}", params = { "direction" }, method = RequestMethod.GET)
    public String move(@PathVariable int id, @RequestParam(value = "direction") String direction,
            RedirectAttributes redirectAttributes, Principal principal) {

        UserPortletDTO up = userPortletFacade.getUserPortletWithId(id);

        if (direction.equals("up")) {
            userPortletFacade.moveUp(up);
        } else if (direction.equals("down")) {
            userPortletFacade.moveDown(up);
        }

        return "redirect:/portlets/";
    }

    /* --- DETAIL: UPDATE --- */

    /**
     * Shows portlet edit form. 
     */
    @PreAuthorize("hasPermission(#id, 'UserPortlet', 'isOwner')")
    @RequestMapping(value = "detail/{id}", method = RequestMethod.GET)
    public String detail(@PathVariable int id, RedirectAttributes redirectAttributes, Model model,
            Principal principal) {

        UserPortletDTO up = userPortletFacade.getUserPortletWithId(id);

        UserPortletEditDTO upd = new UserPortletEditDTO();
        upd.setId(up.getId());
        upd.setDescription(up.getDescription());
        upd.setHidden(up.isHidden());
        upd.setPlacement(up.getPlacement());

        model.addAttribute("isAdding", false);
        model.addAttribute("portlet", up.getPortlet());
        model.addAttribute("userPortletEditDTO", upd);

        return "portlets/detail";
    }

    /**
     * Handles submit of the portlet edit form. 
     */
    @PreAuthorize("hasPermission(#userPortletEditDTO.id, 'UserPortlet', 'isOwner')")
    @RequestMapping(value = "detail/{id}", method = RequestMethod.POST)
    public String detail(@Valid @ModelAttribute("userPortletEditDTO") UserPortletEditDTO userPortletEditDTO,
            BindingResult bindingResult, RedirectAttributes redirectAttributes, UriComponentsBuilder uriBuilder,
            Principal principal) {

        UserPortletDTO up = userPortletFacade.getUserPortletWithId(userPortletEditDTO.getId());

        if (bindingResult.hasErrors()) {
            redirectAttributes.addFlashAttribute("alert_danger", "Some data were not filled!");
            return "redirect:/portlets/";
        }

        // update
        userPortletFacade.updateInfo(userPortletEditDTO.getId(), userPortletEditDTO.getDescription(),
                userPortletEditDTO.getPlacement(), userPortletEditDTO.isHidden());

        redirectAttributes.addFlashAttribute("alert_success", "Portlet was successfully modified.");

        return "redirect:/portlets/";

    }

    /* --- DETAIL: ADD --- */

    /**
     * Shows a list of pre-defined portlets. 
     */
    @RequestMapping(value = "add", method = RequestMethod.GET)
    public String add(Model model, Principal principal) {
        List<PortletDTO> portletDTOs = portletFacade.getAllPortlets();
        model.addAttribute("portlets", portletDTOs);
        return "portlets/choose-portlet";
    }

    /**
     * Shows the adding form with options. 
     */
    @RequestMapping(value = "add/{id}", method = RequestMethod.GET)
    public String add(@PathVariable int id, Model model, Principal principal) {
        PortletDTO p = portletFacade.getPortletWithId(id);

        UserPortletCreateDTO upd = new UserPortletCreateDTO();
        upd.setDescription("");
        upd.setHidden(false);
        upd.setPlacement(Placement.LEFT);

        model.addAttribute("isAdding", true);
        model.addAttribute("portlet", p);
        model.addAttribute("userPortletCreateDTO", upd);

        return "portlets/detail";
    }

    /**
     * Finishes adding a new portlet. 
     */
    @RequestMapping(value = "add/{portletId}", method = RequestMethod.POST)
    public String add(@PathVariable int portletId,
            @Valid @ModelAttribute("userPortletCreateDTO") UserPortletCreateDTO userPortletCreateDTO,
            BindingResult bindingResult, RedirectAttributes redirectAttributes, UriComponentsBuilder uriBuilder,
            Principal principal) {
        UserDTO user = userFacade.getLoggedUser();

        if (bindingResult.hasErrors()) {
            redirectAttributes.addFlashAttribute("alert_danger", "Some data were not filled!");
            return "redirect:/portlets/add/" + portletId;
        }

        // add
        PortletDTO port = portletFacade.getPortletWithId(portletId);
        UserPortletDTO upd = new UserPortletDTO();

        upd.setDescription(userPortletCreateDTO.getDescription());
        upd.setHidden(userPortletCreateDTO.isHidden());
        upd.setPlacement(userPortletCreateDTO.getPlacement());
        upd.setUser(user);
        upd.setPortlet(port);

        userPortletFacade.createUserPortlet(upd);

        // redirect
        redirectAttributes.addFlashAttribute("alert_success", "Portlet was successfully added.");

        return "redirect:/portlets/";

    }

}