Example usage for org.springframework.web.servlet.support ServletUriComponentsBuilder fromCurrentRequestUri

List of usage examples for org.springframework.web.servlet.support ServletUriComponentsBuilder fromCurrentRequestUri

Introduction

In this page you can find the example usage for org.springframework.web.servlet.support ServletUriComponentsBuilder fromCurrentRequestUri.

Prototype

public static ServletUriComponentsBuilder fromCurrentRequestUri() 

Source Link

Document

Same as #fromRequestUri(HttpServletRequest) except the request is obtained through RequestContextHolder .

Usage

From source file:com.coffeebeans.services.controller.base.BaseController.java

protected URI buildLocationFromCurrentRequestUri(String username) {
    URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().path("/").path(username).build().toUri();
    return location;
}

From source file:org.farrukh.template.rest.inbound.RestInboundGateway.java

@RequestMapping(method = RequestMethod.POST, consumes = CustomMediaTypeHolder.JSON_MIME_TYPE)
public ResponseEntity<LibraryResource> createLibrary(@RequestBody final Library library) {
    try {//from ww  w.  j a  va 2 s  . co  m
        Library createdLibrary = coreService.create(library);
        URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUri();
        LibraryResource libraryResource = assembler.toResource(createdLibrary);
        return ResponseEntity.created(location).body(libraryResource);
    } catch (Exception e) {
        throw new LibraryCreationError(RestFeedbackContext.SOME_FEEDBACK, e);
    }
}

From source file:org.lareferencia.backend.rest.PageResource.java

private ServletUriComponentsBuilder createBuilder() {
    return ServletUriComponentsBuilder.fromCurrentRequestUri();
}

From source file:eu.agilejava.javaonedemo.api.RecipeResource.java

@RequestMapping(method = RequestMethod.POST, consumes = APPLICATION_JSON_VALUE)
public ResponseEntity<Recipe> create(@RequestBody Recipe recipe) {
    recipeService.create(recipe);//from   w  ww  .  j a v a 2s  . co  m

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Location", ServletUriComponentsBuilder.fromCurrentRequestUri()
            .pathSegment(String.valueOf(recipe.getId())).build().toUriString());
    return new ResponseEntity<>(responseHeaders, HttpStatus.CREATED);
}

From source file:eu.agilejava.javaonedemo.api.CookBookResource.java

@RequestMapping(method = RequestMethod.POST, consumes = APPLICATION_JSON_VALUE)
public ResponseEntity<CookBook> create(@RequestBody CookBook cookBook) {
    cookBookService.create(cookBook);/*  w  w  w . j  ava  2 s  . c  o m*/

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Location", ServletUriComponentsBuilder.fromCurrentRequestUri()
            .pathSegment(String.valueOf(cookBook.getId())).build().toUriString());
    return new ResponseEntity<>(responseHeaders, HttpStatus.CREATED);

}

From source file:eu.agilejava.javaonedemo.api.CookBookUserResource.java

@RequestMapping(method = RequestMethod.POST, consumes = APPLICATION_JSON_VALUE)
public ResponseEntity<CookBookUser> create(@RequestBody CookBookUser user) {
    cookBookUserService.create(user);/*from   ww  w . j  a v a2  s  .  c  om*/

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Location", ServletUriComponentsBuilder.fromCurrentRequestUri()
            .pathSegment(String.valueOf(user.getId())).build().toUriString());
    return new ResponseEntity<>(responseHeaders, HttpStatus.CREATED);
}

From source file:net.es.sense.rm.api.SenseRmController.java

/**
 * Returns a list of available SENSE service API resource URLs.
 *
 * Operation: GET /api/sense/v1/*  www . j av a2  s  .  c om*/
 *
 * @return A RESTful response.
 * @throws java.net.MalformedURLException
 */
