/** * Licensed to Apereo under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Apereo licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a * copy of the License at the following location: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jasig.portlet.courses.dao.xml; import java.util.Collections; import java.util.HashMap; import java.util.Map; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import org.jasig.portlet.courses.dao.ICourseOfferingDao; import org.jasig.portlet.courses.model.catalog.xml.CourseList; import org.jasig.portlet.courses.model.xml.CourseSection; import org.jasig.portlet.courses.model.xml.Department; import org.jasig.portlet.courses.model.catalog.xml.DepartmentList; import org.jasig.portlet.courses.model.catalog.xml.FullCourseOffering; import org.jasig.portlet.courses.model.catalog.xml.School; import org.jasig.portlet.courses.model.catalog.xml.SchoolList; import org.jasig.portlet.courses.model.xml.Term; import org.jasig.portlet.courses.model.xml.TermList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.client.RestTemplate; public class HttpClientCourseOfferingDaoImpl implements ICourseOfferingDao { private RestTemplate restTemplate; @Autowired(required = true) public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } private Ehcache cache; @Autowired(required = true) public void setCache(Ehcache cache) { this.cache = cache; } protected final String SCHOOL_LIST_KEY = "schoolList"; protected final String TERM_LIST_KEY = "termList"; protected final String DEPARTMENT_LIST_KEY = "departmentList"; protected final String COURSE_LIST_KEY = "courseList"; @Value("http://localhost:8080/CoursesPortlet/data/terms/{school}.xml") private String termListUrl; public void setTermListUrl(String termListUrl) { this.termListUrl = termListUrl; } @Value("http://localhost:8080/CoursesPortlet/data/schools.xml") private String schoolListUrl; public void setSchoolListUrl(String schoolListUrl) { this.schoolListUrl = schoolListUrl; } @Value("http://localhost:8080/CoursesPortlet/data/departments/{school}/{term}.xml") private String departmentListUrl; public void setDepartmentListUrl(String departmentListUrl) { this.departmentListUrl = departmentListUrl; } @Value("http://localhost:8080/CoursesPortlet/data/courses/{school}/{term}/{department}.xml") private String courseListUrl; public void setCourseListUrl(String courseListUrl) { this.courseListUrl = courseListUrl; } @Value("http://localhost:8080/CoursesPortlet/data/courses/{school}/{term}/{department}/{course}.xml") private String courseUrl; public void setCourseUrl(String courseUrl) { this.courseUrl = courseUrl; } @Override public TermList getTerms(String schoolCode) { final String cacheKey = TERM_LIST_KEY.concat(schoolCode); final Element element = cache.get(cacheKey); if (element != null) { return (TermList) element.getObjectValue(); } else { final TermList terms = restTemplate.getForObject(termListUrl, TermList.class, Collections.singletonMap("school", schoolCode)); cache.put(new Element(cacheKey, terms)); return terms; } } @Override public Term getCurrentTerm(String schoolCode) { final TermList termList = getTerms(schoolCode); for (Term term : termList.getTerms()) { if (term.isCurrent()) { return term; } } if (termList.getTerms().size() > 0) { return termList.getTerms().get(0); } return null; } @Override public SchoolList getSchools() { final Element element = cache.get(SCHOOL_LIST_KEY); if (element != null) { return (SchoolList) element.getObjectValue(); } else { final SchoolList schools = restTemplate.getForObject(schoolListUrl, SchoolList.class); cache.put(new Element(SCHOOL_LIST_KEY, schools)); return schools; } } @Override public School getSchool(String schoolCode) { final SchoolList schoolList = getSchools(); for (School school : schoolList.getSchools()) { if (school.getCode().equals(schoolCode)) { return school; } } return null; } @Override public DepartmentList getDepartments(String schoolCode, String termCode) { final String cacheKey = DEPARTMENT_LIST_KEY.concat(schoolCode).concat(termCode); final Element element = cache.get(cacheKey); if (element != null) { return (DepartmentList) element.getObjectValue(); } else { final Map<String, String> params = new HashMap<String, String>(); params.put("school", schoolCode); params.put("term", termCode); final DepartmentList departments = restTemplate.getForObject(departmentListUrl, DepartmentList.class, params);; cache.put(new Element(cacheKey, departments)); return departments; } } @Override public Department getDepartment(String schoolCode, String departmentCode, String termCode) { final DepartmentList departmentList = getDepartments(schoolCode, termCode); for (Department department : departmentList.getDepartments()) { if (department.getCode().equals(departmentCode)) { return department; } } return null; } @Override public CourseList getCourseOfferings( String schoolCode, String departmentCode, String termCode) { final String cacheKey = COURSE_LIST_KEY.concat(schoolCode).concat(departmentCode).concat(termCode); final Element element = cache.get(cacheKey); if (element != null) { return (CourseList) element.getObjectValue(); } else { final Map<String, String> params = new HashMap<String, String>(); params.put("school", schoolCode); params.put("term", termCode); params.put("department", departmentCode); final CourseList courses = restTemplate.getForObject(courseListUrl, CourseList.class, params); cache.put(new Element(cacheKey, courses)); return courses; } } @Override public FullCourseOffering getCourseOffering(String courseCode, String termCode) { final Map<String, String> params = new HashMap<String, String>(); params.put("term", termCode); params.put("course", courseCode); final FullCourseOffering course = restTemplate.getForObject(courseUrl, FullCourseOffering.class, params); return course; } @Override public CourseSection getCourseSectionOffering(String courseCode, String sectionCode, String termCode) { final FullCourseOffering course = getCourseOffering(courseCode, termCode); if (course != null) { for (CourseSection section : course.getCourseSections()) { if (section.getCode().equals(sectionCode)) { return section; } } } return null; } }