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; 022import static org.fcrepo.client.PreferHeaderConstants.HANDLING_LENIENT; 023 024import java.io.File; 025import java.io.IOException; 026import java.io.InputStream; 027import java.io.UnsupportedEncodingException; 028import java.net.URI; 029import java.net.URLEncoder; 030 031import org.apache.http.client.methods.HttpRequestBase; 032 033/** 034 * Builds a PUT request for interacting with the Fedora HTTP API in order to create a resource with a specified path, 035 * or replace the triples associated with a resource with the triples provided in the request body. 036 * 037 * @author bbpennel 038 */ 039public class PutBuilder extends BodyRequestBuilder { 040 041 /** 042 * Instantiate builder 043 * 044 * @param uri uri of the resource this request is being made to 045 * @param client the client 046 */ 047 public PutBuilder(final URI uri, final FcrepoClient client) { 048 super(uri, client); 049 } 050 051 @Override 052 protected HttpRequestBase createRequest() { 053 return HttpMethods.PUT.createRequest(targetUri); 054 } 055 056 @Override 057 public PutBuilder body(final InputStream stream, final String contentType) { 058 return (PutBuilder) super.body(stream, contentType); 059 } 060 061 @Override 062 public PutBuilder body(final File file, final String contentType) throws IOException { 063 return (PutBuilder) super.body(file, contentType); 064 } 065 066 @Override 067 public PutBuilder externalContent(final URI contentURI, final String contentType, final String handling) { 068 return (PutBuilder) super.externalContent(contentURI, contentType, handling); 069 } 070 071 @Override 072 public PutBuilder body(final InputStream stream) { 073 return (PutBuilder) super.body(stream); 074 } 075 076 @Override 077 public PutBuilder ifMatch(final String etag) { 078 return (PutBuilder) super.ifMatch(etag); 079 } 080 081 @Override 082 public PutBuilder ifUnmodifiedSince(final String modified) { 083 return (PutBuilder) super.ifUnmodifiedSince(modified); 084 } 085 086 @Override 087 public PutBuilder ifStateToken(final String token) { 088 return (PutBuilder) super.ifStateToken(token); 089 } 090 091 @Deprecated 092 @Override 093 public PutBuilder digest(final String digest) { 094 return (PutBuilder) super.digest(digest); 095 } 096 097 @Override 098 public PutBuilder digest(final String digest, final String alg) { 099 return (PutBuilder) super.digest(digest, alg); 100 } 101 102 @Override 103 public PutBuilder digestMd5(final String digest) { 104 return (PutBuilder) super.digestMd5(digest); 105 } 106 107 @Override 108 public PutBuilder digestSha1(final String digest) { 109 return (PutBuilder) super.digestSha1(digest); 110 } 111 112 @Override 113 public PutBuilder digestSha256(final String digest) { 114 return (PutBuilder) super.digestSha256(digest); 115 } 116 117 @Override 118 public PutBuilder addInteractionModel(final String interactionModelUri) { 119 return (PutBuilder) super.addInteractionModel(interactionModelUri); 120 } 121 122 @Override 123 public PutBuilder linkAcl(final String aclUri) { 124 return (PutBuilder) super.linkAcl(aclUri); 125 } 126 127 @Override 128 public PutBuilder addHeader(final String name, final String value) { 129 return (PutBuilder) super.addHeader(name, value); 130 } 131 132 @Override 133 public PutBuilder addLinkHeader(final FcrepoLink linkHeader) { 134 return (PutBuilder) super.addLinkHeader(linkHeader); 135 } 136 137 /** 138 * Provide a content disposition header which will be used as the filename 139 * 140 * @param filename the name of the file being provided in the body of the request 141 * @return this builder 142 * @throws FcrepoOperationFailedException if unable to encode filename 143 */ 144 public PutBuilder filename(final String filename) throws FcrepoOperationFailedException { 145 try { 146 final String f = (filename != null) ? "; filename=\"" + URLEncoder.encode(filename, "utf-8") + "\"" : ""; 147 request.addHeader(CONTENT_DISPOSITION, "attachment" + f); 148 } catch (final UnsupportedEncodingException e) { 149 throw new FcrepoOperationFailedException(request.getURI(), -1, e.getMessage()); 150 } 151 return this; 152 } 153 154 /** 155 * Set the prefer header for this request to lenient handling, to indicate that server-managed triples will not 156 * be included in the request body. 157 * 158 * @return this builder 159 */ 160 public PutBuilder preferLenient() { 161 request.setHeader(PREFER, HANDLING_LENIENT); 162 return this; 163 } 164}