Skip to content

Commit 1b8a70d

Browse files
authored
Merge pull request #134 from zzq996/master
Version 3.23.5
2 parents 2a31fb9 + 7553933 commit 1b8a70d

18 files changed

+437
-8
lines changed

README-Android.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Version 3.23.5
2+
New features:
3+
1. Allow you put Object in two Buckets by calling putObjectInTwoBucket
4+
2. Allow you query statistics on the capacity of standard, warm and cold objects in bucket
5+
-----------------------------------------------------------------------------------
16
Version 3.23.3
27
New features:
38
1. Allow you to query the progress of crr

README-Java.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Version 3.23.5
2+
New features:
3+
1. Allow you put Object in two Buckets by calling putObjectInTwoBucket
4+
2. Allow you query statistics on the capacity of standard, warm and cold objects in bucket
5+
-----------------------------------------------------------------------------------
16
Version 3.23.3
27
New features:
38
1. Allow you to query the progress of crr

README.MD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Version 3.23.5
2+
New features:
3+
1. Allow you put Object in two Buckets by calling putObjectInTwoBucket
4+
2. Allow you query statistics on the capacity of standard, warm and cold objects in bucket
5+
-----------------------------------------------------------------------------------
16
Version 3.23.3
27
New features:
38
1. Allow you to query the progress of crr

README_CN.MD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Version 3.23.5
2+
New features:
3+
1. 新增双写桶能力
4+
2. 支持标准、归档、低频三种桶容量的统计
5+
-----------------------------------------------------------------------------------
16
Version 3.23.3
27
New features:
38
1. 支持crr进度查询

app/src/main/java/com/obs/services/AbstractObjectClient.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import com.obs.services.exception.ObsException;
2222
import com.obs.services.internal.ServiceException;
23+
import com.obs.services.internal.utils.ObjectUtils;
2324
import com.obs.services.internal.utils.ServiceUtils;
2425
import com.obs.services.model.AccessControlList;
2526
import com.obs.services.model.AppendObjectRequest;
@@ -43,6 +44,8 @@
4344
import com.obs.services.model.ObsObject;
4445
import com.obs.services.model.OptionsInfoRequest;
4546
import com.obs.services.model.OptionsInfoResult;
47+
import com.obs.services.model.PutObjectInTwoBucketRequest;
48+
import com.obs.services.model.PutObjectInTwoBucketResult;
4649
import com.obs.services.model.PutObjectRequest;
4750
import com.obs.services.model.PutObjectResult;
4851
import com.obs.services.model.RestoreObjectRequest;
@@ -317,6 +320,55 @@ public PutObjectResult putObject(String bucketName, String objectKey, File file,
317320
request.setMetadata(metadata);
318321
return this.putObject(request);
319322
}
323+
324+
@Override
325+
public PutObjectInTwoBucketResult putObjectInTwoBucket(PutObjectInTwoBucketRequest request)
326+
throws ObsException {
327+
ServiceUtils.assertParameterNotNull(request, "PutObjectInTwoBucketRequest is null");
328+
ServiceUtils.assertParameterNotNull(request.getMainBucketRequest(), "mainBucketRequest is null");
329+
ServiceUtils.assertParameterNotNull(request.getBackupBucketRequest(), "backupBucketRequest is null");
330+
ServiceUtils.assertParameterNotNull2(request.getBackupBucketRequest().getBucketName(), "backupBucketName is null");
331+
ServiceUtils.assertParameterNotNull2(request.getMainBucketRequest().getBucketName(), "mainBucketName is null");
332+
ServiceUtils.assertParameterNotNull2(request.getBackupBucketRequest().getObjectKey(), "backupObjectKey is null");
333+
ServiceUtils.assertParameterNotNull2(request.getMainBucketRequest().getObjectKey(), "mainObjectKey is null");
334+
String path = request.getFilePath();
335+
if (ObjectUtils.isNotBlank(path)) {
336+
File file = new File(path);
337+
if (file.exists()) {
338+
PutObjectRequest mainBucketRequest = request.getMainBucketRequest();
339+
mainBucketRequest.setFile(file);
340+
request.setMainBucketRequest(mainBucketRequest);
341+
PutObjectRequest backupBucketRequest = request.getBackupBucketRequest();
342+
backupBucketRequest.setFile(file);
343+
request.setBackupBucketRequest(backupBucketRequest);
344+
}
345+
}
346+
return this.doActionWithResult("putObjectInTwoBucket", "All Buckets",
347+
new ActionCallbackWithResult<PutObjectInTwoBucketResult>() {
348+
@Override
349+
public PutObjectInTwoBucketResult action() throws ServiceException {
350+
if (null != request.getMainBucketRequest().getInput()
351+
&& null != request.getMainBucketRequest().getFile()) {
352+
throw new ServiceException("Both input and file are set, only one is allowed in main bucket request.");
353+
}
354+
if (null != request.getBackupBucketRequest().getInput()
355+
&& null != request.getBackupBucketRequest().getFile()) {
356+
throw new ServiceException("Both input and file are set, only one is allowed in backup bucket request.");
357+
}
358+
return AbstractObjectClient.this.putObjectInTwoBucketImpl(request);
359+
}
360+
361+
@Override
362+
void authTypeNegotiate(String bucketName) throws ServiceException {
363+
AuthTypeEnum authTypeEnum = AbstractObjectClient.this.getProviderCredentials()
364+
.getLocalAuthType().get(bucketName);
365+
if (authTypeEnum == null) {
366+
authTypeEnum = AbstractObjectClient.this.getApiVersion("");
367+
AbstractObjectClient.this.getProviderCredentials().setLocalAuthType(bucketName, authTypeEnum);
368+
}
369+
}
370+
});
371+
}
320372

