/**
* Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, 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 java.io.IOException;
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.EUpdateStrategy;
import com.autoupdater.server.models.Package;
import com.autoupdater.server.models.Update;
/**
* Responsible for rendering updates panel.
*
* @FIXME repair saving file to database
*/
@Controller
@RequestMapping(value = "/updates")
@SessionAttributes({ "newUpdate", "update" })
public final class UpdatesController extends AppController {
/**
* Controller's logger.
*/
private static final Logger logger = getLogger(UpdatesController.class);
/**
* Renders list of packages.
*
* Let JSF run /views/updates/index.jsp on GET /server/updates/{packageID}
* request.
*
* @param packageID
* package's ID
* @param model
* passed updates model
* @return facelet name
*/
@RequestMapping(value = "/{packageID}", method = GET)
public String index(@PathVariable("packageID") int packageID, Model model) {
logger.debug("Received request: GET /updates/" + packageID);
Package _package = packageService.findById(packageID);
model.addAttribute("thePackage", _package);
model.addAttribute("updates", _package.getUpdates());
logger.debug("Renders request: GET /updates/" + packageID);
return "updates/index";
}
/**
* Renders new update form.
*
* Let JSF run /views/updates/new.jsp on GET /server/updates/add/{packageID}
* request.
*
* @param packageID
* package's ID
* @param model
* passed update model
* @return facelet name
*/
@RequestMapping(value = "/add/{packageID}", method = GET)
public String createForm(@PathVariable("packageID") int packageID, Model model) {
logger.debug("Received request: GET /updates/add/" + packageID);
Update update = new Update();
update.setUploader(getCurrentUser());
update.setThePackage(packageService.findById(packageID));
model.addAttribute("newUpdate", update);
model.addAttribute("updateTypes", EUpdateStrategy.values());
logger.debug("Renders request: GET /updates/add/" + packageID);
return "updates/new";
}
/**
* Saves new update.
*
* Creates update and redirects to /updates/{packageID} on POST
* /server/updates/add request.
*
* On errors let JSF run /views/packages/new.jsp.
*
* @param update
* update to be created
* @param result
* validation result
* @param model
* passed model
* @return facelet name or redirect
*/
@RequestMapping(value = "/add", method = POST)
public String create(@Valid @ModelAttribute(value = "newUpdate") Update update,
BindingResult result, Model model) {
logger.debug("Received request: POST /updates/add");
if (result.hasErrors()) {
model.addAttribute("newUpdate", update);
model.addAttribute("updateTypes", EUpdateStrategy.values());
logger.debug("Renders request: POST /updates/add (validation failed)");
return "updates/new";
}
try {
updateService.persist(update);
} catch (IOException e) {
model.addAttribute("newUpdate", update);
model.addAttribute("updateTypes", EUpdateStrategy.values());
logger.error("Renders request: POST /updates/add (file save failed)");
return "updates/new";
}
logger.debug("Redirect to /updates/" + update.getThePackage().getId() + " (Update created)");
return "redirect:" + update.getThePackage().getId();
}
/**
* Renders form to edit existing package.
*
* Let JSF run /views/updates/edit.jsp on GET /server/updates/edit/{id}
* request.
*
* @param id
* updates's ID
* @param model
* passed updates model
* @return facelet name
*/
@RequestMapping(value = "/edit/{id}", method = GET)
public String editForm(@PathVariable("id") int id, Model model) {
logger.debug("Received request: GET /updates/edit/" + id);
model.addAttribute("update", updateService.findById(id));
model.addAttribute("updateTypes", EUpdateStrategy.values());
logger.debug("Renders request: GET /updates/edit/" + id);
return "updates/edit";
}
/**
* Saves changes.
*
* Let JSF run /views/updates/edit.jsp on POST /server/packages/edit/[id]
* request.
*
* On errors let JSF run /views/updates/edit.jsp.
*
* @param update
* update
* @param result
* validation result
* @param model
* passed model
* @return facelet name or redirect
*/
@RequestMapping(value = "/edit", method = POST)
public String edit(@Valid @ModelAttribute(value = "update") Update update,
BindingResult result, Model model) {
logger.debug("Received request: POST /updates/edit");
if (result.hasErrors()) {
model.addAttribute("update", update);
model.addAttribute("updateTypes", EUpdateStrategy.values());
logger.debug("Renders request: POST /updates/edit (validation failed)");
return "updates/edit";
}
updateService.merge(update);
logger.debug("Redirect to /updates/" + update.getThePackage().getId() + " (Update updated)");
return "redirect:" + update.getThePackage().getId();
}
/**
* Deletes update.
*
* @param id
* update's ID
* @param model
* model
* @return facelet name
*/
@RequestMapping(value = "/delete/{id}", method = GET)
public String delete(@PathVariable("id") int id, Model model) {
logger.debug("Received request: GET /updates/delete/" + id);
Update update = updateService.findById(id);
int packageID = update.getThePackage().getId();
updateService.remove(update);
logger.debug("Redirect to /updates/" + update.getThePackage().getId() + " (Update deleted)");
return "redirect:./../" + packageID;
}
/**
* Filters values passed to command object "newUpdate".
*
* @param binder
* binder that will bind sent information to command object
*/
@InitBinder("newUpdate")
public void configureBinderOfNewUpdates(WebDataBinder binder) {
logger.debug("Securing \"newUpdate\" modelAttribute");
binder.setAllowedFields("version", "developmentVersion", "changelog", "type",
"relativePath", "updaterCommand", "file");
}
/**
* Filters values passed to command object "update".
*
* @param binder
* binder that will bind sent information to command object
*/
@InitBinder("update")
public void configureBinderOfUpdates(WebDataBinder binder) {
logger.debug("Securing \"update\" modelAttribute");
binder.setAllowedFields("version", "developmentVersion", "changelog", "type",
"relativePath", "updaterCommand");
}
}