Skip to content

Commit 3b7ca77

Browse files
committed
feat: add the decompression support
1 parent 89fa99d commit 3b7ca77

File tree

8 files changed

+542
-0
lines changed

8 files changed

+542
-0
lines changed

src/main/java/com/qcloud/cos/COS.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3060,6 +3060,36 @@ SelectObjectContentResult selectObjectContent(SelectObjectContentRequest selectR
30603060
ImageStyleResponse getImageStyle(ImageStyleRequest request);
30613061

30623062
Boolean deleteImageStyle(ImageStyleRequest request);
3063+
3064+
/**
3065+
*提交一个解压任务
3066+
* @param decompressionRequest 解压请求体
3067+
* @return 解压状态
3068+
*/
3069+
DecompressionResult postObjectDecompression(DecompressionRequest decompressionRequest);
3070+
3071+
3072+
/**
3073+
* 查询解压任务的状态
3074+
* @param bucketName 桶名
3075+
* @param objectKey 对象的key
3076+
* @param jobId 可选参数,可查看指定jobId,也可以填null,则返回最新的解压任务
3077+
* @return 解压状态
3078+
*/
3079+
DecompressionResult getObjectDecompressionStatus(String bucketName, String objectKey, String jobId);
3080+
3081+
/**
3082+
* 列出解压缩任务列表.
3083+
* @param bucketName 桶名称
3084+
* @param jobStatus 支持Running|Success|Failed|Pending等选项进行查询过滤
3085+
* @param sortType 支持asc/dsc两个选项, 分别代表升序和降序
3086+
* @param maxResults 每一页最多列出的项数
3087+
* @param nextToken 可选项,用于翻页
3088+
* @return 解压缩任务列表
3089+
*/
3090+
ListJobsResult listObjectDecompressionJobs(String bucketName, String jobStatus,
3091+
String sortType, int maxResults, String nextToken);
3092+
30633093
}
30643094

30653095

src/main/java/com/qcloud/cos/COSClient.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4439,5 +4439,58 @@ public Boolean deleteImageStyle(ImageStyleRequest imageStyleRequest) {
44394439
return true;
44404440
}
44414441

