Java tutorial
/** * Copyright 2002 Instituto Superior Tcnico * * This file is part of FenixEdu Core. * * FenixEdu Core 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 Core 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 Core. If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.fenixedu.dataTransferObject.externalServices; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import net.sourceforge.fenixedu.domain.CourseLoad; import net.sourceforge.fenixedu.domain.CurricularCourse; import net.sourceforge.fenixedu.domain.Degree; import net.sourceforge.fenixedu.domain.Department; import net.sourceforge.fenixedu.domain.ExecutionCourse; import net.sourceforge.fenixedu.domain.ExecutionSemester; import net.sourceforge.fenixedu.domain.ExternalTeacherAuthorization; import net.sourceforge.fenixedu.domain.Professorship; import net.sourceforge.fenixedu.domain.Qualification; import net.sourceforge.fenixedu.domain.QualificationType; import net.sourceforge.fenixedu.domain.ShiftType; import net.sourceforge.fenixedu.domain.Teacher; import net.sourceforge.fenixedu.domain.TeacherAuthorization; import net.sourceforge.fenixedu.domain.personnelSection.contracts.GiafProfessionalData; import net.sourceforge.fenixedu.domain.personnelSection.contracts.PersonProfessionalData; import net.sourceforge.fenixedu.domain.personnelSection.contracts.ProfessionalCategory; import net.sourceforge.fenixedu.domain.personnelSection.contracts.ProfessionalRegime; import net.sourceforge.fenixedu.domain.phd.InternalPhdParticipant; import net.sourceforge.fenixedu.domain.phd.PhdIndividualProgramProcess; import net.sourceforge.fenixedu.domain.teacher.Career; import net.sourceforge.fenixedu.domain.teacher.DegreeTeachingService; import net.sourceforge.fenixedu.domain.teacher.DegreeTeachingServiceCorrection; import net.sourceforge.fenixedu.domain.teacher.OtherService; import net.sourceforge.fenixedu.domain.teacher.ProfessionalCareer; import net.sourceforge.fenixedu.domain.teacher.TeacherService; import net.sourceforge.fenixedu.domain.thesis.ThesisEvaluationParticipant; import net.sourceforge.fenixedu.domain.thesis.ThesisParticipationType; import org.apache.commons.collections.comparators.ReverseComparator; import org.apache.commons.lang.StringUtils; import org.fenixedu.commons.StringNormalizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TeacherCurricularInformation implements Serializable { private static final Logger logger = LoggerFactory.getLogger(TeacherCurricularInformation.class); protected Teacher teacher; protected Degree degree; protected SortedSet<ExecutionSemester> executionSemesters = new TreeSet<ExecutionSemester>( ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR); protected SortedSet<QualificationBean> qualificationBeans = new TreeSet<QualificationBean>( new ReverseComparator(new Comparator<QualificationBean>() { @Override public int compare(final QualificationBean o1, final QualificationBean o2) { int compareType = o1.type.compareTo(o2.type); if (compareType == 0) { if (o1.year == null && o2.year == null) { return 0; } else if (o1.year == null) { return -1; } else if (o2.year == null) { return 1; } return o1.year.compareTo(o2.year); } if ((o1.getType().equals(QualificationType.AGGREGATION) && o2.getType().isDoctorate()) || (o2.getType().equals(QualificationType.AGGREGATION) && o1.getType().isDoctorate())) { return -compareType; } return compareType; } })); protected List<LecturedCurricularUnit> lecturedUCs = new ArrayList<LecturedCurricularUnit>(); protected List<String> teacherPublications = new ArrayList<String>(); public TeacherCurricularInformation(Teacher teacher, Degree degree, List<ExecutionSemester> executionSemester, List<String> list) { super(); this.teacher = teacher; this.degree = degree; this.executionSemesters.addAll(executionSemester); for (Qualification qualification : teacher.getPerson().getAssociatedQualificationsSet()) { if (qualification.getType() != null && (qualification.getType().isDegree() || qualification.getType().isMaster() || qualification.getType().isDoctorate() || qualification.getType().equals(QualificationType.AGGREGATION))) { this.qualificationBeans.add(new QualificationBean(qualification)); } } if (list != null) { this.teacherPublications = list; } setlecturedUCs(); } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public SortedSet<QualificationBean> getQualifications() { return qualificationBeans; } public void setQualifications(SortedSet<QualificationBean> qualificationBeans) { this.qualificationBeans = qualificationBeans; } public String getUnitName() { Department lastWorkingDepartment = getTeacher().getLastWorkingDepartment( executionSemesters.first().getBeginDateYearMonthDay(), executionSemesters.last().getEndDateYearMonthDay()); return lastWorkingDepartment == null ? null : lastWorkingDepartment.getName(); } public String getProfessionalCategoryName() { ProfessionalCategory lastCategory = getTeacher().getLastCategory( executionSemesters.first().getBeginDateYearMonthDay().toLocalDate(), executionSemesters.last().getEndDateYearMonthDay().toLocalDate()); if (lastCategory != null) { if (lastCategory.getName().getContent().equalsIgnoreCase("Assistente")) { return "Assistente"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Assistente Convidado")) { return "Assistente convidado"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip. Assistente") || lastCategory.getName().getContent().equalsIgnoreCase("Equiparado Assistente")) { return "Equiparado a Assistente"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip. Assistente Convidado")) { return "Equiparado a Assistente"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip. Prof. Auxiliar") || lastCategory.getName().getContent().equalsIgnoreCase("Equiparado Professor Auxiliar") || lastCategory.getName().getContent().equalsIgnoreCase("Professor Auxiliar")) { return "Professor Auxiliar"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip.Assistente Estagiario")) { return "Assistente Estagirio"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip.Monitor S/Lic") || lastCategory.getName().getContent().equalsIgnoreCase("Monitor-E.C.D.U. c/Licenciatura") || lastCategory.getName().getContent().equalsIgnoreCase("Monitor-E.C.D.U.s/Licenciatura")) { return "Monitor"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Equip.Prof.Auxiliar Convidado") || lastCategory.getName().getContent().equalsIgnoreCase("Prof Auxiliar Convidado")) { return "Professor Auxiliar convidado"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Professor Associado")) { return "Professor Associado"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Professor Associado Convidado")) { return "Professor Associado convidado"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Professor Catedrtico")) { return "Professor Catedrtico"; } else if (lastCategory.getName().getContent().equalsIgnoreCase("Professor Catedrtico Convidado")) { return "Professor Catedrtico convidado"; } logger.debug("Invalid category: " + lastCategory.getName().getContent()); } return lastCategory == null ? null : lastCategory.getName().getContent(); } public Float getProfessionalRegimeTime() { float maxRegimeTime = 100f; PersonProfessionalData personProfessionalData = getTeacher().getPerson().getPersonProfessionalData(); ProfessionalRegime lastProfessionalRegime = null; if (personProfessionalData != null) { GiafProfessionalData giafProfessionalData = personProfessionalData.getGiafProfessionalData(); if (giafProfessionalData != null) { lastProfessionalRegime = personProfessionalData.getLastProfessionalRegime(giafProfessionalData, executionSemesters.first().getBeginDateYearMonthDay().toLocalDate(), executionSemesters.last().getEndDateYearMonthDay().toLocalDate()); } } if (lastProfessionalRegime != null) { String regime = StringNormalizer.normalize(lastProfessionalRegime.getName().getContent()); if (regime.matches(".*?" + StringNormalizer.normalize("Tempo Integral") + ".*?")) { return maxRegimeTime; } else if (regime.matches(".*?" + StringNormalizer.normalize("Exclusividade") + ".*?")) { return maxRegimeTime; } else if (regime.matches(".*?" + StringNormalizer.normalize("Tempo Parcial") + ".*?")) { Integer weighting = lastProfessionalRegime.getWeighting(); if (weighting != null) { return Math.min(maxRegimeTime, weighting); } } } Float authorizationRegimeTime = getAuthorizationRegimeTime(executionSemesters.last()); if (authorizationRegimeTime == 0f) { authorizationRegimeTime = getAuthorizationRegimeTime(executionSemesters.first()); } return authorizationRegimeTime; } protected Float getAuthorizationRegimeTime(ExecutionSemester executionSemester) { TeacherAuthorization teacherAuthorization = getTeacher().getTeacherAuthorization(executionSemester); if (teacherAuthorization != null) { Double lessonHours = ((ExternalTeacherAuthorization) teacherAuthorization).getLessonHours(); return new Float(Math.round(lessonHours * 100 / 12)); } return 0f; } public List<String> getTop5ResultParticipation() { return addUntil5Elements(teacherPublications); } public List<String> getTop5ProfessionalDevelomentActivities() { return addUntil5Elements(new ArrayList<String>()); } public List<String> getTop5ProfessionalCareer() { List<String> result = new ArrayList<String>(); List<ProfessionalCareer> sorted = new ArrayList<ProfessionalCareer>(); for (Career career : teacher.getPerson().getAssociatedCareersSet()) { if (career instanceof ProfessionalCareer) { sorted.add((ProfessionalCareer) career); } } Collections.sort(sorted, ProfessionalCareer.CAREER_DATE_COMPARATOR); for (ProfessionalCareer professionalCareer : sorted.subList(0, Math.min(5, sorted.size()))) { result.add(professionalCareer.getBeginYear() + (professionalCareer.getEndYear() != null ? " - " + professionalCareer.getEndYear() : "") + " " + professionalCareer.getFunction() + " (" + professionalCareer.getEntity() + ")"); } return addUntil5Elements(result); } private List<String> addUntil5Elements(List<String> top5) { for (int i = top5.size(); i < 5; i++) { top5.add(StringUtils.EMPTY); } return top5; } private static String formatParticipant(String name) { String[] parts = name.split("\\s+"); return name.charAt(0) + ". " + parts[parts.length - 1]; } private String filter(String... text) { Set<String> parts = new HashSet<String>(); for (String string : text) { if (StringUtils.isNotBlank(string)) { parts.add(string.replace('\n', ' ').replace('\r', ' ').trim()); } } return StringUtils.join(parts, ", "); } private String join(String journal, String volume, Integer year) { StringBuilder builder = new StringBuilder(); if (StringUtils.isNotBlank(journal)) { builder.append(journal); } if (StringUtils.isNotBlank(volume)) { builder.append(" - " + volume); } if (year != null) { builder.append(" " + year); } return builder.toString(); } private void insert(List<String> publication, Integer part) { if (part != null) { publication.add(Integer.toString(part)); } } private void insert(List<String> publication, String part) { if (StringUtils.isNotBlank(part)) { publication.add(part); } } public void setlecturedUCs() { for (ExecutionSemester executionSemester : executionSemesters) { for (Professorship professorship : teacher.getProfessorships(executionSemester)) { getLecturedCurricularUnitForProfessorship(professorship, executionSemester); } for (ThesisEvaluationParticipant thesisEvaluationParticipant : teacher.getPerson() .getThesisEvaluationParticipants(executionSemester)) { final ThesisParticipationType type = thesisEvaluationParticipant.getType(); if (type == ThesisParticipationType.ORIENTATOR || type == ThesisParticipationType.COORIENTATOR) { ExecutionCourse executionCourse = thesisEvaluationParticipant.getThesis().getEnrolment() .getExecutionCourseFor(executionSemester); if (executionCourse != null) { addLecturedCurricularUnit(executionCourse.getDegreePresentationString(), executionCourse.getName(), "OT", (float) 0); } } } if (degree.getPhdProgram() != null) { for (InternalPhdParticipant participant : teacher.getPerson().getInternalParticipantsSet()) { PhdIndividualProgramProcess phdIndividualProgramProcess = participant.getIndividualProcess(); if (phdIndividualProgramProcess.getPhdProgram().equals(degree.getPhdProgram()) && phdIndividualProgramProcess .isActive(executionSemester.getAcademicInterval().toInterval()) && phdIndividualProgramProcess.isGuiderOrAssistentGuider(teacher.getPerson()) && teacher.isActiveOrHasAuthorizationForSemester(executionSemester)) { addLecturedCurricularUnit(phdIndividualProgramProcess.getPhdProgram().getAcronym(), "Dissertao", "OT", (float) 0); } } } } return; } public List<LecturedCurricularUnit> getLecturedUCs() { Collections.sort(lecturedUCs); return lecturedUCs; } public String getDegreeSiglas(ExecutionCourse executionCourse) { Set<String> degreeSiglas = new HashSet<String>(); for (CurricularCourse curricularCourse : executionCourse.getAssociatedCurricularCoursesSet()) { degreeSiglas.add(curricularCourse.getDegreeCurricularPlan().getDegree().getSigla()); } return StringUtils.join(degreeSiglas, ", "); } protected void getLecturedCurricularUnitForProfessorship(Professorship professorship, ExecutionSemester executionSemester) { Map<String, Float> hoursByTypeMap = new HashMap<String, Float>(); TeacherService teacherService = teacher.getTeacherServiceByExecutionPeriod(executionSemester); final StringBuilder shiftTypeDescription = new StringBuilder(); if (teacherService != null) { List<DegreeTeachingService> degreeTeachingServices = teacherService .getDegreeTeachingServiceByProfessorship(professorship); for (DegreeTeachingService degreeTeachingService : degreeTeachingServices) { for (CourseLoad courseLoad : degreeTeachingService.getShift().getCourseLoadsSet()) { final ShiftType type = courseLoad.getType(); appendShiftType(shiftTypeDescription, type); Float duration = hoursByTypeMap.get(StringUtils.EMPTY); Float weeklyHours = courseLoad.getTotalQuantity().floatValue() * (degreeTeachingService.getPercentage().floatValue() / 100); hoursByTypeMap.put(StringUtils.EMPTY, duration == null ? weeklyHours : duration + weeklyHours); } } for (OtherService otherService : teacherService.getOtherServices()) { if (otherService instanceof DegreeTeachingServiceCorrection) { DegreeTeachingServiceCorrection degreeTeachingServiceCorrection = (DegreeTeachingServiceCorrection) otherService; if (degreeTeachingServiceCorrection.getProfessorship().equals(professorship) && (!degreeTeachingServiceCorrection.getProfessorship().getExecutionCourse() .isDissertation()) && (!degreeTeachingServiceCorrection.getProfessorship().getExecutionCourse() .getProjectTutorialCourse())) { Float duration = hoursByTypeMap.get(StringUtils.EMPTY); Float weeklyHours = degreeTeachingServiceCorrection.getCorrection().floatValue(); hoursByTypeMap.put(StringUtils.EMPTY, duration == null ? weeklyHours : duration + weeklyHours); } } } } String name = professorship.getExecutionCourse().getName(); if (hoursByTypeMap.isEmpty()) { addLecturedCurricularUnit(professorship.getExecutionCourse().getDegreePresentationString(), name, "O", (float) 0); } else { for (String shiftType : hoursByTypeMap.keySet()) { addLecturedCurricularUnit(professorship.getExecutionCourse().getDegreePresentationString(), name, /*shiftType*/ shiftTypeDescription.toString(), hoursByTypeMap.get(StringUtils.EMPTY)); } } } private void appendShiftType(final StringBuilder builder, final ShiftType type) { if (type != null) { final String t = convertShiftType(type); if (t != null && !t.isEmpty()) { String string = builder.toString(); if (!string.equals(t) && !string.startsWith(t + ',') && !string.endsWith("," + t)) { if (!string.isEmpty()) { builder.append(','); } builder.append(t); } } } } private void addLecturedCurricularUnit(String degree, String name, String shiftType, Float hours) { for (LecturedCurricularUnit lecturedCurricularUnit : lecturedUCs) { if (lecturedCurricularUnit.getName().equals(name) && lecturedCurricularUnit.getOriginalShiftType().equals(shiftType)) { lecturedUCs.remove(lecturedCurricularUnit); lecturedCurricularUnit.addHours(hours); lecturedCurricularUnit.addDegree(degree); lecturedUCs.add(lecturedCurricularUnit); return; } } lecturedUCs.add(new LecturedCurricularUnit(degree, name, shiftType, hours)); } public class QualificationBean { protected QualificationType type; protected String degree; protected String scientificArea; protected Integer year; protected String institution; protected String classification; public QualificationBean(Qualification qualification) { type = qualification.getType(); degree = qualification.getType() != null ? qualification.getType().getLocalizedName().trim() : "Sem Grau"; if (qualification.getType().name().startsWith("DOCTORATE_DEGREE")) { degree = QualificationType.DOCTORATE_DEGREE.getLocalizedName(); } scientificArea = qualification.getDegree(); year = qualification.getYear() != null ? Integer.parseInt(qualification.getYear()) : null; institution = qualification.getSchool(); classification = qualification.getMark() != null ? qualification.getMark() : "-"; } public QualificationType getType() { return type; } public String getDegree() { return degree; } public String getScientificArea() { return scientificArea; } public Integer getYear() { return year; } public String getInstitution() { return institution; } public String getClassification() { return classification; } } private static String convertShiftType(final ShiftType shiftType) { if (shiftType == null) { return "0"; } if (shiftType == ShiftType.LABORATORIAL) { return "PL"; } if (shiftType == ShiftType.PROBLEMS) { return "TP"; } return shiftType.getSiglaTipoAula(); } public class LecturedCurricularUnit implements Comparable<LecturedCurricularUnit> { protected Set<String> degrees = new HashSet<String>(); protected String name; protected String shiftType; protected float hours; public LecturedCurricularUnit(String degree, String name, String shiftType, float hoursValue) { addDegree(degree); this.name = name; this.shiftType = shiftType; this.hours = hoursValue; } public void addDegree(String degrees) { for (String thisDegree : degrees.split(",")) { this.degrees.add(thisDegree.trim()); } } public void addHours(Float hours) { this.hours = this.hours + hours; } protected String getOriginalShiftType() { return shiftType; } public String getShiftType() { if (shiftType == null) { return null; } else if (shiftType.equals("T") || shiftType.equals("TP") || shiftType.equals("TC") || shiftType.equals("S") || shiftType.equals("E") || shiftType.equals("OT") || shiftType.equals("PL")) { return shiftType; } else if (shiftType.equals("L")) { return "PL"; } else if (shiftType.equals("PB")) { return "TP"; } else if (shiftType.equals(StringUtils.EMPTY)) { return StringUtils.EMPTY; } else if (shiftType.indexOf(',') > 0) { return shiftType; } return "O"; } public String getName() { return name; } public float getHours() { return ((float) Math.round(hours * 100)) / 100; } public String getDegree() { return StringUtils.join(degrees, ", "); } @Override public boolean equals(Object obj) { if (obj instanceof LecturedCurricularUnit) { LecturedCurricularUnit o = (LecturedCurricularUnit) obj; return equal(getDegree(), o.getDegree()) && equal(getName(), o.getName()) && equal(getShiftType(), o.getShiftType()) && equal(getHours(), o.getHours()); } return false; } protected boolean equal(Object obj1, Object obj2) { if (obj1 == null && obj2 == null) { return true; } if (obj1 == null || obj2 == null) { return false; } return obj1.equals(obj2); } @Override public int hashCode() { return getDegree().hashCode() + getName().hashCode() + (getShiftType() != null ? getShiftType().hashCode() : 0) + (int) getHours(); } @Override public int compareTo(LecturedCurricularUnit o) { String sigla = TeacherCurricularInformation.this.degree.getSigla(); if (getDegree().matches("(.*, )*" + sigla + "(, .*)*") && !o.getDegree().matches("(.*, )*" + sigla + "(, .*)*") && getHours() != 0) { return -1; } else if ((!getDegree().matches("(.*, )*" + sigla + "(, .*)*")) && o.getDegree().matches("(.*, )*" + sigla + "(, .*)*") && o.getHours() != 0) { return 1; } return ((Float) o.getHours()).compareTo(getHours()); } } }