package fi.otavanopisto.pyramus.views.projects; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.apache.commons.lang.math.NumberUtils; import fi.internetix.smvc.controllers.PageRequestContext; import fi.otavanopisto.pyramus.I18N.Messages; import fi.otavanopisto.pyramus.breadcrumbs.Breadcrumbable; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.base.EducationalTimeUnitDAO; import fi.otavanopisto.pyramus.dao.courses.CourseDAO; import fi.otavanopisto.pyramus.dao.courses.CourseStudentDAO; import fi.otavanopisto.pyramus.dao.grading.CourseAssessmentDAO; import fi.otavanopisto.pyramus.dao.grading.ProjectAssessmentDAO; import fi.otavanopisto.pyramus.dao.grading.TransferCreditDAO; import fi.otavanopisto.pyramus.dao.projects.ProjectDAO; import fi.otavanopisto.pyramus.dao.projects.StudentProjectDAO; import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO; import fi.otavanopisto.pyramus.domainmodel.base.CourseOptionality; import fi.otavanopisto.pyramus.domainmodel.base.EducationalTimeUnit; import fi.otavanopisto.pyramus.domainmodel.base.Tag; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent; import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessment; import fi.otavanopisto.pyramus.domainmodel.grading.ProjectAssessment; import fi.otavanopisto.pyramus.domainmodel.grading.TransferCredit; import fi.otavanopisto.pyramus.domainmodel.projects.Project; import fi.otavanopisto.pyramus.domainmodel.projects.StudentProject; import fi.otavanopisto.pyramus.domainmodel.projects.StudentProjectModule; import fi.otavanopisto.pyramus.domainmodel.users.Role; import fi.otavanopisto.pyramus.framework.PyramusViewController; import fi.otavanopisto.pyramus.framework.UserRole; import fi.otavanopisto.pyramus.util.StringAttributeComparator; /** * The controller responsible of the Edit Project view of the application. */ public class ViewProjectViewController extends PyramusViewController implements Breadcrumbable { /** * Processes the page request by including the corresponding JSP page to the response. * * @param pageRequestContext Page request context */ public void process(PageRequestContext pageRequestContext) { StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO(); ProjectDAO projectDAO = DAOFactory.getInstance().getProjectDAO(); CourseDAO courseDAO = DAOFactory.getInstance().getCourseDAO(); StudentProjectDAO studentProjectDAO = DAOFactory.getInstance().getStudentProjectDAO(); EducationalTimeUnitDAO educationalTimeUnitDAO = DAOFactory.getInstance().getEducationalTimeUnitDAO(); Long projectId = NumberUtils.createLong(pageRequestContext.getRequest().getParameter("project")); Project project = projectDAO.findById(projectId); StringBuilder tagsBuilder = new StringBuilder(); Iterator<Tag> tagIterator = project.getTags().iterator(); while (tagIterator.hasNext()) { Tag tag = tagIterator.next(); tagsBuilder.append(tag.getText()); if (tagIterator.hasNext()) tagsBuilder.append(' '); } List<EducationalTimeUnit> educationalTimeUnits = educationalTimeUnitDAO.listUnarchived(); Collections.sort(educationalTimeUnits, new StringAttributeComparator("getName")); List<StudentProject> studentProjectsByProject = studentProjectDAO.listByProject(project); List<StudentProjectBean> studentProjectBeans = new ArrayList<>(); Collections.sort(studentProjectsByProject, new Comparator<StudentProject>() { @Override public int compare(StudentProject o1, StudentProject o2) { int v = o1.getStudent().getLastName().compareToIgnoreCase(o2.getStudent().getLastName()); return v != 0 ? v : o1.getStudent().getFirstName().compareToIgnoreCase(o2.getStudent().getFirstName()); } }); for (StudentProject sp : studentProjectsByProject) { studentProjectBeans.add(beanify(sp, courseDAO)); } pageRequestContext.getRequest().setAttribute("tags", tagsBuilder.toString()); pageRequestContext.getRequest().setAttribute("project", project); pageRequestContext.getRequest().setAttribute("studentProjects", studentProjectBeans); pageRequestContext.getRequest().setAttribute("optionalStudiesLengthTimeUnits", educationalTimeUnits); pageRequestContext.getRequest().setAttribute("users", userDAO.listAll()); pageRequestContext.setIncludeJSP("/templates/projects/viewproject.jsp"); } /** * Returns the roles allowed to access this page. Editing projects is available for users with * {@link Role#MANAGER} or {@link Role#ADMINISTRATOR} privileges. * * @return The roles allowed to access this page */ public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.MANAGER, UserRole.STUDY_PROGRAMME_LEADER, UserRole.ADMINISTRATOR }; } /** * Returns the localized name of this page. Used e.g. for breadcrumb navigation. * * @param locale The locale to be used for the name * * @return The localized name of this page */ public String getName(Locale locale) { return Messages.getInstance().getText(locale, "projects.viewProject.breadcrumb"); } private StudentProjectBean beanify(StudentProject studentProject, CourseDAO courseDAO) { int mandatoryModuleCount = 0; int optionalModuleCount = 0; int passedMandatoryModuleCount = 0; int passedOptionalModuleCount = 0; CourseStudentDAO courseStudentDAO = DAOFactory.getInstance().getCourseStudentDAO(); TransferCreditDAO transferCreditDAO = DAOFactory.getInstance().getTransferCreditDAO(); CourseAssessmentDAO courseAssessmentDAO = DAOFactory.getInstance().getCourseAssessmentDAO(); ProjectAssessmentDAO projectAssessmentDAO = DAOFactory.getInstance().getProjectAssessmentDAO(); /** * Go through project modules to * a) count mandatory/optional modules * b) count mandatory/optional modules that have passing grade on them * c) create beans to be passed to jsp */ List<TransferCredit> transferCreditsByStudent = transferCreditDAO.listByStudent(studentProject.getStudent()); for (StudentProjectModule studentProjectModule : studentProject.getStudentProjectModules()) { boolean hasPassingGrade = false; List<CourseStudent> courseStudentList = courseStudentDAO.listByModuleAndStudent(studentProjectModule.getModule(), studentProject.getStudent()); // Find out if there is a course that has passing grade for the module if (courseStudentList != null) { for (CourseStudent cs : courseStudentList) { CourseAssessment ca = courseAssessmentDAO.findByCourseStudentAndArchived(cs, Boolean.FALSE); if (ca != null && ca.getGrade() != null && ca.getGrade().getPassingGrade()) { hasPassingGrade = true; break; } } } if (!hasPassingGrade) { if ((studentProjectModule.getModule().getCourseNumber() != null) && (studentProjectModule.getModule().getCourseNumber() != -1) && (studentProjectModule.getModule().getSubject() != null)) { for (TransferCredit tc : transferCreditsByStudent) { if ((tc.getCourseNumber() != null) && (tc.getCourseNumber() != -1) && (tc.getSubject() != null)) { if (tc.getCourseNumber().equals(studentProjectModule.getModule().getCourseNumber()) && tc.getSubject().equals(studentProjectModule.getModule().getSubject())) { if (tc.getGrade() != null && tc.getGrade().getPassingGrade()) { hasPassingGrade = true; break; } } } } } } if (studentProjectModule.getOptionality() == CourseOptionality.MANDATORY) { mandatoryModuleCount++; if (hasPassingGrade) passedMandatoryModuleCount++; } else if (studentProjectModule.getOptionality() == CourseOptionality.OPTIONAL) { optionalModuleCount++; if (hasPassingGrade) passedOptionalModuleCount++; } } List<ProjectAssessment> projectAssessments = projectAssessmentDAO.listByProjectAndArchived(studentProject, Boolean.FALSE); Collections.sort(projectAssessments, new Comparator<ProjectAssessment>() { @Override public int compare(ProjectAssessment o1, ProjectAssessment o2) { return o2.getDate().compareTo(o1.getDate()); } }); return new StudentProjectBean(studentProject, mandatoryModuleCount, optionalModuleCount, passedMandatoryModuleCount, passedOptionalModuleCount, projectAssessments); } public class StudentProjectBean { private final StudentProject studentProject; private final int passedOptionalModuleCount; private final int mandatoryModuleCount; private final int optionalModuleCount; private final int passedMandatoryModuleCount; private final List<ProjectAssessment> assessments; public StudentProjectBean(StudentProject studentProject, int mandatoryModuleCount, int optionalModuleCount, int passedMandatoryModuleCount, int passedOptionalModuleCount, List<ProjectAssessment> assessments) { this.studentProject = studentProject; this.mandatoryModuleCount = mandatoryModuleCount; this.optionalModuleCount = optionalModuleCount; this.passedOptionalModuleCount = passedOptionalModuleCount; this.passedMandatoryModuleCount = passedMandatoryModuleCount; this.assessments = assessments; } public StudentProject getStudentProject() { return studentProject; } public int getPassedOptionalModuleCount() { return passedOptionalModuleCount; } public int getMandatoryModuleCount() { return mandatoryModuleCount; } public int getOptionalModuleCount() { return optionalModuleCount; } public int getPassedMandatoryModuleCount() { return passedMandatoryModuleCount; } public List<ProjectAssessment> getAssessments() { return assessments; } } }