package fi.otavanopisto.pyramus.views.settings; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang.math.NumberUtils; import fi.internetix.smvc.controllers.PageRequestContext; import fi.otavanopisto.pyramus.I18N.Messages; import fi.otavanopisto.pyramus.breadcrumbs.Breadcrumbable; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.base.SchoolDAO; import fi.otavanopisto.pyramus.dao.base.SchoolVariableDAO; import fi.otavanopisto.pyramus.dao.base.SchoolVariableKeyDAO; import fi.otavanopisto.pyramus.domainmodel.base.Address; import fi.otavanopisto.pyramus.domainmodel.base.Email; import fi.otavanopisto.pyramus.domainmodel.base.PhoneNumber; import fi.otavanopisto.pyramus.domainmodel.base.School; import fi.otavanopisto.pyramus.domainmodel.base.SchoolVariable; import fi.otavanopisto.pyramus.domainmodel.base.SchoolVariableKey; import fi.otavanopisto.pyramus.domainmodel.base.Tag; import fi.otavanopisto.pyramus.framework.PyramusViewController; import fi.otavanopisto.pyramus.framework.UserRole; import fi.otavanopisto.pyramus.util.JSONArrayExtractor; import fi.otavanopisto.pyramus.util.StringAttributeComparator; /** * The controller responsible of the Edit School view of the application. * * @see fi.otavanopisto.pyramus.json.settings.EditSchoolJSONRequestController */ public class ViewSchoolViewController extends PyramusViewController implements Breadcrumbable { /** * Processes the page request by including the corresponding JSP page to the response. * * @param pageRequestContext Page request context */ public void process(PageRequestContext pageRequestContext) { SchoolDAO schoolDAO = DAOFactory.getInstance().getSchoolDAO(); SchoolVariableDAO schoolVariableDAO = DAOFactory.getInstance().getSchoolVariableDAO(); SchoolVariableKeyDAO schoolVariableKeyDAO = DAOFactory.getInstance().getSchoolVariableKeyDAO(); Long schoolId = NumberUtils.createLong(pageRequestContext.getRequest().getParameter("school")); School school = schoolDAO.findById(schoolId); List<SchoolVariableKey> schoolUserEditableVariableKeys = schoolVariableKeyDAO.listUserEditableVariableKeys(); Collections.sort(schoolUserEditableVariableKeys, new StringAttributeComparator("getVariableName")); StringBuilder tagsBuilder = new StringBuilder(); Iterator<Tag> tagIterator = school.getTags().iterator(); while (tagIterator.hasNext()) { Tag tag = tagIterator.next(); tagsBuilder.append(tag.getText()); if (tagIterator.hasNext()) tagsBuilder.append(' '); } List<Address> addresses = school.getContactInfo().getAddresses(); JSONArray jsonAddresses = new JSONArrayExtractor("id", "name", "streetAddress", "postalCode", "city", "country").extract(addresses); for (int i=0; i<jsonAddresses.size(); i++) { JSONObject jsonAddress = jsonAddresses.getJSONObject(i); if (addresses.get(i).getContactType() != null) { jsonAddress.put("contactTypeName", addresses.get(i).getContactType().getName()); } } List<Email> emails = school.getContactInfo().getEmails(); JSONArray jsonEmails = new JSONArrayExtractor("id", "defaultAddress", "address").extract(emails); for (int i=0; i<jsonEmails.size(); i++) { JSONObject jsonEmail = jsonEmails.getJSONObject(i); if (emails.get(i).getContactType() != null) { jsonEmail.put("contactTypeName", emails.get(i).getContactType().getName()); } } List<PhoneNumber> phoneNumbers = school.getContactInfo().getPhoneNumbers(); JSONArray jsonPhoneNumbers = new JSONArrayExtractor("id", "defaultNumber", "number").extract(phoneNumbers); for (int i=0; i<jsonPhoneNumbers.size(); i++) { JSONObject jsonPhoneNumber = jsonPhoneNumbers.getJSONObject(i); if (phoneNumbers.get(i).getContactType() != null) { jsonPhoneNumber.put("contactTypeName", phoneNumbers.get(i).getContactType().getName()); } } JSONArray jsonVariableKeys = new JSONArrayExtractor("variableName", "variableKey", "variableType").extract(schoolUserEditableVariableKeys); for (int i=0; i<schoolUserEditableVariableKeys.size(); i++) { JSONObject jsonVariableKey = jsonVariableKeys.getJSONObject(i); Map<String,String> variables = new HashMap<>(); for (SchoolVariable schoolVariable : schoolVariableDAO.listBySchool(school)) { variables.put(schoolVariable.getKey().getVariableKey(), schoolVariable.getValue()); } jsonVariableKey.put("variableValue", variables.get(jsonVariableKey.getString("variableKey"))); } this.setJsDataVariable(pageRequestContext, "addresses", jsonAddresses.toString()); this.setJsDataVariable(pageRequestContext, "emails", jsonEmails.toString()); this.setJsDataVariable(pageRequestContext, "phoneNumbers", jsonPhoneNumbers.toString()); this.setJsDataVariable(pageRequestContext, "variableKeys", jsonVariableKeys.toString()); pageRequestContext.getRequest().setAttribute("tags", tagsBuilder.toString()); // used by jsp pageRequestContext.getRequest().setAttribute("school", school); pageRequestContext.setIncludeJSP("/templates/settings/viewschool.jsp"); } /** * Returns the roles allowed to access this page. * * @return The roles allowed to access this page */ public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.MANAGER, UserRole.STUDY_PROGRAMME_LEADER, UserRole.ADMINISTRATOR }; } /** * Returns the localized name of this page. Used e.g. for breadcrumb navigation. * * @param locale The locale to be used for the name * * @return The localized name of this page */ public String getName(Locale locale) { return Messages.getInstance().getText(locale, "settings.viewSchool.pageTitle"); } }