org.opentestsystem.delivery.testadmin.rest.TestStatusController.java Source code

Java tutorial

Introduction

Here is the source code for org.opentestsystem.delivery.testadmin.rest.TestStatusController.java

Source

/*******************************************************************************
 * Educational Online Test Delivery System
 * Copyright (c) 2013 American Institutes for Research
 *
 * Distributed under the AIR Open Source License, Version 1.0
 * See accompanying file AIR-License-1_0.txt or at
 * http://www.smarterapp.org/documents/American_Institutes_for_Research_Open_Source_Software_License.pdf
 ******************************************************************************/
package org.opentestsystem.delivery.testadmin.rest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.apache.commons.lang.StringUtils;
import org.opentestsystem.delivery.testadmin.domain.Status;
import org.opentestsystem.delivery.testadmin.domain.TestStatus;
import org.opentestsystem.delivery.testadmin.domain.TestStatusRequest;
import org.opentestsystem.delivery.testadmin.domain.search.TestStatusSearchRequest;
import org.opentestsystem.delivery.testadmin.persistence.validator.TestStatusValidator;
import org.opentestsystem.delivery.testadmin.service.TestStatusService;
import org.opentestsystem.shared.exception.LocalizedException;
import org.opentestsystem.shared.exception.RestException;
import org.opentestsystem.shared.search.domain.SearchResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

@Controller
public class TestStatusController extends TestAdminBaseController {

    @Autowired
    private TestStatusService testStatusService;

    @Autowired
    private TestStatusValidator statusValidator;

    @Override
    @InitBinder
    protected void initBinder(final WebDataBinder binder) {
        if (binder.getTarget() != null && List.class.isAssignableFrom(binder.getTarget().getClass())) {
            binder.setValidator(this.statusValidator);
        }
    }

    /**
     * Creates TestStatus.
     * @param TestStatus to be saved.
     * @param response HttpServletResponse.
     * @return TestStatus newly created teststatus object.
     */
    @ResponseStatus(HttpStatus.CREATED)
    @RequestMapping(value = "/testStatus", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @Secured({ "ROLE_TestStatus Modify" })
    @ResponseBody
    public TestStatus saveTestStatus(@RequestBody @Valid final TestStatus testStatus,
            final HttpServletResponse response) {
        TestStatus savedTestStatus = testStatusService.saveTestStatus(testStatus);
        response.setHeader("Location", savedTestStatus.getUrl());
        return savedTestStatus;
    }

    /**
     * Updates testStatus.
     *
     * @param testStatus to be saved.
     * @param response HttpServletResponse.
     * 
     */
    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/testStatus", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
    @Secured({ "ROLE_TestStatus Modify" })
    public void updateTestStatus(@Valid @RequestBody final List<TestStatusRequest> statusRequests) {
        List<TestStatus> statusList = new ArrayList<TestStatus>();
        List<TestStatus> status = TestStatusRequest.converToTestStatus(statusRequests);
        if (status != null) {
            for (TestStatus stat : status) {
                TestStatus statObj = testStatusService.findByAlternateId(stat.getStudentId(),
                        stat.getStateAbbreviation(), stat.getAssessmentId(), stat.getOpportunity());
                if (statObj != null) {
                    statObj.setOpportunity(stat.getOpportunity());
                    statObj.setStatus(stat.getStatus());
                    if (stat.getStatus() == Status.STARTED) {
                        statObj.setActualStart(stat.getActualStart());
                        statObj.setActualComplete(null);
                    } else if (stat.getStatus() == Status.COMPLETED) {
                        statObj.setActualComplete(stat.getActualComplete());
                        statObj.setActualStart(null);
                    }
                    statusList.add(statObj);
                } else {
                    statusList.add(stat);
                }
            }
            testStatusService.saveTestStatuses(statusList);
        }
    }

    /**
     * Updates testStatus.
     *
     * @param id testStatus mongoid
    * @param testStatus
     * @param response HttpServletResponse
     * 
     */
    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/testStatus/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
    @Secured({ "ROLE_TestStatus Modify" })
    public void editTestStatus(@PathVariable final String id, @Valid @RequestBody final TestStatus status,
            final HttpServletResponse response) {
        if (status == null || StringUtils.isEmpty(status.getId()) || !id.equals(status.getId())) {
            throw new LocalizedException("nonentity.invalid.id", new String[] { "TestStatus" });
        } else {
            TestStatus savedTestStatus = testStatusService.getTestStatus(id);
            if (savedTestStatus != null) {
                savedTestStatus.setStatus(status.getStatus());
                testStatusService.saveTestStatus(savedTestStatus);
            }
        }
    }

    /**
     * Can query the /testStatus endpoint with query parameters in a querystring.
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @return SearchResponse<TestStatus>
     */
    @RequestMapping(value = "/testStatus", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @Secured({ "ROLE_TestStatus Read" })
    @ResponseBody
    public SearchResponse<TestStatus> searchTestStatuses(final HttpServletRequest request,
            final HttpServletResponse response) {
        Map<String, String[]> inRequestMap = new HashMap<String, String[]>(request.getParameterMap());
        if (inRequestMap.containsKey(TestStatusSearchRequest.KEY_TEST_ID)) {
            inRequestMap.put(TestStatusSearchRequest.SEARCH_KEY_ASSESSMENT_ID,
                    inRequestMap.get(TestStatusSearchRequest.KEY_TEST_ID));
            inRequestMap.remove(TestStatusSearchRequest.KEY_TEST_ID);
        }
        TestStatusSearchRequest searchRequest = new TestStatusSearchRequest(inRequestMap);
        SearchResponse<TestStatus> searchResponse;
        if (searchRequest.isValid()) {
            searchResponse = testStatusService.searchTestStatuses(searchRequest);
        } else {
            throw new RestException("teststatus.search.invalidSearchCriteria");
        }
        return searchResponse;
    }
}