/**
* 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.phd;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyPeriod;
import org.fenixedu.academic.domain.phd.thesis.PhdThesisProcessStateType;
import org.fenixedu.academic.util.predicates.AndPredicate;
import org.fenixedu.academic.util.predicates.InlinePredicate;
import org.fenixedu.commons.StringNormalizer;
public class SearchPhdIndividualProgramProcessBean implements Serializable {
static private final long serialVersionUID = -5653277152319382139L;
public static enum SearchCriterion {
PROCESS_NUMBER, STUDENT_NUMBER, NAME, PHD_STUDENT_NUMBER
}
public static enum OnlineApplicationFilter {
ONLY_ONLINE, EXCLUDE_ONLINE
}
private SearchCriterion searchCriterion = SearchCriterion.PROCESS_NUMBER;
private String searchValue;
private ExecutionYear executionYear;
private PhdIndividualProgramProcessState processState;
private String processNumber;
private Integer studentNumber;
private Integer phdStudentNumber;
private List<PhdProgram> phdPrograms;
private Boolean filterPhdPrograms = Boolean.TRUE;
private List<PhdIndividualProgramProcess> processes;
private Boolean filterPhdProcesses = Boolean.TRUE;
private String name;
private PhdProgramCandidacyProcessState candidacyProcessState;
private PhdThesisProcessStateType thesisProcessState;
private PhdProgram phdProgram;
private OnlineApplicationFilter onlineApplicationFilter;
private PhdCandidacyPeriod phdCandidacyPeriod;
private PhdIndividualProgramCollaborationType phdCollaborationType;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
public void setSearchCriterion(SearchCriterion searchCriterion) {
this.searchCriterion = searchCriterion;
}
public SearchCriterion getSearchCriterion() {
return searchCriterion;
}
public PhdProgramCandidacyProcessState getCandidacyProcessState() {
return candidacyProcessState;
}
public void setCandidacyProcessState(PhdProgramCandidacyProcessState candidacyProcessState) {
this.candidacyProcessState = candidacyProcessState;
}
public Boolean getFilterPhdPrograms() {
return filterPhdPrograms;
}
public void setFilterPhdPrograms(Boolean filterPhdPrograms) {
this.filterPhdPrograms = filterPhdPrograms;
}
public Boolean getFilterPhdProcesses() {
return filterPhdProcesses;
}
public void setFilterPhdProcesses(Boolean filterPhdProcesses) {
this.filterPhdProcesses = filterPhdProcesses;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<PhdProgram> getPhdPrograms() {
final List<PhdProgram> result = new ArrayList<PhdProgram>();
for (final PhdProgram each : this.phdPrograms) {
result.add(each);
}
return result;
}
public void setPhdPrograms(List<PhdProgram> phdPrograms) {
setPhdPrograms((Collection<PhdProgram>) phdPrograms);
}
public void setPhdPrograms(Collection<PhdProgram> phdPrograms) {
final List<PhdProgram> result = new ArrayList<PhdProgram>();
for (final PhdProgram each : phdPrograms) {
result.add(each);
}
this.phdPrograms = result;
}
public ExecutionYear getExecutionYear() {
return this.executionYear;
}
public void setExecutionYear(ExecutionYear executionYear) {
this.executionYear = executionYear;
}
public PhdIndividualProgramProcessState getProcessState() {
return processState;
}
public void setProcessState(PhdIndividualProgramProcessState processState) {
this.processState = processState;
}
public String getProcessNumber() {
return processNumber;
}
public void setProcessNumber(String processNumber) {
this.processNumber = processNumber;
}
public Integer getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(Integer studentNumber) {
this.studentNumber = studentNumber;
}
public PhdThesisProcessStateType getThesisProcessState() {
return thesisProcessState;
}
public void setThesisProcessState(PhdThesisProcessStateType thesisProcessStateType) {
this.thesisProcessState = thesisProcessStateType;
}
public PhdCandidacyPeriod getPhdCandidacyPeriod() {
return phdCandidacyPeriod;
}
public void setPhdCandidacyPeriod(PhdCandidacyPeriod phdCandidacyPeriod) {
this.phdCandidacyPeriod = phdCandidacyPeriod;
}
public List<PhdIndividualProgramProcess> getProcesses() {
final List<PhdIndividualProgramProcess> result = new ArrayList<PhdIndividualProgramProcess>();
for (final PhdIndividualProgramProcess each : this.processes) {
result.add(each);
}
return result;
}
public void setProcesses(List<PhdIndividualProgramProcess> processes) {
final List<PhdIndividualProgramProcess> result = new ArrayList<PhdIndividualProgramProcess>();
for (final PhdIndividualProgramProcess each : processes) {
result.add(each);
}
this.processes = result;
}
public AndPredicate<PhdIndividualProgramProcess> getPredicates() {
if (getSearchValue() != null && !getSearchValue().isEmpty()) {
String searchValue = getSearchValue().trim();
setProcessNumber((getSearchCriterion() == SearchCriterion.PROCESS_NUMBER) ? searchValue : null);
setStudentNumber((getSearchCriterion() == SearchCriterion.STUDENT_NUMBER) ? Integer.valueOf(searchValue) : null);
setPhdStudentNumber((getSearchCriterion() == SearchCriterion.PHD_STUDENT_NUMBER) ? Integer.valueOf(searchValue) : null);
setName((getSearchCriterion() == SearchCriterion.NAME) ? searchValue : null);
}
final AndPredicate<PhdIndividualProgramProcess> result = new AndPredicate<PhdIndividualProgramProcess>();
result.add(getManagedPhdProgramsAndProcessesPredicate());
if (getStudentNumber() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, Integer>(getStudentNumber()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return toEval.getStudent() != null && toEval.getStudent().getNumber().compareTo(getValue()) == 0;
}
});
return result;
}
if (!StringUtils.isEmpty(getProcessNumber())) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, String>(getProcessNumber()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return toEval.getProcessNumber().equals(getValue());
}
});
return result;
}
if (getPhdStudentNumber() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, Integer>(getPhdStudentNumber()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return toEval.getPhdStudentNumber() != null && toEval.getPhdStudentNumber().compareTo(getValue()) == 0;
}
});
return result;
}
if (!StringUtils.isEmpty(getName())) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, String[]>(
StringNormalizer.normalizeAndRemoveAccents(getName().toLowerCase().trim()).split("\\s+")) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
String normalizedName = StringNormalizer
.normalizeAndRemoveAccents(toEval.getPerson().getProfile().getFullName().toLowerCase().trim());
return Arrays.stream(getValue()).allMatch(normalizedName::contains);
}
});
return result;
}
result.add(getAndPredicate());
return result;
}
public AndPredicate<PhdIndividualProgramProcess> getAndPredicate() {
final AndPredicate<PhdIndividualProgramProcess> result = new AndPredicate<PhdIndividualProgramProcess>();
result.add(getManagedPhdProgramsAndProcessesPredicate());
if (getExecutionYear() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, ExecutionYear>(getExecutionYear()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return toEval.getExecutionYear() == getValue();
}
});
}
if (getPhdProgram() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdProgram>(getPhdProgram()) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return process.getPhdProgram() == getValue();
}
});
}
if (getProcessState() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdIndividualProgramProcessState>(getProcessState()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return toEval.getActiveState() == getValue();
}
});
}
if (PhdIndividualProgramProcessState.CANDIDACY.equals(getProcessState()) && getCandidacyProcessState() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdProgramCandidacyProcessState>(
getCandidacyProcessState()) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return getValue().equals(process.getCandidacyProcess().getActiveState());
}
});
}
if (PhdIndividualProgramProcessState.THESIS_DISCUSSION.equals(getProcessState()) && getThesisProcessState() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdThesisProcessStateType>(getThesisProcessState()) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return process.getThesisProcess() != null && getValue().equals(process.getThesisProcess().getActiveState());
}
});
}
if (OnlineApplicationFilter.EXCLUDE_ONLINE.equals(getOnlineApplicationFilter())) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, String>(null) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return !process.getCandidacyProcess().isPublicCandidacy();
}
});
}
if (OnlineApplicationFilter.ONLY_ONLINE.equals(getOnlineApplicationFilter())) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, String>(null) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return process.getCandidacyProcess().isPublicCandidacy();
}
});
if (getPhdCandidacyPeriod() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdCandidacyPeriod>(getPhdCandidacyPeriod()) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return process.getCandidacyProcess().getPublicPhdCandidacyPeriod() == getValue();
}
});
}
}
if (getPhdCollaborationType() != null) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, PhdIndividualProgramCollaborationType>(
getPhdCollaborationType()) {
@Override
public boolean test(PhdIndividualProgramProcess process) {
return process.getCollaborationType() == getValue();
}
});
}
return result;
}
private AndPredicate<PhdIndividualProgramProcess> getManagedPhdProgramsAndProcessesPredicate() {
final AndPredicate<PhdIndividualProgramProcess> result = new AndPredicate<PhdIndividualProgramProcess>();
if (getFilterPhdPrograms() != null && getFilterPhdPrograms().booleanValue()) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, List<PhdProgram>>(getPhdPrograms()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
if (toEval.getPhdProgram() != null) {
return getValue().contains(toEval.getPhdProgram());
} else if (toEval.getPhdProgramFocusArea() != null) {
return !CollectionUtils.intersection(getValue(), toEval.getPhdProgramFocusArea().getPhdProgramsSet())
.isEmpty();
} else {
return false;
}
}
});
}
if (getFilterPhdProcesses() != null && getFilterPhdProcesses().booleanValue()) {
result.add(new InlinePredicate<PhdIndividualProgramProcess, List<PhdIndividualProgramProcess>>(getProcesses()) {
@Override
public boolean test(PhdIndividualProgramProcess toEval) {
return getValue().contains(toEval);
}
});
}
return result;
}
public Integer getPhdStudentNumber() {
return phdStudentNumber;
}
public void setPhdStudentNumber(Integer phdStudentNumber) {
this.phdStudentNumber = phdStudentNumber;
}
public PhdProgram getPhdProgram() {
return phdProgram;
}
public void setPhdProgram(PhdProgram phdProgram) {
this.phdProgram = phdProgram;
}
public OnlineApplicationFilter getOnlineApplicationFilter() {
return onlineApplicationFilter;
}
public void setOnlineApplicationFilter(OnlineApplicationFilter onlineApplicationFilter) {
this.onlineApplicationFilter = onlineApplicationFilter;
}
public PhdIndividualProgramCollaborationType getPhdCollaborationType() {
return phdCollaborationType;
}
public void setPhdCollaborationType(PhdIndividualProgramCollaborationType phdCollaborationType) {
this.phdCollaborationType = phdCollaborationType;
}
}