LectureBean.java 6.34 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.beans;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.LectureFacade;
import fi.codecrew.moya.facade.LectureGroupFacade;
import fi.codecrew.moya.model.ApplicationPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Lecture;
import fi.codecrew.moya.model.LectureGroup;
import fi.codecrew.moya.model.Role;

/**
 * Session Bean implementation class FoodWaveBean
 */
@Stateless
@DeclareRoles({ LecturePermission.S_VIEW, LecturePermission.S_MANAGE })
public class LectureBean implements LectureBeanLocal {

	private static final Logger logger = LoggerFactory.getLogger(LectureBean.class);
	
	@EJB
	LectureFacade lectureFacade;
	@EJB
	LectureGroupFacade lectureGroupFacade;
	@EJB
	EventUserFacade eventUserFacade;
	@EJB
	EventBean eventBean;

	@EJB
	UserBeanLocal userBean;
	
	@EJB
	PermissionBean permBean;

	@Override
	public List<Lecture> getLecturesByLectureGroup(LectureGroup group) {
		LectureGroup sourceGroup = lectureGroupFacade.reload(group);
		
		return sourceGroup.getLectures();
	}

	@Override
	public List<LectureGroup> getLectureGroups() {
		return lectureGroupFacade.getLectureGroups();
	}

	@Override
	@RolesAllowed(LecturePermission.S_MANAGE)
	public LectureGroup saveLectureGroup(LectureGroup group) {

		if (group.getId() == null)
		{
			if (group.getEvent() == null)
				group.setEvent(eventBean.getCurrentEvent());

			lectureGroupFacade.create(group);

		} else {
			group = lectureGroupFacade.merge(group);
		}

		return group;
	}

	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public LectureGroup findLectureGroup(Integer id) {
		return lectureGroupFacade.find(id);
	}

	@Override
	@RolesAllowed(LecturePermission.S_MANAGE)
	public Lecture saveLecture(Lecture lecture) {

		if (lecture == null || lecture.getLectureGroup() == null) {
			throw new NullPointerException("Lecture must be in some lecturegroup!");
		}

		// let's try this, some weird cache problem
		LectureGroup group = lectureGroupFacade.reload(lecture.getLectureGroup());
		lecture.setLectureGroup(group);

		if (lecture.getId() == null) {
			lectureFacade.create(lecture);

			if (!lecture.getLectureGroup().getLectures().contains(lecture))
				lecture.getLectureGroup().getLectures().add(lecture);
		} else {
			lecture = lectureFacade.merge(lecture);
		}
		

		return lecture;
	}

	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public List<Lecture> findAvailableLectures(LectureGroup group, EventUser user) {

		LectureGroup lectureGroup = lectureGroupFacade.reload(group);
		List<Role> userRoles = userBean.findUsersRoles(user);

		List<Lecture> lectures = new ArrayList<Lecture>();
		

		lectureloop: for (Lecture l : lectureGroup.getLectures()) {
			for (Role r : l.getOpenForRoles()) {
				if (userRoles.contains(r)) {
					if(!user.getLectures().contains(l)) {
						lectures.add(l);
					}
					continue lectureloop;
				}
			}
		}

		return lectures;
	}

	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public List<Lecture> getParticipatedLectures(EventUser user) {
		return eventUserFacade.reload(user).getLectures();
	}

	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public Lecture participate(EventUser user, Lecture lecture) {
		
		if(userLectureSelectsLeft(lecture.getLectureGroup(), user) <= 0 && !permBean.hasPermission(LecturePermission.MANAGE))
			return lecture;
		
		EventUser targetUser = eventUserFacade.reload(user);

		if (!lecture.getParticipants().contains(targetUser)) {
			lecture.getParticipants().add(targetUser);
			lecture = lectureFacade.merge(lecture);
			targetUser.getLectures().add(lecture);
		}
		
		return lecture;
	}

	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public Lecture unparticipate(EventUser user, Lecture lecture) {
		
		EventUser targetUser = eventUserFacade.reload(user);
		
		lecture.getParticipants().remove(targetUser);
		targetUser.getLectures().remove(lecture);
		lecture = lectureFacade.merge(lecture);
		
		
		return lecture;
	}

	
	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public int userLectureSelects(LectureGroup group, EventUser user) {
		
		EventUser updatedUser = eventUserFacade.reload(user);
		
	
		int count = 0;
		
		for(Lecture l : updatedUser.getLectures()) {
			if(l.getLectureGroup().equals(group)) {
				count++;
			}
		}
		
		return count;
	}
	
	
	@Override
	@RolesAllowed({LecturePermission.S_VIEW, LecturePermission.S_MANAGE})
	public int userLectureSelectsLeft(LectureGroup group, EventUser user) {
		
		LectureGroup updatedGroup = lectureGroupFacade.reload(group);
		
		int maxCount = updatedGroup.getSelectCount();
		
		
		if(maxCount <= 0)
			return 99;
		
		
		return maxCount - userLectureSelects(group, user);
	}

	@Override
	public boolean isUserCanParticipate(EventUser user) {
		
		List<Role> roles = userBean.findUsersRoles(user);
		for (Role role : roles) {
			for (ApplicationPermission apperm : role.getPermissions()) {
				if(apperm.getPermission().getFullName().equals(LecturePermission.PARTICIPATE.getFullName()))
					return true;
			}
		}
		
		return false;
	}

	@Override
	public Lecture getFirstLecture() {
		return lectureFacade.findFirstLecture();
	}

	@Override
	public Lecture findLecture(Integer id) {
		return lectureFacade.find(id);
	}

}