@RequestMapping(method = RequestMethod.GET)
  @PreAuthorize("(hasRole('ROLE_REPORT_READ') and hasRole('ROLE_ACCOMMODATION_READ'))")
  @ResponseBody
  public void getDisabilityServicesReport(
      final HttpServletResponse response,
      final @RequestParam(required = false) ObjectStatus status,
      final @RequestParam(required = true) UUID coachId,
      final @RequestParam(required = true) UUID watcherId,
      final @RequestParam(required = false) UUID odsCoachId,
      final @RequestParam(required = false) UUID disabilityStatusId,
      final @RequestParam(required = false) UUID disabilityTypeId,
      final @RequestParam(required = false) UUID programStatus,
      final @RequestParam(required = false) List<UUID> specialServiceGroupIds,
      final @RequestParam(required = false) List<UUID> referralSourcesIds,
      final @RequestParam(required = false) List<UUID> studentTypeIds,
      final @RequestParam(required = false) List<UUID> serviceReasonIds,
      final @RequestParam(required = false) Integer anticipatedStartYear,
      final @RequestParam(required = false) String anticipatedStartTerm,
      final @RequestParam(required = false) Integer actualStartYear,
      final @RequestParam(required = false) String actualStartTerm,
      final @RequestParam(required = false) Date createDateFrom,
      final @RequestParam(required = false) Date createDateTo,
      final @RequestParam(required = false) String termCode,
      final @RequestParam(required = false) String homeDepartment,
      final @RequestParam(required = false) String rosterStatus,
      final @RequestParam(required = false, defaultValue = DEFAULT_REPORT_TYPE) String reportType)
      throws ObjectNotFoundException, IOException {

    final Map<String, Object> parameters = Maps.newHashMap();
    final PersonSearchFormTO personSearchForm = new PersonSearchFormTO();
    SearchParameters.addCoach(
        coachId, parameters, personSearchForm, personService, personTOFactory);
    SearchParameters.addOdsCoach(
        odsCoachId, parameters, personSearchForm, personService, personTOFactory);
    SearchParameters.addWatcher(
        watcherId, parameters, personSearchForm, personService, personTOFactory);
    SearchParameters.addReferenceLists(
        studentTypeIds,
        specialServiceGroupIds,
        referralSourcesIds,
        serviceReasonIds,
        parameters,
        personSearchForm,
        studentTypeService,
        ssgService,
        referralSourcesService,
        serviceReasonService);

    SearchParameters.addDateRange(
        createDateFrom, createDateTo, termCode, parameters, personSearchForm, termService);

    SearchParameters.addReferenceTypes(
        programStatus,
        disabilityStatusId,
        disabilityTypeId,
        true,
        rosterStatus,
        homeDepartment,
        parameters,
        personSearchForm,
        programStatusService,
        disabilityStatusService,
        disabilityTypeService);

    SearchParameters.addAnticipatedAndActualStartTerms(
        anticipatedStartTerm,
        anticipatedStartYear,
        actualStartTerm,
        actualStartYear,
        parameters,
        personSearchForm);

    // TODO Specifying person name sort fields in the SaP doesn't seem to
    // work... end up with empty results need to dig into actual query
    // building
    final PagingWrapper<DisabilityServicesReportTO> people =
        personService.getDisabilityReport(
            personSearchForm, SearchParameters.getReportPersonSortingAndPagingAll(status));
    List<DisabilityServicesReportTO> compressedReports = this.processStudentReportTOs(people);

    SearchParameters.addStudentCount(compressedReports, parameters);

    renderReport(
        response,
        parameters,
        compressedReports,
        REPORT_TYPE_PDF.equals(reportType) ? REPORT_URL_PDF : null,
        reportType,
        REPORT_FILE_TITLE);
  }