/*** * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource * All rights reserved. * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ package br.com.caelum.vraptor.musicjungle.controller; import javax.inject.Inject; import javax.validation.Valid; import br.com.caelum.vraptor.Controller; import br.com.caelum.vraptor.Get; import br.com.caelum.vraptor.Path; import br.com.caelum.vraptor.Post; import br.com.caelum.vraptor.Put; import br.com.caelum.vraptor.Result; import br.com.caelum.vraptor.musicjungle.dao.MusicDao; import br.com.caelum.vraptor.musicjungle.dao.UserDao; import br.com.caelum.vraptor.musicjungle.enums.MusicType; import br.com.caelum.vraptor.musicjungle.interceptor.Public; import br.com.caelum.vraptor.musicjungle.interceptor.UserInfo; import br.com.caelum.vraptor.musicjungle.model.Music; import br.com.caelum.vraptor.musicjungle.model.User; import br.com.caelum.vraptor.musicjungle.validation.LoginAvailable; import br.com.caelum.vraptor.validator.SimpleMessage; import br.com.caelum.vraptor.validator.Validator; /** * The resource <code>UsersController</code> handles all user * operations, such as adding new users, listing users, and so on. */ @Controller public class UsersController { private final Validator validator; private final Result result; private final UserDao userDao; private final UserInfo userInfo; private final MusicDao musicDao; /** * @deprecated CDI eyes only */ protected UsersController() { this(null, null, null, null, null); } /** * Receives dependencies through the constructor. * * @param factory dao factory. * @param userInfo info on the logged user. * @param result VRaptor result handler. * @param validator VRaptor validator. * @param userInfo */ @Inject public UsersController(UserDao dao, Result result, Validator validator, UserInfo userInfo, MusicDao musicDao) { this.userDao = dao; this.result = result; this.validator = validator; this.userInfo = userInfo; this.musicDao = musicDao; } /** * Accepts HTTP GET requests. * * URL: /home * View: /WEB-INF/jsp/user/home.jsp * * Shows user's home page containing his Music collection. */ @Get("/") public void home() { result.include("musicTypes", MusicType.values()); } /** * Accepts HTTP GET requests. * * URL: /users (only GET requests for this URL) * View: /WEB-INF/jsp/user/list.jsp * * Lists all users. */ @Get("/users") public void list() { result.include("users", userDao.listAll()); } /** * Accepts HTTP POST requests. * * URL: /users * View: /WEB-INF/jsp/user/add.jsp * * The "user" parameter will be populated with the request * parameters, for example: * * POST /user * user.name=Nico * user.login=555555 * * automatically populates the name and login parameters on * the user object with values Nico and 555555. * * Adds new users to the database. */ @Path("/users") @Post @Public public void add(@Valid @LoginAvailable User user) { validator.onErrorUsePageOf(HomeController.class).login(); userDao.add(user); // you can add objects to result even in redirects. Added objects will // survive one more request when redirecting. result.include("notice", "User " + user.getName() + " successfully added"); result.redirectTo(HomeController.class).login(); } /** * Accepts HTTP GET requests. * * URL: /users/{login} (for example, /users/john * shows information of the user with login john) * View: /WEB-INF/jsp/user/view.jsp * * Shows information on the specified user. * @param user */ @Path("/users/{user.login}") @Get public void show(User user) { result.include("user", userDao.find(user.getLogin())); //You can redirect to any page if you like. result.forwardTo("/WEB-INF/jsp/users/view.jsp"); } /** * Accepts HTTP PUT requests. <br> * * <strong>URL:</strong> /users/login/musics/id (for example, * /users/john/musics/3 adds the music with id 3 to the john's * collection)<br> * * <strong>View:</strong> redirects to user's home <br> * * You can use more than one variable on URI. Since the browsers * don't support PUT method you have to pass an additional parameter: * <strong>_method=PUT</strong> for calling this method.<br> * * This method adds a music to a user's collection. */ @Path("/users/{user.login}/musics/{music.id}") @Put public void addToMyList(User user, Music music) { User currentUser = userInfo.getUser(); userDao.refresh(currentUser); validator.check(user.getLogin().equals(currentUser.getLogin()), new SimpleMessage("user", "you_cant_add_to_others_list")); validator.check(!currentUser.getMusics().contains(music), new SimpleMessage("music", "you_already_have_this_music")); validator.onErrorUsePageOf(UsersController.class).home(); music = musicDao.load(music); currentUser.add(music); result.redirectTo(UsersController.class).home(); } }