001/* 002 * Licensed to DuraSpace under one or more contributor license agreements. 003 * See the NOTICE file distributed with this work for additional information 004 * regarding copyright ownership. 005 * 006 * DuraSpace licenses this file to you under the Apache License, 007 * Version 2.0 (the "License"); you may not use this file except in 008 * compliance with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.fcrepo.client; 019 020import static org.fcrepo.client.FedoraHeaderConstants.CONTENT_DISPOSITION; 021import static org.fcrepo.client.FedoraHeaderConstants.PREFER; 022 023import java.io.File; 024import java.io.IOException; 025import java.io.InputStream; 026import java.net.URI; 027 028import org.apache.http.client.methods.HttpRequestBase; 029import org.springframework.http.ContentDisposition; 030import org.springframework.http.ContentDisposition.Builder; 031 032/** 033 * Builds a PUT request for interacting with the Fedora HTTP API in order to create a resource with a specified path, 034 * or replace the triples associated with a resource with the triples provided in the request body. 035 * 036 * @author bbpennel 037 */ 038public class PutBuilder extends BodyRequestBuilder { 039 040 /** 041 * Instantiate builder 042 * 043 * @param uri uri of the resource this request is being made to 044 * @param client the client 045 */ 046 public PutBuilder(final URI uri, final FcrepoClient client) { 047 super(uri, client); 048 } 049 050 @Override 051 protected HttpRequestBase createRequest() { 052 return HttpMethods.PUT.createRequest(targetUri); 053 } 054 055 @Override 056 public PutBuilder body(final InputStream stream, final String contentType) { 057 return (PutBuilder) super.body(stream, contentType); 058 } 059 060 @Override 061 public PutBuilder body(final File file, final String contentType) throws IOException { 062 return (PutBuilder) super.body(file, contentType); 063 } 064 065 @Override 066 public PutBuilder externalContent(final URI contentURI, final String contentType, final String handling) { 067 return (PutBuilder) super.externalContent(contentURI, contentType, handling); 068 } 069 070 @Override 071 public PutBuilder body(final InputStream stream) { 072 return (PutBuilder) super.body(stream); 073 } 074 075 @Override 076 public PutBuilder ifMatch(final String etag) { 077 return (PutBuilder) super.ifMatch(etag); 078 } 079 080 @Override 081 public PutBuilder ifUnmodifiedSince(final String modified) { 082 return (PutBuilder) super.ifUnmodifiedSince(modified); 083 } 084 085 @Override 086 public PutBuilder ifStateToken(final String token) { 087 return (PutBuilder) super.ifStateToken(token); 088 } 089 090 @Deprecated 091 @Override 092 public PutBuilder digest(final String digest) { 093 return (PutBuilder) super.digest(digest); 094 } 095 096 @Override 097 public PutBuilder digest(final String digest, final String alg) { 098 return (PutBuilder) super.digest(digest, alg); 099 } 100 101 @Override 102 public PutBuilder digestMd5(final String digest) { 103 return (PutBuilder) super.digestMd5(digest); 104 } 105 106 @Override 107 public PutBuilder digestSha1(final String digest) { 108 return (PutBuilder) super.digestSha1(digest); 109 } 110 111 @Override 112 public PutBuilder digestSha256(final String digest) { 113 return (PutBuilder) super.digestSha256(digest); 114 } 115 116 @Override 117 public PutBuilder addInteractionModel(final String interactionModelUri) { 118 return (PutBuilder) super.addInteractionModel(interactionModelUri); 119 } 120 121 @Override 122 public PutBuilder linkAcl(final String aclUri) { 123 return (PutBuilder) super.linkAcl(aclUri); 124 } 125 126 @Override 127 public PutBuilder addHeader(final String name, final String value) { 128 return (PutBuilder) super.addHeader(name, value); 129 } 130 131 @Override 132 public PutBuilder addLinkHeader(final FcrepoLink linkHeader) { 133 return (PutBuilder) super.addLinkHeader(linkHeader); 134 } 135 136 /** 137 * Provide a content disposition header which will be used as the filename 138 * 139 * @param filename the name of the file being provided in the body of the request 140 * @return this builder 141 * @throws FcrepoOperationFailedException if unable to encode filename 142 */ 143 public PutBuilder filename(final String filename) throws FcrepoOperationFailedException { 144 final Builder builder = ContentDisposition.builder("attachment"); 145 if (filename != null) { 146 builder.filename(filename); 147 } 148 request.addHeader(CONTENT_DISPOSITION, builder.build().toString()); 149 return this; 150 } 151 152 /** 153 * Set the prefer header for this request to lenient handling, to indicate that server-managed triples will not 154 * be included in the request body. 155 * 156 * @return this builder 157 */ 158 public PutBuilder preferLenient() { 159 request.setHeader(PREFER, "handling=lenient; received=\"minimal\""); 160 return this; 161 } 162}