/* * Created on 07/Set/2003 * */ package net.sourceforge.fenixedu.applicationTier.Servico.student; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.sourceforge.fenixedu.applicationTier.FenixService; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.ExistingServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.FenixServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.InvalidArgumentsServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.InvalidChangeServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.InvalidSituationServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.InvalidStudentNumberServiceException; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.NotAuthorizedException; import net.sourceforge.fenixedu.applicationTier.strategy.groupEnrolment.strategys.GroupEnrolmentStrategyFactory; import net.sourceforge.fenixedu.applicationTier.strategy.groupEnrolment.strategys.IGroupEnrolmentStrategy; import net.sourceforge.fenixedu.applicationTier.strategy.groupEnrolment.strategys.IGroupEnrolmentStrategyFactory; import net.sourceforge.fenixedu.domain.Attends; import net.sourceforge.fenixedu.domain.ExecutionCourse; import net.sourceforge.fenixedu.domain.Grouping; import net.sourceforge.fenixedu.domain.Person; import net.sourceforge.fenixedu.domain.Shift; import net.sourceforge.fenixedu.domain.StudentGroup; import net.sourceforge.fenixedu.domain.accessControl.FixedSetGroup; import net.sourceforge.fenixedu.domain.student.Registration; import net.sourceforge.fenixedu.domain.util.email.Message; import net.sourceforge.fenixedu.domain.util.email.Recipient; import net.sourceforge.fenixedu.domain.util.email.SystemSender; import org.apache.struts.util.MessageResources; import pt.ist.fenixWebFramework.security.accessControl.Checked; import pt.ist.fenixWebFramework.services.Service; /** * @author asnr and scpo * */ public class EditGroupShift extends FenixService { private static final MessageResources messages = MessageResources.getMessageResources("resources/GlobalResources"); @Checked("RolePredicates.STUDENT_PREDICATE") @Service public static Boolean run(Integer studentGroupID, Integer groupingID, Integer newShiftID, String username) throws FenixServiceException { final Grouping grouping = rootDomainObject.readGroupingByOID(groupingID); if (grouping == null) { throw new ExistingServiceException(); } final StudentGroup studentGroup = rootDomainObject.readStudentGroupByOID(studentGroupID); if (studentGroup == null) { throw new InvalidArgumentsServiceException(); } final Shift shift = rootDomainObject.readShiftByOID(newShiftID); if (grouping.getShiftType() == null || !shift.containsType(grouping.getShiftType())) { throw new InvalidStudentNumberServiceException(); } final Registration registration = Registration.readByUsername(username); IGroupEnrolmentStrategyFactory enrolmentGroupPolicyStrategyFactory = GroupEnrolmentStrategyFactory.getInstance(); IGroupEnrolmentStrategy strategy = enrolmentGroupPolicyStrategyFactory.getGroupEnrolmentStrategyInstance(grouping); if (!strategy.checkStudentInGrouping(grouping, username)) { throw new NotAuthorizedException(); } if (!checkStudentInStudentGroup(registration, studentGroup)) { throw new InvalidSituationServiceException(); } boolean result = strategy.checkNumberOfGroups(grouping, shift); if (!result) { throw new InvalidChangeServiceException(); } studentGroup.setShift(shift); informStudents(studentGroup, registration, grouping); return true; } private static boolean checkStudentInStudentGroup(Registration registration, StudentGroup studentGroup) throws FenixServiceException { boolean found = false; List studentGroupAttends = studentGroup.getAttends(); Attends attend = null; Iterator iterStudentGroupAttends = studentGroupAttends.iterator(); while (iterStudentGroupAttends.hasNext() && !found) { attend = ((Attends) iterStudentGroupAttends.next()); if (attend.getRegistration().equals(registration)) { found = true; } } return found; } private static void informStudents(final StudentGroup studentGroup, final Registration registration, final Grouping grouping) { final Set recievers = new HashSet(); for (final Attends attends : studentGroup.getAttends()) { recievers.add(attends.getRegistration().getPerson()); } final StringBuilder executionCourseNames = new StringBuilder(); for (final ExecutionCourse executionCourse : grouping.getExecutionCourses()) { if (executionCourseNames.length() > 0) { executionCourseNames.append(", "); } executionCourseNames.append(executionCourse.getNome()); } final String message = messages.getMessage("message.body.grouping.change.shift", registration.getNumber().toString(), studentGroup.getGroupNumber().toString(), executionCourseNames.toString()); final String groupName = messages.getMessage("message.group.name", studentGroup.getGroupNumber()); final Collection recipients = Collections .singletonList(new Recipient(groupName, new FixedSetGroup(recievers))); SystemSender systemSender = rootDomainObject.getSystemSender(); new Message(systemSender, systemSender.getConcreteReplyTos(), recipients, messages .getMessage("message.subject.grouping.change"), message, ""); // new Email("Fenix System", messages.getMessage("noreply.mail"), null, // emails, null, null, messages // .getMessage("message.subject.grouping.change"), // messages.getMessage("message.body.grouping.change.shift", // registration.getNumber().toString(), // studentGroup.getGroupNumber().toString())); } }