4442+
public DecompressionResult postObjectDecompression(DecompressionRequest decompressionRequest) {
4443+
rejectNull(decompressionRequest.getSourceBucketName(),
4444+
"The sourceBucketName parameter must be specified post object decompression");
4445+
rejectNull(decompressionRequest,
4446+
"The decompressionRequest parameter must be specified post object decompression");
4447+
rejectNull(decompressionRequest.getTargetBucketName(),
4448+
"The decompressionRequest parameter must be specified post object decompression");
4449+
rejectNull(decompressionRequest.getResourcesPrefix(),
4450+
"The decompressionRequest parameter must be specified post object decompression");
4451+
if (decompressionRequest.getPrefixReplaced()) {
4452+
rejectNull(decompressionRequest.getTargetKeyPrefix(),
4453+
"The targetKeyPrefix parameter must be specified post object decompression "
4454+
+ "when prefixReplaced is true");
4455+
}
4456+
CosHttpRequest<DecompressionRequest> request =
4457+
createRequest(decompressionRequest.getSourceBucketName(),
4458+
decompressionRequest.getObjectKey(), decompressionRequest, HttpMethodName.POST);
4459+
request.addParameter("decompression", null);
4460+
byte[] content = DecompressionRequest.convertToByteArray(decompressionRequest);
4461+
request.addHeader("Content-Length", String.valueOf(content.length));
4462+
request.addHeader("Content-Type", "application/xml");
4463+
request.setContent(new ByteArrayInputStream(content));
4464+
return invoke(request, new COSXmlResponseHandler<>(new Unmarshallers.DecompressionResultUnmarshaller()));
4465+
}
4466+
4467+
@Override
4468+
public DecompressionResult getObjectDecompressionStatus(String bucketName, String objectKey, String jobId) {
4469+
rejectNull(bucketName, "The bucketName parameter must be specified getting object decompression status");
4470+
rejectNull(objectKey, "The objectKey parameter must be specified getting object decompression status");
4471+
CosHttpRequest<CosServiceRequest> request = createRequest(bucketName, objectKey, new CosServiceRequest(), HttpMethodName.GET);
4472+
if (jobId != null) {
4473+
request.addParameter("jobId", jobId);
4474+
}
4475+
request.addParameter("decompression", null);
4476+
return invoke(request, new COSXmlResponseHandler<>(new Unmarshallers.DecompressionResultUnmarshaller()));
4477+
}
4478+
4479+
@Override
4480+
public ListJobsResult listObjectDecompressionJobs(String bucketName, String jobStatus,
4481+
String sortType, int maxResults, String nextToken) {
4482+
rejectNull(bucketName, "The bucketName parameter must be specified list object decompression status");
4483+
rejectNull(jobStatus, "The jobStatus parameter must be specified list object decompression status");
4484+
rejectNull(sortType, "The sortType parameter must be specified list object decompression status");
4485+
CosHttpRequest<CosServiceRequest> request =
4486+
createRequest(bucketName, "/", new CosServiceRequest(), HttpMethodName.GET);
4487+
request.addParameter("decompression", null);
4488+
request.addParameter("jobStatus", jobStatus);
4489+
request.addParameter("sortBy", sortType);
4490+
request.addParameter("maxResults", String.valueOf(maxResults));
4491+
request.addParameter("nextToken", nextToken);
4492+
return invoke(request, new COSXmlResponseHandler<>(new Unmarshallers.ListJobsResultUnmarshaller()));
4493+
}
4494+
44424495
}
44434496

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.qcloud.cos.demo;
2+
3+
import com.qcloud.cos.COSClient;
4+
import com.qcloud.cos.ClientConfig;
5+
import com.qcloud.cos.auth.BasicCOSCredentials;
6+
import com.qcloud.cos.auth.COSCredentials;
7+
import com.qcloud.cos.http.HttpProtocol;
8+
import com.qcloud.cos.model.DecompressionRequest;
9+
import com.qcloud.cos.model.DecompressionResult;
10+
import com.qcloud.cos.model.ListJobsResult;
11+
import com.qcloud.cos.region.Region;
12+
13+
public class DecompressDemo {
14+
15+
private static final String secretId = "";
16+
private static final String secretKey = "";
17+
private static final String bucket = "";
18+
private static final String region = "";
19+
20+
public static DecompressionResult postObjectDecompression() {
21+
COSCredentials cosCredentials = new BasicCOSCredentials(secretId, secretKey);
22+
ClientConfig clientConfig = new ClientConfig(new Region(region));
23+
COSClient cosClient = new COSClient(cosCredentials, clientConfig);
24+
25+
try {
26+
DecompressionRequest decompressionRequest =
27+
new DecompressionRequest()
28+
.setObjectKey("a.tar.gz")
29+
.setSourceBucketName(bucket)
30+
.setTargetBucketName(bucket)
31+
.setPrefixReplaced(true)
32+
.setResourcesPrefix("")
33+
.setTargetKeyPrefix("test_out/");
34+
return cosClient.postObjectDecompression(decompressionRequest);
35+
} finally {
36+
cosClient.shutdown();
37+
}
38+
39+
}
40+
41+
public static DecompressionResult getObjectDecompressionStatus(String objectKey) {
42+
COSCredentials cosCredentials = new BasicCOSCredentials(secretId, secretKey);
43+
ClientConfig clientConfig = new ClientConfig(new Region(region));
44+
clientConfig.setHttpProtocol(HttpProtocol.http);
45+
COSClient cosClient = new COSClient(cosCredentials, clientConfig);
46+
try {
47+
return cosClient.getObjectDecompressionStatus(bucket, objectKey, null);
48+
} finally {
49+
cosClient.shutdown();
50+
}
51+
}
52+
53+
54+
public static void listObjectDecompressionJobs() {
55+
COSCredentials cosCredentials = new BasicCOSCredentials(secretId, secretKey);
56+
ClientConfig clientConfig = new ClientConfig(new Region(region));
57+
clientConfig.setHttpProtocol(HttpProtocol.http);
58+
COSClient cosClient = new COSClient(cosCredentials, clientConfig);
59+
try {
60+
ListJobsResult result =
61+
cosClient.listObjectDecompressionJobs(bucket, "Success", "asc", 1000, null);
62+
System.out.println(result);
63+
} finally {
64+
cosClient.shutdown();
65+
}
66+
}
67+
68+
public static String getPrefix(String objectKey) {
69+
int index = objectKey.lastIndexOf('/');
70+
String parent = "";
71+
if (index != -1) {
72+
parent = objectKey.substring(0, index + 1);
73+
}
74+
return parent;
75+
}
76+
77+
78+
public static void main(String[] args) {
79+
System.out.println(postObjectDecompression());
80+
System.out.println(getObjectDecompressionStatus("a.tar.gz"));
81+
listObjectDecompressionJobs();
82+
}
83+
}

