/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.domain.accessControl; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.fenixedu.academic.domain.ExecutionCourse; import org.fenixedu.academic.domain.ExecutionInterval; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Professorship; import org.fenixedu.academic.domain.time.calendarStructure.AcademicInterval; import org.fenixedu.academic.domain.time.calendarStructure.AcademicPeriod; import org.fenixedu.academic.util.Bundle; import org.fenixedu.bennu.core.annotation.GroupArgument; import org.fenixedu.bennu.core.annotation.GroupOperator; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.domain.groups.PersistentGroup; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.joda.time.DateTime; import com.google.common.base.Objects; @GroupOperator("professorship") public class ProfessorshipsGroup extends FenixGroup { private static final long serialVersionUID = -6043352087768539757L; @GroupArgument("external") private Boolean externalAuthorizations; @GroupArgument private AcademicPeriod period; private ProfessorshipsGroup() { super(); } private ProfessorshipsGroup(Boolean externalAuthorizations, AcademicPeriod period) { this(); this.externalAuthorizations = externalAuthorizations; this.period = period; } public static ProfessorshipsGroup get(Boolean externalAuthorizations, AcademicPeriod period) { return new ProfessorshipsGroup(externalAuthorizations, period); } @Override public String getPresentationNameKey() { if (externalAuthorizations) { return super.getPresentationNameKey() + ".external"; } return super.getPresentationNameKey(); } @Override public String[] getPresentationNameKeyArgs() { return new String[] { BundleUtil.getString(Bundle.ENUMERATION, period.getName()) }; } @Override public Stream<User> getMembers() { return getMembers(DateTime.now()); } @Override public Stream<User> getMembers(DateTime when) { Set<User> users = new HashSet<>(); //TODO: select active 'when' ExecutionInterval interval = ExecutionInterval.getExecutionInterval(AcademicInterval.readDefaultAcademicInterval(period)); if (interval instanceof ExecutionSemester) { ExecutionSemester semester = (ExecutionSemester) interval; fillMembers(users, semester); } else if (interval instanceof ExecutionYear) { for (ExecutionSemester semester : ((ExecutionYear) interval).getExecutionPeriodsSet()) { fillMembers(users, semester); } } return users.stream(); } private void fillMembers(Set<User> users, ExecutionSemester semester) { if (externalAuthorizations) { users.addAll(semester.getTeacherAuthorizationStream().filter(a -> !a.isContracted()) .map(a -> a.getTeacher().getPerson().getUser()).collect(Collectors.toSet())); } else { for (final ExecutionCourse executionCourse : semester.getAssociatedExecutionCoursesSet()) { for (final Professorship professorship : executionCourse.getProfessorshipsSet()) { User user = professorship.getPerson().getUser(); if (user != null) { users.add(user); } } } } } @Override public boolean isMember(User user) { return isMember(user, DateTime.now()); } @Override public boolean isMember(User user, DateTime when) { if (user == null) { return false; } //TODO: select active 'when' AcademicInterval interval = AcademicInterval.readDefaultAcademicInterval(period); if (externalAuthorizations) { if (user.getPerson().getTeacher().getTeacherAuthorization(interval).isPresent()) { return true; } } else { for (final Professorship professorship : user.getPerson().getProfessorshipsSet()) { final ExecutionCourse executionCourse = professorship.getExecutionCourse(); if (interval.contains(executionCourse.getAcademicInterval())) { return true; } } } return false; } @Override public PersistentGroup toPersistentGroup() { return PersistentProfessorshipsGroup.getInstance(externalAuthorizations, period); } @Override public boolean equals(Object object) { if (object instanceof ProfessorshipsGroup) { ProfessorshipsGroup other = (ProfessorshipsGroup) object; return Objects.equal(externalAuthorizations, other.externalAuthorizations) && Objects.equal(period, other.period); } return false; } @Override public int hashCode() { return Objects.hashCode(externalAuthorizations, period); } }