org.jasig.portlet.degreeprogress.dao.xml.HttpDegreeProgressDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.portlet.degreeprogress.dao.xml.HttpDegreeProgressDaoImpl.java

Source

/**
 * 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;
    }
}