@ApiOperation(value = "Get a list of supported SENSE resources.", notes = "Returns a list of available SENSE resource URL.", response = DeltaResource.class, responseContainer = "List")
@ApiResponses(value = {
        @ApiResponse(code = HttpConstants.OK_CODE, message = HttpConstants.OK_MSG, response = Resource.class),
        @ApiResponse(code = HttpConstants.UNAUTHORIZED_CODE, message = HttpConstants.UNAUTHORIZED_MSG, response = Error.class),
        @ApiResponse(code = HttpConstants.FORBIDDEN_CODE, message = HttpConstants.FORBIDDEN_MSG, response = Error.class),
        @ApiResponse(code = HttpConstants.INTERNAL_ERROR_CODE, message = HttpConstants.INTERNAL_ERROR_MSG, response = Error.class), })
@RequestMapping(method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
public ResponseEntity<?> getResources() throws MalformedURLException {
    try {
        // We need the request URL to build fully qualified resource URLs.
        final URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUri();

        log.info("[SenseRmController] GET operation = {}", location);

        // We will populate some HTTP response headers.
        final HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Location", location.toASCIIString());

        List<Resource> resources = new ArrayList<>();
        Method[] methods = SenseRmController.class.getMethods();
        for (Method m : methods) {
            if (m.isAnnotationPresent(ResourceAnnotation.class)) {
                ResourceAnnotation ra = m.getAnnotation(ResourceAnnotation.class);
                RequestMapping rm = m.getAnnotation(RequestMapping.class);
                if (ra == null || rm == null) {
                    continue;
                }
                Resource resource = new Resource();
                resource.setId(ra.name());
                resource.setVersion(ra.version());
                UriComponentsBuilder path = utilities.getPath(location.toASCIIString());
                path.path(rm.value()[0]);
                resource.setHref(path.build().toUriString());
                resources.add(resource);
            }
        }

        return new ResponseEntity<>(resources, headers, HttpStatus.OK);
    } catch (SecurityException | MalformedURLException ex) {
        log.error("[SenseRmController] Exception caught", ex);
        Error error = Error.builder().error(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .error_description(ex.getMessage()).build();
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

From source file:net.es.sense.rm.api.SenseRmController.java

/**
 * Returns a list of available SENSE topology models.
 *
 * Operation: GET /api/sense/v1/models/*w  w  w.  j  a  v  a 2  s.c o  m*/
 *
 * @param accept Provides media types that are acceptable for the response.
 *    At the moment 'application/json' is the supported response encoding.
 *
 * @param ifModifiedSince The HTTP request may contain the If-Modified-Since
 *    header requesting all models with creationTime after the specified
 *    date. The date must be specified in RFC 1123 format.
 *
 * @param current If current=true then a collection of models containing only
 *    the most recent model will be returned. Default value is current=false.
 *
 * @param encode Transfer size of the model element contents can be optimized
 *    by gzip/base64 encoding the contained model.  If encode=true the
 *    returned model will be gzipped (contentType="application/x-gzip") and
 *    base64 encoded (contentTransferEncoding= "base64") to reduce transfer
 *    size. Default value is encode=false.
 *
 * @param summary If summary=true then a summary collection of models will be
 *    returned including the model meta-data while excluding the model
 *    element. Default value is summary=true.
 *
 * @param model Specify the model schema format (TURTLE, JSON-LD, etc.).
 *
 * @return A RESTful response.
 */
@ApiOperation(value = "Get a collection of available model resources.", notes = "Returns a list of available SENSE topology model resources.", response = ModelResource.class, responseContainer = "List")
@ApiResponses(value = {
        @ApiResponse(code = HttpConstants.OK_CODE, message = HttpConstants.OK_TOPOLOGIES_MSG, response = ModelResource.class, responseContainer = "List", responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_MODIFIED, message = HttpConstants.NOT_MODIFIED_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.BAD_REQUEST_CODE, message = HttpConstants.BAD_REQUEST_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.UNAUTHORIZED_CODE, message = HttpConstants.UNAUTHORIZED_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.FORBIDDEN_CODE, message = HttpConstants.FORBIDDEN_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.INTERNAL_ERROR_CODE, message = HttpConstants.INTERNAL_ERROR_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }), })
@RequestMapping(value = "/models", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
@ResourceAnnotation(name = "models", version = "v1")
public ResponseEntity<?> getModels(
        @RequestHeader(value = HttpConstants.ACCEPT_NAME, defaultValue = MediaType.APPLICATION_JSON_VALUE) @ApiParam(value = HttpConstants.ACCEPT_MSG, required = false) String accept,
        @RequestHeader(value = HttpConstants.IF_MODIFIED_SINCE_NAME, required = false) @ApiParam(value = HttpConstants.IF_MODIFIED_SINCE_MSG, required = false) String ifModifiedSince,
        @RequestParam(value = HttpConstants.CURRENT_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.CURRENT_MSG, required = false) boolean current,
        @RequestParam(value = HttpConstants.SUMMARY_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.SUMMARY_MSG, required = false) boolean summary,
        @RequestParam(value = HttpConstants.ENCODE_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.ENCODE_MSG, required = false) boolean encode,
        @RequestParam(value = HttpConstants.MODEL_NAME, defaultValue = HttpConstants.MODEL_TURTLE) @ApiParam(value = HttpConstants.MODEL_MSG, required = false) String model) {

    // We need the request URL to build fully qualified resource URLs.
    final URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUri();

    log.info("[SenseRmController] GET operation = {}, accept = {}, If-Modified-Since = {}, current = {}, "
            + "summary = {}, model = {}", location, accept, ifModifiedSince, current, summary, model);

    // Parse the If-Modified-Since header if it is present.
    long ifms = parseIfModfiedSince(ifModifiedSince);

    // Populate the content location header with our URL location.
    final HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Location", location.toASCIIString());

    try {
        // Track matching models here.
        List<ModelResource> models = new ArrayList<>();

        // Keep track of the most recently updated model date.
        long newest = 0;

        // Query the driver for a list of models.
        Collection<ModelResource> result = new ArrayList<>();

        // First case is to handle a targeted request for the current model.
        if (current) {
            ModelResponse response = driver.getCurrentModel(model, ifms).get();
            if (response == null || response.getStatus() != Status.OK) {
                return toResponseEntity(headers, response);
            }

            response.getModel().ifPresent(m -> result.add(m));
        } else {
            ModelsResponse response = driver.getModels(model, ifms).get();
            if (response == null || response.getStatus() != Status.OK) {
                return toResponseEntity(headers, response);
            }

            result.addAll(response.getModels());
        }

        // The requester asked for a list of models so apply any filtering criteria.
        for (ModelResource m : result) {
            long creationTime = XmlUtilities.xmlGregorianCalendar(m.getCreationTime()).toGregorianCalendar()
                    .getTimeInMillis();

            log.info(
                    "[SenseRmController] returning model id = {}, creationTime = {}, If-Modified-Since = {}\n{}",
                    m.getId(), m.getCreationTime(), ifModifiedSince, Encoder.encode(m.getModel()));

            // Create the unique resource URL.
            m.setHref(UrlHelper.append(location.toASCIIString(), m.getId()));

            // If summary results are requested we do not return the model.
            if (summary) {
                m.setModel(null);
            } else {
                // If they requested an encoded transfer we will encode the model contents.
                if (encode) {
                    m.setModel(Encoder.encode(m.getModel()));
                }
            }

            // Save this model and update If-Modified-Since with the creation time.
            models.add(m);

            if (creationTime > newest) {
                newest = creationTime;
            }
        }

        // Update the LastModified header with the value of the newest model.
        headers.setLastModified(newest);

        // We have success so return the models we have found.
        return new ResponseEntity<>(models, headers, HttpStatus.OK);
    } catch (InterruptedException | IOException | DatatypeConfigurationException | IllegalArgumentException
            | ExecutionException ex) {
        log.error("[SenseRmController] getModels failed, ex = {}", ex);
        Error error = Error.builder().error(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .error_description(ex.getMessage()).build();
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

From source file:net.es.sense.rm.api.SenseRmController.java

/**
 * Returns the SENSE topology model identified by id.
 *
 * Operation: GET /api/sense/v1/models/{id}
 *
 * @param accept Provides media types that are acceptable for the response. At the moment
 *    'application/json' is the supported response encoding.
 *
 * @param ifModifiedSince The HTTP request may contain the If-Modified-Since header requesting
 *    all models with creationTime after the specified date. The date must be specified in
 *    RFC 1123 format./* www . j a  v  a 2s  .  com*/
 *
 * @param encode Transfer size of the model element contents can be optimized by gzip/base64
 *    encoding the contained model.  If encode=true then returned model will be gzipped
 *    (contentType="application/x-gzip") and base64 encoded (contentTransferEncoding= "base64")
 *    to reduce transfer size. Default value is encode=false.
 *
 * @param model This versions detailed topology model in the requested format (TURTLE, etc.).
 *    To optimize transfer the contents of this model element should be gzipped
 *    (contentType="application/x-gzip") and base64 encoded (contentTransferEncoding="base64").
 *    This will reduce the transfer size and encapsulate the original model contents.
 *
 * @param id Identifier of the target topology model resource.
 *
 * @return A RESTful response.
 */
@ApiOperation(value = "Get a specific SENSE topology model resource.", notes = "Returns SENSE topology model resource corresponding to the specified resource id.", response = ModelResource.class)
@ApiResponses(value = {
        @ApiResponse(code = HttpConstants.OK_CODE, message = HttpConstants.OK_TOPOLOGIES_MSG, response = ModelResource.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_MODIFIED, message = HttpConstants.NOT_MODIFIED_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.BAD_REQUEST_CODE, message = HttpConstants.BAD_REQUEST_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.FORBIDDEN_CODE, message = HttpConstants.FORBIDDEN_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_FOUND_CODE, message = HttpConstants.NOT_FOUND_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_ACCEPTABLE_CODE, message = HttpConstants.NOT_ACCEPTABLE_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.INTERNAL_ERROR_CODE, message = HttpConstants.INTERNAL_ERROR_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }), })
@RequestMapping(value = "/models/{" + HttpConstants.ID_NAME + "}", method = RequestMethod.GET, produces = {
        MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
public ResponseEntity<?> getModel(
        @RequestHeader(value = HttpConstants.ACCEPT_NAME, defaultValue = MediaType.APPLICATION_JSON_VALUE) @ApiParam(value = HttpConstants.ACCEPT_MSG, required = false) String accept,
        /*
          @RequestHeader(
                value = HttpConstants.IF_MODIFIED_SINCE_NAME,
                defaultValue = HttpConstants.IF_MODIFIED_SINCE_DEFAULT)
          @ApiParam(value = HttpConstants.IF_MODIFIED_SINCE_MSG, required = false) String ifModifiedSince,
        */
        @RequestHeader(value = HttpConstants.IF_MODIFIED_SINCE_NAME, required = false) @ApiParam(value = HttpConstants.IF_MODIFIED_SINCE_MSG, required = false) String ifModifiedSince,
        @RequestParam(value = HttpConstants.MODEL_NAME, defaultValue = HttpConstants.MODEL_TURTLE) @ApiParam(value = HttpConstants.MODEL_MSG, required = false) String model,
        @RequestParam(value = HttpConstants.ENCODE_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.ENCODE_MSG, required = false) boolean encode,
        @PathVariable(HttpConstants.ID_NAME) @ApiParam(value = HttpConstants.ID_MSG, required = true) String id) {

    final URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUri();

    log.info("[SenseRmController] operation = {}, id = {}, accept = {}, ifModifiedSince = {}, model = {}",
            location, id, accept, ifModifiedSince, model);

    // Parse the If-Modified-Since header if it is present.
    long ifms = parseIfModfiedSince(ifModifiedSince);

    // Return the local in HTTP header.
    final HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Location", location.toASCIIString());

    try {
        // Retrieve the model if newer than specified If-Modified-Since header.
        ModelResponse response = driver.getModel(id, model, ifms).get();

        if (response == null || response.getStatus() != Status.OK) {
            return toResponseEntity(headers, response);
        }

        ModelResource m = response.getModel().get();

        // Get the creation time for HTTP header.
        long creationTime = XmlUtilities.xmlGregorianCalendar(m.getCreationTime()).toGregorianCalendar()
                .getTimeInMillis();
        headers.setLastModified(creationTime);

        log.info("[SenseRmController] returning id = {}, creationTime = {}, queried If-Modified-Since = {}\n{}",
                m.getId(), m.getCreationTime(), ifModifiedSince, Encoder.encode(m.getModel()));

        // Update the HREF to point to the absolute URL for the resource.
        m.setHref(location.toASCIIString());
        if (encode) {
            m.setModel(Encoder.encode(m.getModel()));
        }

        return new ResponseEntity<>(m, headers, HttpStatus.OK);
    } catch (InterruptedException | IOException | DatatypeConfigurationException | ExecutionException ex) {
        log.error("[SenseRmController] getModel failed, ex = {}", ex);
        Error error = Error.builder().error(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .error_description(ex.getMessage()).build();
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

From source file:net.es.sense.rm.api.SenseRmController.java

/**
 * Returns a list of accepted delta resources associated with the specified SENSE topology model.
 *
 * @param accept Provides media types that are acceptable for the response. At the moment 'application/json' is the
 * supported response encoding./*from   ww w  . ja  va 2 s  .  c om*/
 * @param ifModifiedSince The HTTP request may contain the If-Modified-Since header requesting all models with
 * creationTime after the specified date. The date must be specified in RFC 1123 format.
 * @param summary If summary=true then a summary collection of delta resources will be returned including the delta
meta-data while excluding the addition, reduction, and m elements. Default value is summary=true.
*
 * @param encode Transfer size of the model element contents can be optimized by gzip/base64
 *    encoding the contained model.  If encode=true then returned model will be gzipped
 *    (contentType="application/x-gzip") and base64 encoded (contentTransferEncoding= "base64")
 *    to reduce transfer size. Default value is encode=false.
 *
 * @param model If model=turtle then the returned addition, reduction, and m elements will contain the full
topology model in a TURTLE representation. Default value is model=turtle.
 * @param id The UUID uniquely identifying the topology model resource.
 * @return A RESTful response.
 */
@ApiOperation(value = "Get a collection of delta resources associated with the model resource "
        + "identified by id.", notes = "Returns a collection of delta resources associated with a model resource.", response = DeltaResource.class, responseContainer = "List")
@ApiResponses(value = {
        @ApiResponse(code = HttpConstants.OK_CODE, message = HttpConstants.OK_DELTAS_MSG, response = DeltaResource.class, responseContainer = "List", responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_MODIFIED, message = HttpConstants.NOT_MODIFIED_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class),
                @ResponseHeader(name = HttpConstants.LAST_MODIFIED_NAME, description = HttpConstants.LAST_MODIFIED_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.BAD_REQUEST_CODE, message = HttpConstants.BAD_REQUEST_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.FORBIDDEN_CODE, message = HttpConstants.FORBIDDEN_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_FOUND_CODE, message = HttpConstants.NOT_FOUND_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.NOT_ACCEPTABLE_CODE, message = HttpConstants.NOT_ACCEPTABLE_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }),
        @ApiResponse(code = HttpConstants.INTERNAL_ERROR_CODE, message = HttpConstants.INTERNAL_ERROR_MSG, response = Error.class, responseHeaders = {
                @ResponseHeader(name = HttpConstants.CONTENT_TYPE_NAME, description = HttpConstants.CONTENT_TYPE_DESC, response = String.class) }), })
@RequestMapping(value = "/models/{" + HttpConstants.ID_NAME
        + "}/deltas", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
public ResponseEntity<?> getModelDeltas(
        @RequestHeader(value = HttpConstants.ACCEPT_NAME, defaultValue = MediaType.APPLICATION_JSON_VALUE) @ApiParam(value = HttpConstants.ACCEPT_MSG, required = false) String accept,
        @RequestHeader(value = HttpConstants.IF_MODIFIED_SINCE_NAME, required = false) @ApiParam(value = HttpConstants.IF_MODIFIED_SINCE_MSG, required = false) String ifModifiedSince,
        @RequestParam(value = HttpConstants.SUMMARY_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.SUMMARY_MSG, required = false) boolean summary,
        @RequestParam(value = HttpConstants.ENCODE_NAME, defaultValue = "false") @ApiParam(value = HttpConstants.ENCODE_MSG, required = false) boolean encode,
        @RequestParam(value = HttpConstants.MODEL_NAME, defaultValue = HttpConstants.MODEL_TURTLE) @ApiParam(value = HttpConstants.MODEL_MSG, required = false) String model,
        @PathVariable(HttpConstants.ID_NAME) @ApiParam(value = HttpConstants.ID_MSG, required = true) String id) {

    // We need the request URL to build fully qualified resource URLs.
    final URI location = ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUri();

    log.info(
            "[SenseRmController] GET operation = {}, accept = {}, If-Modified-Since = {}, current = {}, "
                    + "summary = {}, model = {}, modelId = {}",
            location, accept, ifModifiedSince, summary, model, id);

    // Parse the If-Modified-Since header if it is present.
    long ifms = parseIfModfiedSince(ifModifiedSince);

    // Populate the content location header with our URL location.
    final HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Location", location.toASCIIString());

    try {
        // Track matching deltas here.
        List<DeltaResource> deltas = new ArrayList<>();

        // Keep track of the most recently updated delta date.
        long newest = 0;

        // Query the driver for a list of deltas.
        DeltasResponse response = driver.getDeltas(model, ifms).get();
        if (response == null || response.getStatus() != Status.OK) {
            return toResponseEntity(headers, response);
        }

        // The requester asked for a list of models so apply any filtering criteria.
        for (DeltaResource d : response.getDeltas()) {
            long lastModified = XmlUtilities.xmlGregorianCalendar(d.getLastModified()).toGregorianCalendar()
                    .getTimeInMillis();

            log.info("[SenseRmController] delta id = {}, lastModified = {}, If-Modified-Since = {}", d.getId(),
                    d.getLastModified(), ifModifiedSince);

            // Create the unique resource URL.
            d.setHref(UrlHelper.append(location.toASCIIString(), d.getId()));

            // If summary results are requested we do not return the model.
            if (summary) {
                d.setAddition(null);
                d.setReduction(null);
                d.setResult(null);
            } else {
                // If they requested an encoded transfer we will encode the model contents.
                if (encode) {
                    d.setAddition(Encoder.encode(d.getAddition()));
                    d.setReduction(Encoder.encode(d.getReduction()));
                    d.setResult(Encoder.encode(d.getResult()));
                }
            }

            // Save this model and update If-Modified-Since with the creation time.
            deltas.add(d);

            if (lastModified > newest) {
                newest = lastModified;
            }
        }

        // Update the LastModified header with the value of the newest model.
        headers.setLastModified(newest);

        // We have success so return the models we have found.
        return new ResponseEntity<>(deltas, headers, HttpStatus.OK);
    } catch (InterruptedException | IOException | DatatypeConfigurationException | IllegalArgumentException
            | ExecutionException ex) {
        log.error("[SenseRmController] getDeltas failed, ex = {}", ex);
        Error error = Error.builder().error(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .error_description(ex.getMessage()).build();
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}