src/main/java/com/qcloud/cos/internal/Unmarshallers.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@
3838
import com.qcloud.cos.model.BucketTaggingConfiguration;
3939
import com.qcloud.cos.model.BucketVersioningConfiguration;
4040
import com.qcloud.cos.model.BucketWebsiteConfiguration;
41+
import com.qcloud.cos.model.DecompressionResult;
4142
import com.qcloud.cos.model.DeleteBucketInventoryConfigurationResult;
4243
import com.qcloud.cos.model.DeleteObjectTaggingResult;
4344
import com.qcloud.cos.model.GetBucketInventoryConfigurationResult;
4445
import com.qcloud.cos.model.GetObjectTaggingResult;
4546
import com.qcloud.cos.model.InitiateMultipartUploadResult;
4647
import com.qcloud.cos.model.ListBucketInventoryConfigurationsResult;
48+
import com.qcloud.cos.model.ListJobsResult;
4749
import com.qcloud.cos.model.MultipartUploadListing;
4850
import com.qcloud.cos.model.ObjectListing;
4951
import com.qcloud.cos.model.ObjectMetadata;
@@ -826,4 +828,21 @@ public ImageStyleResponse unmarshall(InputStream in) throws Exception {
826828
.parseGetImageStyleResponse(in).getResponse();
827829
}
828830
}
831+
832+
public static final class DecompressionResultUnmarshaller
833+
implements Unmarshaller<DecompressionResult, InputStream> {
834+
835+
public DecompressionResult unmarshall(InputStream in) throws Exception {
836+
return new XmlResponsesSaxParser().parseDecompressionResult(in)
837+
.getDecompressionResult();
838+
}
839+
}
840+
841+
public static final class ListJobsResultUnmarshaller
842+
implements Unmarshaller<ListJobsResult, InputStream> {
843+
844+
public ListJobsResult unmarshall(InputStream in) throws Exception {
845+
return new XmlResponsesSaxParser().parseListJobsResult(in).getResult();
846+
}
847+
}
829848
}

src/main/java/com/qcloud/cos/internal/XmlResponsesSaxParser.java

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.io.InputStream;
2525
import java.io.InputStreamReader;
2626
import java.net.URLDecoder;
27+
import java.time.LocalDateTime;
2728
import java.util.ArrayList;
2829
import java.util.Date;
2930
import java.util.LinkedHashMap;
@@ -61,6 +62,7 @@
6162
import com.qcloud.cos.model.COSVersionSummary;
6263
import com.qcloud.cos.model.CompleteMultipartUploadResult;
6364
import com.qcloud.cos.model.CopyObjectResult;
65+
import com.qcloud.cos.model.DecompressionResult;
6466
import com.qcloud.cos.model.DeleteObjectsResult.DeletedObject;
6567
import com.qcloud.cos.model.DomainRule;
6668
import com.qcloud.cos.model.GetBucketInventoryConfigurationResult;
@@ -69,6 +71,7 @@
6971
import com.qcloud.cos.model.GroupGrantee;
7072
import com.qcloud.cos.model.InitiateMultipartUploadResult;
7173
import com.qcloud.cos.model.ListBucketInventoryConfigurationsResult;
74+
import com.qcloud.cos.model.ListJobsResult;
7275
import com.qcloud.cos.model.MultipartUpload;
7376
import com.qcloud.cos.model.MultipartUploadListing;
7477
import com.qcloud.cos.model.ObjectListing;
@@ -893,6 +896,19 @@ public GetImageStyleHandler parseGetImageStyleResponse(InputStream inputStream)
893896
return handler;
894897
}
895898

