Skip to content

Commit e1d51e9

Browse files
committed
release 0.0.7-beta source code for java
1 parent 7fe0396 commit e1d51e9

File tree

76 files changed

+3450
-436
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+3450
-436
lines changed

CHANGELOG.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,92 @@
1+
# 0.0.7-beta 2023-06-16
2+
3+
### G42Cloud SDK CCE
4+
5+
- _Features_
6+
- None
7+
- _Bug Fix_
8+
- None
9+
- _Change_
10+
- **ShowNode**
11+
- changes of response param
12+
- `+ status.lastProbeTime`
13+
- **UpdateNode**
14+
- changes of response param
15+
- `+ status.lastProbeTime`
16+
- **DeleteNode**
17+
- changes of response param
18+
- `+ status.lastProbeTime`
19+
- **CreateNode**
20+
- changes of response param
21+
- `+ status.lastProbeTime`
22+
- **ListNodes**
23+
- changes of response param
24+
- `+ items.status.lastProbeTime`
25+
26+
### G42Cloud SDK CSE
27+
28+
- _Features_
29+
- None
30+
- _Bug Fix_
31+
- None
32+
- _Change_
33+
- **DownloadKie**
34+
- changes of response param
35+
- `+ data.id`
36+
- **CreateEngine**
37+
- changes of response param
38+
- `+ jobId`
39+
- `- job_id`
40+
- **DeleteEngine**
41+
- changes of response param
42+
- `+ jobId`
43+
- `- job_id`
44+
45+
### G42Cloud SDK ECS
46+
47+
- _Features_
48+
- None
49+
- _Bug Fix_
50+
- None
51+
- _Change_
52+
- **CreateServers**
53+
- changes of request param
54+
- `+ server.data_volumes.delete_on_termination`
55+
- **CreatePostPaidServers**
56+
- changes of request param
57+
- `+ server.data_volumes.delete_on_termination`
58+
59+
### G42Cloud SDK SMN
60+
61+
- _Features_
62+
- Support the following interfaces:
63+
- `UpdateSubscription`
64+
- `ListLogtank`
65+
- `CreateLogtank`
66+
- `UpdateLogtank`
67+
- `DeleteLogtank`
68+
- _Bug Fix_
69+
- None
70+
- _Change_
71+
- **ListTopicDetails**
72+
- changes of response param
73+
- `+ topic_id`
74+
- **ListTopics**
75+
- changes of request param
76+
- `+ topic_id`
77+
- changes of response param
78+
- `+ topics.topic_id`
79+
- **ListTopicAttributes**
80+
- changes of response param
81+
- `+ attributes.access_policy`
82+
- `+ attributes.introduction`
83+
- `- attributes.Version`
84+
- `- attributes.Id`
85+
- `- attributes.Statement`
86+
- **AddSubscription**
87+
- changes of request param
88+
- `+ extension`
89+
190
# 0.0.6-beta 2023-05-12
291

392
### G42Cloud SDK CBR

core/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
<parent>
77
<groupId>io.github.g42cloud-sdk</groupId>
8-
<version>0.0.6-beta</version>
8+
<version>0.0.7-beta</version>
99
<artifactId>g42cloud-sdk</artifactId>
1010
</parent>
1111

1212
<modelVersion>4.0.0</modelVersion>
1313
<packaging>jar</packaging>
1414
<artifactId>g42cloud-sdk-core</artifactId>
15-
<version>0.0.6-beta</version>
15+
<version>0.0.7-beta</version>
1616
<name>G42 Cloud SDK for Java Core</name>
1717
<description>Core library for G42 Cloud Java SDK</description>
1818
<url>https://github.com/g42cloud-sdk/g42cloud-sdk-java</url>

