/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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 software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.photoalbum.model; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.enterprise.context.SessionScoped; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotNull; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; import org.hibernate.annotations.OrderBy; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; /** * Class for representing User Entity EJB3 Entity Bean * * @author Andrey Markhel */ @NamedQueries({ @NamedQuery(name = "user-login", query = "select u from User u where u.login = :username and u.passwordHash = :password"), @NamedQuery(name = "user-comments", query = "select c from Comment c where c.author = :author"), @NamedQuery(name = "user-exist", query = "select u from User u where u.login = :login"), @NamedQuery(name = "email-exist", query = "select u from User u where u.email = :email"), @NamedQuery(name = "user-user", query = "select u from User u where u.login = :login"), @NamedQuery(name = "user-fb-login", query = "select u from User u where u.fbId = :fbId"), @NamedQuery(name = "user-gplus-login", query = "select u from User u where u.gPlusId = :gPlusId") }) @Entity @SessionScoped @Table(name = "User", uniqueConstraints = { @UniqueConstraint(columnNames = "login"), @UniqueConstraint(columnNames = "email") }) public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @NotEmpty @Column(length = 30) private String fbId = "1"; @NotNull @NotEmpty @Column(length = 30) private String gPlusId = "1"; @NotNull private String passwordHash; @NotNull @NotEmpty @Length(min = 3) @Column(length = 255, nullable = false) private String firstName; @NotNull @NotEmpty @Length(min = 3) @Column(length = 255, nullable = false) private String secondName; @Column(length = 255, nullable = false) @NotNull @NotEmpty @Email private String email; @Column(length = 255, nullable = false) @NotNull @NotEmpty @Length(min = 3) private String login; @Transient private String password; @Transient private String confirmPassword; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @NotNull private Sex sex = Sex.MALE; private Boolean hasAvatar; @OrderBy(clause = "NAME asc") @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true) // @LazyCollection(LazyCollectionOption.EXTRA) @LazyCollection(LazyCollectionOption.FALSE) private List<Shelf> shelves = new ArrayList<Shelf>(); private boolean preDefined; public boolean isPreDefined() { return preDefined; } public void setPreDefined(boolean preDefined) { this.preDefined = preDefined; } // ----------------Getters, Setters public String getFbId() { return fbId; } public void setFbId(String fbId) { this.fbId = fbId; } public String getgPlusId() { return gPlusId; } public void setgPlusId(String gPlusId) { this.gPlusId = gPlusId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getSecondName() { return secondName; } public void setSecondName(String secondName) { this.secondName = secondName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPasswordHash() { return passwordHash; } public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public Long getId() { return id; } public String getConfirmPassword() { return confirmPassword; } public void setConfirmPassword(String confirmPassword) { this.confirmPassword = confirmPassword; } public List<Shelf> getShelves() { // return only shelves that aren't bound to events List<Shelf> shelvesWithoutEvents = new ArrayList<Shelf>(); for (Shelf shelf : shelves) { if (shelf.getEvent() == null) { shelvesWithoutEvents.add(shelf); } } return shelvesWithoutEvents; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } public Boolean getHasAvatar() { return hasAvatar; } public void setHasAvatar(Boolean hasAvatar) { this.hasAvatar = hasAvatar; } // ---------------------------Business methods /** * This method add shelf to collection of shelves, belongs to user * * @param shelf - shelf to add */ public void addShelf(Shelf shelf) { if (shelf == null) { throw new IllegalArgumentException("Null album group!"); } if (!shelves.contains(shelf)) { shelf.setOwner(this); shelves.add(shelf); } } /** * This method remove shelf from collection of shelves, belongs to user * * @param shelf - shelf to remove */ public void removeShelf(Shelf shelf) { if (shelf == null) { throw new IllegalArgumentException("Null album group"); } if (shelf.getOwner().getLogin().equals(this.getLogin())) { shelves.remove(shelf); } else { throw new IllegalArgumentException("Album Groups does not belong to this user!"); } } /** * Return relative path of folder with user's images in file-system(relative to uploadRoot parameter) */ public String getPath() { if (this.getId() == null) { return null; } return File.separator + this.getLogin() + File.separator; } /** * This method return all images, belongs to user * * @return images, belongs to user */ public List<Image> getImages() { final List<Image> images = new ArrayList<Image>(); for (Shelf s : getShelves()) { images.addAll(s.getImages()); } return images; } /** * This method return all albums, belongs to user * * @return albums, belongs to user */ public List<Album> getAlbums() { final List<Album> albums = new ArrayList<Album>(); for (Shelf s : getShelves()) { albums.addAll(s.getAlbums()); } return albums; } /** * This method return all images, belongs to user * * @return images, belongs to user */ public List<Image> getSharedImages() { final List<Image> images = new ArrayList<Image>(); for (Shelf s : getShelves()) { if (!s.isShared()) { continue; } for (Album a : s.getAlbums()) { images.addAll(a.getImages()); } } return images; } /** * This method return all albums, belongs to user * * @return albums, belongs to user */ public List<Album> getSharedAlbums() { final List<Album> albums = new ArrayList<Album>(); for (Shelf s : getShelves()) { if (!s.isShared()) { continue; } albums.addAll(s.getAlbums()); } return albums; } /** * This method check, if user already have shelf with given name * * @param shelf - shelf to check * @return boolean value, that indicated if shelf with the same name exist */ public boolean hasShelfWithName(Shelf shelf) { for (Shelf s : getShelves()) { if (!s.equals(shelf) && s.getName().equals(shelf.getName())) { return true; } } return false; } /** * This method check, if parent shelf contain album with the same name as given album * * @param album - album to check * @return boolean value, that indicate if album with the same name exist */ public boolean hasAlbumWithName(Album album) { for (Album a : album.getShelf().getAlbums()) { if (!a.equals(album) && a.getName().equals(album.getName())) { return true; } } return false; } /** * This method check, if containing album already have image with the same name * * @param image - image to check * @return boolean value, that indicate if image with the same name exist */ public boolean hasImageWithName(Image image) { for (Image i : image.getAlbum().getImages()) { if (!i.equals(image) && i.getName().equals(image.getName())) { return true; } } return false; } public boolean equals(final Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final User user = (User) o; if (id != null ? !id.equals(user.id) : user.id != null) { return false; } if (login != null ? !login.equals(user.login) : user.login != null) { return false; } return true; } public int hashCode() { int result = id != null ? id.hashCode() : 0; result = 31 * result + (login != null ? login.hashCode() : 0); return result; } @Override public String toString() { return "User{" + "firstName=" + firstName + ", secondName=" + secondName + ", email=" + email + ", login=" + login + ", sex=" + sex + ", hasAvatar=" + hasAvatar + '}'; } }