899+
public DecompressionHandler parseDecompressionResult(InputStream inputStream) throws IOException {
900+
DecompressionHandler handler = new DecompressionHandler();
901+
parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream));
902+
return handler;
903+
}
904+
905+
public ListJobsResultHandler parseListJobsResult(InputStream inputStream) throws IOException {
906+
ListJobsResultHandler handler = new ListJobsResultHandler();
907+
parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream));
908+
return handler;
909+
}
910+
911+
896912
/**
897913
* @param inputStream
898914
*
@@ -6833,5 +6849,96 @@ public void setResponse(ImageAuditingResponse response) {
68336849
}
68346850

68356851
}
6852+
6853+
public static class DecompressionHandler extends AbstractHandler {
6854+
6855+
private final DecompressionResult decompressionResult = new DecompressionResult();
6856+
@Override
6857+
protected void doStartElement(String uri, String name, String qName, Attributes attrs) {
6858+
}
6859+
6860+
@Override
6861+
protected void doEndElement(String uri, String name, String qName) {
6862+
if(in("DecompressionResult")) {
6863+
switch (name) {
6864+
case "JobId":
6865+
decompressionResult.setJobId(getText());
6866+
break;
6867+
case "Status":
6868+
decompressionResult.setStatus(getText());
6869+
break;
6870+
case "Msg":
6871+
decompressionResult.setMsg(getText());
6872+
break;
6873+
}
6874+
}
6875+
}
6876+
6877+
public DecompressionResult getDecompressionResult() {
6878+
return decompressionResult;
6879+
}
6880+
}
6881+
6882+
public static class ListJobsResultHandler extends AbstractHandler {
6883+
6884+
private final ListJobsResult listJobsResult;
6885+
6886+
6887+
private final List<ListJobsResult.DecompressionJob> jobList;
6888+
private ListJobsResult.DecompressionJob job;
6889+
6890+
public ListJobsResultHandler() {
6891+
listJobsResult = new ListJobsResult();
6892+
jobList = new ArrayList<>();
6893+
listJobsResult.setJobs(jobList);
6894+
}
6895+
6896+
@Override
6897+
protected void doStartElement(String uri, String name, String qName, Attributes attrs) {
6898+
if(in("ListJobsResult", "Jobs")) {
6899+
if(name.equals("Job")) {
6900+
job = new ListJobsResult.DecompressionJob();
6901+
}
6902+
}
6903+
}
6904+
6905+
@Override
6906+
protected void doEndElement(String uri, String name, String qName) {
6907+
if(in("ListJobsResult", "Jobs", "Job")) {
6908+
switch (name) {
6909+
case "Key":
6910+
job.setKey(getText());
6911+
break;
6912+
case "DecompressionPrefix":
6913+
job.setDecompressionPrefix(getText());
6914+
break;
6915+
case "CreationTime":
6916+
job.setCreationTime(getText());
6917+
break;
6918+
case "TerminationTime":
6919+
job.setTerminationTime(getText());
6920+
break;
6921+
case "JobId":
6922+
job.setJobId(getText());
6923+
break;
6924+
case "Status":
6925+
job.setStatus(getText());
6926+
break;
6927+
}
6928+
} else if (in("ListJobsResult", "Jobs")) {
6929+
if (name.equals("Job")) {
6930+
jobList.add(job);
6931+
}
6932+
} else if (in("ListJobsResult")) {
6933+
if (name.equals("NextToken")) {
6934+
listJobsResult.setNextToken(getText());
6935+
}
6936+
}
6937+
}
6938+
6939+
public ListJobsResult getResult() {
6940+
return listJobsResult;
6941+
}
6942+
}
68366943
}
68376944

0 commit comments

Comments
 (0)