package fi.otavanopisto.pyramus.domainmodel.courses;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import javax.persistence.PersistenceException;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DateBridge;
import org.hibernate.search.annotations.EncodingType;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.FullTextFilterDef;
import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Resolution;
import fi.otavanopisto.pyramus.domainmodel.base.ArchivableEntity;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBase;
import fi.otavanopisto.pyramus.domainmodel.base.Tag;
import fi.otavanopisto.pyramus.domainmodel.modules.Module;
import fi.otavanopisto.pyramus.persistence.search.filters.ArchivedEntityFilterFactory;
import fi.otavanopisto.security.ContextReference;
@Entity
@Indexed
@PrimaryKeyJoinColumn(name="id")
@FullTextFilterDefs (
@FullTextFilterDef (
name="ArchivedCourse",
impl=ArchivedEntityFilterFactory.class
)
)
public class Course extends CourseBase implements ArchivableEntity, ContextReference {
public void setModule(Module module) {
this.module = module;
}
public Module getModule() {
return module;
}
public List<CourseComponent> getCourseComponents() {
return courseComponents;
}
@SuppressWarnings("unused")
private void setCourseComponents(List<CourseComponent> courseComponents) {
this.courseComponents = courseComponents;
}
public void addCourseComponent(CourseComponent courseComponent) {
if (courseComponent.getCourse() != null)
courseComponent.getCourse().getCourseComponents().remove(courseComponent);
courseComponent.setCourse(this);
courseComponents.add(courseComponent);
}
public void removeCourseComponent(CourseComponent courseComponent) {
courseComponent.setCourse(null);
this.courseComponents.remove(courseComponent);
}
public void setStudentCourseResources(List<StudentCourseResource> studentCourseResources) {
this.studentCourseResources = studentCourseResources;
}
public List<StudentCourseResource> getStudentCourseResources() {
return studentCourseResources;
}
public void setBasicCourseResources(List<BasicCourseResource> basicCourseResources) {
this.basicCourseResources = basicCourseResources;
}
public List<BasicCourseResource> getBasicCourseResources() {
return basicCourseResources;
}
public void setGradeCourseResources(List<GradeCourseResource> gradeCourseResources) {
this.gradeCourseResources = gradeCourseResources;
}
public List<GradeCourseResource> getGradeCourseResources() {
return gradeCourseResources;
}
public void setOtherCosts(List<OtherCost> otherCosts) {
this.otherCosts = otherCosts;
}
public List<OtherCost> getOtherCosts() {
return otherCosts;
}
public void addBasicCourseResource(BasicCourseResource basicCourseResource) {
if (basicCourseResource.getCourse() != null)
basicCourseResource.getCourse().getBasicCourseResources().remove(basicCourseResource);
basicCourseResource.setCourse(this);
basicCourseResources.add(basicCourseResource);
}
public void removeBasicCourseResource(BasicCourseResource basicCourseResource) {
basicCourseResource.setCourse(null);
basicCourseResources.remove(basicCourseResource);
}
public void addStudentCourseResource(StudentCourseResource studentCourseResource) {
if (studentCourseResource.getCourse() != null)
studentCourseResource.getCourse().getStudentCourseResources().remove(studentCourseResource);
studentCourseResource.setCourse(this);
studentCourseResources.add(studentCourseResource);
}
public void removeStudentCourseResource(StudentCourseResource studentCourseResource) {
studentCourseResource.setCourse(null);
studentCourseResources.remove(studentCourseResource);
}
public void addGradeCourseResource(GradeCourseResource gradeCourseResource) {
if (gradeCourseResource.getCourse() != null)
gradeCourseResource.getCourse().getGradeCourseResources().remove(gradeCourseResource);
gradeCourseResource.setCourse(this);
gradeCourseResources.add(gradeCourseResource);
}
public void removeGradeCourseResource(GradeCourseResource gradeCourseResource) {
gradeCourseResource.setCourse(null);
gradeCourseResources.remove(gradeCourseResource);
}
public void addOtherCost(OtherCost otherCost) {
if (otherCost.getCourse() != null)
otherCost.getCourse().getOtherCosts().remove(otherCost);
otherCost.setCourse(this);
otherCosts.add(otherCost);
}
public void removeOtherCost(OtherCost otherCost) {
otherCost.setCourse(null);
otherCosts.remove(otherCost);
}
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getBeginDate() {
return beginDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Date getEndDate() {
return endDate;
}
public String getNameExtension() {
return nameExtension;
}
public void setNameExtension(String nameExtension) {
this.nameExtension = nameExtension;
}
public void setLocalTeachingDays(Double localTeachingDays) {
this.localTeachingDays = localTeachingDays;
}
public Double getLocalTeachingDays() {
return localTeachingDays;
}
public void setState(CourseState state) {
this.state = state;
}
public CourseState getState() {
return state;
}
public CourseType getType() {
return type;
}
public void setType(CourseType type) {
this.type = type;
}
public void setTeachingHours(Double teachingHours) {
this.teachingHours = teachingHours;
}
public Double getTeachingHours() {
return teachingHours;
}
public void setDistanceTeachingDays(Double distanceTeachingDays) {
this.distanceTeachingDays = distanceTeachingDays;
}
public Double getDistanceTeachingDays() {
return distanceTeachingDays;
}
public Double getAssessingHours() {
return assessingHours;
}
public void setAssessingHours(Double assessingHours) {
this.assessingHours = assessingHours;
}
public Double getPlanningHours() {
return planningHours;
}
public void setPlanningHours(Double planningHours) {
this.planningHours = planningHours;
}
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");
}
}
public void setEnrolmentTimeEnd(Date enrolmentTimeEnd) {
this.enrolmentTimeEnd = enrolmentTimeEnd;
}
public Date getEnrolmentTimeEnd() {
return enrolmentTimeEnd;
}
public Double getDistanceTeachingHours() {
return distanceTeachingHours;
}
public void setDistanceTeachingHours(Double distanceTeachingHours) {
this.distanceTeachingHours = distanceTeachingHours;
}
public BigDecimal getCourseFee() {
return courseFee;
}
public void setCourseFee(BigDecimal courseFee) {
this.courseFee = courseFee;
}
public Currency getCourseFeeCurrency() {
return courseFeeCurrency;
}
public void setCourseFeeCurrency(Currency courseFeeCurrency) {
this.courseFeeCurrency = courseFeeCurrency;
}
@ManyToOne
@JoinColumn(name="module")
private Module module;
@ManyToOne
@JoinColumn(name="state")
@IndexedEmbedded
private CourseState state;
@ManyToOne
private CourseType type;
@Field
private String nameExtension;
@Temporal (value=TemporalType.DATE)
@Field (analyze = Analyze.NO)
@DateBridge (resolution = Resolution.DAY, encoding = EncodingType.STRING)
private Date beginDate;
@Temporal (value=TemporalType.DATE)
@Field (analyze = Analyze.NO)
@DateBridge (resolution = Resolution.DAY, encoding = EncodingType.STRING)
private Date endDate;
private Double distanceTeachingDays;
private Double distanceTeachingHours;
private Double planningHours;
private Double localTeachingDays;
private Double teachingHours;
private Double assessingHours;
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn (name = "indexColumn")
@JoinColumn (name="course")
@IndexedEmbedded
private List<CourseComponent> courseComponents = new Vector<>();
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name="course")
private List<BasicCourseResource> basicCourseResources = new Vector<>();
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name="course")
private List<StudentCourseResource> studentCourseResources = new Vector<>();
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name="course")
private List<GradeCourseResource> gradeCourseResources = new Vector<>();
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name="course")
private List<OtherCost> otherCosts = new Vector<>();
@ManyToMany (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable (name="__CourseTags", joinColumns=@JoinColumn(name="course"), inverseJoinColumns=@JoinColumn(name="tag"))
@IndexedEmbedded
private Set<Tag> tags = new HashSet<>();
@Column
@Temporal (value=TemporalType.TIMESTAMP)
private Date enrolmentTimeEnd;
private BigDecimal courseFee;
private Currency courseFeeCurrency;
}