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.SLUG;
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 post request for interacting with the Fedora HTTP API in order to create a new resource within an LDP
022 * container.
023 *
024 * @author bbpennel
025 */
026public class PostBuilder 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 PostBuilder(final URI uri, final FcrepoClient client) {
035        super(uri, client);
036    }
037
038    @Override
039    protected HttpRequestBase createRequest() {
040        return HttpMethods.POST.createRequest(targetUri);
041    }
042
043    @Override
044    public PostBuilder body(final InputStream stream, final String contentType) {
045        return (PostBuilder) super.body(stream, contentType);
046    }
047
048    @Override
049    public PostBuilder body(final File file, final String contentType) throws IOException {
050        return (PostBuilder) super.body(file, contentType);
051    }
052
053    @Override
054    public PostBuilder body(final InputStream stream) {
055        return (PostBuilder) super.body(stream);
056    }
057
058    @Override
059    public PostBuilder externalContent(final URI contentURI, final String contentType, final String handling) {
060        return (PostBuilder) super.externalContent(contentURI, contentType, handling);
061    }
062
063    @Deprecated
064    @Override
065    public PostBuilder digest(final String digest) {
066        return (PostBuilder) super.digest(digest);
067    }
068
069    @Override
070    public PostBuilder digest(final String digest, final String alg) {
071        return (PostBuilder) super.digest(digest, alg);
072    }
073
074    @Override
075    public PostBuilder digestMd5(final String digest) {
076        return (PostBuilder) super.digestMd5(digest);
077    }
078
079    @Override
080    public PostBuilder digestSha1(final String digest) {
081        return (PostBuilder) super.digestSha1(digest);
082    }
083
084    @Override
085    public PostBuilder digestSha256(final String digest) {
086        return (PostBuilder) super.digestSha256(digest);
087    }
088
089    @Override
090    public PostBuilder addInteractionModel(final String interactionModelUri) {
091        return (PostBuilder) super.addInteractionModel(interactionModelUri);
092    }
093
094    @Override
095    public PostBuilder linkAcl(final String aclUri) {
096        return (PostBuilder) super.linkAcl(aclUri);
097    }
098
099    @Override
100    public PostBuilder addHeader(final String name, final String value) {
101        return (PostBuilder) super.addHeader(name, value);
102    }
103
104    @Override
105    public PostBuilder addTransaction(final URI transaction) {
106        return (PostBuilder) super.addTransaction(transaction);
107    }
108
109    @Override
110    public PostBuilder addLinkHeader(final FcrepoLink linkHeader) {
111        return (PostBuilder) super.addLinkHeader(linkHeader);
112    }
113
114    /**
115     * Provide a content disposition header which will be used as the filename
116     *
117     * @param filename the name of the file being provided in the body of the request
118     * @return this builder
119     * @throws FcrepoOperationFailedException if unable to encode filename
120     */
121    public PostBuilder filename(final String filename) throws FcrepoOperationFailedException {
122        final Builder builder = ContentDisposition.builder("attachment");
123        if (filename != null) {
124            builder.filename(filename);
125        }
126        request.addHeader(CONTENT_DISPOSITION, builder.build().toString());
127        return this;
128    }
129
130    /**
131     * Provide a suggested name for the new child resource, which the repository may ignore.
132     *
133     * @param slug value to supply as the slug header
134     * @return this builder
135     */
136    public PostBuilder slug(final String slug) {
137        if (slug != null) {
138            request.addHeader(SLUG, slug);
139        }
140        return this;
141    }
142}