package fr.openwide.maven.artifact.notifier.core.business.project.model;
import java.util.Collections;
import java.util.Set;
import javax.persistence.Cacheable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import org.bindgen.Bindable;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.SortNatural;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Fields;
import org.hibernate.search.annotations.Indexed;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Sets;
import fr.openwide.core.jpa.business.generic.model.GenericEntity;
import fr.openwide.core.jpa.search.util.HibernateSearchAnalyzer;
import fr.openwide.core.spring.util.StringUtils;
import fr.openwide.maven.artifact.notifier.core.business.artifact.model.Artifact;
import fr.openwide.maven.artifact.notifier.core.business.audit.model.AuditSummary;
@Indexed
@Bindable
@Cacheable
@Entity
public class Project extends GenericEntity<Long, Project> {
private static final long serialVersionUID = 2367269665391314255L;
public static final String NAME_SORT_FIELD_NAME = "nameSort";
@Id
@GeneratedValue
@DocumentId
private Long id;
@Column(nullable = false, unique = true)
@Fields({
@Field(analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT)),
@Field(name = NAME_SORT_FIELD_NAME, analyzer = @Analyzer(definition = HibernateSearchAnalyzer.TEXT_SORT))
})
private String name;
@Column(nullable = false, unique = true)
private String uri;
@Embedded
private ItemAdditionalInformation additionalInformation = new ItemAdditionalInformation();
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@SortNatural
private Set<ProjectVersion> versions = Sets.newTreeSet();
@OneToMany(mappedBy = "project", fetch = FetchType.LAZY)
@SortNatural
private Set<Artifact> artifacts = Sets.newTreeSet();
@Embedded
private AuditSummary auditSummary;
public Project() {
}
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = StringUtils.urlize(uri);
}
public ItemAdditionalInformation getAdditionalInformation() {
if (additionalInformation == null) {
additionalInformation = new ItemAdditionalInformation();
}
return additionalInformation;
}
public void setAdditionalInformation(ItemAdditionalInformation additionalInformation) {
this.additionalInformation = additionalInformation;
}
public Set<ProjectVersion> getVersions() {
return Collections.unmodifiableSet(versions);
}
public void addVersion(ProjectVersion version) {
if (version != null) {
versions.add(version);
version.setProject(this);
}
}
public void removeVersion(ProjectVersion version) {
versions.remove(version);
version.setProject(null);
}
public void setVersions(Set<ProjectVersion> versions) {
this.versions.clear();
this.versions.addAll(versions);
}
public Set<Artifact> getArtifacts() {
return Collections.unmodifiableSet(artifacts);
}
public void addArtifact(Artifact artifact) {
if (artifact != null) {
artifacts.add(artifact);
artifact.setProject(this);
}
}
public void removeArtifact(Artifact artifact) {
artifacts.remove(artifact);
artifact.setProject(null);
}
public void setArtifacts(Set<Artifact> artifacts) {
this.artifacts.clear();
this.artifacts.addAll(artifacts);
}
public AuditSummary getAuditSummary() {
if (auditSummary == null) {
auditSummary = new AuditSummary();
}
return auditSummary;
}
@Override
@JsonIgnore
public String getNameForToString() {
return name;
}
@Override
@JsonIgnore
public String getDisplayName() {
return name;
}
}