code: @CrossOrigin(allowedHeaders = {"*"}, origins = {"*"})
    @RequestMapping(value = {"{identifier}/manifest", "{identifier}"}, method = RequestMethod.GET,
            produces = "application/json")
    @ResponseBody
    public Manifest getManifest(@PathVariable String identifier, HttpServletRequest request) throws NotFoundException, InvalidDataException {
      HttpLoggingUtilities.addRequestClientInfoToMDC(request);
      MDC.put("manifestId", identifier);
      try {
        Manifest manifest = presentationService.getManifest(identifier);
        LOGGER.info("Serving manifest for {}", identifier);
        return manifest;
      } catch (NotFoundException e) {
        LOGGER.info("Did not find manifest for {}", identifier);
        throw e;
      } catch (InvalidDataException e) {
        LOGGER.error("Bad data for {}", identifier);
        throw e;
      } finally {
        MDC.clear();
      }
    }
docs: The manifest response contains sufficient information for the client to initialize itself and begin to display
  something quickly to the user. The manifest resource represents a single object and any intellectual work or works
  embodied within that object. In particular it includes the descriptive, rights and linking information for the
  object. It then embeds the sequence(s) of canvases that should be rendered to the user.
  
  @param identifier unique id of object to be shown
  @param request request containing client information for logging
  @return the JSON-Manifest
  @throws NotFoundException if manifest can not be delivered
  @throws de.digitalcollections.iiif.presentation.model.api.exceptions.InvalidDataException if manifest can not be read
  @see <a href="http://iiif.io/api/presentation/2.0/#manifest">IIIF 2.0</a>