Lecture.java 4.95 KB
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fi.codecrew.moya.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;

/**
 * Group for lectures, so you can set limits how many of these the user can
 * choose
 */
@Entity
@Table(name = "lectures")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class Lecture extends GenericEntity {

	private static final long serialVersionUID = 3L;

	@Column(name = "name")
	private String name;

	@Lob
	@Column(name = "description")
	private String description;

	@ManyToOne
	@JoinColumn(name = "lecture_group_id", referencedColumnName = LectureGroup.ID_COLUMN)
	private LectureGroup lectureGroup;

	@ManyToMany()
	@JoinTable(name = "lecture_participants",
			joinColumns = { @JoinColumn(name = "lecture_id", referencedColumnName = Lecture.ID_COLUMN) },
			inverseJoinColumns = { @JoinColumn(name = "eventuser_id", referencedColumnName = EventUser.ID_COLUMN) })
	private List<EventUser> participants;

	@ManyToMany()
	@JoinTable(name = "lecture_roles",
			joinColumns = { @JoinColumn(name = "lecture_id", referencedColumnName = Lecture.ID_COLUMN) },
			inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = Role.ID_COLUMN) })
	private List<Role> openForRoles;

	@Column(name = "max_participants_count")
	private Integer maxParticipantsCount;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "start_time")
	private Date startTime;

	@Column(name = "hours", precision = 10, scale = 2)
	private BigDecimal hours;

	public Lecture() {
		super();
	}

	public Lecture(LectureGroup group) {
		this();

		setLectureGroup(group);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public LectureGroup getLectureGroup() {
		return lectureGroup;
	}

	public void setLectureGroup(LectureGroup lectureGroup) {
		this.lectureGroup = lectureGroup;
	}

	public List<EventUser> getParticipants() {
		if (participants == null)
			participants = new ArrayList<EventUser>();

		return participants;
	}

	public void setParticipants(List<EventUser> participants) {
		this.participants = participants;
	}

	public List<Role> getOpenForRoles() {

		if (openForRoles == null)
			openForRoles = new ArrayList<Role>();

		return openForRoles;
	}

	public void setOpenForRoles(List<Role> openForRoles) {
		this.openForRoles = openForRoles;
	}

	public Integer getMaxParticipantsCount() {
		return maxParticipantsCount;
	}

	public void setMaxParticipantsCount(Integer maxParticipantsCount) {
		this.maxParticipantsCount = maxParticipantsCount;
	}

	public Date getStartTime() {
		if (startTime == null) {
			startTime = new Date();
		}
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	
	@Transient
	public Date getEndTime() {

		if (getStartTime() == null || getHours() == null)
			return getStartTime();

		Calendar endTime = Calendar.getInstance(); 
				
		endTime.setTime((Date) getStartTime().clone());

		endTime.add(Calendar.MINUTE, getHours().multiply(new BigDecimal(60)).intValue());

		return endTime.getTime();
	}
	/*
	@Transient
	public void setEndTime(Calendar endTime) {

		if (endTime == null || getStartTime() == null) {
			hours = BigDecimal.ZERO;
		}

		setHours(new BigDecimal((int) endTime.compareTo(getStartTime()) / 1000 / 60 / 60));
	}*/

	public BigDecimal getHours() {
		return hours;
	}

	public void setHours(BigDecimal hours) {
		this.hours = hours;
	}

	/**
	 * Clones lecture -object withoud database id and partisipants
	 */
	@Override
	public Object clone() {
		Lecture newLecture = new Lecture(this.getLectureGroup());

		newLecture.setDescription(getDescription());
		newLecture.setName(getName());
		newLecture.setHours(getHours());
		newLecture.setMaxParticipantsCount(getMaxParticipantsCount());
		newLecture.setStartTime( (Date) getStartTime().clone());
		newLecture.setOpenForRoles(new ArrayList<Role>(getOpenForRoles()));

		return newLecture;
	}

	@Transient
	public boolean isFull() {		

		if (getMaxParticipantsCount() == null || getMaxParticipantsCount() <= 0) {
			return false;
		}

		return (getParticipants().size() >= getMaxParticipantsCount());
	}

	@Transient
	public int getParticipantsCount() {
		return getParticipants().size();
	}

}