package fi.otavanopisto.pyramus.domainmodel.students;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DateBridge;
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.ArchivableEntity;
import fi.otavanopisto.pyramus.domainmodel.base.Curriculum;
import fi.otavanopisto.pyramus.domainmodel.base.Email;
import fi.otavanopisto.pyramus.domainmodel.base.Language;
import fi.otavanopisto.pyramus.domainmodel.base.Municipality;
import fi.otavanopisto.pyramus.domainmodel.base.Nationality;
import fi.otavanopisto.pyramus.domainmodel.base.School;
import fi.otavanopisto.pyramus.domainmodel.base.StudyProgramme;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.pyramus.domainmodel.users.User;
@Entity
@Indexed
@PrimaryKeyJoinColumn(name="id")
public class Student extends User implements ArchivableEntity {
/**
* Returns full name (first name + last name) of this student.
*
* @return Full name
*/
@Transient
@Field (store = Store.NO)
public String getFullName() {
return getFirstName() + ' ' + getLastName();
}
@Transient
public Email getPrimaryEmail() {
for (Email email : getContactInfo().getEmails()) {
if (email.getDefaultAddress())
return email;
}
return null;
}
/**
* Sets additional info for this student.
*
* @param additionalInfo Additional info
*/
public void setAdditionalInfo(String additionalInfo) {
this.additionalInfo = additionalInfo;
}
/**
* Returns additional info of this student.
*
* @return Additional info
*/
public String getAdditionalInfo() {
return additionalInfo;
}
/**
* Sets the municipality of this student.
*
* @param municipality Municipality
*/
public void setMunicipality(Municipality municipality) {
this.municipality = municipality;
}
/**
* Returns the municipality of this student.
*
* @return Municipality
*/
public Municipality getMunicipality() {
return municipality;
}
/**
* Sets nationality for this student.
*
* @param nationality Nationality
*/
public void setNationality(Nationality nationality) {
this.nationality = nationality;
}
/**
* Returns the nationality of this student.
*
* @return The nationality of this student
*/
public Nationality getNationality() {
return nationality;
}
/**
* Sets language for this student.
*
* @param language Language
*/
public void setLanguage(Language language) {
this.language = language;
}
/**
* Returns language of this student.
*
* @return Language
*/
public Language getLanguage() {
return language;
}
/**
* Returns an ending date of students right to study
*
* @return ending date of students right to study
*/
public Date getStudyTimeEnd() {
return studyTimeEnd;
}
/**
* Sets an ending date of students right to study
*
* @param studyTimeEnd
*/
public void setStudyTimeEnd(Date studyTimeEnd) {
this.studyTimeEnd = studyTimeEnd;
}
public void setSchool(School school) {
this.school = school;
}
public School getSchool() {
return school;
}
public StudyProgramme getStudyProgramme() {
return studyProgramme;
}
public void setStudyProgramme(StudyProgramme studyProgramme) {
this.studyProgramme = studyProgramme;
}
public void setStudyEndDate(Date studyEndDate) {
this.studyEndDate = studyEndDate;
}
public Date getStudyEndDate() {
return studyEndDate;
}
public void setStudyStartDate(Date studyStartDate) {
this.studyStartDate = studyStartDate;
}
public Date getStudyStartDate() {
return studyStartDate;
}
public void setPreviousStudies(Double previousStudies) {
this.previousStudies = previousStudies;
}
public Double getPreviousStudies() {
return previousStudies;
}
public void setStudyEndReason(StudentStudyEndReason studyEndReason) {
this.studyEndReason = studyEndReason;
}
public StudentStudyEndReason getStudyEndReason() {
return studyEndReason;
}
public void setStudyEndText(String studyEndText) {
this.studyEndText = studyEndText;
}
public String getStudyEndText() {
return studyEndText;
}
@Transient
public boolean getActive() {
return getHasStartedStudies() && !getHasFinishedStudies();
}
@Transient
public boolean getHasStartedStudies() {
return studyStartDate != null && studyStartDate.before(new Date());
}
@Transient
public boolean getHasFinishedStudies() {
return studyEndDate != null && studyEndDate.before(new Date());
}
public void setActivityType(StudentActivityType activityType) {
this.activityType = activityType;
}
public StudentActivityType getActivityType() {
return activityType;
}
public void setEducationalLevel(StudentEducationalLevel educationalLevel) {
this.educationalLevel = educationalLevel;
}
public StudentEducationalLevel getEducationalLevel() {
return educationalLevel;
}
public void setExaminationType(StudentExaminationType examinationType) {
this.examinationType = examinationType;
}
public StudentExaminationType getExaminationType() {
return examinationType;
}
public String getEducation() {
return education;
}
public void setEducation(String education) {
this.education = education;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Boolean getLodging() {
return lodging;
}
public void setLodging(Boolean lodging) {
this.lodging = lodging;
}
@Transient
@Override
public Role getRole() {
return Role.STUDENT;
}
public Curriculum getCurriculum() {
return curriculum;
}
public void setCurriculum(Curriculum curriculum) {
this.curriculum = curriculum;
}
private String nickname;
@Lob
@Basic (fetch = FetchType.LAZY)
@Column
private String additionalInfo;
@ManyToOne
@JoinColumn (name = "nationality")
private Nationality nationality;
@ManyToOne
@JoinColumn (name = "language")
private Language language;
@ManyToOne
@JoinColumn (name = "municipality")
private Municipality municipality;
@ManyToOne
@JoinColumn (name = "school")
@IndexedEmbedded (depth = 1)
private School school;
@ManyToOne
@JoinColumn (name = "activityType")
private StudentActivityType activityType;
@ManyToOne
@JoinColumn (name = "examinationType")
private StudentExaminationType examinationType;
@ManyToOne
@JoinColumn (name = "educationalLevel")
private StudentEducationalLevel educationalLevel;
@Temporal (value=TemporalType.DATE)
private Date studyTimeEnd;
@ManyToOne
@JoinColumn(name="studyProgramme")
private StudyProgramme studyProgramme;
private Double previousStudies;
private String education;
@NotNull
@Column (nullable = false)
private Boolean lodging = Boolean.FALSE;
@Temporal (value=TemporalType.DATE)
private Date studyStartDate;
@Temporal (value=TemporalType.DATE)
@Field (analyze = Analyze.NO)
@DateBridge (resolution = Resolution.DAY)
private Date studyEndDate;
@ManyToOne
@JoinColumn (name = "studyEndReason")
@IndexedEmbedded
private StudentStudyEndReason studyEndReason;
@Basic (fetch = FetchType.LAZY)
private String studyEndText;
@ManyToOne
private Curriculum curriculum;
}