package fi.otavanopisto.pyramus.json.students; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import fi.internetix.smvc.controllers.JSONRequestContext; import fi.otavanopisto.pyramus.I18N.Messages; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.base.LanguageDAO; import fi.otavanopisto.pyramus.dao.base.MunicipalityDAO; import fi.otavanopisto.pyramus.dao.base.NationalityDAO; import fi.otavanopisto.pyramus.dao.base.PersonDAO; import fi.otavanopisto.pyramus.dao.base.StudyProgrammeDAO; import fi.otavanopisto.pyramus.dao.students.StudentDAO; import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO; import fi.otavanopisto.pyramus.domainmodel.base.Language; import fi.otavanopisto.pyramus.domainmodel.base.Municipality; import fi.otavanopisto.pyramus.domainmodel.base.Nationality; import fi.otavanopisto.pyramus.domainmodel.base.Person; import fi.otavanopisto.pyramus.domainmodel.base.StudyProgramme; import fi.otavanopisto.pyramus.domainmodel.students.Sex; import fi.otavanopisto.pyramus.domainmodel.students.Student; import fi.otavanopisto.pyramus.domainmodel.users.StaffMember; import fi.otavanopisto.pyramus.framework.JSONRequestController; import fi.otavanopisto.pyramus.framework.UserRole; import fi.otavanopisto.pyramus.persistence.search.PersonFilter; import fi.otavanopisto.pyramus.persistence.search.SearchResult; /** * Request handler for searching students. * * @author antti.viljakainen */ public class SearchStudentsJSONRequestContoller extends JSONRequestController { public void process(JSONRequestContext jsonRequestContext) { StudentDAO studentDAO = DAOFactory.getInstance().getStudentDAO(); PersonDAO personDAO = DAOFactory.getInstance().getPersonDAO(); LanguageDAO languageDAO = DAOFactory.getInstance().getLanguageDAO(); MunicipalityDAO municipalityDAO = DAOFactory.getInstance().getMunicipalityDAO(); NationalityDAO nationalityDAO = DAOFactory.getInstance().getNationalityDAO(); StudyProgrammeDAO studyProgrammeDAO = DAOFactory.getInstance().getStudyProgrammeDAO(); StaffMemberDAO staffMemberDAO = DAOFactory.getInstance().getStaffMemberDAO(); Integer resultsPerPage = NumberUtils.createInteger(jsonRequestContext.getRequest().getParameter("maxResults")); if (resultsPerPage == null) { resultsPerPage = 10; } Integer page = NumberUtils.createInteger(jsonRequestContext.getRequest().getParameter("page")); if (page == null) { page = 0; } SearchResult<Person> searchResult; if ("advanced".equals(jsonRequestContext.getRequest().getParameter("activeTab"))) { String firstName = jsonRequestContext.getString("firstname"); String nickname = jsonRequestContext.getString("nickname"); String lastName = jsonRequestContext.getString("lastname"); String tags = jsonRequestContext.getString("tags"); if (!StringUtils.isBlank(tags)) tags = tags.replace(',', ' '); String education = jsonRequestContext.getString("education"); String email = jsonRequestContext.getString("email"); Sex sex = (Sex) jsonRequestContext.getEnum("sex", Sex.class); String ssn = jsonRequestContext.getString("ssn"); String addressCity = jsonRequestContext.getString("addressCity"); String addressCountry = jsonRequestContext.getString("addressCountry"); String addressPostalCode = jsonRequestContext.getString("addressPostalCode"); String addressStreetAddress = jsonRequestContext.getString("addressStreetAddress"); String phone = jsonRequestContext.getString("phone"); String title = jsonRequestContext.getString("title"); Integer lodgingInt = jsonRequestContext.getInteger("lodging"); Boolean lodging = lodgingInt == null ? null : lodgingInt == 1; PersonFilter personFilter = (PersonFilter) jsonRequestContext.getEnum("studentFilter", PersonFilter.class); Language language = null; Long languageId = jsonRequestContext.getLong("language"); if (languageId != null) { language = languageDAO.findById(languageId); } Nationality nationality = null; Long nationalityId = jsonRequestContext.getLong("nationality"); if (nationalityId != null) { nationality = nationalityDAO.findById(nationalityId); } Municipality municipality = null; Long municipalityId = jsonRequestContext.getLong("municipality"); if (municipalityId != null) { municipality = municipalityDAO.findById(municipalityId); } StudyProgramme studyProgramme = null; Long studyProgrammeId = jsonRequestContext.getLong("studyProgramme"); if (studyProgrammeId != null) { studyProgramme = studyProgrammeDAO.findById(studyProgrammeId); } searchResult = personDAO.searchPersons(resultsPerPage, page, firstName, lastName, nickname, tags, education, email, sex, ssn, addressCity, addressCountry, addressPostalCode, addressStreetAddress, phone, lodging, studyProgramme, language, nationality, municipality, title, personFilter); } else if ("active".equals(jsonRequestContext.getRequest().getParameter("activeTab"))) { String query = jsonRequestContext.getRequest().getParameter("activesQuery"); searchResult = personDAO.searchPersonsBasic(resultsPerPage, page, query, PersonFilter.ACTIVE_STUDENTS); } else { String query = jsonRequestContext.getRequest().getParameter("query"); searchResult = personDAO.searchPersonsBasic(resultsPerPage, page, query, PersonFilter.ALL); } List<Map<String, Object>> results = new ArrayList<>(); List<Person> persons = searchResult.getResults(); for (Person person : persons) { List<Student> studentList2 = studentDAO.listByPerson(person); StaffMember staffMember = staffMemberDAO.findByPerson(person); if (!studentList2.isEmpty() || staffMember != null) { String activeStudyProgrammes = ""; String inactiveStudyProgrammes = ""; for (Student student1 : studentList2) { if (student1.getStudyProgramme() != null) { if (!student1.getHasFinishedStudies()) { if (activeStudyProgrammes.length() == 0) activeStudyProgrammes = student1.getStudyProgramme().getName(); else activeStudyProgrammes += ", " + student1.getStudyProgramme().getName(); } else { if (inactiveStudyProgrammes.length() == 0) inactiveStudyProgrammes = student1.getStudyProgramme().getName(); else inactiveStudyProgrammes += ", " + student1.getStudyProgramme().getName(); } } } String firstName = ""; String lastName = ""; Boolean archived = Boolean.FALSE; Long id = null; if (person.getLatestStudent() != null) { firstName = person.getLatestStudent().getFirstName(); lastName = person.getLatestStudent().getLastName(); archived = person.getLatestStudent().getArchived(); id = person.getLatestStudent().getId(); } else { if (staffMember != null) { firstName = staffMember.getFirstName(); lastName = staffMember.getLastName(); } } Map<String, Object> info = new HashMap<>(); info.put("personId", person.getId()); info.put("id", id); info.put("firstName", firstName); info.put("lastName", lastName); info.put("archived", archived); info.put("activeStudyProgrammes", activeStudyProgrammes); info.put("inactiveStudyProgrammes", inactiveStudyProgrammes); info.put("active", person.getActive()); results.add(info); } } String statusMessage; Locale locale = jsonRequestContext.getRequest().getLocale(); if (searchResult.getTotalHitCount() > 0) { statusMessage = Messages.getInstance().getText( locale, "students.searchStudents.searchStatus", new Object[] { searchResult.getFirstResult() + 1, searchResult.getLastResult() + 1, searchResult.getTotalHitCount() }); } else { statusMessage = Messages.getInstance().getText(locale, "students.searchStudents.searchStatusNoMatches"); } jsonRequestContext.addResponseParameter("results", results); jsonRequestContext.addResponseParameter("statusMessage", statusMessage); jsonRequestContext.addResponseParameter("pages", searchResult.getPages()); jsonRequestContext.addResponseParameter("page", searchResult.getPage()); } public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.MANAGER, UserRole.STUDY_PROGRAMME_LEADER, UserRole.ADMINISTRATOR }; } }