/*
* 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.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonProperty;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
/**
* Class for representing Album Entity. EJB3 Entity Bean
*
* @author Andrey Markhel
*/
@Entity
@JsonAutoDetect(fieldVisibility=Visibility.NONE, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE)
public class Album implements Serializable {
private static final long serialVersionUID = -7042878411608396483L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonProperty
private Long id = null;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "album", orphanRemoval = true)
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.FALSE)
@JsonProperty
private List<Image> images = new ArrayList<Image>();
@NotNull
@ManyToOne
@JoinColumn
private Shelf shelf;
@OneToOne(fetch = FetchType.EAGER)
@JsonProperty
private Image coveringImage;
@Transient
private boolean showAfterCreate;
@Temporal(TemporalType.DATE)
private Date created;
@Column(length = 255, nullable = false)
@NotNull
@NotEmpty
@Length(min = 3, max = 50)
@JsonProperty
private String name;
@Column(length = 1024)
@JsonProperty
private String description;
// ********************** Accessor Methods ********************** //
/**
* Getter for property shelf
*
* @return Shelf object, that contains this album
*/
public Shelf getShelf() {
return shelf;
}
public void setShelf(Shelf parent) {
this.shelf = parent;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/**
* Getter for property images
*
* @return List if images, belongs to this album
*/
public List<Image> getImages() {
return images;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
/**
* @return List of unvisited images
*/
public List<Image> getUnvisitedImages() {
final List<Image> unvisitedImages = new ArrayList<Image>(this.getImages().size());
for (Image i : this.getImages()) {
if (i.isNew()) {
unvisitedImages.add(i);
}
}
return unvisitedImages;
}
/**
* @param coveringImage - Image for covering album
*/
public void setCoveringImage(Image coveringImage) {
this.coveringImage = coveringImage;
}
// ********************** Business Methods ********************** //
/**
* This method add image to collection of images of current album
*
* @param image - image to add
*/
public void addImage(Image image) { // TODO
if (image == null) {
throw new IllegalArgumentException("Null image!");
}
if (this.getImages().contains(image)) {
// If album contain this image already
return;
}
if (image.getAlbum() != null && !this.equals(image.getAlbum())) {
// Remove from previous album
image.getAlbum().removeImage(image);
}
image.setAlbum(this);
images.add(image);
}
/**
* This method remove image from collection of images of album
*
* @param image - image to remove
*/
public void removeImage(Image image) {
if (image == null) {
throw new IllegalArgumentException("Null image");
}
if (!image.getAlbum().equals(this)) {
throw new IllegalArgumentException("This album not contain this image!");
}
if (getCoveringImage().equals(image)) {
setCoveringImage(null);
}
images.remove(image);
}
/**
* Getter for property owner
*
* @return User object, owner of this album
*/
public User getOwner() {
return getShelf() != null ? getShelf().getOwner() : null;
}
public boolean isOwner(User user) {
return user != null && user.equals(getOwner());
}
/**
* This method determine index of specified image in collection of images, belongs to this album. Used in slideshow etc...
*
* @return index of specified image
*/
public int getIndex(Image image) {
if (isEmpty()) {
return -1;
}
return images.indexOf(image);
}
/**
* This method determine covering image of this album
*
* @return covering image
*/
public Image getCoveringImage() {
if (coveringImage == null && !isEmpty()) {
coveringImage = images.get(0);
}
return coveringImage;
}
/**
* This method determine is album empty or not
*
*/
public boolean isEmpty() {
return images == null || images.isEmpty();
}
/**
* Getter for property preDefined
*
* @return is this shelf is predefined
*/
public boolean isPreDefined() {
return getOwner().isPreDefined();
}
/**
* Return relative path of this album in file-system(relative to uploadRoot parameter)
*
*/
public String getPath() {
if (getShelf() != null) {
if (getShelf().getPath() == null) {
return null;
}
}
else {
return File.separator + "event" + File.separator + this.getId() + File.separator;
}
return getShelf().getPath() + this.getId() + File.separator;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final Album album = (Album) obj;
if (id != null ? !id.equals(album.id) : album.id != null) {
return false;
}
if (!shelf.equals(album.shelf)) {
return false;
}
if (!name.equals(album.name)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + name.hashCode();
result = 31 * result + shelf.hashCode();
return result;
}
@Override
public String toString() {
return "{id : " + getId() + ", name : " + getName() + "}";
}
public boolean isShowAfterCreate() {
return showAfterCreate;
}
public void setShowAfterCreate(boolean showAfterCreate) {
this.showAfterCreate = showAfterCreate;
}
}