core/src/main/java/com/g42cloud/sdk/core/Constants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ public final class Constants {
7171

7272
public static final String ISO_8601_BASIC_FORMAT = "yyyyMMdd'T'HHmmss'Z'";
7373

74+
public static final int DEFAULT_CHUNK_SIZE = 4096;
75+
76+
public static final int DEFAULT_WRITE_BUFFER_STREAM = 8192;
77+
78+
public static final int DEFAULT_READ_BUFFER_STREAM = 8192;
79+
80+
public static final long DEFAULT_PROGRESS_INTERVAL = 100 * 1024L;
81+
7482
/**
7583
* Supported media type
7684
*/

core/src/main/java/com/g42cloud/sdk/core/HcClient.java

Lines changed: 82 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,18 @@
3939
import com.g42cloud.sdk.core.http.LocationType;
4040
import com.g42cloud.sdk.core.http.SdkFormDataBody;
4141
import com.g42cloud.sdk.core.impl.DefaultHttpClient;
42+
import com.g42cloud.sdk.core.progress.ProgressInputStream;
43+
import com.g42cloud.sdk.core.progress.ProgressRequest;
44+
import com.g42cloud.sdk.core.progress.SimpleProgressManager;
4245
import com.g42cloud.sdk.core.utils.CastUtils;
4346
import com.g42cloud.sdk.core.utils.ExceptionUtils;
47+
import com.g42cloud.sdk.core.utils.HttpUtils;
4448
import com.g42cloud.sdk.core.utils.JsonUtils;
4549
import com.g42cloud.sdk.core.utils.StringUtils;
4650
import org.slf4j.Logger;
4751
import org.slf4j.LoggerFactory;
4852

53+
import java.io.BufferedInputStream;
4954
import java.net.MalformedURLException;
5055
import java.net.URL;
5156
import java.time.OffsetDateTime;
@@ -185,7 +190,7 @@ public <ReqT, ResT> ResT syncInvokeHttp(ReqT request, HttpRequestDef<ReqT, ResT>
185190
}
186191
printAccessLog(httpRequest, httpResponse, exchange);
187192
handleException(httpRequest, httpResponse);
188-
return extractResponse(httpResponse, reqDef);
193+
return extractResponse(httpRequest, httpResponse, reqDef);
189194
} finally {
190195
SdkExchangeCache.removeExchange(exchangeId);
191196
}
@@ -233,7 +238,7 @@ public <ReqT, ResT> CompletableFuture<ResT> asyncInvokeHttp(ReqT request, HttpRe
233238
return httpClient.asyncInvokeHttp(validHttpRequest).thenApplyAsync(httpResponse -> {
234239
printAccessLog(finalValidHttpRequest, httpResponse, exchange);
235240
handleException(finalValidHttpRequest, httpResponse);
236-
return extractResponse(httpResponse, reqDef);
241+
return extractResponse(finalValidHttpRequest, httpResponse, reqDef);
237242
}, httpConfig.getExecutorService()).whenCompleteAsync((r, e) ->
238243
SdkExchangeCache.removeExchange(exchangeIdRef.get()), httpConfig.getExecutorService());
239244
}, httpConfig.getExecutorService());
@@ -285,9 +290,15 @@ protected <ReqT, ResT> HttpRequest buildRequest(ReqT request, HttpRequestDef<Req
285290
}
286291
}
287292

288-
// upload
289-
if (request instanceof SdkStreamRequest) {
290-
httpRequestBuilder.withBody(((SdkStreamRequest) request).extractBody());
293+
// handle upload/download progress
294+
if (request instanceof ProgressRequest) {
295+
ProgressRequest progressRequest = (ProgressRequest) request;
296+
httpRequestBuilder.withProgressListener((progressRequest.getProgressListener()))
297+
.withProgressInterval(progressRequest.getProgressInterval() > 0 ?
298+
progressRequest.getProgressInterval() : Constants.DEFAULT_PROGRESS_INTERVAL);
299+
if (request instanceof SdkStreamRequest) {
300+
httpRequestBuilder.withBody(((SdkStreamRequest) request).extractBody());
301+
}
291302
}
292303

293304
httpRequestBuilder.addHeader(Constants.USER_AGENT, "g42cloud-usdk-java/3.0");
@@ -311,12 +322,13 @@ private void buildRequestBody(HttpRequest.HttpRequestBuilder httpRequestBuilder,
311322
} else if (reqValue instanceof SdkSerializable) {
312323
httpRequestBuilder.withBodyAsString(((SdkSerializable<?>) reqValue).serialize());
313324
} else {
314-
httpRequestBuilder.withBodyAsString(JsonUtils.toJSON(reqValue));
325+
String bodyString = reqValue instanceof String ? (String) reqValue : JsonUtils.toJSON(reqValue);
326+
httpRequestBuilder.withBodyAsString(bodyString);
315327
}
316328
}
317329

318330
private void buildQueryParams(HttpRequest.HttpRequestBuilder httpRequestBuilder, String fieldName,
319-
Object reqValue) {
331+
Object reqValue) {
320332
if (reqValue instanceof Collection) {
321333
httpRequestBuilder.addQueryParam(fieldName, buildCollectionQueryParams(reqValue));
322334
} else if (reqValue instanceof Map) {
@@ -380,52 +392,75 @@ private void handleException(HttpRequest httpRequest, HttpResponse httpResponse)
380392
}
381393
}
382394

