package org.freezo.domain;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.annotations.BatchSize;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Entity
@JsonIgnoreProperties({ "version" })
public class Website
{
@Id
@GeneratedValue
private long id;
private String name;
private String description;
private Status status = Status.ENABLED;
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;
@Temporal(TemporalType.TIMESTAMP)
private Date deleteRequestedAt;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "website", cascade = CascadeType.ALL, orphanRemoval = true)
@BatchSize(size = 10)
private final Set<Host> hosts = new HashSet<Host>();
@Version
private long version;
@Override
public String toString()
{
return new ToStringBuilder(this, ToStringStyle.NO_CLASS_NAME_STYLE)
.append("id", id).append("name", name).append("hosts", hosts).toString();
}
public long getId()
{
return id;
}
public long getVersion()
{
return version;
}
public String getName()
{
return name;
}
public void setName(final String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(final String description)
{
this.description = description;
}
public Set<String> getHosts()
{
return this.hosts.stream().map(Host::getName).collect(Collectors.toSet());
}
public void setHosts(final Set<String> hosts)
{
this.hosts.removeIf(host -> !hosts.contains(host.getName()));
this.hosts.addAll(hosts.stream().map(Host::new).collect(Collectors.toSet()));
this.hosts.forEach(host -> host.setWebsite(this));
}
public Date getUpdatedAt()
{
return updatedAt;
}
public void setUpdatedAt(final Date updatedAt)
{
this.updatedAt = updatedAt;
}
public Date getCreatedAt()
{
return createdAt;
}
public void setCreatedAt(final Date createdAt)
{
this.createdAt = createdAt;
}
public Date getDeleteRequestedAt()
{
return deleteRequestedAt;
}
public void setDeleteRequestedAt(final Date deleteRequestedAt)
{
this.deleteRequestedAt = deleteRequestedAt;
}
public Status getStatus()
{
return status;
}
public void setStatus(final Status status)
{
this.status = status;
}
public static enum Status
{
ENABLED,
DISABLED,
PENDING_REMOVE
}
}