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}