383-
private <ReqT, ResT> ResT extractResponse(HttpResponse httpResponse, HttpRequestDef<ReqT, ResT> reqDef) {
384-
int code = httpResponse.getStatusCode();
395+
private <T> T processTextBasedType(HttpResponse httpResponse, HttpRequestDef<?, T> reqDef)
396+
throws InstantiationException, IllegalAccessException {
385397

386-
try {
387-
ResT resT;
388-
String stringResult = httpResponse.getBodyAsString();
389-
String respContentType = httpResponse.getContentType();
390-
391-
if (Objects.nonNull(respContentType)
392-
&& (respContentType.startsWith(Constants.MEDIATYPE.APPLICATION_OCTET_STREAM)
393-
|| respContentType.startsWith(Constants.MEDIATYPE.IMAGE)
394-
|| respContentType.startsWith(Constants.MEDIATYPE.APPLICATION_BSON))) {
395-
resT = reqDef.getResponseType().newInstance();
396-
if (resT instanceof SdkStreamResponse) {
397-
resT = CastUtils.cast(((SdkStreamResponse) resT).parseBody(httpResponse.getBody()));
398-
}
399-
} else {
400-
if (SdkSerializable.class.isAssignableFrom(reqDef.getResponseType())) {
401-
resT = deserializeSerializableResponse(reqDef.getResponseType(), stringResult);
402-
} else if (!reqDef.hasResponseField(Constants.BODY)) {
403-
resT = JsonUtils.toObjectIgnoreUnknown(stringResult, reqDef.getResponseType());
404-
if (Objects.isNull(resT)) {
405-
resT = reqDef.getResponseType().newInstance();
406-
}
398+
T response;
399+
String stringResult = httpResponse.getBodyAsString();
400+
int statusCode = httpResponse.getStatusCode();
401+
if (SdkSerializable.class.isAssignableFrom(reqDef.getResponseType())) {
402+
// Processes the response that implements the SdkSerializable interface
403+
response = deserializeSerializableResponse(reqDef.getResponseType(), stringResult);
404+
} else if (!reqDef.hasResponseField(Constants.BODY)) {
405+
// process response without body
406+
response = JsonUtils.toObjectIgnoreUnknown(stringResult, reqDef.getResponseType());
407+
if (Objects.isNull(response)) {
408+
response = reqDef.getResponseType().newInstance();
409+
}
407410

408-
if (reqDef.hasResponseField(String.valueOf(code))) {
409-
Field<ResT, ?> resTField = reqDef.getResponseField(String.valueOf(code));
410-
resTField.writeValueSafe(resT,
411-
JsonUtils.toObjectIgnoreUnknown(stringResult, resTField.getFieldType()),
412-
resTField.getFieldType());
413-
}
411+
if (reqDef.hasResponseField(String.valueOf(statusCode))) {
412+
Field<T, ?> resTField = reqDef.getResponseField(String.valueOf(statusCode));
413+
resTField.writeValueSafe(response,
414+
JsonUtils.toObjectIgnoreUnknown(stringResult, resTField.getFieldType()),
415+
resTField.getFieldType());
416+
}
414417

415-
} else {
416-
resT = reqDef.getResponseType().newInstance();
417-
Field<ResT, ?> responseField = reqDef.getResponseField(Constants.BODY);
418-
Object obj = responseToObject(stringResult, responseField);
419-
responseField.writeValueSafe(resT, obj, responseField.getFieldType());
418+
} else {
419+
// process response with body[object, map, list, string...]
420+
response = reqDef.getResponseType().newInstance();
421+
Field<T, ?> responseField = reqDef.getResponseField(Constants.BODY);
422+
Object obj = responseToObject(stringResult, responseField);
423+
responseField.writeValueSafe(response, obj, responseField.getFieldType());
424+
425+
if (reqDef.hasResponseField(String.valueOf(statusCode))) {
426+
Field<T, ?> resTField = reqDef.getResponseField(String.valueOf(statusCode));
427+
resTField.writeValueSafe(response, obj, resTField.getFieldType());
428+
}
429+
}
420430

421-
if (reqDef.hasResponseField(String.valueOf(code))) {
422-
Field<ResT, ?> resTField = reqDef.getResponseField(String.valueOf(code));
423-
resTField.writeValueSafe(resT, obj, resTField.getFieldType());
424-
}
425-
}
431+
return response;
432+
}
433+
434+
private <T> T processStreamType(HttpRequest httpRequest, HttpResponse httpResponse, HttpRequestDef<?, T> reqDef)
435+
throws InstantiationException, IllegalAccessException {
436+
437+
T response = reqDef.getResponseType().newInstance();
438+
if (response instanceof SdkStreamResponse) {
439+
if (Objects.nonNull(httpRequest.getProgressListener())) {
440+
SimpleProgressManager progressManager = new SimpleProgressManager(
441+
httpResponse.getContentLength(), 0,
442+
httpRequest.getProgressListener(), httpRequest.getProgressInterval());
443+
((SdkStreamResponse) response).parseBody(new BufferedInputStream(
444+
new ProgressInputStream(httpResponse.getBody(), progressManager),
445+
Constants.DEFAULT_READ_BUFFER_STREAM));
446+
} else if (Objects.nonNull(httpResponse.getContentType())
447+
&& HttpUtils.isBsonContentType(httpResponse.getContentType())) {
448+
response = CastUtils.cast(((SdkStreamResponse) response).parseBody(httpResponse.getBodyAsBytes()));
449+
} else {
450+
response = CastUtils.cast(((SdkStreamResponse) response).parseBody(httpResponse.getBody()));
426451
}
452+
}
453+
454+
return response;
455+
}
456+
457+
private <ReqT, ResT> ResT extractResponse(
458+
HttpRequest httpRequest, HttpResponse httpResponse, HttpRequestDef<ReqT, ResT> reqDef) {
459+
460+
try {
461+
ResT finalResT = HttpUtils.isTextBasedContentType(httpResponse.getContentType()) ?
462+
processTextBasedType(httpResponse, reqDef) : processStreamType(httpRequest, httpResponse, reqDef);
427463

428-
ResT finalResT = resT;
429464
reqDef.getResponseFields().forEach(resTField -> {
430465
if (resTField.getLocation() == LocationType.Header) {
431466
fillHeaderField(httpResponse, finalResT, resTField);

core/src/main/java/com/g42cloud/sdk/core/SdkStreamRequest.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,39 @@
2222
package com.g42cloud.sdk.core;
2323

2424
import com.fasterxml.jackson.annotation.JsonIgnore;
25+
import com.g42cloud.sdk.core.progress.ProgressListener;
26+
import com.g42cloud.sdk.core.progress.ProgressRequest;
2527

2628
import java.io.InputStream;
2729

2830
/**
2931
* @author G42Cloud_SDK
3032
*/
31-
public class SdkStreamRequest implements SdkRequest {
33+
public class SdkStreamRequest implements SdkRequest, ProgressRequest {
34+
35+
private ProgressListener progressListener;
36+
37+
private long progressInterval;
38+
39+
@Override
40+
public void setProgressListener(ProgressListener progressListener) {
41+
this.progressListener = progressListener;
42+
}
43+
44+
@Override
45+
public ProgressListener getProgressListener() {
46+
return progressListener;
47+
}
48+
49+
@Override
50+
public void setProgressInterval(long progressInterval) {
51+
this.progressInterval = progressInterval;
52+
}
53+
54+
@Override
55+
public long getProgressInterval() {
56+
return progressInterval;
57+
}
3258

3359
@JsonIgnore
3460
private InputStream body;

core/src/main/java/com/g42cloud/sdk/core/SdkStreamResponse.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,26 @@ public class SdkStreamResponse extends SdkResponse {
3838

3939
/**
4040
* 解析http响应body,用于content-type是application/bson或application/octet-stream的响应
41+
*
4142
* @param inputStream http response body
4243
*/
4344
public Object parseBody(InputStream inputStream) {
4445
this.body = inputStream;
4546
return this;
4647
}
4748

49+
/**
50+
* 解析http响应body到XXXResponse,XXXResponse是SdkBsonDocResponse的子类,
51+
* 目前只有SdkBsonDocResponse的子类的解析会使用这个函数,即content-type是application/bson的响应。
52+
* 把该函数放在SdkStreamResponse的目的是为了解除core模块对core-bson模块的依赖。
53+
*
54+
* @param buf http response body
55+
* @return object deserialized from buf
56+
*/
57+
public Object parseBody(byte[] buf) {
58+
throw new SdkException("only used in application/bson response");
59+
}
60+
4861
public void consumeDownloadStream(Consumer<InputStream> consumer) {
4962
try (InputStream inputStream = this.body) {
5063
consumer.accept(inputStream);

0 commit comments

Comments
 (0)