package com.idega.block.article.data;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import org.hibernate.Hibernate;
import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.annotations.Index;
import com.idega.block.article.data.dao.ArticleDao;
import com.idega.util.CoreConstants;
import com.idega.util.ListUtil;
import com.idega.util.expression.ELUtil;
/**
* IC_ARTICLE table entity
* @author martynas
*
*/
@Entity
@Table(name = "IC_ARTICLE")
@NamedQueries(
{
@NamedQuery(
name = ArticleEntity.GET_BY_URI,
query = "from ArticleEntity s where s.uri = :"+ArticleEntity.uriProp
),
@NamedQuery(
name = ArticleEntity.GET_ID_BY_URI,
query = "select id from ArticleEntity s where s.uri = :"+ArticleEntity.uriProp
)
}
)
@Inheritance(strategy=InheritanceType.JOINED)
public class ArticleEntity implements Serializable {
public static final String GET_BY_URI = "articleEntity.getByURI";
public static final String GET_ID_BY_URI = "articleEntity.getIDByURI";
private static final long serialVersionUID = -8125483527520853214L;
public static final String idProp = "id";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
public static final String modificationDateProp = "modificationDate";
@Index(name = "modificationDateIndex")
@Column(name = "MODIFICATION_DATE", nullable=false)
private Date modificationDate;
public static final String uriProp = "uri";
@Index(name = "uriIndex")
@Column(name = "URI", nullable=false)
private String uri;
public static final String categoriesProp = "categories";
@ManyToMany
@JoinTable(name = "JND_ARTICLE_CATEGORY",
joinColumns = @JoinColumn(name = "ARTICLE_FK"),
inverseJoinColumns = @JoinColumn(name = "CATEGORY_FK"))
private Set<CategoryEntity> categories;
public static final String editorsProp = "editorsProp";
@CollectionOfElements(fetch = FetchType.EAGER)
@JoinTable(
name = "article_editors_groups",
joinColumns=@JoinColumn(name="ARTICLE_ID"))
@Column(name = "EDITORS_GROUPS_IDS", nullable=false)
private Set<Integer> editors;
private Integer hashCode = new Random().nextInt();
public ArticleEntity() {
super();
}
public ArticleEntity(ArticleEntity entity) {
this();
setCategories(entity.getCategories());
setEditors(entity.getEditors());
setModificationDate(entity.getModificationDate());
setUri(entity.getUri());
//TODO: test this!!!!!!!!!!!!!
id = entity.getId();
}
/**
* Returns group ids. Users of those groups are allowed to edit article.
* @return Groups ids
*/
public Set<Integer> getEditors() {
if (this.editors == null) {
return Collections.emptySet();
}
return editors;
}
/**
* Sets the ids of groups which users are allowed to edit articles.
*
* @param editors The set of ids of groups which users are allowed to edit articles.
*/
public void setEditors(Set<Integer> editors) {
this.editors = editors;
}
public Long getId() {
return id;
}
public Date getModificationDate() {
return modificationDate;
}
public void setModificationDate(Date modificationDate) {
this.modificationDate = modificationDate;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
if (uri.startsWith(CoreConstants.WEBDAV_SERVLET_URI))
uri = uri.replaceFirst(CoreConstants.WEBDAV_SERVLET_URI, CoreConstants.EMPTY);
if (uri.endsWith(CoreConstants.SLASH))
uri = uri.substring(0, uri.lastIndexOf(CoreConstants.SLASH));
this.uri = uri;
}
// @Transient
public Set<CategoryEntity> getCategories() {
if (Hibernate.isInitialized(categories))
return categories;
if (id == null)
return Collections.emptySet();
List<CategoryEntity> categoriesList = getArticleDao().getCategories(id);
if (ListUtil.isEmpty(categoriesList)) {
// Not empty set because add should be supported
categories = new HashSet<CategoryEntity>();
} else {
categories = new HashSet<CategoryEntity>(categoriesList);
}
return categories;
}
public void setCategories(Collection<CategoryEntity> categories) {
this.categories = new HashSet<CategoryEntity>(categories);
}
public void setCategories(Set<CategoryEntity> categories) {
this.categories = categories;
}
public boolean addCategories(Collection<CategoryEntity> categories){
if (ListUtil.isEmpty(categories))
return Boolean.TRUE;
Set<CategoryEntity> categoriesList = getCategories();
if (categoriesList == null) {
setCategories(categoriesList);
return Boolean.TRUE;
}
return categoriesList.addAll(categories);
}
public boolean removeCategories(Collection<CategoryEntity> categories){
if (ListUtil.isEmpty(categories))
return Boolean.TRUE;
if (this.categories == null)
return Boolean.FALSE;
return this.categories.removeAll(categories);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof ArticleEntity))
return false;
ArticleEntity article = (ArticleEntity) obj;
try {
return getUri().equals(article.getUri()) && getId().longValue() == article.getId().longValue();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public int hashCode() {
if (hashCode == null)
hashCode = new Random().nextInt();
return hashCode;
}
@Override
public String toString() {
return "ID: " + getId() + ", URI: " + getUri() + ", modified: " + getModificationDate();
}
private ArticleDao getArticleDao() {
return ELUtil.getInstance().getBean(ArticleDao.BEAN_NAME);
}
}