Skip to content

Commit ff4c540

Browse files
committed
- remove references to native http type in interfaces
- removes useless method in interface - adds result wrapper for consumers for large file uploads
1 parent 156b6c5 commit ff4c540

File tree

7 files changed

+227
-199
lines changed

7 files changed

+227
-199
lines changed

src/main/java/com/microsoft/graph/http/CoreHttpProvider.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,11 +404,6 @@ private <Result, Body, DeserializeType> Result processResponse(final Response re
404404

405405
// Call being executed
406406

407-
408-
if (handler != null) {
409-
handler.configConnection(response);
410-
}
411-
412407
logger.logDebug(String.format(Locale.ROOT, "Response code %d, %s",
413408
response.code(),
414409
response.message()));

src/main/java/com/microsoft/graph/http/IStatefulResponseHandler.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
import javax.annotation.Nullable;
3030
import javax.annotation.Nonnull;
3131

32-
import okhttp3.Response;
33-
3432
/**
3533
* The handler interface for requests having stateful response from server.
3634
* The handler will custom the HTTP connection if needed and generate request
@@ -40,26 +38,20 @@
4038
* @param <DeserializedType> the deserialize type for serializer
4139
*/
4240
public interface IStatefulResponseHandler<ResultType, DeserializedType> {
43-
/**
44-
* Configure the response
45-
*
46-
* @param response the HTTP response
47-
*/
48-
void configConnection(@Nonnull final Response response);
49-
5041
/**
5142
* Generate result after receiving response
5243
*
5344
* @param request the HTTP request
5445
* @param response the HTTP connection
5546
* @param serializer the serializer for parsing response
5647
* @param logger the logger
48+
* @param <ResponseType> the native http client response type
5749
* @return the result generated by this handler
5850
* @throws Exception an exception occurs if the request was unable to complete for any reason
5951
*/
6052
@Nullable
61-
ResultType generateResult(@Nonnull final IHttpRequest request,
62-
@Nonnull final Response response,
53+
<ResponseType> ResultType generateResult(@Nonnull final IHttpRequest request,
54+
@Nonnull final ResponseType response,
6355
@Nonnull final ISerializer serializer,
6456
@Nonnull final ILogger logger) throws Exception;
6557
}

src/main/java/com/microsoft/graph/tasks/LargeFileUploadRequest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* The chunk upload request.
2222
* @param <UploadType> The upload item type.
2323
*/
24-
public class LargeFileUploadRequest<UploadType> {
24+
class LargeFileUploadRequest<UploadType> {
2525

2626
/**
2727
* Content Range header name.
@@ -41,7 +41,7 @@ public class LargeFileUploadRequest<UploadType> {
4141
/**
4242
* The base request.
4343
*/
44-
private final BaseRequest<LargeFileUploadResult<UploadType>> baseRequest;
44+
private final BaseRequest<LargeFileUploadResponse<UploadType>> baseRequest;
4545

4646
/**
4747
* Construct the ChunkedUploadRequest
@@ -67,7 +67,7 @@ protected LargeFileUploadRequest(@Nonnull final String requestUrl,
6767
Objects.requireNonNull(chunk, "parameter chunk cannot be null");
6868
this.data = new byte[chunkSize];
6969
System.arraycopy(chunk, 0, this.data, 0, chunkSize);
70-
this.baseRequest = new BaseRequest<LargeFileUploadResult<UploadType>>(requestUrl, client, options, (Class<? extends LargeFileUploadResult<UploadType>>)(new LargeFileUploadResult<>((UploadType)null)).getClass()) {
70+
this.baseRequest = new BaseRequest<LargeFileUploadResponse<UploadType>>(requestUrl, client, options, (Class<? extends LargeFileUploadResponse<UploadType>>)(new LargeFileUploadResponse<>((UploadType)null)).getClass()) {
7171
};
7272
this.baseRequest.setHttpMethod(HttpMethod.PUT);
7373
this.baseRequest.addHeader(CONTENT_RANGE_HEADER_NAME,
@@ -86,24 +86,24 @@ protected LargeFileUploadRequest(@Nonnull final String requestUrl,
8686
*/
8787
@SuppressWarnings("unchecked")
8888
@Nonnull
89-
public LargeFileUploadResult<UploadType> upload(
89+
public LargeFileUploadResponse<UploadType> upload(
9090
@Nonnull final LargeFileUploadResponseHandler<UploadType> responseHandler) {
9191
Objects.requireNonNull(responseHandler, "parameter responseHandler cannot be null");
92-
LargeFileUploadResult<UploadType> result = null;
92+
LargeFileUploadResponse<UploadType> result = null;
9393

9494
try {
9595
result = this.baseRequest
9696
.getClient()
9797
.getHttpProvider()
98-
.send(baseRequest, (Class<LargeFileUploadResult<UploadType>>)(Class<?>) LargeFileUploadResult.class, this.data, responseHandler);
98+
.send(baseRequest, (Class<LargeFileUploadResponse<UploadType>>)(Class<?>) LargeFileUploadResponse.class, this.data, responseHandler);
9999
} catch (final ClientException e) {
100100
throw new ClientException("Request failed with error, retry if necessary.", e);
101101
}
102102

103103
if (result != null && result.chunkCompleted()) {
104104
return result;
105105
} else
106-
return new LargeFileUploadResult<UploadType>(
106+
return new LargeFileUploadResponse<UploadType>(
107107
new ClientException("Upload session failed.", result == null ? null : result.getError()));
108108
}
109109
}
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
// ------------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information.
3+
// ------------------------------------------------------------------------------
4+
5+
package com.microsoft.graph.tasks;
6+
7+
import com.microsoft.graph.core.ClientException;
8+
import com.microsoft.graph.http.GraphServiceException;
9+
10+
import javax.annotation.Nullable;
11+
12+
import java.util.Objects;
13+
14+
import javax.annotation.Nonnull;
15+
16+
/**
17+
* Wrapper class for different upload response from server.
18+
*/
19+
class LargeFileUploadResponse<UploadType> {
20+
/**
21+
* The location header from the response if provided
22+
*/
23+
private final String location;
24+
/**
25+
* The uploaded item response.
26+
*/
27+
private final UploadType uploadedItem;
28+
29+
/**
30+
* The next session response.
31+
*/
32+
private final IUploadSession session;
33+
34+
/**
35+
* The error happened during upload.
36+
*/
37+
private final ClientException error;
38+
39+
/**
40+
* Constructs response with the location header.
41+
*
42+
* @param location The location returned by the response
43+
*/
44+
protected LargeFileUploadResponse(@Nullable final String location) {
45+
this.location = location;
46+
this.error = null;
47+
this.session = null;
48+
this.uploadedItem = null;
49+
}
50+
51+
/**
52+
* Construct response with item created.
53+
*
54+
* @param uploaded The created item.
55+
*/
56+
protected LargeFileUploadResponse(@Nullable final UploadType uploaded) {
57+
this.uploadedItem = uploaded;
58+
this.session = null;
59+
this.error = null;
60+
this.location = null;
61+
}
62+
63+
/**
64+
* Construct response with next session.
65+
*
66+
* @param session The next session.
67+
*/
68+
protected LargeFileUploadResponse(@Nullable final IUploadSession session) {
69+
this.session = session;
70+
this.uploadedItem = null;
71+
this.error = null;
72+
this.location = null;
73+
}
74+
75+
/**
76+
* Construct response with error.
77+
*
78+
* @param error The error occurred during uploading.
79+
*/
80+
protected LargeFileUploadResponse(@Nullable final ClientException error) {
81+
this.error = error;
82+
this.uploadedItem = null;
83+
this.session = null;
84+
this.location = null;
85+
}
86+
87+
/**
88+
* Construct response with server exception.
89+
*
90+
* @param exception The exception received from server.
91+
*/
92+
protected LargeFileUploadResponse(@Nonnull final GraphServiceException exception) {
93+
this(new ClientException(Objects
94+
.requireNonNull(exception, "parameter exception cannot be null")
95+
.getMessage(/* verbose */ true),
96+
exception));
97+
}
98+
99+
/**
100+
* Checks the large upload range is completed.
101+
*
102+
* @return true if current large upload range is completed.
103+
*/
104+
public boolean chunkCompleted() {
105+
return this.uploadedItem != null || this.session != null;
106+
}
107+
108+
/**
109+
* Checks the whole upload is completed.
110+
*
111+
* @return true if the response is an item.
112+
*/
113+
public boolean uploadCompleted() {
114+
return this.uploadedItem != null || this.location != null;
115+
}
116+
117+
/**
118+
* Checks if an error happened.
119+
*
120+
* @return true if current request has error.
121+
*/
122+
public boolean hasError() {
123+
return this.error != null;
124+
}
125+
126+
/**
127+
* Get the uploaded item.
128+
*
129+
* @return The item.
130+
*/
131+
@Nullable
132+
public UploadType getItem() {
133+
return this.uploadedItem;
134+
}
135+
136+
/**
137+
* Get the next session.
138+
*
139+
* @return The next session for uploading.
140+
*/
141+
@Nullable
142+
public IUploadSession getSession() {
143+
return this.session;
144+
}
145+
146+
/**
147+
* Get the error.
148+
*
149+
* @return The error.
150+
*/
151+
@Nullable
152+
public ClientException getError() {
153+
return this.error;
154+
}
155+
/**
156+
* Get the location.
157+
* @return The location.
158+
*/
159+
@Nullable
160+
public String getLocation () {
161+
return this.location;
162+
}
163+
}

src/main/java/com/microsoft/graph/tasks/LargeFileUploadResponseHandler.java

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
*
5252
* @param <UploadType> the expected uploaded item
5353
*/
54-
public class LargeFileUploadResponseHandler<UploadType>
55-
implements IStatefulResponseHandler<LargeFileUploadResult<UploadType>, UploadType> {
54+
class LargeFileUploadResponseHandler<UploadType>
55+
implements IStatefulResponseHandler<LargeFileUploadResponse<UploadType>, UploadType> {
5656
/**
5757
* The expected deserialized upload type
5858
*/
@@ -70,75 +70,60 @@ protected LargeFileUploadResponseHandler(@Nonnull final Class<UploadType> upload
7070
this.uploadSessionClass = Objects.requireNonNull(uploadSessionType, "parameter uploadSessionType cannot be null");
7171
}
7272

73-
/**
74-
* Do nothing before getting the response
75-
*
76-
* @param response The response
77-
*/
78-
@Override
79-
public void configConnection(@Nonnull final Response response) {
80-
return;
81-
}
82-
83-
/**
84-
* Generate the chunked upload response result
85-
*
86-
* @param request the HTTP request
87-
* @param response the HTTP response
88-
* @param serializer the serializer
89-
* @param logger the system logger
90-
* @return the chunked upload result, which could be either an uploaded item or error
91-
* @throws Exception an exception occurs if the request was unable to complete for any reason
92-
*/
9373
@Override
9474
@Nullable
95-
public LargeFileUploadResult<UploadType> generateResult(
75+
public <ResponseType> LargeFileUploadResponse<UploadType> generateResult(
9676
@Nonnull final IHttpRequest request,
97-
@Nonnull final Response response,
77+
@Nonnull final ResponseType response,
9878
@Nonnull final ISerializer serializer,
9979
@Nonnull final ILogger logger) throws Exception {
10080
Objects.requireNonNull(request, "parameter request cannot be null");
10181
Objects.requireNonNull(response, "parameter response cannot be null");
10282
Objects.requireNonNull(serializer, "parameter serializer cannot be null");
10383
Objects.requireNonNull(logger, "parameter logger cannot be null");
104-
if (response.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) {
84+
if(!(response instanceof Response)) {
85+
throw new ClientException("unsupported response type", null);
86+
}
87+
final Response nativeResponse = (Response)response;
88+
89+
if (nativeResponse.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) {
10590
logger.logDebug("Receiving error during upload, see detail on result error");
10691

107-
return new LargeFileUploadResult<>(
92+
return new LargeFileUploadResponse<>(
10893
GraphServiceException.createFromResponse(request, null, serializer,
109-
response, logger));
110-
} else if (response.code() >= HTTP_OK
111-
&& response.code() < HttpResponseCode.HTTP_MULTIPLE_CHOICES) {
112-
try(final ResponseBody body = response.body()) {
113-
final String location = response.headers().get("Location");
94+
nativeResponse, logger));
95+
} else if (nativeResponse.code() >= HTTP_OK
96+
&& nativeResponse.code() < HttpResponseCode.HTTP_MULTIPLE_CHOICES) {
97+
try(final ResponseBody body = nativeResponse.body()) {
98+
final String location = nativeResponse.headers().get("Location");
11499
final MediaType contentType = body.contentType();
115100
final String subType = contentType == null ? null : contentType.subtype();
116101
if (subType != null && subType.contains("json")) {
117102
return parseJsonUploadResult(body, serializer, logger);
118103
} else if (location != null) {
119104
logger.logDebug("Upload session is completed (Outlook), uploaded item returned.");
120-
return new LargeFileUploadResult<>(this.deserializeTypeClass.getDeclaredConstructor().newInstance());
105+
return new LargeFileUploadResponse<>(location);
121106
} else {
122107
logger.logDebug("Upload session returned an unexpected response");
123108
}
124109
}
125110
}
126-
return new LargeFileUploadResult<>(new ClientException("Received an unexpected response from the service, response code: " + response.code(), null));
111+
return new LargeFileUploadResponse<>(new ClientException("Received an unexpected response from the service, response code: " + nativeResponse.code(), null));
127112
}
128113

129114
@Nonnull
130-
private LargeFileUploadResult<UploadType> parseJsonUploadResult(@Nonnull final ResponseBody responseBody, @Nonnull final ISerializer serializer, @Nonnull final ILogger logger) throws IOException {
115+
private LargeFileUploadResponse<UploadType> parseJsonUploadResult(@Nonnull final ResponseBody responseBody, @Nonnull final ISerializer serializer, @Nonnull final ILogger logger) throws IOException {
131116
try (final InputStream in = responseBody.byteStream()) {
132117
final byte[] responseBytes = ByteStreams.toByteArray(in);
133118
final IUploadSession session = serializer.deserializeObject(new ByteArrayInputStream(responseBytes), uploadSessionClass);
134119

135120
if (session == null || session.getNextExpectedRanges() == null) {
136121
logger.logDebug("Upload session is completed (ODSP), uploaded item returned.");
137122
final UploadType uploadedItem = serializer.deserializeObject(new ByteArrayInputStream(responseBytes), this.deserializeTypeClass);
138-
return new LargeFileUploadResult<>(uploadedItem);
123+
return new LargeFileUploadResponse<>(uploadedItem);
139124
} else {
140125
logger.logDebug("Chunk bytes has been accepted by the server.");
141-
return new LargeFileUploadResult<>(session);
126+
return new LargeFileUploadResponse<>(session);
142127
}
143128
}
144129
}

0 commit comments

Comments
 (0)