package hu.sch.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Transient;
/**
*
* @author hege
*/
@Embeddable
public class Semester implements Serializable, Comparable<Semester> {
/**
* Semester azonosító, ÉV1ÉV2FÉLÉV formában
* Pl. 200720081 -> 2007/2008 tanév 1. (őszi) féléve
*/
@Column(name = "semester", length = 9, nullable = false)
protected String id;
public Semester() {
id = "200020011";
}
public Semester(String id) {
this.id = id;
}
public Semester(Integer firstYear, Integer secondYear, boolean isAutumn) {
if (firstYear > 2030 || firstYear <= 1970
|| secondYear > 2030 || secondYear <= 1970) {
throw new IllegalArgumentException("Az évnek 1970 és 2030 között kell lennie");
}
setId(firstYear.toString() + secondYear.toString() + (isAutumn ? "1" : "2"));
}
public Semester getPrevious() {
Semester ret = new Semester();
if (this.isAutumn()) {
ret.setFirstYear(this.getFirstYear() - 1);
ret.setSecondYear(this.getSecondYear() - 1);
} else {
ret.setFirstYear(this.getFirstYear());
ret.setSecondYear(this.getSecondYear());
}
// őszi félév előtt tavaszi és viszont
ret.setAutumn(!this.isAutumn());
return ret;
}
public Semester getNext() {
Semester ret = new Semester();
if (!this.isAutumn()) {
ret.setFirstYear(this.getFirstYear() + 1);
ret.setSecondYear(this.getSecondYear() + 1);
} else {
ret.setFirstYear(this.getFirstYear());
ret.setSecondYear(this.getSecondYear());
}
// őszi félév előtt tavaszi és viszont
ret.setAutumn(!this.isAutumn());
return ret;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean isAutumn() {
Long sem = Long.parseLong(id);
return Long.lowestOneBit(sem) == 1;
}
public void setAutumn(boolean isAutumn) {
setId(getFirstYear().toString() + getSecondYear().toString() + (isAutumn ? "1" : "2"));
}
public Integer getFirstYear() {
return Integer.parseInt(id.substring(0, 4));
}
public void setFirstYear(Integer firstYear) {
if (firstYear > 2030 || firstYear <= 1970) {
throw new IllegalArgumentException("Az évnek 1970 és 2030 között kell lennie");
}
setId(firstYear.toString() + getSecondYear().toString() + (isAutumn() ? "1" : "2"));
}
public Integer getSecondYear() {
return Integer.parseInt(id.substring(4, 8));
}
public void setSecondYear(Integer secondYear) {
if (secondYear > 2030 || secondYear <= 1970) {
throw new IllegalArgumentException("Az évnek 1970 és 2030 között kell lennie");
}
setId(getFirstYear() + secondYear.toString() + (isAutumn() ? "1" : "2"));
}
public boolean isValid() {
int firstYear = 0;
int secondYear = 0;
int autumn = 0;
if (id.length() != 9) {
return false;
}
try {
firstYear = getFirstYear();
secondYear = getSecondYear();
autumn = Integer.parseInt(id.substring(8));
} catch (NumberFormatException ex) {
return false;
}
if (firstYear > 2030 || secondYear <= 1970 || secondYear > 2030
|| secondYear <= 1970 || (autumn != 1 && autumn != 2)) {
return false;
}
return true;
}
/**
* @return Emészthető formátum: pl 2007/2008 tavasz
*/
@Override
public String toString() {
StringBuilder b = new StringBuilder(getFirstYear().toString());
b.append("/");
b.append(getSecondYear().toString());
b.append(" ");
b.append(isAutumn() ? "ősz" : "tavasz");
return b.toString();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!getClass().isAssignableFrom(obj.getClass())) {
return false;
}
final Semester other = (Semester) obj;
if ((this.id == null) ? (other.id != null) : !this.id.equals(other.getId())) {
return false;
}
return true;
}
public boolean equals(Semester szemeszter) {
if (szemeszter == null) {
return false;
}
return this.getId().equals(szemeszter.getId());
}
@Override
public int hashCode() {
int hash = 3;
hash = 47 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
@Override
public int compareTo(Semester o) {
return id.compareTo(o.id);
}
}