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

Java tutorial

Introduction

Here is the source code for org.opentestsystem.delivery.testadmin.rest.FacilityAvailabilityController.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.Date;

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

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.opentestsystem.delivery.testadmin.domain.FacilityAvailability;
import org.opentestsystem.delivery.testadmin.domain.FacilityAvailability.FacilityTimeSlot;
import org.opentestsystem.delivery.testadmin.domain.TestAdminBase;
import org.opentestsystem.delivery.testadmin.domain.search.FacilityAvailabilitySearchRequest;
import org.opentestsystem.delivery.testadmin.persistence.validator.FacilityAvailabilityValidator;
import org.opentestsystem.delivery.testadmin.service.FacilityAvailabilityService;
import org.opentestsystem.shared.exception.LocalizedException;
import org.opentestsystem.shared.exception.RestException;
import org.opentestsystem.shared.search.domain.SearchResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

@Controller
public class FacilityAvailabilityController extends TestAdminBaseController {

    private static final Logger LOGGER = LoggerFactory.getLogger(FacilityAvailabilityController.class);

    @Autowired
    private FacilityAvailabilityService facilityAvailabilityService;

    @Autowired
    private FacilityAvailabilityValidator facilityAvailabilityValidator;

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

    /**
     * Gets facilityAvailability by facilityAvailabilityId.
     * @param facilityAvailability id.
     * @return FacilityAvailability object.
     */
    @RequestMapping(value = "/facilityAvailability/{facilityAvailabilityId}", method = RequestMethod.GET, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @Secured({ "ROLE_FacilityAvailability Read" })
    @ResponseBody
    public FacilityAvailability findFacilityAvailabilityById(@PathVariable final String facilityAvailabilityId) {
        LOGGER.debug("Finding facilityAvailability for Id: " + facilityAvailabilityId);
        return facilityAvailabilityService.getFacilityAvailability(facilityAvailabilityId);
    }

    /**
     * Creates FacilityAvailability.
     * @param facilityAvailability to be saved.
     * @param response HttpServletResponse.
     * @return FacilityAvailability newly created facilityAvailability object.
     */
    @ResponseStatus(HttpStatus.CREATED)
    @RequestMapping(value = "/facilityAvailability", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @Secured({ "ROLE_FacilityAvailability Modify" })
    @ResponseBody
    public FacilityAvailability saveFacilityAvailability(
            @RequestBody @Valid final FacilityAvailability facilityAvailability,
            final HttpServletResponse response) {
        LOGGER.debug("Saving FacilityAvailability");
        FacilityAvailability savedFacilityAvailability = facilityAvailabilityService
                .saveFacilityAvailability(facilityAvailability);
        response.setHeader("Location", savedFacilityAvailability.getUrl());
        return savedFacilityAvailability;
    }

    /**
     * Updates FacilityAvailability.
     * @param facilityAvailability to be saved.
     * @param response HttpServletResponse.
     * @return FacilityAvailability updated facilityAvailability object.
     */
    @ResponseStatus(HttpStatus.OK)
    @RequestMapping(value = "/facilityAvailability/{facilityAvailabilityId}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = {
            MediaType.APPLICATION_JSON_VALUE })
    @Secured({ "ROLE_FacilityAvailability Modify" })
    @ResponseBody
    public FacilityAvailability updateFacilityAvailability(@PathVariable final String facilityAvailabilityId,
            @RequestBody @Valid final FacilityAvailability facilityAvailability,
            final HttpServletResponse response) {
        if (facilityAvailability == null || StringUtils.isEmpty(facilityAvailability.getId())
                || !facilityAvailabilityId.equals(facilityAvailability.getId())) {
            throw new LocalizedException("facilityAvailability.invalid.id");
        } else {
            FacilityAvailability savedFacilityAvailability = facilityAvailabilityService
                    .saveFacilityAvailability(facilityAvailability);
            response.setHeader("Location", savedFacilityAvailability.getUrl());
            return savedFacilityAvailability;
        }
    }

    /**
     * Removes FacilityAvailability.
     * @param facilityAvailabilityId facilityAvailability Id.
     */
    @ResponseStatus(HttpStatus.NO_CONTENT)
    @RequestMapping(value = "/facilityAvailability/{facilityAvailabilityId}", method = RequestMethod.DELETE)
    @Secured({ "ROLE_FacilityAvailability Modify" })
    public void removeFacilityAvailabilityById(@PathVariable final String facilityAvailabilityId) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Removing facilityAvailability with Id:" + facilityAvailabilityId);
        }
        facilityAvailabilityService.removeFacilityAvailability(facilityAvailabilityId);
    }

    /**
     * Can query the /facilityAvailability endpoint with query parameters in a querystring.
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @return SearchResponse<FacilityAvailability>
     */
    @RequestMapping(value = "/facilityAvailability", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @Secured({ "ROLE_FacilityAvailability Read" })
    @ResponseBody
    public SearchResponse<FacilityAvailability> searchFacilityAvailability(final HttpServletRequest request,
            final HttpServletResponse response) {

        FacilityAvailabilitySearchRequest searchRequest = new FacilityAvailabilitySearchRequest(
                request.getParameterMap());
        SearchResponse<FacilityAvailability> searchResponse;
        if (searchRequest.isValid()) {
            searchResponse = facilityAvailabilityService.searchFacilityAvailabilities(searchRequest);
        } else {
            throw new RestException("facilityAvailability.search.invalidSearchCriteria");
        }
        return searchResponse;
    }

    @RequestMapping(value = "/facilityAvailabilityTimeSlot", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @Secured({ "ROLE_FacilityAvailability Read" })
    @ResponseBody
    public FacilityTimeSlot findFacilityAvailabilityTimeSlot(
            @RequestParam(value = "scheduledDate", required = true) @DateTimeFormat(pattern = "yyyy-MM-dd") Date scheduledDate,
            @RequestParam(value = "timeSlotId", required = true) String timeSlotId,
            @RequestParam(value = "facilityId", required = true) String facilityId,
            @RequestParam(value = "institutionId", required = true) String institutionId) {
        return facilityAvailabilityService.getFacilityTimeSlot(facilityId, institutionId,
                new DateTime(scheduledDate.getTime()), timeSlotId);
    }
}