/** * Copyright (C) 2011 JTalks.org Team * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jtalks.jcommune.web.controller; import org.jtalks.common.model.entity.User; import org.jtalks.jcommune.model.entity.JCUser; import org.jtalks.jcommune.model.entity.SimplePage; import org.jtalks.jcommune.service.SimplePageService; import org.jtalks.jcommune.service.UserService; import org.jtalks.jcommune.service.dto.SimplePageInfoContainer; import org.jtalks.jcommune.plugin.api.exceptions.NotFoundException; import org.jtalks.jcommune.web.dto.SimplePageDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; /** * Controller for simple pages * * @author Scherbakov Roman * @author Alexander Gavrikov */ @Controller public class SimplePageController { static final String PAGE_NOT_FOUND = "simplePageNotFound"; private static final String PAGE_DTO = "simplePageDto"; static final String PAGE_PATH_NAME = "pagePathName"; static final String CURRENT_USER_PARAMETER = "currentUser"; private SimplePageService simplePageService; private UserService userService; /** * This method turns the trim binder on. Trim binder * removes leading and trailing spaces from the submitted fields. * So, it ensures, that all validations will be applied to * trimmed field values only. * * @param binder Binder object to be injected */ @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } /** * @param simplePageService the object which provides actions on {@link SimplePage} entity */ @Autowired public SimplePageController(SimplePageService simplePageService, UserService userService) { this.simplePageService = simplePageService; this.userService = userService; } /** * Show a page information by its path name. * * @param pagePathName address in browser which associated with current simple page * @return {@code ModelAndView} object with 'simplePage' view with data from {@link SimplePageDto} */ @RequestMapping(value = "/pages/{pagePathName}", method = RequestMethod.GET) public ModelAndView showPage(@PathVariable(PAGE_PATH_NAME) String pagePathName) { checkPermissionToCreateAndEditPage(); SimplePage page = null; try { page = simplePageService.getPageByPathName(pagePathName); } finally { if (page != null) { SimplePageDto pageDto = new SimplePageDto(page); return new ModelAndView("simplePage") .addObject(PAGE_DTO, pageDto) .addObject("simplePage", page); } else { return new ModelAndView(PAGE_NOT_FOUND) .addObject(PAGE_PATH_NAME, pagePathName) .addObject(CURRENT_USER_PARAMETER, userService.getCurrentUser()); } } } /** * Show a form in browser for edit page information and content in {@link SimplePage} entity * associated with address in browser * * @param pagePathName address in browser which associated with current {@link SimplePage} * @return {@code ModelAndView} object with 'simplePageEditor' view filled with data from {@link SimplePageDto} * @throws NotFoundException when page was not found or not exist */ @RequestMapping(value = "/pages/{pagePathName}/edit", method = RequestMethod.GET) public ModelAndView showEditPage(@PathVariable(PAGE_PATH_NAME) String pagePathName) throws NotFoundException { checkPermissionToCreateAndEditPage(); SimplePage page = simplePageService.getPageByPathName(pagePathName); SimplePageDto pageDto = new SimplePageDto(page); return new ModelAndView("simplePageEditor") .addObject(PAGE_DTO, pageDto); } /** * Check permissions to edit or create simple(static) pages. */ private void checkPermissionToCreateAndEditPage() { User currentUser = userService.getCurrentUser(); userService.checkPermissionToCreateAndEditSimplePage(currentUser.getId()); } /** * Change name or/and content of page associated with pagePathName * * @param simplePageDto Dto with entered data * @param result Validation result * @param pagePathName address in browser which associated with current simple page * @return {@code ModelAndView} object with redirect to edited page if saved successfully * or show form with error message * @throws NotFoundException when page was not found or not exist */ @RequestMapping(value = "/pages/{pagePathName}/edit", method = RequestMethod.POST) public ModelAndView update(@Valid @ModelAttribute SimplePageDto simplePageDto, BindingResult result, @PathVariable(PAGE_PATH_NAME) String pagePathName) throws NotFoundException { if (result.hasErrors()) { return new ModelAndView("simplePageEditor") .addObject(PAGE_PATH_NAME, pagePathName); } SimplePageInfoContainer simplePageInfoContainer = simplePageDto.getSimplePageInfoContainer(); simplePageService.updatePage(simplePageInfoContainer); return new ModelAndView("redirect:/pages/" + pagePathName); } @RequestMapping(value = "/pages/create/{pagePathName}", method = RequestMethod.GET) public ModelAndView createPage(@PathVariable(PAGE_PATH_NAME) String pagePathName) { SimplePage simplePage = new SimplePage(); simplePage.setName("Title"); simplePage.setContent("Content"); simplePage.setPathName(pagePathName); JCUser userCreator = userService.getCurrentUser(); simplePageService.createPage(simplePage, userCreator); SimplePageDto simplePageDto = new SimplePageDto(simplePage); return new ModelAndView("simplePageEditor") .addObject(PAGE_DTO, simplePageDto); } }