package fi.otavanopisto.pyramus.domainmodel.help;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PersistenceException;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.apache.commons.lang.StringUtils;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DateBridge;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Resolution;
import org.hibernate.search.annotations.Store;
import fi.otavanopisto.pyramus.domainmodel.base.Tag;
import fi.otavanopisto.pyramus.domainmodel.users.User;
@Entity
@Inheritance (strategy=InheritanceType.JOINED)
@Indexed
public class HelpItem {
public Long getId() {
return id;
}
public HelpFolder getParent() {
return parent;
}
public void setParent(HelpFolder parent) {
this.parent = parent;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public User getCreator() {
return creator;
}
public void setCreator(User creator) {
this.creator = creator;
}
public Date getLastModified() {
return lastModified;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
public User getLastModifier() {
return lastModifier;
}
public void setLastModifier(User lastModifier) {
this.lastModifier = lastModifier;
}
public Integer getIndexColumn() {
return indexColumn;
}
public void setIndexColumn(Integer indexColumn) {
this.indexColumn = indexColumn;
}
public List<HelpItemTitle> getTitles() {
return titles;
}
public void setTitles(List<HelpItemTitle> titles) {
this.titles = titles;
}
@Transient
public void addTitle(HelpItemTitle helpItemTitle) {
if (helpItemTitle.getItem() != null) {
helpItemTitle.getItem().removeTitle(helpItemTitle);
}
helpItemTitle.setItem(this);
titles.add(helpItemTitle);
}
@Transient
public void removeTitle(HelpItemTitle helpItemTitle) {
helpItemTitle.setItem(null);
titles.remove(helpItemTitle);
}
@Transient
public HelpItemTitle getTitleByLocale(Locale locale) {
for (HelpItemTitle title : titles) {
if (title.getLocale().equals(locale))
return title;
}
return null;
}
public Set<Tag> getTags() {
return tags;
}
public void setTags(Set<Tag> tags) {
this.tags = tags;
}
public void addTag(Tag tag) {
if (!tags.contains(tag)) {
tags.add(tag);
} else {
throw new PersistenceException("Entity already has this tag");
}
}
public void removeTag(Tag tag) {
if (tags.contains(tag)) {
tags.remove(tag);
} else {
throw new PersistenceException("Entity does not have this tag");
}
}
@Transient
@Field (analyze = Analyze.NO, store = Store.YES)
public String getRecursiveIndex() {
String result = StringUtils.leftPad(String.valueOf(getIndexColumn() + 1), 3, '0');
HelpFolder parent = getParent();
int depth = 0;
while (depth <= 4) {
depth++;
int index = 0;
if (parent != null) {
index = parent.getIndexColumn() + 1;
parent = parent.getParent();
}
result = StringUtils.leftPad(String.valueOf(index), 3, '0') + result;
}
return result;
}
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="HelpItem")
@TableGenerator(name="HelpItem", allocationSize=1, table = "hibernate_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_next_hi_value")
@DocumentId
private Long id;
@ManyToOne
@JoinColumn (name="parent")
private HelpFolder parent;
@Column (nullable=false)
@Field (analyze = Analyze.NO, store = Store.YES)
@NotNull
private Integer indexColumn;
@Column (nullable=false)
@NotNull
@Temporal (TemporalType.TIMESTAMP)
@Field (analyze = Analyze.NO, store=Store.YES)
@DateBridge (resolution=Resolution.MILLISECOND)
private Date lastModified;
@Column (nullable=false)
@Temporal (TemporalType.TIMESTAMP)
@org.hibernate.search.annotations.Field (analyze = Analyze.NO, store=Store.YES)
@DateBridge (resolution=Resolution.MILLISECOND)
private Date created;
@ManyToOne
@JoinColumn (name="creator")
private User creator;
@ManyToOne
@JoinColumn (name="lastModifier")
private User lastModifier;
@OneToMany (cascade = CascadeType.ALL, mappedBy="item")
@IndexedEmbedded
private List<HelpItemTitle> titles = new ArrayList<>();
@ManyToMany (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable (name="__HelpItemTags", joinColumns=@JoinColumn(name="helpItem"), inverseJoinColumns=@JoinColumn(name="tag"))
@IndexedEmbedded
private Set<Tag> tags = new HashSet<>();
}