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 addLinkHeader(final FcrepoLink linkHeader) {
106        return (PostBuilder) super.addLinkHeader(linkHeader);
107    }
108
109    /**
110     * Provide a content disposition header which will be used as the filename
111     *
112     * @param filename the name of the file being provided in the body of the request
113     * @return this builder
114     * @throws FcrepoOperationFailedException if unable to encode filename
115     */
116    public PostBuilder filename(final String filename) throws FcrepoOperationFailedException {
117        final Builder builder = ContentDisposition.builder("attachment");
118        if (filename != null) {
119            builder.filename(filename);
120        }
121        request.addHeader(CONTENT_DISPOSITION, builder.build().toString());
122        return this;
123    }
124
125    /**
126     * Provide a suggested name for the new child resource, which the repository may ignore.
127     *
128     * @param slug value to supply as the slug header
129     * @return this builder
130     */
131    public PostBuilder slug(final String slug) {
132        if (slug != null) {
133            request.addHeader(SLUG, slug);
134        }
135        return this;
136    }
137}