@XmlTransient public String getETag() { return firstHeader(RestUtil.HEADER_ETAG); } @XmlTransient
@XmlTransient public String getExpirationRuleId() { return S3ObjectMetadata.getExpirationRuleId(getHeaders()); }
public void doSinglePut() { configure(); InputStream is = null; try { is = file != null ? new FileInputStream(file) : stream; is = new ProgressInputStream(is, this); PutObjectRequest putRequest = new PutObjectRequest(bucket, key, is); putRequest.setObjectMetadata(objectMetadata); putRequest.setAcl(acl); putRequest.setCannedAcl(cannedAcl); PutObjectResult result = s3Client.putObject(putRequest); eTag = result.getETag(); } catch (IOException e) { throw new RuntimeException("Error opening file", e); } finally { // make sure we close the input stream if necessary if (is != null && closeStream) { try { is.close(); } catch (Throwable t) { log.warn("could not close stream", t); } } } }
@Override public PutObjectResult putObject(PutObjectRequest request) { // enable checksum of the object request.property(RestUtil.PROPERTY_VERIFY_WRITE_CHECKSUM, Boolean.TRUE); PutObjectResult result = new PutObjectResult(); fillResponseEntity(result, executeAndClose(client, request)); return result; }
@Override public long appendObject(String bucketName, String key, Object content) { return putObject(new PutObjectRequest(bucketName, key, content) .withRange(Range.fromOffset(-1))).getAppendOffset(); }
@Override public String call() throws Exception { Range range = Range.fromOffsetLength(offset, length); InputStream is = file != null ? new FileInputStream(file) : stream; is = new ProgressInputStream(is, LargeFileUploader.this); SizedInputStream segmentStream = file != null ? new InputStreamSegment(is, offset, length) : new SizedInputStream(is, length); PutObjectRequest request = new PutObjectRequest(bucket, key, segmentStream).withRange(range); return s3Client.putObject(request).getETag(); } }
@Override public PutObjectResult putObject(PutObjectRequest request) { if (request.getObjectMetadata() != null) { request.setObjectMetadata(null); } try { Path path = Paths.get(this.baseDir, request.getBucketName(), request.getKey()); Path parent = path.getParent(); assert parent != null; Files.createDirectories(parent); Files.createFile(path); } catch (IOException e) { throw new S3Exception(e.getMessage(), 0, e); } PutObjectResult retVal = new PutObjectResult(); if (request.getAcl() != null) { long size = 0; if (request.getRange() != null) { size = request.getRange().getLast() + 1; } aclMap.putIfAbsent(request.getKey(), new AclSize(request.getAcl(), size)); } return retVal; }
@Override public PutObjectResult putObject(PutObjectRequest request) { if (request.getRange() != null) throw new UnsupportedOperationException(PARTIAL_UPDATE_MSG); // make user metadata available as a request property if (request.getObjectMetadata() == null) request.setObjectMetadata(new S3ObjectMetadata()); Map<String, String> userMeta = request.getObjectMetadata().getUserMetadata(); request.property(RestUtil.PROPERTY_USER_METADATA, userMeta); // activate codec filter request.property(RestUtil.PROPERTY_ENCODE_ENTITY, Boolean.TRUE); // write data PutObjectResult result = super.putObject(request); // encryption filter will modify userMeta with encryption metadata *after* the object is transferred // we must send a separate metadata update or the object will be unreadable // TODO: should this be atomic? how do we handle rollback? CopyObjectRequest metadataUpdate = new CopyObjectRequest(request.getBucketName(), request.getKey(), request.getBucketName(), request.getKey()).withAcl(request.getAcl()) .withObjectMetadata(request.getObjectMetadata()).withIfMatch(result.getETag()); return super.copyObject(metadataUpdate); }
@XmlTransient public String getVersionId() { return firstHeader(S3Constants.AMZ_VERSION_ID); }
@XmlTransient public Date getExpirationDate() { return S3ObjectMetadata.getExpirationDate(getHeaders()); }
log.debug("Wrote {} etag: {}", targetKey, result.getETag()); } else { LargeFileUploader uploader;
@XmlTransient public Long getAppendOffset() { String appendOffset = firstHeader(RestUtil.EMC_APPEND_OFFSET); return appendOffset == null ? null : Long.parseLong(appendOffset); } }