Skip to content

add seal append object #561

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/main/java/com/aliyun/oss/OSS.java
Original file line number Diff line number Diff line change
Expand Up @@ -5685,4 +5685,22 @@ public UdfApplicationLog getUdfApplicationLog(GetUdfApplicationLogRequest getUdf
*/
public ListAccessPointsResult listBucketAccessPoints(ListBucketAccessPointsRequest listBucketAccessPointsRequest) throws OSSException, ClientException;

/**
* Used to stop an Object of the type Appendable Object from further writing.
*
* @param bucketName
* Bucket name.
* @param key
* Object key.
*
* @return A {@link VoidResult} instance wrapped void return and
* contains some basic response options, such as requestId.
*
* @throws OSSException
* If any errors occurred in OSS while processing the request.
* @throws ClientException
* If any errors are encountered in the client while making the
* request or handling the response.
*/
public VoidResult sealAppendObject(String bucketName, String key) throws OSSException, ClientException;
}
5 changes: 5 additions & 0 deletions src/main/java/com/aliyun/oss/OSSClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -2162,6 +2162,11 @@ public ListAccessPointsResult listBucketAccessPoints(ListBucketAccessPointsReque
return bucketOperation.listBucketAccessPoints(listBucketAccessPointsRequest);
}

@Override
public VoidResult sealAppendObject(String bucketName, String key) throws OSSException, ClientException {
return this.objectOperation.sealAppendObject(new GenericRequest(bucketName, key));
}

@Override
public void shutdown() {
try {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/aliyun/oss/common/utils/HttpHeaders.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,5 @@ public interface HttpHeaders {
public static final String RANGE = "Range";
public static final String LOCATION = "Location";
public static final String CONNECTION = "Connection";

public static final String SEALED_TIME = "x-oss-sealed-time";
}
31 changes: 31 additions & 0 deletions src/main/java/com/aliyun/oss/internal/OSSObjectOperation.java
Original file line number Diff line number Diff line change
Expand Up @@ -1450,6 +1450,37 @@ public String calculatePostSignature(String postPolicy, Date date) throws Client
}
}

/**
* seal append object.
*/
public VoidResult sealAppendObject(GenericRequest genericRequest) throws OSSException, ClientException {

assertParameterNotNull(genericRequest, "genericRequest");

String bucketName = genericRequest.getBucketName();
String key = genericRequest.getKey();

assertParameterNotNull(bucketName, "bucketName");
ensureBucketNameValid(bucketName);
assertParameterNotNull(key, "key");
ensureObjectKeyValid(key);

Map<String, String> headers = new HashMap<String, String>();
populateRequestPayerHeader(headers, genericRequest.getRequestPayer());

Map<String, String> params = new HashMap<String, String>();
params.put(SEAL, null);

RequestMessage request = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint(genericRequest))
.setMethod(HttpMethod.POST).setBucket(bucketName).setKey(key).setHeaders(headers).setParameters(params)
.setInputStream(new ByteArrayInputStream(new byte[0])).setInputSize(0)
.setOriginalRequest(genericRequest)
.build();

return doOperation(request, requestIdResponseParser, bucketName, key, true);
}


private static void addHeaderIfNotNull(Map<String, String> headers, String header, String value) {
if (value != null) {
headers.put(header, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ public final class RequestParameters {
public static final String COMP_QUERY = "query";
public static final String META_QUERY = "metaQuery";
public static final String MODE = "mode";
public static final String SEAL = "seal";

public static final String STAT = "stat";
public static final String HISTORY = "history";
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/com/aliyun/oss/model/ObjectMetadata.java
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,23 @@ public boolean isRestoreCompleted() {
}
return true;
}

/**
* Gets the {@link Date} value of the "x-oss-sealed-time" header in Rfc822 format. If
* sealed time is not set, then the value is null.
*
* @return sealed time header's value in Rfc822.
* @throws ParseException
* The value is not in the Rfc822 format.
*/
public Date getSealedTime() throws ParseException {
String sealedTime = (String) metadata.get(OSSHeaders.SEALED_TIME);

if (sealedTime != null)
return DateUtil.parseRfc822Date((String) metadata.get(OSSHeaders.SEALED_TIME));

return null;
}

public void setObjectTagging(Map<String, String> tags) {
if (tags != null && !tags.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.aliyun.oss.integrationtests;

import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.utils.DateUtil;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import junit.framework.Assert;
import org.junit.Test;
import java.io.InputStream;
import static com.aliyun.oss.integrationtests.TestUtils.genFixedLengthInputStream;

public class SealAppendObjectTest extends TestBase {

@Test
public void testSealAppendObject() {
String key = "seal-append-object.txt";
final long instreamLength = 128 * 1024;

try {
InputStream instream = genFixedLengthInputStream(instreamLength);
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, key, instream, null);
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);

// get object
OSSObject o = ossClient.getObject(bucketName, key);
Assert.assertEquals(key, o.getKey());
Assert.assertEquals(instreamLength, o.getObjectMetadata().getContentLength());
Assert.assertEquals(APPENDABLE_OBJECT_TYPE, o.getObjectMetadata().getObjectType());

Assert.assertEquals(appendObjectResult.getRequestId().length(), REQUEST_ID_LEN);
Assert.assertEquals(o.getRequestId().length(), REQUEST_ID_LEN);
Assert.assertNull(o.getResponse().getHeaders().get("x-oss-sealed-time"));
Assert.assertNull(o.getObjectMetadata().getSealedTime());

// head object
ObjectMetadata metadata = ossClient.headObject(bucketName, key);
Assert.assertNull(metadata.getSealedTime());
Assert.assertNull(metadata.getRawMetadata().get(OSSHeaders.SEALED_TIME));

// seal append object
try {
ossClient.sealAppendObject(bucketName, key);

// get object
OSSObject obj = ossClient.getObject(bucketName, key);
Assert.assertEquals(key, obj.getKey());
Assert.assertEquals(instreamLength, obj.getObjectMetadata().getContentLength());
Assert.assertEquals(APPENDABLE_OBJECT_TYPE, obj.getObjectMetadata().getObjectType());

Assert.assertEquals(appendObjectResult.getRequestId().length(), REQUEST_ID_LEN);
Assert.assertEquals(obj.getRequestId().length(), REQUEST_ID_LEN);
Assert.assertNotNull(obj.getResponse().getHeaders().get("x-oss-sealed-time"));
Assert.assertNotNull(obj.getObjectMetadata().getSealedTime());
Assert.assertEquals(obj.getObjectMetadata().getSealedTime(), DateUtil.parseRfc822Date(obj.getResponse().getHeaders().get("x-oss-sealed-time")));

// head object
ObjectMetadata metadata2 = ossClient.headObject(bucketName, key);
Assert.assertNotNull(metadata2.getSealedTime());
Assert.assertNotNull(metadata2.getRawMetadata().get(OSSHeaders.SEALED_TIME));
Assert.assertEquals(metadata2.getSealedTime(), DateUtil.parseRfc822Date(metadata2.getRawMetadata().get(OSSHeaders.SEALED_TIME).toString()));

} catch (OSSException ex) {
Assert.assertEquals("MethodNotAllowed", ex.getErrorCode());
}
} catch (Exception ex) {
Assert.fail(ex.getMessage());
}
}
}