com.autoupdater.server.controllers.PackagesController.java Source code

Java tutorial

Introduction

Here is the source code for com.autoupdater.server.controllers.PackagesController.java

Source

/**
 * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Pawe Kdzia, Mateusz Kubuszok
 *
 * <p>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</p> 
 * 
 * <p>http://www.apache.org/licenses/LICENSE-2.0</p>
 *
 * <p>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.</p>
 */
package com.autoupdater.server.controllers;

import static org.apache.log4j.Logger.getLogger;
import static org.springframework.web.bind.annotation.RequestMethod.*;

import javax.validation.Valid;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
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.SessionAttributes;

import com.autoupdater.server.models.Package;
import com.autoupdater.server.models.Program;

/**
 * Responsible for handling package panel.
 */
@Controller
@SessionAttributes({ "_package" })
@RequestMapping(value = "/packages")
public final class PackagesController extends AppController {
    /**
     * Controller's logger.
     */
    private static final Logger logger = getLogger(PackagesController.class);

    /**
     * Renders list of packages.
     * 
     * Let JSF run /views/packages/index.jsp on GET /server/packages/{programID}
     * request.
     * 
     * @param programID
     *            program's ID
     * @param model
     *            passed model
     * @return facelet name
     */
    @RequestMapping(value = "/{id}", method = GET)
    public String index(@PathVariable("id") int programID, Model model) {
        logger.debug("Received request: GET /packages/" + programID);

        Program program = programService.findById(programID);
        model.addAttribute("packages", program != null ? program.getPackages() : packageService.findAll());
        model.addAttribute("program", program);

        logger.debug("Renders request: GET /packages/" + programID);
        return "packages/index";
    }

    /**
     * Renders new package form.
     * 
     * Let JSF run /views/packages/new.jsp on GET
     * /server/packages/add/{programID} request.
     * 
     * @param programID
     *            program's ID
     * @param model
     *            passed model
     * @return facelet name
     */
    @RequestMapping(value = "/add/{id}", method = GET)
    public String createForm(@PathVariable("id") int programID, Model model) {
        logger.debug("Received request: GET /programs/add/" + programID);

        Package _package = new Package();
        _package.setProgram(programService.findById(programID));

        model.addAttribute("_package", _package);

        logger.debug("Renders request: GET /packages/add/" + programID);
        return "packages/new";
    }

    /**
     * Saves new package.
     * 
     * Creates package and redirects to /packages/{programID} on POST
     * /server/packages/add request.
     * 
     * On errors let JSF run /views/packages/new.jsp.
     * 
     * @param _package
     *            package
     * @param result
     *            validation result
     * @param model
     *            passed model
     * @return facelet name or redirect
     */
    @RequestMapping(value = "/add", method = POST)
    public String create(@Valid @ModelAttribute(value = "_package") Package _package, BindingResult result,
            Model model) {
        logger.debug("Received request: POST /packages/add");

        if (result.hasErrors()) {
            model.addAttribute("_package", _package);

            logger.debug("Renders request: POST /packages/add (validation failed)");
            return "packages/new";
        }

        packageService.persist(_package);

        logger.debug("Redirect to /packages/" + _package.getProgram().getId() + " (Package created)");
        return "redirect:" + _package.getProgram().getId();
    }

    /**
     * Renders form to edit existing package.
     * 
     * Let JSF run /views/packages/edit.jsp on GET /server/packages/edit/{id}
     * request.
     * 
     * @param id
     *            package's ID
     * @param model
     *            passed model
     * @return facelet name
     */
    @RequestMapping(value = "/edit/{id}", method = GET)
    public String editForm(@PathVariable("id") int id, Model model) {
        logger.debug("Received request: GET /packages/edit/" + id);

        model.addAttribute("_package", packageService.findById(id));

        logger.debug("Renders request: GET /packages/edit/" + id);
        return "packages/edit";
    }

    /**
     * Saves changes.
     * 
     * Updates program and redirects to /packages/{programID} on POST
     * /server/packages/edit request.
     * 
     * On errors let JSF run /views/packages/edit.jsp.
     * 
     * @param _package
     *            package
     * @param result
     *            contains binding results for Package
     * @param model
     *            passed model
     * @return facelet name
     */
    @RequestMapping(value = "/edit", method = POST)
    public String edit(@Valid @ModelAttribute("_package") Package _package, BindingResult result, Model model) {
        logger.debug("Received request: POST /programs/edit");

        if (result.hasErrors()) {
            model.addAttribute("_package", _package);

            logger.debug("Renders request: POST /packages/edit (validation failed)");
            return "packages/edit";
        }

        packageService.merge(_package);

        logger.debug("Redirect to /packages/" + _package.getProgram().getId() + " (Package updated)");
        return "redirect:" + _package.getProgram().getId();
    }

    /**
     * Deletes program.
     * 
     * Deletes program and redirects to /packages on GET
     * /server/packages/delete/{id} request.
     * 
     * @param id
     *            package's ID
     * @param model
     *            passed model
     * @return facelet name
     */
    @RequestMapping(value = "/delete/{id}", method = GET)
    public String delete(@PathVariable("id") int id, Model model) {
        logger.debug("Received request: GET /packages/delete/" + id);

        Package _package = packageService.findById(id);
        int programID = _package.getProgram().getId();
        packageService.remove(_package);

        logger.debug("Redirect to /packages/" + programID + " (Package deleted)");
        return "redirect:./../" + programID;
    }

    /**
     * Filters values passed to command object "_package".
     * 
     * @param binder
     *            binder that will bind sent information to command object
     */
    @InitBinder("_package")
    public void configureBindingOfPackage(WebDataBinder binder) {
        logger.debug("Securing \"_package\" modelAttribute");
        binder.setAllowedFields("name");
    }
}