package fi.otavanopisto.pyramus.json.modules;
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.CurriculumDAO;
import fi.otavanopisto.pyramus.dao.base.EducationSubtypeDAO;
import fi.otavanopisto.pyramus.dao.base.EducationTypeDAO;
import fi.otavanopisto.pyramus.dao.base.SubjectDAO;
import fi.otavanopisto.pyramus.dao.modules.ModuleDAO;
import fi.otavanopisto.pyramus.domainmodel.base.Curriculum;
import fi.otavanopisto.pyramus.domainmodel.base.EducationSubtype;
import fi.otavanopisto.pyramus.domainmodel.base.EducationType;
import fi.otavanopisto.pyramus.domainmodel.base.Subject;
import fi.otavanopisto.pyramus.domainmodel.modules.Module;
import fi.otavanopisto.pyramus.framework.JSONRequestController;
import fi.otavanopisto.pyramus.framework.UserRole;
import fi.otavanopisto.pyramus.persistence.search.SearchResult;
/**
* The controller responsible of searching modules.
*
* @see fi.otavanopisto.pyramus.views.modules.SearchModulesViewController
*/
public class SearchModulesJSONRequestController extends JSONRequestController {
public void process(JSONRequestContext requestContext) {
ModuleDAO moduleDAO = DAOFactory.getInstance().getModuleDAO();
EducationTypeDAO educationTypeDAO = DAOFactory.getInstance().getEducationTypeDAO();
SubjectDAO subjectDAO = DAOFactory.getInstance().getSubjectDAO();
EducationSubtypeDAO educationSubtypeDAO = DAOFactory.getInstance().getEducationSubtypeDAO();
CurriculumDAO curriculumDAO = DAOFactory.getInstance().getCurriculumDAO();
Integer resultsPerPage = NumberUtils.createInteger(requestContext.getRequest().getParameter("maxResults"));
if (resultsPerPage == null) {
resultsPerPage = 10;
}
Integer page = NumberUtils.createInteger(requestContext.getRequest().getParameter("page"));
if (page == null) {
page = 0;
}
SearchResult<Module> searchResult;
// Gather the search terms
if ("advanced".equals(requestContext.getRequest().getParameter("activeTab"))) {
String name = requestContext.getString("name");
String tags = requestContext.getString("tags");
if (!StringUtils.isBlank(tags))
tags = tags.replace(',', ' ');
String description = requestContext.getString("description");
Subject subject = null;
Long subjectId = requestContext.getLong("subject");
if (subjectId != null)
subject = subjectDAO.findById(subjectId);
EducationType educationType = null;
Long educationTypeId = requestContext.getLong("educationType");
if (educationTypeId != null)
educationType = educationTypeDAO.findById(educationTypeId);
EducationSubtype educationSubtype = null;
Long educationSubtypeId = requestContext.getLong("educationSubtype");
if (educationSubtypeId != null)
educationSubtype = educationSubtypeDAO.findById(educationSubtypeId);
Curriculum curriculum = null;
Long curriculumId = requestContext.getLong("curriculum");
if (curriculumId != null)
curriculum = curriculumDAO.findById(curriculumId);
// Search via the DAO object
searchResult = moduleDAO.searchModules(resultsPerPage, page, null, name, tags, description,
null, null, null, subject, educationType, educationSubtype, curriculum, true);
}
else {
String text = requestContext.getString("text");
// Search via the DAO object
searchResult = moduleDAO.searchModulesBasic(resultsPerPage, page, text);
}
List<Map<String, Object>> results = new ArrayList<>();
List<Module> modules = searchResult.getResults();
for (Module module : modules) {
Map<String, Object> moduleInfo = new HashMap<>();
moduleInfo.put("id", module.getId());
moduleInfo.put("name", module.getName());
results.add(moduleInfo);
}
String statusMessage;
Locale locale = requestContext.getRequest().getLocale();
if (searchResult.getTotalHitCount() > 0) {
statusMessage = Messages.getInstance().getText(
locale,
"modules.searchModules.searchStatus",
new Object[] { searchResult.getFirstResult() + 1, searchResult.getLastResult() + 1,
searchResult.getTotalHitCount() });
}
else {
statusMessage = Messages.getInstance().getText(locale, "modules.searchModules.searchStatusNoMatches");
}
requestContext.addResponseParameter("results", results);
requestContext.addResponseParameter("statusMessage", statusMessage);
requestContext.addResponseParameter("pages", searchResult.getPages());
requestContext.addResponseParameter("page", searchResult.getPage());
}
public UserRole[] getAllowedRoles() {
return new UserRole[] { UserRole.EVERYONE };
}
}