321373
/*
322374
* (non-Javadoc)

app/src/main/java/com/obs/services/IObsClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
import com.obs.services.model.ObsObject;
8080
import com.obs.services.model.PostSignatureRequest;
8181
import com.obs.services.model.PostSignatureResponse;
82+
import com.obs.services.model.PutObjectInTwoBucketRequest;
83+
import com.obs.services.model.PutObjectInTwoBucketResult;
8284
import com.obs.services.model.PutObjectRequest;
8385
import com.obs.services.model.PutObjectResult;
8486
import com.obs.services.model.PutObjectsRequest;
@@ -1652,6 +1654,8 @@ PutObjectResult putObject(String bucketName, String objectKey, InputStream input
16521654
PutObjectResult putObject(String bucketName, String objectKey, File file, ObjectMetadata metadata)
16531655
throws ObsException;
16541656

1657+
PutObjectInTwoBucketResult putObjectInTwoBucket(final PutObjectInTwoBucketRequest request) throws ObsException;
1658+
16551659
/**
16561660
* Perform an appendable upload.
16571661
*

app/src/main/java/com/obs/services/internal/handler/XmlResponsesSaxParser.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,34 @@ public void endElement(String name, String content) {
24702470
storageInfo.setSize(Long.parseLong(content));
24712471
} else if (name.equals("ObjectNumber")) {
24722472
storageInfo.setObjectNumber(Long.parseLong(content));
2473+
} else if (name.equals("StandardSize")) {
2474+
storageInfo.setStandardSize(Long.parseLong(content));
2475+
} else if (name.equals("StandardObjectNumber")) {
2476+
storageInfo.setStandardObjectNumber(Long.parseLong(content));
2477+
} else if (name.equals("WarmSize")) {
2478+
storageInfo.setWarmSize(Long.parseLong(content));
2479+
} else if (name.equals("WarmObjectNumber")) {
2480+
storageInfo.setWarmObjectNumber(Long.parseLong(content));
2481+
} else if (name.equals("ColdSize")) {
2482+
storageInfo.setColdSize(Long.parseLong(content));
2483+
} else if (name.equals("ColdObjectNumber")) {
2484+
storageInfo.setColdObjectNumber(Long.parseLong(content));
2485+
} else if (name.equals("DeepArchiveSize")) {
2486+
storageInfo.setDeepArchiveSize(Long.parseLong(content));
2487+
} else if (name.equals("DeepArchiveObjectNumber")) {
2488+
storageInfo.setDeepArchiveObjectNumber(Long.parseLong(content));
2489+
} else if (name.equals("HighPerformanceSize")) {
2490+
storageInfo.setHighPerformanceSize(Long.parseLong(content));
2491+
} else if (name.equals("HighPerformanceObjectNumber")) {
2492+
storageInfo.setHighPerformanceObjectNumber(Long.parseLong(content));
2493+
} else if (name.equals("Standard_IASize")) {
2494+
storageInfo.setStandard_IASize(Long.parseLong(content));
2495+
} else if (name.equals("Standard_IAObjectNumber")) {
2496+
storageInfo.setStandard_IAObjectNumber(Long.parseLong(content));
2497+
} else if (name.equals("GlacierSize")) {
2498+
storageInfo.setGlacierSize(Long.parseLong(content));
2499+
} else if (name.equals("GlacierObjectNumber")) {
2500+
storageInfo.setGlacierObjectNumber(Long.parseLong(content));
24732501
}
24742502
}
24752503
}

app/src/main/java/com/obs/services/internal/service/ObsObjectBaseService.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.obs.log.ILogger;
1919
import com.obs.log.LoggerBuilder;
20+
import com.obs.services.exception.ObsException;
2021
import com.obs.services.internal.Constants;
2122
import com.obs.services.internal.Constants.CommonHeaders;
2223
import com.obs.services.internal.Constants.ObsRequestParams;
@@ -45,7 +46,10 @@
4546
import com.obs.services.model.HttpMethodEnum;
4647
import com.obs.services.model.ObjectMetadata;
4748
import com.obs.services.model.ObsObject;
49+
import com.obs.services.model.PutObjectInTwoBucketRequest;
50+
import com.obs.services.model.PutObjectInTwoBucketResult;
4851
import com.obs.services.model.PutObjectRequest;
52+
import com.obs.services.model.PutObjectResult;
4953
import com.obs.services.model.SetObjectAclRequest;
5054
import com.obs.services.model.SetObjectMetadataRequest;
5155
import com.obs.services.model.SpecialParamEnum;
@@ -68,6 +72,10 @@
6872
import java.util.Date;
6973
import java.util.HashMap;
7074
import java.util.Map;
75+
import java.util.concurrent.ExecutorService;
76+
import java.util.concurrent.Executors;
77+
import java.util.concurrent.Future;
78+
import java.util.concurrent.TimeUnit;
7179

7280
public abstract class ObsObjectBaseService extends ObsBucketAdvanceService {
7381
private static final ILogger log = LoggerBuilder.getLogger(ObsObjectBaseService.class);
@@ -137,6 +145,51 @@ protected ObsFSFile putObjectImpl(PutObjectRequest request) throws ServiceExcept
137145
return ret;
138146
}
139147

148+
protected PutObjectInTwoBucketResult putObjectInTwoBucketImpl(PutObjectInTwoBucketRequest request) throws ObsException {
149+
ExecutorService executorService = Executors.newFixedThreadPool(2);
150+
PutObjectInTwoBucketResult putObjectInTwoBucketResult;
151+
try {
152+
Future<PutObjectInTwoBucketResult> futureMainBucket = executorService.submit(() -> {
153+
PutObjectInTwoBucketResult result = new PutObjectInTwoBucketResult();
154+
try {
155+
PutObjectResult putObjectResult = this.putObjectImpl(request.getMainBucketRequest());
156+
result.setMainBucketResult(putObjectResult);
157+
} catch (ServiceException e) {
158+
result.setMainBucketException(ServiceUtils.changeFromServiceException(e));
159+
} catch (Exception e) {
160+
result.setMainBucketException(ServiceUtils.changeFromException(e));
161+
}
162+
return result;
163+
});
164+
165+
Future<PutObjectInTwoBucketResult> futureBackupBucket = executorService.submit(() -> {
166+
PutObjectInTwoBucketResult result = new PutObjectInTwoBucketResult();
167+
try {
168+
PutObjectResult putObjectResult = this.putObjectImpl(request.getBackupBucketRequest());
169+
result.setBackupBucketResult(putObjectResult);
170+
} catch (ServiceException e) {
171+
result.setBackupBucketException(ServiceUtils.changeFromServiceException(e));
172+
} catch (Exception e) {
173+
result.setBackupBucketException(ServiceUtils.changeFromException(e));
174+
}
175+
return result;
176+
});
177+
178+
executorService.shutdown();
179+
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
180+
181+
putObjectInTwoBucketResult = futureMainBucket.get();
182+
PutObjectInTwoBucketResult backupBucketResult = futureBackupBucket.get();
183+
putObjectInTwoBucketResult.setBackupBucketResult(backupBucketResult.getBackupBucketResult());
184+
putObjectInTwoBucketResult.setBackupBucketException(backupBucketResult.getBackupBucketException());
185+
} catch (ServiceException e) {
186+
throw ServiceUtils.changeFromServiceException(e);
187+
} catch (Exception e) {
188+
throw ServiceUtils.changeFromException(e);
189+
}
190+
return putObjectInTwoBucketResult;
191+
}
192+
140193
protected ObsObject getObjectImpl(GetObjectRequest request) throws ServiceException {
141194
return (ObsObject) this.getObjectImpl((GetObjectMetadataRequest) request);
142195
}

app/src/main/java/com/obs/services/internal/utils/ObjectUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ public static boolean isEquals(Object obj1, Object obj2) {
2626
return obj1.equals(obj2);
2727
}
2828
}
29+
30+
public static boolean isNotBlank(String str) {
31+
return str != null && str.length() > 0;
32+
}
2933
}

app/src/main/java/com/obs/services/internal/utils/V4Authentication.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737

3838
public class V4Authentication {
3939

40-
public static final String CONTENT_SHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
40+
public static final String CONTENT_SHA256 = PropertyManager.getInstance(Constants.PROPERTY_NAME_OBS)
41+
.getFormattedString("content.sha256");
4142

4243
private String ak;
4344

0 commit comments

Comments
 (0)