Lecture.java 5.05 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.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 Calendar 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 Calendar getStartTime() {
		if(startTime == null) {
			startTime = Calendar.getInstance();
		}
		return startTime;
	}

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

	public Calendar getEndTime() {
		
		
		if(getStartTime() == null || getHours() == null)
			return getStartTime();
		
		
		Calendar endTime = (Calendar) getStartTime().clone(); 
		
		
		endTime.add(Calendar.MINUTE, getHours().multiply(new BigDecimal(60)).intValue());
		
		return endTime;
	}

	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(getStartTime());
		newLecture.setOpenForRoles(getOpenForRoles());
		
		return newLecture;
	}
	
	@Transient
	public boolean isFull() {
		
		if(getMaxParticipantsCount() <= 0) {
			return false;
		}
		
		
		return (getParticipants().size() >= getMaxParticipantsCount());
	}
	
	@Transient
	public int getParticipantsCount() {
		return getParticipants().size();
	}
	
}