/** * 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.degreeprogress.dao.xml; import java.util.HashMap; import java.util.Map; import javax.portlet.PortletRequest; import javax.xml.bind.JAXBElement; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jasig.portlet.courses.util.IParameterEvaluator; import org.jasig.portlet.degreeprogress.dao.IDegreeProgressDao; import org.jasig.portlet.degreeprogress.dao.WhatIfRequest; import org.jasig.portlet.degreeprogress.model.StudentCourseRegistration; import org.jasig.portlet.degreeprogress.model.xml.Course; import org.jasig.portlet.degreeprogress.model.xml.CourseRequirement; import org.jasig.portlet.degreeprogress.model.xml.DegreeProgressReport; import org.jasig.portlet.degreeprogress.model.xml.DegreeRequirementSection; import org.jasig.portlet.degreeprogress.model.xml.GeneralRequirementType; import org.jasig.portlet.degreeprogress.model.xml.GpaRequirement; import org.jasig.portlet.degreeprogress.model.xml.Grade; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.web.client.RestTemplate; /** * HttpDegreeProgressDaoImpl retrieves degree progress from a Basic Authentication * protected XML feed. * * @author Chris Waymire, chris@waymire.net */ public class HttpDegreeProgressDaoImpl implements IDegreeProgressDao { private final Log log = LogFactory.getLog(getClass()); private IParameterEvaluator usernameEvaluator; public void setUsernameEvaluator(IParameterEvaluator usernameEvaluator) { this.usernameEvaluator = usernameEvaluator; } private IParameterEvaluator passwordEvaluator; private Map<String,IParameterEvaluator> urlParams = new HashMap<String,IParameterEvaluator>(); public void setUrlParams(Map<String,IParameterEvaluator> params) { this.urlParams = params; } public void setPasswordEvaluator(IParameterEvaluator passwordEvaluator) { this.passwordEvaluator = passwordEvaluator; } private RestTemplate restTemplate; public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } private String degreeProgressUrlFormat = null; public void setDegreeProgressUrlFormat(String urlFormat) { this.degreeProgressUrlFormat = urlFormat; } @Override public DegreeProgressReport getProgressReport(PortletRequest request) { Map<String,String> params = createParameters(request, urlParams); if (log.isDebugEnabled()) { log.debug("Invoking uri '" + degreeProgressUrlFormat + "' with the following parameters: " + params.toString()); } HttpEntity<?> requestEntity = getRequestEntity(request); HttpEntity<DegreeProgressReport> response = restTemplate.exchange( degreeProgressUrlFormat, HttpMethod.GET, requestEntity, DegreeProgressReport.class, params); DegreeProgressReport report = response.getBody(); for (DegreeRequirementSection section : report.getDegreeRequirementSections()) { for (JAXBElement<? extends GeneralRequirementType> requirement : section.getGeneralRequirements()) { GeneralRequirementType req = requirement.getValue(); if (req instanceof GpaRequirement) { section.setRequiredGpa(((GpaRequirement) req).getRequiredGpa()); } } for (CourseRequirement req : section.getCourseRequirements()) { for (Course course : req.getCourses()) { StudentCourseRegistration registration = new StudentCourseRegistration(); registration.setCredits(course.getCredits()); registration.setSource(course.getSource()); registration.setSemester(course.getSemester()); registration.setCourse(course); Grade grade = new Grade(); grade.setCode(course.getGrade().getCode()); registration.setGrade(grade); req.getRegistrations().add(registration); } } report.addSection(section); } return report; } @Override public Boolean getWebEnabled(PortletRequest request) { return Boolean.TRUE; } @Override public WhatIfRequest createWhatIfRequest(PortletRequest request) { return null; } @Override public DegreeProgressReport getWhatIfReport(WhatIfRequest whatIfRequest) { return null; } /** * Get a request entity prepared for basic authentication. */ protected HttpEntity<?> getRequestEntity(PortletRequest request) { String username = usernameEvaluator.evaluate(request); String password = passwordEvaluator.evaluate(request); if (log.isDebugEnabled()) { boolean hasPassword = password != null; log.debug("Preparing HttpEntity for user '" + username + "' (password provided = " + hasPassword + ")"); } HttpHeaders requestHeaders = new HttpHeaders(); String authString = username.concat(":").concat(password); String encodedAuthString = new Base64().encodeToString(authString.getBytes()); requestHeaders.set("Authorization", "Basic ".concat(encodedAuthString)); HttpEntity<?> rslt = new HttpEntity<Object>(requestHeaders); return rslt; } protected Map<String,String> createParameters(PortletRequest request,Map<String,IParameterEvaluator> params) { Map<String,String> result = new HashMap<String,String>(); for(String key : params.keySet()) { result.put(key,params.get(key).evaluate(request)); } return result; } }