diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicController.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicController.java index 0773806f4..52992b97e 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicController.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicController.java @@ -37,11 +37,12 @@ import br.com.caelum.vraptor.Post; 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.files.Musics; 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.MusicOwner; +import br.com.caelum.vraptor.musicjungle.model.User; import br.com.caelum.vraptor.observer.download.Download; import br.com.caelum.vraptor.observer.download.FileDownload; import br.com.caelum.vraptor.observer.upload.UploadedFile; @@ -70,12 +71,13 @@ public class MusicController { private final UserInfo userInfo; private final MusicDao musicDao; private final Musics musics; + private final UserDao userDao; /** * @deprecated CDI eyes only */ protected MusicController() { - this(null, null, null, null, null); + this(null, null, null, null, null, null); } @@ -86,15 +88,17 @@ protected MusicController() { * @param result VRaptor result handler. * @param validator VRaptor validator. * @param factory dao factory. + * @param userDao */ @Inject public MusicController(MusicDao musicDao, UserInfo userInfo, - Result result, Validator validator, Musics musics) { + Result result, Validator validator, Musics musics, UserDao userDao) { this.musicDao = musicDao; this.result = result; this.validator = validator; this.userInfo = userInfo; this.musics = musics; + this.userDao = userDao; } /** @@ -115,7 +119,11 @@ public void add(final @NotNull @Valid Music music, UploadedFile file) { validator.onErrorForwardTo(UsersController.class).home(); musicDao.add(music); - musicDao.add(new MusicOwner(userInfo.getUser(), music)); + + User currentUser = userInfo.getUser(); + userDao.refresh(currentUser); + + currentUser.add(music); // is there a file? if (file != null) { diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicOwnerController.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicOwnerController.java deleted file mode 100644 index 8c54e024f..000000000 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/MusicOwnerController.java +++ /dev/null @@ -1,114 +0,0 @@ -/*** - * 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 br.com.caelum.vraptor.Controller; -import br.com.caelum.vraptor.Path; -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.interceptor.UserInfo; -import br.com.caelum.vraptor.musicjungle.model.Music; -import br.com.caelum.vraptor.musicjungle.model.MusicOwner; -import br.com.caelum.vraptor.musicjungle.model.User; -import br.com.caelum.vraptor.validator.SimpleMessage; -import br.com.caelum.vraptor.validator.Validator; - -/** - * The resource MusicOwnerController handles all - * MusicOwner operations, such as adding new Musics to a user list. - */ -@Controller -public class MusicOwnerController { - - private final Result result; - private final Validator validator; - private final UserInfo userInfo; - private final MusicDao musicDao; - private final UserDao userDao; - - /** - * @deprecated CDI eyes only - */ - protected MusicOwnerController() { - this(null, null, null, null, null); - } - - /** - * Receives dependencies through the constructor. - * - * @param userDao user data access object. - * @param userInfo info on the logged user. - * @param result VRaptor result handler. - * @param validator VRaptor validator. - */ - @Inject - public MusicOwnerController(MusicDao musicDao, UserDao userDao, - UserInfo userInfo, Result result, Validator validator) { - this.musicDao = musicDao; - this.userDao = userDao; - this.result = result; - this.validator = validator; - this.userInfo = userInfo; - } - - /** - * Accepts HTTP PUT requests.
- * - * URL: /users/login/musics/id (for example, - * /users/john/musics/3 adds the music with id 3 to the john's - * collection)
- * - * View: redirects to user's home
- * - * You can use more than one variable on URI. Since the browsers - * don't support PUT method you have to pass an additional parameter: - * _method=PUT for calling this method.
- * - * This method adds a music to a user's collection. - */ - @Path("/users/{user.login}/musics/{music.id}") - @Put - public void addToMyList(final User user, final Music music) { - final User sessionUser = refreshUser(); - - validator.check(user.getLogin().equals(sessionUser.getLogin()), - new SimpleMessage("user", "you_cant_add_to_others_list")); - - validator.check(!sessionUser.getMusics().contains(music), - new SimpleMessage("music", "you_already_have_this_music")); - - validator.onErrorUsePageOf(UsersController.class).home(); - - musicDao.add(new MusicOwner(user, music)); - - result.redirectTo(UsersController.class).home(); - } - - /* - * Refreshes user data from database - */ - private User refreshUser() { - User user = userInfo.getUser(); - userDao.refresh(user); - return user; - } - -} \ No newline at end of file diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/UsersController.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/UsersController.java index a25658926..83c56df7b 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/UsersController.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/controller/UsersController.java @@ -23,12 +23,17 @@ 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; /** @@ -41,12 +46,14 @@ 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); + this(null, null, null, null, null); } /** @@ -56,12 +63,17 @@ protected UsersController() { * @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) { + 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; } /** @@ -141,4 +153,40 @@ public void show(User user) { result.forwardTo("/WEB-INF/jsp/users/view.jsp"); } + + /** + * Accepts HTTP PUT requests.
+ * + * URL: /users/login/musics/id (for example, + * /users/john/musics/3 adds the music with id 3 to the john's + * collection)
+ * + * View: redirects to user's home
+ * + * You can use more than one variable on URI. Since the browsers + * don't support PUT method you have to pass an additional parameter: + * _method=PUT for calling this method.
+ * + * 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(); + } + } diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultMusicDao.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultMusicDao.java index c804d1bc4..6f7153097 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultMusicDao.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultMusicDao.java @@ -22,7 +22,6 @@ import javax.persistence.EntityManager; import br.com.caelum.vraptor.musicjungle.model.Music; -import br.com.caelum.vraptor.musicjungle.model.MusicOwner; /** * Default implementation for MusicDao. @@ -56,11 +55,6 @@ public void add(Music music) { entityManager.persist(music); } - @Override - public void add(MusicOwner copy) { - entityManager.persist(copy); - } - @Override public List searchSimilarTitle(String title) { List musics = entityManager diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultUserDao.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultUserDao.java index ecd244998..e302fd9d4 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultUserDao.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/DefaultUserDao.java @@ -93,9 +93,8 @@ public void add(User user) { } @Override - public User refresh(User user) { + public void refresh(User user) { getSession().refresh(user); // You still can use Hibernate Session - return user; } @Override diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/MusicDao.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/MusicDao.java index d5637f004..87f0676d4 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/MusicDao.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/MusicDao.java @@ -19,7 +19,6 @@ import java.util.List; import br.com.caelum.vraptor.musicjungle.model.Music; -import br.com.caelum.vraptor.musicjungle.model.MusicOwner; /** * Data Access Object for the Music entity. @@ -34,11 +33,6 @@ public interface MusicDao { */ void add(Music music); - /** - * Adds a copy of the music - */ - void add(MusicOwner copy); - /** * Load the music from database */ diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/UserDao.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/UserDao.java index 9fd3ff98e..503154def 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/UserDao.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/dao/UserDao.java @@ -56,7 +56,7 @@ public interface UserDao { * Any not saved modification on user will be overwritten. * @return */ - User refresh(User user); + void refresh(User user); /** * Update the user on database. diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/interceptor/AuthorizationInterceptor.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/interceptor/AuthorizationInterceptor.java index b5378e555..6dca58832 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/interceptor/AuthorizationInterceptor.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/interceptor/AuthorizationInterceptor.java @@ -57,9 +57,9 @@ public boolean accepts(ControllerMethod method) { @AroundCall public void intercept(SimpleInterceptorStack stack) { - User current = null; + User current = info.getUser(); try { - current = dao.refresh(info.getUser()); + dao.refresh(current); } catch (Exception e) { // could happen if the user does not exist in the database or if there's no user logged in. } @@ -74,7 +74,6 @@ public void intercept(SimpleInterceptorStack stack) { result.redirectTo(HomeController.class).login(); return; } - stack.next(); } diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/Music.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/Music.java index 39ae866f2..2dad6361b 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/Music.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/Music.java @@ -16,6 +16,7 @@ */ package br.com.caelum.vraptor.musicjungle.model; +import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; @@ -23,7 +24,7 @@ import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.ManyToMany; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @@ -51,8 +52,8 @@ public class Music { @Size(min = 6) private String description; - @OneToMany(mappedBy = "music") - private Set musicOwners; + @ManyToMany(mappedBy = "musics") + private Set owners = new HashSet<>(); @NotNull @Enumerated(EnumType.STRING) @@ -89,13 +90,9 @@ public MusicType getType() { public void setType(MusicType type) { this.type = type; } - - public Set getMusicOwners() { - return musicOwners; - } - - public void setMusicOwners(Set copies) { - this.musicOwners = copies; + + public Set getOwners() { + return owners; } @Override diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/MusicOwner.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/MusicOwner.java deleted file mode 100644 index d6eb67924..000000000 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/MusicOwner.java +++ /dev/null @@ -1,115 +0,0 @@ -/*** - * 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.model; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToOne; - -@Entity -public class MusicOwner { - - @Id - @GeneratedValue - private Long id; - - @ManyToOne - private User owner; - - @ManyToOne - private Music music; - - public MusicOwner(User owner, Music music) { - this.owner = owner; - this.music = music; - } - - public MusicOwner() { - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public User getOwner() { - return owner; - } - - public void setOwner(User owner) { - this.owner = owner; - } - - public Music getMusic() { - return music; - } - - public void setMusic(Music music) { - this.music = music; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((music == null) ? 0 : music.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((owner == null) ? 0 : owner.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - MusicOwner other = (MusicOwner) obj; - if (music == null) { - if (other.music != null) { - return false; - } - } else if (!music.equals(other.music)) { - return false; - } - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (owner == null) { - if (other.owner != null) { - return false; - } - } else if (!owner.equals(other.owner)) { - return false; - } - return true; - } - -} diff --git a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/User.java b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/User.java index 2772e86db..c0183b5a5 100644 --- a/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/User.java +++ b/vraptor-musicjungle/src/main/java/br/com/caelum/vraptor/musicjungle/model/User.java @@ -22,15 +22,12 @@ import javax.persistence.Entity; import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.ManyToMany; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; - /** * User entity representing the User table from the database. * A persisted object of this class represents a record in the @@ -55,29 +52,8 @@ public class User implements Serializable { @Length(min = 3, max = 100) private String name; - // user to music mapping, - @OneToMany(mappedBy="owner") - private Set musicOwners; - - public Set getMusicOwners() { - if (musicOwners == null) { - musicOwners = new HashSet(); - } - return musicOwners; - } - - public void setMusicOwners(Set musicOwners) { - this.musicOwners = musicOwners; - } - - public Set getMusics() { - return new HashSet(Collections2.transform(getMusicOwners(), new Function() { - @Override - public Music apply(MusicOwner copy) { - return copy.getMusic(); - } - })); - } + @ManyToMany + private Set musics = new HashSet<>(); public String getLogin() { return login; @@ -103,4 +79,16 @@ public void setPassword(String password) { this.password = password; } + public Set getMusics() { + return musics; + } + + public void setMusics(Set musics) { + this.musics = musics; + } + + public void add(Music music) { + getMusics().add(music); + music.getOwners().add(this); + } } diff --git a/vraptor-musicjungle/src/main/resources/META-INF/persistence.xml b/vraptor-musicjungle/src/main/resources/META-INF/persistence.xml index 8d61a89d2..a09534826 100644 --- a/vraptor-musicjungle/src/main/resources/META-INF/persistence.xml +++ b/vraptor-musicjungle/src/main/resources/META-INF/persistence.xml @@ -9,7 +9,6 @@ br.com.caelum.vraptor.musicjungle.model.Music br.com.caelum.vraptor.musicjungle.model.User - br.com.caelum.vraptor.musicjungle.model.MusicOwner diff --git a/vraptor-musicjungle/src/main/webapp/WEB-INF/jsp/music/search.jsp b/vraptor-musicjungle/src/main/webapp/WEB-INF/jsp/music/search.jsp index c4c3df461..3a88c07a9 100644 --- a/vraptor-musicjungle/src/main/webapp/WEB-INF/jsp/music/search.jsp +++ b/vraptor-musicjungle/src/main/webapp/WEB-INF/jsp/music/search.jsp @@ -1,4 +1,4 @@ -<%@ include file="/header.jsp" %> +<%@ include file="/header.jsp" %>

@@ -20,12 +20,12 @@ ${music.description} - - ${musicOwner.owner.name}
+ + ${musicOwner.name}
-
+