001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.client;
007
008import static org.fcrepo.client.FedoraHeaderConstants.CONTENT_DISPOSITION;
009import static org.fcrepo.client.FedoraHeaderConstants.PREFER;
010
011import java.io.File;
012import java.io.IOException;
013import java.io.InputStream;
014import java.net.URI;
015
016import org.apache.http.client.methods.HttpRequestBase;
017import org.springframework.http.ContentDisposition;
018import org.springframework.http.ContentDisposition.Builder;
019
020/**
021 * Builds a PUT request for interacting with the Fedora HTTP API in order to create a resource with a specified path,
022 * or replace the triples associated with a resource with the triples provided in the request body.
023 *
024 * @author bbpennel
025 */
026public class PutBuilder extends BodyRequestBuilder {
027
028    /**
029     * Instantiate builder
030     *
031     * @param uri uri of the resource this request is being made to
032     * @param client the client
033     */
034    public PutBuilder(final URI uri, final FcrepoClient client) {
035        super(uri, client);
036    }
037
038    @Override
039    protected HttpRequestBase createRequest() {
040        return HttpMethods.PUT.createRequest(targetUri);
041    }
042
043    @Override
044    public PutBuilder body(final InputStream stream, final String contentType) {
045        return (PutBuilder) super.body(stream, contentType);
046    }
047
048    @Override
049    public PutBuilder body(final File file, final String contentType) throws IOException {
050        return (PutBuilder) super.body(file, contentType);
051    }
052
053    @Override
054    public PutBuilder externalContent(final URI contentURI, final String contentType, final String handling) {
055        return (PutBuilder) super.externalContent(contentURI, contentType, handling);
056    }
057
058    @Override
059    public PutBuilder body(final InputStream stream) {
060        return (PutBuilder) super.body(stream);
061    }
062
063    @Override
064    public PutBuilder ifMatch(final String etag) {
065        return (PutBuilder) super.ifMatch(etag);
066    }
067
068    @Override
069    public PutBuilder ifUnmodifiedSince(final String modified) {
070        return (PutBuilder) super.ifUnmodifiedSince(modified);
071    }
072
073    @Override
074    public PutBuilder ifStateToken(final String token) {
075        return (PutBuilder) super.ifStateToken(token);
076    }
077
078    @Deprecated
079    @Override
080    public PutBuilder digest(final String digest) {
081        return (PutBuilder) super.digest(digest);
082    }
083
084    @Override
085    public PutBuilder digest(final String digest, final String alg) {
086        return (PutBuilder) super.digest(digest, alg);
087    }
088
089    @Override
090    public PutBuilder digestMd5(final String digest) {
091        return (PutBuilder) super.digestMd5(digest);
092    }
093
094    @Override
095    public PutBuilder digestSha1(final String digest) {
096        return (PutBuilder) super.digestSha1(digest);
097    }
098
099    @Override
100    public PutBuilder digestSha256(final String digest) {
101        return (PutBuilder) super.digestSha256(digest);
102    }
103
104    @Override
105    public PutBuilder addInteractionModel(final String interactionModelUri) {
106        return (PutBuilder) super.addInteractionModel(interactionModelUri);
107    }
108
109    @Override
110    public PutBuilder linkAcl(final String aclUri) {
111        return (PutBuilder) super.linkAcl(aclUri);
112    }
113
114    @Override
115    public PutBuilder addHeader(final String name, final String value) {
116        return (PutBuilder) super.addHeader(name, value);
117    }
118
119    @Override
120    public PutBuilder addLinkHeader(final FcrepoLink linkHeader) {
121        return (PutBuilder) super.addLinkHeader(linkHeader);
122    }
123
124    /**
125     * Provide a content disposition header which will be used as the filename
126     *
127     * @param filename the name of the file being provided in the body of the request
128     * @return this builder
129     * @throws FcrepoOperationFailedException if unable to encode filename
130     */
131    public PutBuilder filename(final String filename) throws FcrepoOperationFailedException {
132        final Builder builder = ContentDisposition.builder("attachment");
133        if (filename != null) {
134            builder.filename(filename);
135        }
136        request.addHeader(CONTENT_DISPOSITION, builder.build().toString());
137        return this;
138    }
139
140    /**
141     * Set the prefer header for this request to lenient handling, to indicate that server-managed triples will not
142     * be included in the request body.
143     *
144     * @return this builder
145     */
146    public PutBuilder preferLenient() {
147        request.setHeader(PREFER, "handling=lenient; received=\"minimal\"");
148        return this;
149    }
150}