Skip to content

Commit

Permalink
DEV-7961: implement updateFileLegalHold (#54)
Browse files Browse the repository at this point in the history
* DEV-7961: implement updateFileLegalHold

* changes after review
  • Loading branch information
ericjding authored Mar 31, 2021
1 parent e501742 commit a8eda75
Show file tree
Hide file tree
Showing 10 changed files with 360 additions and 7 deletions.
11 changes: 11 additions & 0 deletions core/src/main/java/com/backblaze/b2/client/B2StorageClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
import com.backblaze.b2.client.structures.B2StartLargeFileRequest;
import com.backblaze.b2.client.structures.B2StoreLargeFileRequest;
import com.backblaze.b2.client.structures.B2UpdateBucketRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldResponse;
import com.backblaze.b2.client.structures.B2UploadFileRequest;
import com.backblaze.b2.client.structures.B2UploadListener;
import com.backblaze.b2.client.structures.B2UploadPartUrlResponse;
Expand Down Expand Up @@ -917,6 +919,15 @@ default String getDownloadByNameUrl(String bucketName,
*/
B2FileVersion finishLargeFile(B2FinishLargeFileRequest request) throws B2Exception;

/**
* Updates the legal hold configuration of the specified file as described by the request.
*
* @param request specifies which file to update and how to update it.
* @return the new state of the file
* @throws B2Exception if there's any trouble.
* @see <a href="https://www.backblaze.com/b2/docs/b2_update_file_legal_hold.html">b2_update_file_legal_hold</a>
*/
B2UpdateFileLegalHoldResponse updateFileLegalHold(B2UpdateFileLegalHoldRequest request) throws B2Exception;

/**
* Closes this instance, releasing resources.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
import com.backblaze.b2.client.structures.B2StartLargeFileRequest;
import com.backblaze.b2.client.structures.B2StoreLargeFileRequest;
import com.backblaze.b2.client.structures.B2UpdateBucketRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldResponse;
import com.backblaze.b2.client.structures.B2UploadFileRequest;
import com.backblaze.b2.client.structures.B2UploadListener;
import com.backblaze.b2.client.structures.B2UploadPartUrlResponse;
Expand Down Expand Up @@ -492,6 +494,13 @@ public B2FileVersion finishLargeFile(B2FinishLargeFileRequest request) throws B2
retryPolicySupplier.get());
}

@Override
public B2UpdateFileLegalHoldResponse updateFileLegalHold(B2UpdateFileLegalHoldRequest request) throws B2Exception {
return retryer.doRetry("b2_update_file_legal_hold", accountAuthCache,
() -> webifier.updateFileLegalHold(accountAuthCache.get(), request),
retryPolicySupplier.get());
}

//
// For use by our iterators
// XXX: make private somehow, or move to B2StorageClient interface.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
import com.backblaze.b2.client.structures.B2Part;
import com.backblaze.b2.client.structures.B2StartLargeFileRequest;
import com.backblaze.b2.client.structures.B2UpdateBucketRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldResponse;
import com.backblaze.b2.client.structures.B2UploadFileRequest;
import com.backblaze.b2.client.structures.B2UploadPartRequest;
import com.backblaze.b2.client.structures.B2UploadPartUrlResponse;
Expand Down Expand Up @@ -166,6 +168,9 @@ String getDownloadByIdUrl(B2AccountAuthorization accountAuth,
String getDownloadByNameUrl(B2AccountAuthorization accountAuth,
B2DownloadByNameRequest request) throws B2Exception;

B2UpdateFileLegalHoldResponse updateFileLegalHold(B2AccountAuthorization accountAuth,
B2UpdateFileLegalHoldRequest request) throws B2Exception;

/**
* Closes this object and its underlying resources.
* This is overridden from AutoCloseable to declare that it can't throw any exception.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
import com.backblaze.b2.client.structures.B2StartLargeFileRequest;
import com.backblaze.b2.client.structures.B2TestMode;
import com.backblaze.b2.client.structures.B2UpdateBucketRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldResponse;
import com.backblaze.b2.client.structures.B2UploadFileRequest;
import com.backblaze.b2.client.structures.B2UploadListener;
import com.backblaze.b2.client.structures.B2UploadPartRequest;
Expand Down Expand Up @@ -644,6 +646,16 @@ public B2Bucket deleteBucket(B2AccountAuthorization accountAuth,
B2Bucket.class);
}

@Override
public B2UpdateFileLegalHoldResponse updateFileLegalHold(B2AccountAuthorization accountAuth,
B2UpdateFileLegalHoldRequest request) throws B2Exception {
return webApiClient.postJsonReturnJson(
makeUrl(accountAuth, "b2_update_file_legal_hold"),
makeHeaders(accountAuth),
request,
B2UpdateFileLegalHoldResponse.class);
}

private void addAuthHeader(B2HeadersImpl.Builder builder,
B2AccountAuthorization accountAuth) {
builder.set(B2Headers.AUTHORIZATION, accountAuth.getAuthorizationToken());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright 2021, Backblaze Inc. All Rights Reserved.
* License https://www.backblaze.com/using_b2_code.html
*/
package com.backblaze.b2.client.structures;

import com.backblaze.b2.json.B2Json;
import com.backblaze.b2.util.B2Preconditions;

import java.util.Objects;

public class B2UpdateFileLegalHoldRequest {
@B2Json.required
public final String fileName;

@B2Json.required
public final String fileId;

@B2Json.required
public final String legalHold;

@B2Json.constructor(params = "fileName, fileId, legalHold")
private B2UpdateFileLegalHoldRequest(String fileName,
String fileId,
String legalHold) {
B2Preconditions.checkArgument(
B2LegalHold.ON.equals(legalHold) || B2LegalHold.OFF.equals(legalHold),
String.format("Invalid legalHold value. Valid values: %s, %s", B2LegalHold.ON, B2LegalHold.OFF)
);

this.fileName = fileName;
this.fileId = fileId;
this.legalHold = legalHold;
}

public String getFileName() {
return fileName;
}

public String getFileId() {
return fileId;
}

public String getLegalHold() {
return legalHold;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
B2UpdateFileLegalHoldRequest that = (B2UpdateFileLegalHoldRequest) o;
return Objects.equals(getFileName(), that.getFileName()) &&
Objects.equals(getFileId(), that.getFileId()) &&
Objects.equals(getLegalHold(), that.getLegalHold());
}

@Override
public int hashCode() {
return Objects.hash(getFileName(), getFileId(), getLegalHold());
}

public static Builder builder(String fileName,
String fileId,
String legalHold) {
return new Builder(fileName, fileId, legalHold);
}

public static class Builder {
private final String fileName;
private final String fileId;
private final String legalHold;

public Builder(String fileName,
String fileId,
String legalHold) {
this.fileName = fileName;
this.fileId = fileId;
this.legalHold = legalHold;
}

public B2UpdateFileLegalHoldRequest build() {
return new B2UpdateFileLegalHoldRequest(
fileName,
fileId,
legalHold);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright 2021, Backblaze Inc. All Rights Reserved.
* License https://www.backblaze.com/using_b2_code.html
*/
package com.backblaze.b2.client.structures;

import com.backblaze.b2.json.B2Json;

import java.util.Objects;

public class B2UpdateFileLegalHoldResponse {
@B2Json.required
public final String fileName;

@B2Json.required
public final String fileId;

@B2Json.required
public final String legalHold;

@B2Json.constructor(params = "fileName, fileId, legalHold")
public B2UpdateFileLegalHoldResponse(String fileName,
String fileId,
String legalHold) {
this.fileName = fileName;
this.fileId = fileId;
this.legalHold = legalHold;
}

public String getFileName() {
return fileName;
}

public String getFileId() {
return fileId;
}

public String getLegalHold() {
return legalHold;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
B2UpdateFileLegalHoldResponse that = (B2UpdateFileLegalHoldResponse) o;
return Objects.equals(getFileName(), that.getFileName()) &&
Objects.equals(getFileId(), that.getFileId()) &&
Objects.equals(getLegalHold(), that.getLegalHold());
}

@Override
public int hashCode() {
return Objects.hash(getFileName(), getFileId(), getLegalHold());
}

@Override
public String toString() {
return "B2UpdateFileLegalHoldResponse {" +
"fileId='" + fileId + '\'' +
", fileName='" + fileName + '\'' +
", legalHold='" + legalHold + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ private B2UploadFileRequest(String bucketId,

private void validateLegalHold(String legalHold) {
if (legalHold != null) {
B2Preconditions.checkArgument(legalHold.matches(
String.format("(%s|%s)", B2LegalHold.ON, B2LegalHold.OFF)),
String.format("Legal hold can only be set to '%s' or '%s'.", B2LegalHold.ON, B2LegalHold.OFF));
B2Preconditions.checkArgument(
legalHold.equals(B2LegalHold.ON) || legalHold.equals(B2LegalHold.OFF),
String.format("Invalid legalHold value. Valid values: %s, %s", B2LegalHold.ON, B2LegalHold.OFF));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,56 @@
import com.backblaze.b2.client.contentSources.B2ContentSource;
import com.backblaze.b2.client.contentSources.B2ContentTypes;
import com.backblaze.b2.client.exceptions.B2Exception;
import com.backblaze.b2.client.structures.*;
import com.backblaze.b2.json.B2Json;
import com.backblaze.b2.client.structures.B2AccountAuthorization;
import com.backblaze.b2.client.structures.B2AuthorizationFilteredResponseField;
import com.backblaze.b2.client.structures.B2AuthorizeAccountRequest;
import com.backblaze.b2.client.structures.B2Bucket;
import com.backblaze.b2.client.structures.B2BucketFileLockConfiguration;
import com.backblaze.b2.client.structures.B2BucketServerSideEncryption;
import com.backblaze.b2.client.structures.B2BucketTypes;
import com.backblaze.b2.client.structures.B2CancelLargeFileRequest;
import com.backblaze.b2.client.structures.B2CancelLargeFileResponse;
import com.backblaze.b2.client.structures.B2CopyFileRequest;
import com.backblaze.b2.client.structures.B2CreateBucketRequest;
import com.backblaze.b2.client.structures.B2CreateBucketRequestReal;
import com.backblaze.b2.client.structures.B2DeleteBucketRequest;
import com.backblaze.b2.client.structures.B2DeleteBucketRequestReal;
import com.backblaze.b2.client.structures.B2DeleteFileVersionRequest;
import com.backblaze.b2.client.structures.B2DeleteFileVersionResponse;
import com.backblaze.b2.client.structures.B2DownloadAuthorization;
import com.backblaze.b2.client.structures.B2DownloadByIdRequest;
import com.backblaze.b2.client.structures.B2DownloadByNameRequest;
import com.backblaze.b2.client.structures.B2FileVersion;
import com.backblaze.b2.client.structures.B2FinishLargeFileRequest;
import com.backblaze.b2.client.structures.B2GetDownloadAuthorizationRequest;
import com.backblaze.b2.client.structures.B2GetFileInfoByNameRequest;
import com.backblaze.b2.client.structures.B2GetFileInfoRequest;
import com.backblaze.b2.client.structures.B2GetUploadPartUrlRequest;
import com.backblaze.b2.client.structures.B2GetUploadUrlRequest;
import com.backblaze.b2.client.structures.B2HideFileRequest;
import com.backblaze.b2.client.structures.B2LegalHold;
import com.backblaze.b2.client.structures.B2LifecycleRule;
import com.backblaze.b2.client.structures.B2ListBucketsRequest;
import com.backblaze.b2.client.structures.B2ListBucketsResponse;
import com.backblaze.b2.client.structures.B2ListFileNamesRequest;
import com.backblaze.b2.client.structures.B2ListFileNamesResponse;
import com.backblaze.b2.client.structures.B2ListFileVersionsRequest;
import com.backblaze.b2.client.structures.B2ListFileVersionsResponse;
import com.backblaze.b2.client.structures.B2ListPartsRequest;
import com.backblaze.b2.client.structures.B2ListPartsResponse;
import com.backblaze.b2.client.structures.B2ListUnfinishedLargeFilesRequest;
import com.backblaze.b2.client.structures.B2ListUnfinishedLargeFilesResponse;
import com.backblaze.b2.client.structures.B2Part;
import com.backblaze.b2.client.structures.B2StartLargeFileRequest;
import com.backblaze.b2.client.structures.B2UpdateBucketRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldRequest;
import com.backblaze.b2.client.structures.B2UpdateFileLegalHoldResponse;
import com.backblaze.b2.client.structures.B2UploadFileRequest;
import com.backblaze.b2.client.structures.B2UploadListener;
import com.backblaze.b2.client.structures.B2UploadPartRequest;
import com.backblaze.b2.client.structures.B2UploadPartUrlResponse;
import com.backblaze.b2.client.structures.B2UploadProgress;
import com.backblaze.b2.client.structures.B2UploadUrlResponse;
import com.backblaze.b2.util.B2BaseTest;
import com.backblaze.b2.util.B2ByteRange;
import com.backblaze.b2.util.B2Clock;
Expand Down Expand Up @@ -48,7 +96,7 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
Expand Down Expand Up @@ -999,6 +1047,21 @@ public void testFinishLargeFile() throws B2Exception {
verify(webifier, times(1)).finishLargeFile(anyObject(), anyObject());
}

@Test
public void testUpdateFileLegalHold() throws B2Exception {
final B2UpdateFileLegalHoldRequest request = B2UpdateFileLegalHoldRequest
.builder(fileName(1), fileId(1), B2LegalHold.ON)
.build();
final B2UpdateFileLegalHoldResponse response =
new B2UpdateFileLegalHoldResponse(fileName(1), fileId(1), B2LegalHold.ON);
when(webifier.updateFileLegalHold(any(), eq(request))).thenReturn(response);

assertSame(response, client.updateFileLegalHold(request));

verify(webifier, times(1)).authorizeAccount(any());
verify(webifier, times(1)).updateFileLegalHold(any(), eq(request));
}

@Test
public void testClose() {
final B2AccountAuthorizer authorizer = mock(B2AccountAuthorizer.class);
Expand Down
Loading

0 comments on commit a8eda75

Please sign in to comment.