/**
   * Modify an existing datastream's content
   *
   * @param pathList
   * @param requestContentType Content-Type header
   * @param requestBodyStream Binary blob
   * @return 201 Created
   * @throws RepositoryException
   * @throws InvalidChecksumException
   */
  @PUT
  @Timed
  public Response modifyContent(
      @PathParam("path") final List<PathSegment> pathList,
      @QueryParam("checksum") final String checksum,
      @HeaderParam("Content-Disposition") final String contentDisposition,
      @HeaderParam("Content-Type") final MediaType requestContentType,
      @ContentLocation final InputStream requestBodyStream,
      @Context final Request request,
      @Context final HttpServletResponse servletResponse)
      throws RepositoryException, InvalidChecksumException, URISyntaxException, ParseException {

    try {
      final String path = toPath(pathList);
      final MediaType contentType = getSimpleContentType(requestContentType);

      if (nodeService.exists(session, path)) {

        final Datastream ds = datastreamService.getDatastream(session, path);

        evaluateRequestPreconditions(request, ds);
      }

      LOGGER.debug("create Datastream {}", path);

      final URI checksumURI = checksumURI(checksum);
      final String originalFileName = originalFileName(contentDisposition);

      final Datastream datastream =
          datastreamService.createDatastream(
              session,
              path,
              contentType.toString(),
              originalFileName,
              requestBodyStream,
              checksumURI);

      final boolean isNew = datastream.isNew();
      session.save();
      versionService.nodeUpdated(datastream.getNode());

      ResponseBuilder builder;
      if (isNew) {
        final HttpIdentifierTranslator subjects =
            new HttpIdentifierTranslator(session, FedoraNodes.class, uriInfo);

        builder =
            created(new URI(subjects.getSubject(datastream.getContentNode().getPath()).getURI()));
      } else {
        builder = noContent();
      }

      addCacheControlHeaders(servletResponse, datastream);

      return builder.build();
    } finally {
      session.logout();
    }
  }
  /**
   * Create an anonymous DS with a newly minted name and content from request body
   *
   * @param pathList
   * @throws RepositoryException
   */
  @POST
  @Timed
  public Response create(
      @PathParam("path") final List<PathSegment> pathList,
      @HeaderParam("Slug") final String slug,
      @HeaderParam("Content-Disposition") final String contentDisposition,
      @QueryParam("checksum") final String checksum,
      @HeaderParam("Content-Type") final MediaType requestContentType,
      @ContentLocation final InputStream requestBodyStream,
      @Context final HttpServletResponse servletResponse)
      throws InvalidChecksumException, RepositoryException, URISyntaxException, ParseException {
    final MediaType contentType = getSimpleContentType(requestContentType);

    final String newDatastreamPath;
    final String path = toPath(pathList);

    if (nodeService.exists(session, path)) {
      if (nodeService.getObject(session, path).hasContent()) {
        return status(SC_CONFLICT).entity(path + " is an existing resource!").build();
      }

      final String pid;

      if (slug != null) {
        pid = slug;
      } else {
        pid = pidMinter.mintPid();
      }

      newDatastreamPath = path + "/" + pid;
    } else {
      newDatastreamPath = path;
    }

    LOGGER.trace("Attempting to ingest fcr:content with path: {}", newDatastreamPath);

    try {

      if (nodeService.exists(session, newDatastreamPath)) {
        return status(SC_CONFLICT).entity(path + " is an existing resource!").build();
      }

      final URI checksumURI = checksumURI(checksum);
      final String originalFileName = originalFileName(contentDisposition);

      final Datastream datastream =
          datastreamService.createDatastream(
              session,
              newDatastreamPath,
              contentType.toString(),
              originalFileName,
              requestBodyStream,
              checksumURI);

      final HttpIdentifierTranslator subjects =
          new HttpIdentifierTranslator(session, FedoraNodes.class, uriInfo);

      session.save();
      versionService.nodeUpdated(datastream.getNode());

      final ResponseBuilder builder =
          created(new URI(subjects.getSubject(datastream.getContentNode().getPath()).getURI()));

      addCacheControlHeaders(servletResponse, datastream);

      return builder.build();

    } finally {
      session.logout();
    }
  }