From 4020b30bd73f4a62f622f510a52396110cd84b1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 08:20:50 +0000 Subject: [PATCH 1/8] chore(deps): bump dawidd6/action-download-artifact from 3.1.0 to 3.1.1 Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/git-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/git-release.yml b/.github/workflows/git-release.yml index a40d9917f..22ddb1900 100644 --- a/.github/workflows/git-release.yml +++ b/.github/workflows/git-release.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Download Build Artifact - uses: dawidd6/action-download-artifact@v3.1.0 + uses: dawidd6/action-download-artifact@v3.1.1 with: workflow: build-and-publish.yml workflow_conclusion: success From 2c168c7875521938c7af0742aca66802aef79c46 Mon Sep 17 00:00:00 2001 From: Gianluca C Date: Wed, 21 Feb 2024 16:35:49 +0100 Subject: [PATCH 2/8] Added a test for the completion of a file content update via LargeFileUploadTask --- .../upload/UploadResponseHandlerTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java b/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java index 531383a91..2420e08e3 100644 --- a/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java +++ b/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java @@ -51,6 +51,36 @@ void GetUploadItemOnCompletedUpload() { assertEquals("largeFile.vhd", item.name); assertEquals(33, item.size); } + + @Test + void GetUploadItemOnCompletedUpdate() { + registry.contentTypeAssociatedFactories.put(CoreConstants.MimeTypeNames.APPLICATION_JSON, new JsonParseNodeFactory()); + + UploadResponseHandler responseHandler = new UploadResponseHandler(null); + ResponseBody body = ResponseBody.create("{\n" + + " \"id\": \"912310013A123\",\n" + + " \"name\": \"largeFile.vhd\",\n" + + " \"size\": 33\n" + + "}" + , MediaType.parse(CoreConstants.MimeTypeNames.APPLICATION_JSON)); + Response response = new Response.Builder() + .request(mock(Request.class)) + .protocol(mock(Protocol.class)) + .body(body) + .code(HttpURLConnection.HTTP_OK) + .message("OK") + .build(); + UploadResult result = responseHandler + .handleResponse(response, TestDriveItem::createFromDiscriminatorValue); + responseHandler.handleResponse(response, parseNode -> {return new TestDriveItem();}); + TestDriveItem item = result.itemResponse; + assertTrue(result.isUploadSuccessful()); + assertNotNull(item); + assertEquals("912310013A123", item.id); + assertEquals("largeFile.vhd", item.name); + assertEquals(33, item.size); + } + @Test void getFileAttachmentLocationOnCompletedUpload() { registry.contentTypeAssociatedFactories.put(CoreConstants.MimeTypeNames.APPLICATION_JSON, new JsonParseNodeFactory()); @@ -105,6 +135,7 @@ void getUploadSessionOnProgressingUpload() { assertEquals("77829-99375", session.getNextExpectedRanges().get(1)); assertEquals(2, session.getNextExpectedRanges().size()); } + @Test void throwsServiceExceptionOnErrorResponse() { UploadResponseHandler responseHandler = new UploadResponseHandler(null); From dc45304ca2a9c849ee059a9a04d7477387aae9c3 Mon Sep 17 00:00:00 2001 From: Gianluca C Date: Wed, 21 Feb 2024 16:38:00 +0100 Subject: [PATCH 3/8] Fixed test and fixed a bug The test UploadResponseHandlerTest#getUploadSessionOnProgressingUpload mimicked a server response with a 200/OK response code. In the REST reference (https://learn.microsoft.com/en-us/graph/api/driveitem-createuploadsession?view=graph-rest-1.0#upload-bytes-to-the-upload-session) it is stated that the response code for uploading more bytes to the upload session is 202/Accepted. The bug in https://github.com/microsoftgraph/msgraph-sdk-java-core/issues/1517 is fixed. Previously the method UploadResponseHandler#handleResponse handled differently the response in these two cases: - response code 200/OK - all other cases Now the same method handles differently the response in these two cases: - response code 200/OK or 201/Created - all other cases Everything works if the REST reference is corrected and: - 200/OK is returned when an item is updated, 201/Created is returned when an item is Created - 202/Accepted is returned when more bytes are requested --- .../graph/core/requests/upload/UploadResponseHandler.java | 5 +++-- .../core/requests/upload/UploadResponseHandlerTest.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java index 6d4a2acec..a388e63c0 100644 --- a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java +++ b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java @@ -56,15 +56,16 @@ public UploadResult handleResponse(@Nonnull final Respon } try(final InputStream in = body.byteStream()){ final String contentType = body.contentType().toString().split(";")[0]; //contentType.toString() returns in format ;, we only want the mediaType. + int responseCode = response.code(); if(!response.isSuccessful()) { throw new ApiExceptionBuilder() .withMessage(ErrorConstants.Codes.GENERAL_EXCEPTION) - .withResponseStatusCode(response.code()) + .withResponseStatusCode(responseCode) .withResponseHeaders(HeadersCompatibility.getResponseHeaders(response.headers())) .build(); } UploadResult uploadResult = new UploadResult<>(); - if (response.code() == HttpURLConnection.HTTP_CREATED) { + if (responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_OK) { if (body.contentLength() > 0) { final ParseNode uploadTypeParseNode = parseNodeFactory.getParseNode(contentType, in); uploadResult.itemResponse = uploadTypeParseNode.getObjectValue(factory); diff --git a/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java b/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java index 2420e08e3..f0f4105f7 100644 --- a/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java +++ b/src/test/java/com/microsoft/graph/core/requests/upload/UploadResponseHandlerTest.java @@ -119,9 +119,9 @@ void getUploadSessionOnProgressingUpload() { Response response = new Response.Builder() .request(mock(Request.class)) .protocol(mock(Protocol.class)) - .message("OK") + .message("Accepted") .body(body) - .code(HttpURLConnection.HTTP_OK) + .code(HttpURLConnection.HTTP_ACCEPTED) .build(); UploadResult result = responseHandler .handleResponse(response, TestDriveItem::createFromDiscriminatorValue); @@ -135,7 +135,7 @@ void getUploadSessionOnProgressingUpload() { assertEquals("77829-99375", session.getNextExpectedRanges().get(1)); assertEquals(2, session.getNextExpectedRanges().size()); } - + @Test void throwsServiceExceptionOnErrorResponse() { UploadResponseHandler responseHandler = new UploadResponseHandler(null); From 2c1684d6e54274a24b7623f734a0390986a49809 Mon Sep 17 00:00:00 2001 From: Gianluca C Date: Wed, 21 Feb 2024 18:22:05 +0100 Subject: [PATCH 4/8] Test fix and updating releases - Updated the patch version in gradle.properies - Updated changelog.md and readme.md with the new patch version - Bumped kiota dependencies to 1.0.3 - Fixed the test UploadSliceRequestTest.putReturnsExpectedUploadSession which did not respect the response descripted in the REST reference --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- gradle/dependencies.gradle | 14 +++++++------- readme.md | 4 ++-- .../requests/upload/UploadSliceRequestTest.java | 4 ++-- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7bb7f1ae..2238b7153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +## [3.1.4] - 2024-02-21 + +- Bumps Kiota-Java abstractions, authentication, http, and serialization components +- Fixes a test in the test suite which did not respect the REST reference [#1517](https://github.com/microsoftgraph/msgraph-sdk-java-core/issues/1517) +- Fixes a bug with LargeFileUploadTask [#1517](https://github.com/microsoftgraph/msgraph-sdk-java-core/issues/1517) + +### Changed + ## [3.1.3] - 2024-02-14 ### Changed diff --git a/gradle.properties b/gradle.properties index bb163d800..6b4f97803 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ mavenGroupId = com.microsoft.graph mavenArtifactId = microsoft-graph-core mavenMajorVersion = 3 mavenMinorVersion = 1 -mavenPatchVersion = 3 +mavenPatchVersion = 4 mavenArtifactSuffix = #These values are used to run functional tests diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 9a407bccb..809ce6757 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -16,11 +16,11 @@ dependencies { api 'com.squareup.okhttp3:okhttp:4.12.0' api 'com.azure:azure-core:1.46.0' - api 'com.microsoft.kiota:microsoft-kiota-abstractions:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-authentication-azure:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-http-okHttp:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-serialization-json:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-serialization-text:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-serialization-form:1.0.2' - implementation 'com.microsoft.kiota:microsoft-kiota-serialization-multipart:1.0.2' + api 'com.microsoft.kiota:microsoft-kiota-abstractions:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-authentication-azure:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-http-okHttp:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-serialization-json:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-serialization-text:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-serialization-form:1.0.3' + implementation 'com.microsoft.kiota:microsoft-kiota-serialization-multipart:1.0.3' } diff --git a/readme.md b/readme.md index ae39f1330..bfe046029 100644 --- a/readme.md +++ b/readme.md @@ -22,7 +22,7 @@ repositories { dependencies { // Include the sdk as a dependency - implementation 'com.microsoft.graph:microsoft-graph-core:3.1.3' + implementation 'com.microsoft.graph:microsoft-graph-core:3.1.4' // This dependency is only needed if you are using the TokenCredentialAuthProvider implementation 'com.azure:azure-identity:1.11.0' } @@ -37,7 +37,7 @@ Add the dependency in `dependencies` in pom.xml com.microsoft.graph microsoft-graph-core - 3.1.3 + 3.1.4 com.azure azure-identity diff --git a/src/test/java/com/microsoft/graph/core/requests/upload/UploadSliceRequestTest.java b/src/test/java/com/microsoft/graph/core/requests/upload/UploadSliceRequestTest.java index 73038109b..079521205 100644 --- a/src/test/java/com/microsoft/graph/core/requests/upload/UploadSliceRequestTest.java +++ b/src/test/java/com/microsoft/graph/core/requests/upload/UploadSliceRequestTest.java @@ -40,9 +40,9 @@ void putReturnsExpectedUploadSession() throws IOException { Response response = new Response.Builder() .request(new Request.Builder().post(mock(RequestBody.class)).url("https://a.b.c/").build()) .protocol(Protocol.HTTP_1_1) - .message("OK") + .message("Accepted") .body(body) - .code(HttpURLConnection.HTTP_OK) + .code(HttpURLConnection.HTTP_ACCEPTED) .build(); OkHttpClient mockClient = getMockClient(response); From 3be4c4b7c30663648f9e3ab952405beb16b7cded Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 21 Feb 2024 12:48:49 -0500 Subject: [PATCH 5/8] - fixes implementation difference for large file upload session --- .../graph/core/models/IUploadSession.java | 2 +- .../graph/core/models/UploadSession.java | 5 ++++- .../requests/upload/UploadSessionTest.java | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/microsoft/graph/core/requests/upload/UploadSessionTest.java diff --git a/src/main/java/com/microsoft/graph/core/models/IUploadSession.java b/src/main/java/com/microsoft/graph/core/models/IUploadSession.java index 072d24d02..17c4d1889 100644 --- a/src/main/java/com/microsoft/graph/core/models/IUploadSession.java +++ b/src/main/java/com/microsoft/graph/core/models/IUploadSession.java @@ -29,7 +29,7 @@ public interface IUploadSession extends Parsable, AdditionalDataHolder { * A collection of byte ranges that the server is missing for the file. These ranges are zero indexed and of the format 'start-end' (e.g. '0-26' to indicate the first 27 bytes of the file). When uploading files as Outlook attachments, instead of a collection of ranges, this property always indicates a single value '{start}', the location in the file where the next upload should begin. * @return the Next Expected Ranges. */ - @Nonnull + @Nullable List getNextExpectedRanges(); /** * Sets the ranges that are yet to be uploaded. diff --git a/src/main/java/com/microsoft/graph/core/models/UploadSession.java b/src/main/java/com/microsoft/graph/core/models/UploadSession.java index 18bb54d9c..f69e14a54 100644 --- a/src/main/java/com/microsoft/graph/core/models/UploadSession.java +++ b/src/main/java/com/microsoft/graph/core/models/UploadSession.java @@ -55,9 +55,12 @@ public void setUploadUrl(@Nonnull final String uploadUrl) { * Get the next upload byte ranges to be uploaded. * @return The byte ranges to be uploaded. */ - @Nonnull + @Nullable @Override public List getNextExpectedRanges() { + if (nextExpectedRanges == null) { + return null; + } return new ArrayList<>(nextExpectedRanges); } /** diff --git a/src/test/java/com/microsoft/graph/core/requests/upload/UploadSessionTest.java b/src/test/java/com/microsoft/graph/core/requests/upload/UploadSessionTest.java new file mode 100644 index 000000000..1b29e509c --- /dev/null +++ b/src/test/java/com/microsoft/graph/core/requests/upload/UploadSessionTest.java @@ -0,0 +1,19 @@ +package com.microsoft.graph.core.requests.upload; + +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.microsoft.graph.core.models.UploadSession; + +class UploadSessionTest { + @Test + void getNextExpectedRangesDoesNotFailOnDefault() + { + final UploadSession uploadSession = new UploadSession(); + final List result = uploadSession.getNextExpectedRanges(); + assertNull(result); + } +} From 348236193fac88412492df1310efd6b744725354 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 21 Feb 2024 12:49:47 -0500 Subject: [PATCH 6/8] - reverts status code changes --- .../graph/core/requests/upload/UploadResponseHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java index a388e63c0..6d4a2acec 100644 --- a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java +++ b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java @@ -56,16 +56,15 @@ public UploadResult handleResponse(@Nonnull final Respon } try(final InputStream in = body.byteStream()){ final String contentType = body.contentType().toString().split(";")[0]; //contentType.toString() returns in format ;, we only want the mediaType. - int responseCode = response.code(); if(!response.isSuccessful()) { throw new ApiExceptionBuilder() .withMessage(ErrorConstants.Codes.GENERAL_EXCEPTION) - .withResponseStatusCode(responseCode) + .withResponseStatusCode(response.code()) .withResponseHeaders(HeadersCompatibility.getResponseHeaders(response.headers())) .build(); } UploadResult uploadResult = new UploadResult<>(); - if (responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_OK) { + if (response.code() == HttpURLConnection.HTTP_CREATED) { if (body.contentLength() > 0) { final ParseNode uploadTypeParseNode = parseNodeFactory.getParseNode(contentType, in); uploadResult.itemResponse = uploadTypeParseNode.getObjectValue(factory); From 4cb7c3b63b473a3aceabff07c0129a9b9ad362a2 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 21 Feb 2024 12:51:02 -0500 Subject: [PATCH 7/8] - code linting Signed-off-by: Vincent Biret --- .../com/microsoft/graph/core/models/IUploadSession.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/graph/core/models/IUploadSession.java b/src/main/java/com/microsoft/graph/core/models/IUploadSession.java index 17c4d1889..ab9a0dd6f 100644 --- a/src/main/java/com/microsoft/graph/core/models/IUploadSession.java +++ b/src/main/java/com/microsoft/graph/core/models/IUploadSession.java @@ -23,7 +23,7 @@ public interface IUploadSession extends Parsable, AdditionalDataHolder { * Sets the Upload Url * @param url the upload Url for the session */ - void setUploadUrl(@Nonnull String url); + void setUploadUrl(@Nonnull final String url); /** * Gets the Next Expected Ranges. * A collection of byte ranges that the server is missing for the file. These ranges are zero indexed and of the format 'start-end' (e.g. '0-26' to indicate the first 27 bytes of the file). When uploading files as Outlook attachments, instead of a collection of ranges, this property always indicates a single value '{start}', the location in the file where the next upload should begin. @@ -35,7 +35,7 @@ public interface IUploadSession extends Parsable, AdditionalDataHolder { * Sets the ranges that are yet to be uploaded. * @param nextExpectedRanges the byte ranges yet to be uploaded. */ - void setNextExpectedRanges(@Nonnull List nextExpectedRanges); + void setNextExpectedRanges(@Nonnull final List nextExpectedRanges); /** * Expiration date of the upload session * @return the expiration date. @@ -46,5 +46,5 @@ public interface IUploadSession extends Parsable, AdditionalDataHolder { * Set the expiration date of the UploadSession * @param dateTime the expiration date of the UploadSession. */ - void setExpirationDateTime(@Nonnull OffsetDateTime dateTime); + void setExpirationDateTime(@Nonnull final OffsetDateTime dateTime); } From 9d368ce9d7ec974936f8ff7df609a8a868976dea Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 21 Feb 2024 12:52:26 -0500 Subject: [PATCH 8/8] - fixes NRP in large file upload Signed-off-by: Vincent Biret --- .../graph/core/requests/upload/UploadResponseHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java index 6d4a2acec..8e165599a 100644 --- a/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java +++ b/src/main/java/com/microsoft/graph/core/requests/upload/UploadResponseHandler.java @@ -18,6 +18,7 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; +import java.util.List; import java.util.Objects; /** @@ -76,7 +77,8 @@ public UploadResult handleResponse(@Nonnull final Respon } else { final ParseNode parseNode = parseNodeFactory.getParseNode(contentType, in); final UploadSession uploadSession = parseNode.getObjectValue(UploadSession::createFromDiscriminatorValue); - if (!uploadSession.getNextExpectedRanges().isEmpty()) { + final List nextExpectedRanges = uploadSession.getNextExpectedRanges(); + if (!(nextExpectedRanges == null || nextExpectedRanges.isEmpty())) { uploadResult.uploadSession = uploadSession; } else { uploadResult.itemResponse = parseNode.getObjectValue(factory);