/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST 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.
*
* Fenix IST 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 Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
package pt.ist.fenix.domain.unit.components;
import static java.util.stream.Collectors.toList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.TreeSet;
import java.util.function.Predicate;
import org.fenixedu.academic.domain.CompetenceCourse;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences;
import org.fenixedu.academic.domain.degreeStructure.CompetenceCourseInformation;
import org.fenixedu.academic.domain.organizationalStructure.DepartmentUnit;
import org.fenixedu.cms.domain.Page;
import org.fenixedu.cms.domain.Site;
import org.fenixedu.cms.domain.component.ComponentType;
import org.fenixedu.cms.exceptions.ResourceNotFoundException;
import org.fenixedu.cms.rendering.TemplateContext;
import pt.ist.fenix.domain.unit.UnitSite;
import pt.ist.fenixframework.FenixFramework;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@ComponentType(name = "departmentCourse", description = "Provides a specific competence course")
public class CompetenceCourseComponent extends UnitSiteComponent {
@Override
public void handle(Page page, TemplateContext componentContext, TemplateContext globalContext) {
CompetenceCourse competenceCourse = FenixFramework.getDomainObject(globalContext.getRequestContext()[1]);
if (competenceCourse == null) {
throw new ResourceNotFoundException();
}
ExecutionSemester semester = executionSemester(competenceCourse, globalContext.getRequestContext());
globalContext.put("competenceCourse", wrap(competenceCourse, semester));
globalContext.put("executionSemesterUrls", executionSemesterUrls(competenceCourse, page));
}
private Map<String, Object> wrap(CompetenceCourse competenceCourse, ExecutionSemester semester) {
HashMap<String, Object> wrap = Maps.newHashMap();
wrap.put("name", competenceCourse.getNameI18N(semester).toLocalizedString());
wrap.put("courseLoads", competenceCourse.getSortedCompetenceCourseLoads(semester));
wrap.put("mainBibliographicReferences",
bibliographicReferences(competenceCourse, BibliographicReferences.BibliographicReferenceType.MAIN, semester));
wrap.put("secondaryBibliographicReferences",
bibliographicReferences(competenceCourse, BibliographicReferences.BibliographicReferenceType.SECONDARY, semester));
wrap.put("executionSemester", semester);
wrap.put("evaluationMethod", competenceCourse.getLocalizedEvaluationMethod(semester));
wrap.put("program", competenceCourse.getProgramI18N(semester).toLocalizedString());
wrap.put("objectives", competenceCourse.getObjectivesI18N(semester).toLocalizedString());
wrap.put("regime", competenceCourse.getRegime(semester).getLocalizedName());
wrap.put("isBasic", competenceCourse.isBasic(semester));
wrap.put("competenceCourseLevel", competenceCourse.getLocalizedEvaluationMethod(semester));
wrap.put("associatedCurricularCourses", competenceCourse.getAssociatedCurricularCoursesSet());
wrap.put("competenceCourseGroupUnit", competenceCourse.getCompetenceCourseGroupUnit(semester));
return wrap;
}
private Map<ExecutionSemester, String> executionSemesterUrls(CompetenceCourse competenceCourse, Page page) {
Map<ExecutionSemester, String> semesterUrl = Maps.newTreeMap(ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR);
for (ExecutionSemester semester : executionSemesters(competenceCourse)) {
semesterUrl.put(semester,
String.format("%s/%s/%s", page.getAddress(), competenceCourse.getExternalId(), semester.getExternalId()));
}
return semesterUrl;
}
private List<BibliographicReferences.BibliographicReference> bibliographicReferences(CompetenceCourse competenceCourse,
BibliographicReferences.BibliographicReferenceType type, ExecutionSemester semester) {
Predicate<BibliographicReferences.BibliographicReference> isType =
bibliographicReference -> bibliographicReference.getType().equals(type);
return bibliographicReferences(competenceCourse, semester).stream().filter(isType).collect(toList());
}
private List<BibliographicReferences.BibliographicReference> bibliographicReferences(CompetenceCourse competenceCourse,
ExecutionSemester semester) {
if (competenceCourse.getBibliographicReferences(semester) != null) {
return competenceCourse.getBibliographicReferences(semester).getBibliographicReferencesList();
} else {
return Lists.newArrayList();
}
}
private ExecutionSemester executionSemester(CompetenceCourse competenceCourse, String[] requestContext) {
if (requestContext.length >= 3 && !Strings.isNullOrEmpty(requestContext[2])) {
return FenixFramework.getDomainObject(requestContext[2]);
} else {
Optional<CompetenceCourseInformation> information =
competenceCourse.getCompetenceCourseInformationsSet().stream().findFirst();
return information.isPresent() ? information.get().getExecutionPeriod() : ExecutionSemester
.readActualExecutionSemester();
}
}
private TreeSet<ExecutionSemester> executionSemesters(CompetenceCourse competenceCourse) {
final TreeSet<ExecutionSemester> result = Sets.newTreeSet(ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR);
ExecutionSemester semester = competenceCourse.getStartExecutionSemester();
result.add(semester);
while (semester.hasNextExecutionPeriod()) {
semester = semester.getNextExecutionPeriod();
result.add(semester);
}
return result;
}
public static boolean supportsSite(Site site) {
return site instanceof UnitSite && ((UnitSite) site).getUnit() instanceof DepartmentUnit;
}
}