@Override
  public void storeRepresentation(Representation representation) throws ResourceException {
    if (delegate.acceptsUpload()) {
      upload(representation);
    } else {
      Object payloadInstance = delegate.getPayloadInstance(Method.PUT);
      if (payloadInstance == null) {
        payloadInstance = delegate.getPayloadInstance();
      }
      Object payload = deserialize(payloadInstance);

      Object result = null;
      try {
        result = delegate.put(getContext(), getRequest(), getResponse(), payload);

      } catch (PlexusResourceException e) {
        // set the status
        getResponse().setStatus(e.getStatus());
        // try to get the responseObject
        result = e.getResultObject();
      }

      if (result != null) {
        getResponse().setEntity(doRepresent(result, representation, getResponse()));
      }
    }
  }
  @Override
  public void acceptRepresentation(Representation representation) throws ResourceException {
    if (delegate.acceptsUpload()) {
      upload(representation);
    } else {
      Object payloadInstance = delegate.getPayloadInstance(Method.POST);
      if (payloadInstance == null) {
        payloadInstance = delegate.getPayloadInstance();
      }
      Object payload = deserialize(payloadInstance);

      Object result = null;

      try {
        result = delegate.post(getContext(), getRequest(), getResponse(), payload);

        // This is a post, so set the status correctly
        // but only if the status was not changed to be something else, like a 202
        if (getResponse().getStatus() == Status.SUCCESS_OK) {
          getResponse().setStatus(Status.SUCCESS_CREATED);
        }
      } catch (PlexusResourceException e) {
        // set the status
        getResponse().setStatus(e.getStatus());
        // try to get the responseObject
        result = e.getResultObject();
      }

      if (result != null) {
        getResponse().setEntity(doRepresent(result, representation, getResponse()));
      }
    }
  }
  public RestletResource(
      Context context, Request request, Response response, PlexusResource delegate) {
    super(context, request, response);

    this.delegate = delegate;

    // set variants
    getVariants().clear();
    getVariants().addAll(delegate.getVariants());

    // mimic the constructor
    setAvailable(delegate.isAvailable());
    setReadable(delegate.isReadable());
    setModifiable(delegate.isModifiable());
    setNegotiateContent(delegate.isNegotiateContent());
  }
  protected Object deserialize(Object root) throws ResourceException {

    Object result = null;

    if (root != null) {

      if (String.class.isAssignableFrom(root.getClass())) {
        try {
          result = getRequest().getEntity().getText();
        } catch (IOException e) {
          throw new ResourceException(
              Status.SERVER_ERROR_INTERNAL, "Cannot get the representation!", e);
        }
      }

      XStreamRepresentation representation = createRepresentation(getRequest().getEntity());

      if (representation != null) {
        try {
          result = representation.getPayload(root);
        } catch (XStreamException e) {
          logger.warn(
              "Invalid XML, unable to parse using XStream {}",
              (delegate == null ? "" : delegate.getClass()),
              e);

          throw new ResourceException(
              Status.CLIENT_ERROR_BAD_REQUEST, "Invalid XML, unable to parse using XStream", e);
        }
      }
    }
    return result;
  }
  @Override
  public void removeRepresentations() throws ResourceException {
    delegate.delete(getContext(), getRequest(), getResponse());

    // if we have an Entity set, then return a 200 (default)
    // if not return a 204
    if (getResponse().getStatus() == Status.SUCCESS_OK && !getResponse().isEntityAvailable()) {
      getResponse().setStatus(Status.SUCCESS_NO_CONTENT);
    }
  }
  public void upload(Representation representation) throws ResourceException {
    Object result = null;

    List<FileItem> files = null;

    try {
      RestletFileUpload uploadRequest = new RestletFileUpload(getFileItemFactory());

      files = uploadRequest.parseRepresentation(representation);

      result = delegate.upload(getContext(), getRequest(), getResponse(), files);
    } catch (FileUploadException e) {
      // try to take simply the body as stream
      String name = getRequest().getResourceRef().getPath();

      if (name.contains("/")) {
        name = name.substring(name.lastIndexOf("/") + 1, name.length());
      }

      FileItem file = new FakeFileItem(name, representation);

      files = new ArrayList<FileItem>();

      files.add(file);

      result = delegate.upload(getContext(), getRequest(), getResponse(), files);
    }

    // only if the status was not changed to be something else, like a 202
    if (getResponse().getStatus() == Status.SUCCESS_OK) {
      getResponse().setStatus(Status.SUCCESS_CREATED);
    }

    if (result != null) {
      // TODO: representation cannot be returned as multipart! (representation above is possibly
      // multipart)
      getResponse().setEntity(doRepresent(result, getPreferredVariant(), getResponse()));
    }
  }
  @Override
  public Representation represent(Variant variant) throws ResourceException {
    Object result;
    try {
      result = delegate.get(getContext(), getRequest(), getResponse(), variant);
    } catch (PlexusResourceException e) {
      // set the status
      getResponse().setStatus(e.getStatus());
      // try to get the responseObject
      result = e.getResultObject();
    }

    return (result != null) ? doRepresent(result, variant, getResponse()) : null;
  }