org.kuali.mobility.academics.controllers.AcademicsControllerImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.mobility.academics.controllers.AcademicsControllerImpl.java

Source

/**
 * The MIT License
 * Copyright (c) 2011 Kuali Mobility Team
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package org.kuali.mobility.academics.controllers;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.kuali.mobility.academics.entity.*;
import org.kuali.mobility.academics.service.AcademicsService;
import org.kuali.mobility.academics.util.AcademicsConstants;
import org.kuali.mobility.academics.util.CareerPredicate;
import org.kuali.mobility.academics.util.CatalogNumberPredicate;
import org.kuali.mobility.academics.util.SubjectPredicate;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.LocaleResolver;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;

@Controller
@RequestMapping("/academics")
public class AcademicsControllerImpl {

    private static final Logger LOG = LoggerFactory.getLogger(AcademicsControllerImpl.class);
    @Resource(name = "academicsService")
    private AcademicsService service;

    @Resource(name = "academicsProperties")
    private Properties academicsProperties;

    @Resource(name = "kmeProperties")
    private Properties kmeProperties;

    /**
     * A reference to the locale resolver
     */
    @Resource(name = "localeResolver")
    private LocaleResolver localeResolver;

    @Resource(name = "messageSource")
    private MessageSource messageSource;

    @RequestMapping(method = RequestMethod.GET)
    public String index(HttpServletRequest request, Model uiModel) {
        HttpSession session = request.getSession();
        session.removeAttribute("currentTerm");
        session.removeAttribute("currentCareer");
        session.removeAttribute("currentSection");
        session.removeAttribute("currentCatalogNumber");
        session.removeAttribute("sectionsAll");
        session.removeAttribute(AcademicsConstants.TERM_ID);
        session.removeAttribute(AcademicsConstants.TERM);
        session.removeAttribute(AcademicsConstants.CAREER_ID);
        session.removeAttribute(AcademicsConstants.CAREER);
        session.removeAttribute(AcademicsConstants.SUBJECT_ID);
        session.removeAttribute(AcademicsConstants.SUBJECT);
        session.removeAttribute(AcademicsConstants.CATALOG_NUMBER);
        session.removeAttribute(AcademicsConstants.CATALOG_DESCRIPTION);
        session.removeAttribute(AcademicsConstants.CLASS_NUMBER);
        session.removeAttribute(AcademicsConstants.CLASS_SECTION);
        session.removeAttribute(AcademicsConstants.COURSE_ID);
        session.removeAttribute(AcademicsConstants.COURSE_OFFER_NBR);
        session.removeAttribute(AcademicsConstants.SECTIONS);
        session.removeAttribute(AcademicsConstants.TERM_DESCRIPTION);

        uiModel.addAttribute(AcademicsConstants.HOME_SCREEN_TOOLS, this.getHomeScreenOrder());

        Cookie cks[] = request.getCookies();
        if (cks != null) {
            for (Cookie c : cks) {
                //LOG.info("---Cookies: " + c.getName() + " " + c.getValue());
                if (c.getName().equals("platform")) {
                    uiModel.addAttribute("platform", c.getValue());
                } else if (session.getAttribute("session_platform") != null) {
                    uiModel.addAttribute("platform", (String) session.getAttribute("session_platform"));
                } else {
                    uiModel.addAttribute("platform", "none");
                }
            }
        }
        if ("3".equalsIgnoreCase(getKmeProperties().getProperty("kme.uiVersion", "classic"))) {
            return "ui3/academics/index";
        } else {
            return "academics/index";
        }
    }

    @RequestMapping(value = "/terms")
    public String getTerms(HttpServletRequest request, Model uiModel) {
        String viewName = null;
        if ("3".equalsIgnoreCase(getKmeProperties().getProperty("kme.uiVersion", "classic"))) {
            viewName = "ui3/academics/scheduleOfClasses";
        } else {
            HttpSession session = request.getSession();

            session.setAttribute(AcademicsConstants.TERM, getService().getTerms());

            //uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL, request.getContextPath() + "/academics/");
            viewName = "academics/terms";
        }
        return viewName;
    }

    @RequestMapping(value = "/careers")
    public String getCareers(HttpServletRequest request, Model uiModel,
            @RequestParam(required = true) final String termId) {
        HttpSession session = request.getSession();
        if (termId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.TERM_ID))) {
            // use cached data
            uiModel.addAttribute(AcademicsConstants.TITLE,
                    ((Term) session.getAttribute("currentTerm")).getDescription());
        } else {
            Term term = getService().getTerm(termId);
            session.setAttribute(AcademicsConstants.TERM_ID, termId);
            session.setAttribute("currentTerm", term);
            List<? extends Career> lCareers = getService().getCareers(termId);
            session.setAttribute(AcademicsConstants.CAREER, lCareers);
            session.setAttribute("watermark",
                    getLocalisedString(request, "academics.searchClasses", term.getDescription()));
            uiModel.addAttribute(AcademicsConstants.TITLE,
                    ((Term) session.getAttribute("currentTerm")).getDescription());
        }

        //uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL, request.getContextPath() + "/academics/terms");
        return "academics/careers";
    }

    @RequestMapping(value = "/subjects")
    public String getCareers(HttpServletRequest request, Model uiModel,
            @RequestParam(required = true) final String termId,
            @RequestParam(required = true) final String careerId) {
        HttpSession session = request.getSession();
        if (termId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.TERM_ID))
                && careerId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.CAREER_ID))) {
            // Use cached data.
            //         uiModel.addAttribute(AcademicsConstants.TITLE, ((Career)session.getAttribute("currentCareer")).getShortDescription());
            uiModel.addAttribute(AcademicsConstants.TITLE, "Subjects");
        } else {
            Term term = getService().getTerm(termId);
            session.setAttribute(AcademicsConstants.TERM_ID, term.getId());
            session.setAttribute("currentTerm", term);

            session.setAttribute(AcademicsConstants.CAREER_ID, careerId);
            Career career = (Career) CollectionUtils.find(
                    (List<Career>) session.getAttribute(AcademicsConstants.CAREER), new CareerPredicate(careerId));
            session.setAttribute("currentCareer", career);

            List<? extends Subject> lSubjects = getService().getSubjects(termId, careerId);
            session.setAttribute(AcademicsConstants.SUBJECT, lSubjects);
            //         uiModel.addAttribute(AcademicsConstants.TITLE, ((Career)session.getAttribute("currentCareer")).getShortDescription());
            uiModel.addAttribute(AcademicsConstants.TITLE, "Subjects");
        }
        //uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL, request.getContextPath() + "/academics/careers?termId=" + session.getAttribute(AcademicsConstants.TERM_ID));
        return "academics/subjects";
    }

    @RequestMapping(value = "/catalogNumbers")
    public String getCareers(HttpServletRequest request, Model uiModel,
            @RequestParam(required = true) final String termId,
            @RequestParam(required = true) final String careerId,
            @RequestParam(required = true) final String subjectId) {
        HttpSession session = request.getSession();
        if (termId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.TERM_ID))
                && careerId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.CAREER_ID))
                && subjectId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.SUBJECT_ID))) {
            // Use cached data.
            uiModel.addAttribute(AcademicsConstants.TITLE,
                    ((Subject) session.getAttribute("currentSubject")).getDescription());
        } else {
            Term term = getService().getTerm(termId);
            session.setAttribute(AcademicsConstants.TERM_ID, term.getId());
            session.setAttribute("currentTerm", term);
            session.setAttribute(AcademicsConstants.CAREER_ID, careerId);
            Career career = (Career) CollectionUtils.find(
                    (List<Career>) session.getAttribute(AcademicsConstants.CAREER), new CareerPredicate(careerId));
            session.setAttribute("currentCareer", career);
            session.setAttribute(AcademicsConstants.SUBJECT_ID, subjectId);
            Subject subject = (Subject) CollectionUtils.find(
                    (List<Subject>) session.getAttribute(AcademicsConstants.SUBJECT),
                    new SubjectPredicate(subjectId));
            session.setAttribute("currentSubject", subject);
            List<? extends CatalogNumber> lCatalogNumbers = getService().getCatalogNumbers(termId, subjectId);
            session.setAttribute("catalogNumbers", lCatalogNumbers);

            uiModel.addAttribute(AcademicsConstants.TITLE,
                    ((Subject) session.getAttribute("currentSubject")).getDescription());
        }
        //uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL, request.getContextPath() + "/academics/subjects?termId=" + session.getAttribute(AcademicsConstants.TERM_ID) + "&careerId=" + session.getAttribute(AcademicsConstants.CAREER_ID));
        return "academics/catalogNumbers";
    }

    @RequestMapping(value = "/browseClasses")
    public String browseClasses(HttpServletRequest request, Model uiModel,
            @RequestParam(required = false) String stage, @RequestParam(required = false) final String termId,
            @RequestParam(required = false) final String subjectId,
            @RequestParam(required = false) final String subject,
            @RequestParam(required = false) final String careerId,
            @RequestParam(required = false) final String catalogNumber,
            @RequestParam(required = false) final String catalogDescription) {
        HttpSession session = request.getSession();
        if (stage != null) {
            session.setAttribute(AcademicsConstants.STAGE, stage);
        } else {
            stage = AcademicsConstants.TERM;
        }
        if (termId != null && termId.length() > 0) {
            session.setAttribute(AcademicsConstants.TERM_ID, termId);
        }
        if (subjectId != null && subjectId.length() > 0) {
            session.setAttribute(AcademicsConstants.SUBJECT_ID, subjectId);
        }
        if (subject != null && subject.length() > 0) {
            session.setAttribute(AcademicsConstants.SUBJECT, subject);
        }
        if (careerId != null && careerId.length() > 0) {
            session.setAttribute(AcademicsConstants.CAREER_ID, careerId);
        }
        if (catalogNumber != null && catalogNumber.length() > 0) {
            session.setAttribute(AcademicsConstants.CATALOG_NUMBER, catalogNumber);
        }
        uiModel.addAttribute(AcademicsConstants.STAGE, stage);
        uiModel.addAttribute(AcademicsConstants.TERM_ID, session.getAttribute(AcademicsConstants.TERM_ID));
        uiModel.addAttribute(AcademicsConstants.SUBJECT_ID, session.getAttribute(AcademicsConstants.SUBJECT_ID));
        uiModel.addAttribute(AcademicsConstants.CAREER_ID, session.getAttribute(AcademicsConstants.CAREER_ID));
        uiModel.addAttribute(AcademicsConstants.CATALOG_NUMBER,
                session.getAttribute(AcademicsConstants.CATALOG_NUMBER));
        uiModel.addAttribute(AcademicsConstants.SUBJECT, session.getAttribute(AcademicsConstants.SUBJECT));
        uiModel.addAttribute("toolContext", "academics");
        if (stage.equalsIgnoreCase(AcademicsConstants.CATALOG_NUMBER)) {
            uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL,
                    "browseClasses?stage=" + AcademicsConstants.SUBJECT);
        } else if (stage.equalsIgnoreCase(AcademicsConstants.SUBJECT)) {
            uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL,
                    "browseClasses?stage=" + AcademicsConstants.CAREER);
        } else if (stage.equalsIgnoreCase(AcademicsConstants.CAREER)) {
            uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL,
                    "browseClasses?stage=" + AcademicsConstants.TERM);
        }

        //      Enumeration<String> e = session.getAttributeNames();
        //      while (e.hasMoreElements()) {
        //         String key = e.nextElement();
        //         LOG.debug("Session contains: [" + key + "] [" + session.getAttribute(key) + "]");
        //      }

        return "academics/browseClasses";
    }

    @RequestMapping(value = "/sections")
    public String getSections(HttpServletRequest request, Model uiModel,
            @RequestParam(required = false) final String termId,
            @RequestParam(required = false) final String subjectId,
            @RequestParam(required = false) final String catalogNumber,
            @RequestParam(required = false) final String careerId) {
        HttpSession session = request.getSession();
        if (termId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.TERM_ID))
                && careerId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.CAREER_ID))
                && subjectId.equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.CAREER_ID))
                && catalogNumber
                        .equalsIgnoreCase((String) session.getAttribute(AcademicsConstants.CATALOG_NUMBER))) {
            uiModel.addAttribute(AcademicsConstants.TITLE, session.getAttribute(AcademicsConstants.SUBJECT_ID) + " "
                    + session.getAttribute(AcademicsConstants.CATALOG_NUMBER));
        } else {
            List<Section> lSections = (List<Section>) getService().getSections(termId, subjectId, catalogNumber,
                    careerId);
            CatalogNumber number = (CatalogNumber) CollectionUtils.find(
                    (List<CatalogNumber>) session.getAttribute("catalogNumbers"),
                    new CatalogNumberPredicate(catalogNumber));
            for (Section s : lSections) {
                if (null == s.getCourseTitle() || s.getCourseTitle().trim().isEmpty()) {
                    s.setCourseTitle(number.getDescription());
                }
            }

            session.setAttribute("sectionsAll", lSections);
            session.setAttribute(AcademicsConstants.CATALOG_NUMBER, catalogNumber);
            session.setAttribute(AcademicsConstants.SUBJECT_ID, subjectId);
            uiModel.addAttribute("sectionsAll", lSections);
            uiModel.addAttribute(AcademicsConstants.TITLE, session.getAttribute(AcademicsConstants.SUBJECT_ID) + " "
                    + session.getAttribute(AcademicsConstants.CATALOG_NUMBER));
        }
        uiModel.addAttribute("toolContext", "academics");
        //uiModel.addAttribute(AcademicsConstants.BACKBUTTON_URL, request.getContextPath() + "/academics/catalogNumbers?termId=" + termId + "&careerId=" + careerId + "&subjectId=" + subjectId);
        return "academics/sections";
    }

    @RequestMapping(value = "/sectionsDetail")
    public String getSectionsDetail(HttpServletRequest request, Model uiModel,
            @RequestParam(required = false) final String catalogDescription,
            @RequestParam(required = true) final String sectionUID) {
        HttpSession session = request.getSession();
        Section sectionDetail = null;
        LOG.debug("Entering getSectionsDetail looking for sectionUID [" + sectionUID + "]");
        if (null != session.getAttribute(AcademicsConstants.SECTIONS)) {
            LOG.debug("Sections are stored in the session.");
            List<Section> allSections = (List<Section>) session.getAttribute(AcademicsConstants.SECTIONS);
            for (Section thisSection : allSections) {
                LOG.debug("Testing section [" + thisSection.getSectionUID() + "]");
                if (sectionUID.equalsIgnoreCase(thisSection.getSectionUID())) {
                    LOG.debug("Matching section found, loading remaining details.");
                    sectionDetail = getService().getSectionDetail(thisSection);
                    break;
                }
            }
        }
        //      uiModel.addAttribute(AcademicsConstants.CATALOG_DESCRIPTION, session.getAttribute(AcademicsConstants.CATALOG_DESCRIPTION));
        uiModel.addAttribute(AcademicsConstants.TITLE,
                sectionDetail.getSubjectId() + " " + sectionDetail.getCatalogNumber());
        uiModel.addAttribute("thisSection", sectionDetail);
        uiModel.addAttribute("toolContext", "academics");
        //LOG.debug("BACKBUTTON_URL from request for sectionDetail: -" + session.getAttribute("backButtonURL"));
        //        String backurl = (String) session.getAttribute("backButtonURL");
        //        if(backurl.equalsIgnoreCase("search"))
        //        {
        //           uiModel.addAttribute("backButtonURL","academics/classSearch");
        //        }
        //        else
        //        {
        //           uiModel.addAttribute("backButtonURL","academics/sections?termId="+session.getAttribute(AcademicsConstants.TERM_ID)+"&careerId="+session.getAttribute(AcademicsConstants.CAREER_ID)+"&subjectId="+session.getAttribute(AcademicsConstants.SUBJECT_ID)+"&catalogNumber="+session.getAttribute(AcademicsConstants.CATALOG_NUMBER)+"&catalogDescription="+session.getAttribute(AcademicsConstants.CATALOG_DESCRIPTION));
        //        }
        //      uiModel.addAttribute("backButtonURL", request.getHeader("referer"));
        return "academics/sectionsDetail";
    }

    @RequestMapping(value = "/search")
    public String searchForm(Model uiModel) {
        uiModel.addAttribute(AcademicsConstants.TERM_ID, getService().getTerms());
        uiModel.addAttribute(AcademicsConstants.CAREER_ID, getService().getCareers("ALL"));
        uiModel.addAttribute(AcademicsConstants.SUBJECT_ID, getService().getSubjects("ALL", "ALL"));
        uiModel.addAttribute("toolContext", "academics");
        if ("3".equalsIgnoreCase(getKmeProperties().getProperty("kme.uiVersion", "classic"))) {
            return "ui3/academics/search";
        } else {
            return "academics/search";
        }
    }

    @RequestMapping(value = "/classSearch", method = RequestMethod.POST)
    public String getSearchResults(HttpServletRequest request, Model uiModel) {
        Map<String, String[]> inputMap = request.getParameterMap();

        if (LOG.isDebugEnabled()) {
            LOG.debug("Search request parameter map:");
            Iterator<Map.Entry<String, String[]>> mapIterator = inputMap.entrySet().iterator();
            while (mapIterator.hasNext()) {
                Map.Entry<String, String[]> entry = mapIterator.next();
                LOG.debug(entry.getKey() + ": " + Arrays.toString(entry.getValue()));
            }
        }

        SearchResult result = getService().getSearchResults(inputMap);
        List<Section> lSections = (List<Section>) result.getSections();
        LOG.debug("Sections classSearch POST  " + lSections.size() + " items long.");
        HttpSession session = request.getSession();
        session.setAttribute(AcademicsConstants.SECTIONS, lSections);
        session.setAttribute(AcademicsConstants.SEARCH_RESULT, result);
        session.setAttribute("toolContext", "academics");

        uiModel.addAttribute("searchResult", result);
        uiModel.addAttribute("toolContext", "academics");

        return "academics/searchResult";
    }

    @RequestMapping(value = "/classSearch", method = RequestMethod.GET)
    public String searchResults(HttpServletRequest request, Model uiModel) {
        HttpSession session = request.getSession();
        //uiModel.addAttribute(AcademicsConstants.TITLE, "Search Results");
        //uiModel.addAttribute("sectionsAll", session.getAttribute("sectionsAll"));
        uiModel.addAttribute("searchResult", session.getAttribute(AcademicsConstants.SEARCH_RESULT));
        uiModel.addAttribute("toolContext", session.getAttribute("toolContext"));
        //uiModel.addAttribute("backButtonURL", session.getAttribute("backButtonURL"));
        return "academics/searchResult";
    }

    @RequestMapping(value = "/templates/{key}")
    public String getAngularTemplates(@PathVariable("key") String key, HttpServletRequest request, Model uiModel) {
        return "ui3/academics/templates/" + key;
    }

    @RequestMapping(value = "/js/{key}.js")
    public String getJavaScript(@PathVariable("key") String key, Model uiModel) {
        if ("academics".equalsIgnoreCase(key)) {
            uiModel.addAttribute(AcademicsConstants.HOME_SCREEN_TOOLS, this.getHomeScreenOrder());
        }
        return "ui3/academics/js/" + key;
    }

    private List<String> getHomeScreenOrder() {
        List<String> toolOrder = new ArrayList<String>();
        if (null == getAcademicsProperties()) {
            LOG.error("Failed to load academics properties");
        }
        LOG.debug("Home screen order is: " + getAcademicsProperties().getProperty("academics.homescreenorder"));
        for (String s : getAcademicsProperties().getProperty("academics.homescreenorder").split(",")) {
            if ("true".equalsIgnoreCase(
                    getAcademicsProperties().getProperty("academics." + s + ".enabled", "false"))) {
                toolOrder.add(s);
            }
        }
        return toolOrder;
    }

    private String getLocalisedString(HttpServletRequest request, String code, String... params) {
        Locale locale = localeResolver.resolveLocale(request);
        return messageSource.getMessage(code, params, locale);
    }

    /**
     * @return the service
     */
    public AcademicsService getService() {
        return service;
    }

    /**
     * @param service the service to set
     */
    public void setService(AcademicsService service) {
        this.service = service;
    }

    /**
     * @return the academicsProperties
     */
    public Properties getAcademicsProperties() {
        return academicsProperties;
    }

    /**
     * @param academicsProperties the academicsProperties to set
     */
    public void setAcademicsProperties(Properties academicsProperties) {
        this.academicsProperties = academicsProperties;
    }

    public Properties getKmeProperties() {
        return kmeProperties;
    }

    public void setKmeProperties(Properties kmeProperties) {
        this.kmeProperties = kmeProperties;
    }
}