From fb705f22b5e39935a78766ebabe46b6eebdaf5eb Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Tue, 21 Jan 2025 17:41:42 -0800 Subject: [PATCH 01/21] test parent pom changes --- .../core/TestInterfaceClientService.java | 71 +++++++++++++++++++ .../core/TestInterfaceServiceVersion.java | 39 ++++++++++ sdk/parents/clientcore-parent/pom.xml | 8 ++- 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java create mode 100644 sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java diff --git a/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java b/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java new file mode 100644 index 0000000000000..70b9e0aa52849 --- /dev/null +++ b/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.core; + +import io.clientcore.core.annotation.ServiceInterface; +import io.clientcore.core.http.annotation.BodyParam; +import io.clientcore.core.http.annotation.HeaderParam; +import io.clientcore.core.http.annotation.HttpRequestInformation; +import io.clientcore.core.http.annotation.PathParam; +import io.clientcore.core.http.models.HttpMethod; +import io.clientcore.core.http.models.Response; +import io.clientcore.core.http.pipeline.HttpPipeline; +import io.clientcore.core.util.binarydata.BinaryData; +import io.clientcore.core.util.serializer.ObjectSerializer; + +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.nio.ByteBuffer; + +@ServiceInterface(name = "myService", host = "https://somecloud.com") +public interface TestInterfaceClientService { + static TestInterfaceClientService getInstance(HttpPipeline pipeline, ObjectSerializer serializer, + TestInterfaceServiceVersion serviceVersion) { + if (pipeline == null) { + throw new IllegalArgumentException("pipeline cannot be null"); + } + try { + Class clazz = Class.forName("com.service.clientlibrary.implementation.TestInterfaceClientServiceImpl"); + return (TestInterfaceClientService) clazz + .getMethod("getInstance", HttpPipeline.class, ObjectSerializer.class, TestInterfaceServiceVersion.class) + .invoke(null, pipeline, serializer, serviceVersion); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException + | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + static void reset() { + try { + Class clazz = Class.forName("com.service.clientlibrary.implementation.TestInterfaceClientServiceImpl"); + clazz.getMethod("reset").invoke(null); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException + | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + @HttpRequestInformation(method = HttpMethod.POST, path = "my/uri/path", expectedStatusCodes = { 200 }) + Response testMethod(@BodyParam("application/octet-stream") ByteBuffer request, + @HeaderParam("Content-Type") String contentType, @HeaderParam("Content-Length") Long contentLength); + + @HttpRequestInformation(method = HttpMethod.POST, path = "my/uri/path", expectedStatusCodes = { 200 }) + Response testMethod(@BodyParam("application/octet-stream") BinaryData data, + @HeaderParam("Content-Type") String contentType, @HeaderParam("Content-Length") Long contentLength); + + @HttpRequestInformation(method = HttpMethod.GET, path = "{nextLink}", expectedStatusCodes = { 200 }) + Response testListNext(@PathParam(value = "nextLink", encoded = true) String nextLink); + + @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) + Void testMethodReturnsVoid(); + + @HttpRequestInformation(method = HttpMethod.HEAD, path = "my/uri/path", expectedStatusCodes = { 200 }) + void testHeadMethod(); + + @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) + Response testMethodReturnsResponseVoid(); + + @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) + Response testDownload(); +} diff --git a/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java b/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java new file mode 100644 index 0000000000000..f30e930302ab4 --- /dev/null +++ b/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.core; + +import io.clientcore.core.http.models.ServiceVersion; + +/** + * Service version of OpenAIClient. + */ +public enum TestInterfaceServiceVersion implements ServiceVersion { + /** + * Enum value 2022-12-01. + */ + V_TEST_VALUE("test-value"); + + private final String version; + + TestInterfaceServiceVersion(String version) { + this.version = version; + } + + /** + * {@inheritDoc} + */ + @Override + public String getVersion() { + return this.version; + } + + /** + * Gets the latest service version supported by this client library. + * + * @return The latest {@link TestInterfaceServiceVersion}. + */ + public static TestInterfaceServiceVersion getLatest() { + return V_TEST_VALUE; + } +} diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 6b3fe5e967ebc..5b0f5f3ff9094 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -732,7 +732,13 @@ ${compiler.proc} - + + + io.clientcore.tools + annotation-processor + 1.0.0-beta.1 + + false From eb9e30d183e8143812086f53af6a20bded5b38bc Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Wed, 22 Jan 2025 12:12:04 -0800 Subject: [PATCH 02/21] this works --- .../clientcore/core/TestInterfaceClientService.java | 0 .../clientcore/core/TestInterfaceServiceVersion.java | 0 sdk/clientcore/tools/annotation-processor/pom.xml | 10 ++++++++++ .../clientcore/tools/codegen/AnnotationProcessor.java | 6 +++++- sdk/parents/clientcore-parent/pom.xml | 11 ++++++++++- 5 files changed, 25 insertions(+), 2 deletions(-) rename sdk/clientcore/core/src/{test => main}/java/io/clientcore/core/TestInterfaceClientService.java (100%) rename sdk/clientcore/core/src/{test => main}/java/io/clientcore/core/TestInterfaceServiceVersion.java (100%) diff --git a/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java b/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java similarity index 100% rename from sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceClientService.java rename to sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java diff --git a/sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java b/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceServiceVersion.java similarity index 100% rename from sdk/clientcore/core/src/test/java/io/clientcore/core/TestInterfaceServiceVersion.java rename to sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceServiceVersion.java diff --git a/sdk/clientcore/tools/annotation-processor/pom.xml b/sdk/clientcore/tools/annotation-processor/pom.xml index 1a1624063e090..0af129a7f40bf 100644 --- a/sdk/clientcore/tools/annotation-processor/pom.xml +++ b/sdk/clientcore/tools/annotation-processor/pom.xml @@ -108,5 +108,15 @@ true + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java index b4b28fba71cf4..dbec6976524e9 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java @@ -45,8 +45,11 @@ import java.util.stream.Collectors; @SupportedAnnotationTypes("io.clientcore.core.annotation.*") -@SupportedSourceVersion(SourceVersion.RELEASE_8) +@SupportedSourceVersion(SourceVersion.RELEASE_17) public class AnnotationProcessor extends AbstractProcessor { + public AnnotationProcessor() { + System.out.println("AnnotationProcessor created"); + } @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { @@ -68,6 +71,7 @@ public boolean process(Set annotations, RoundEnvironment private void processServiceInterface(Element serviceInterface) { + System.out.println("Processing service interface: " + serviceInterface); if (serviceInterface == null || serviceInterface.getKind() != ElementKind.INTERFACE) { throw new IllegalArgumentException("Invalid service interface provided."); } diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 5b0f5f3ff9094..9a487c1d52704 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -731,7 +731,7 @@ - ${compiler.proc} + io.clientcore.tools @@ -1154,6 +1154,10 @@ 1.8 1.8 + ${project.build.directory}/generated-sources/ + + io.clientcore.tools.codegen.AnnotationProcessor + @@ -1165,6 +1169,7 @@ module-info.java + @@ -1248,6 +1253,10 @@ module-info.java + ${project.build.directory}/generated-sources/ + + io.clientcore.tools.codegen.AnnotationProcessor + From 5831d79ac339c57c9d83ad1e1071736ccd25811b Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Wed, 22 Jan 2025 14:58:04 -0800 Subject: [PATCH 03/21] add annotation-processor to clientcore pom --- eng/versioning/external_dependencies.txt | 1 - eng/versioning/version_client.txt | 1 + .../tools/annotation-processor/README.md | 4 ++-- .../tools/annotation-processor/pom.xml | 5 +++-- sdk/parents/clientcore-parent/pom.xml | 18 +++++++++++++++--- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/eng/versioning/external_dependencies.txt b/eng/versioning/external_dependencies.txt index 18fa0b9342fcb..31a86c96f0670 100644 --- a/eng/versioning/external_dependencies.txt +++ b/eng/versioning/external_dependencies.txt @@ -42,7 +42,6 @@ com.squareup.okhttp3:okhttp;4.12.0 com.squareup:javapoet;1.13.0 commons-codec:commons-codec;1.15 commons-net:commons-net;3.9.0 -io.clientcore.tools:annotation-processor;1.0.0-beta.1 io.cloudevents:cloudevents-api;2.2.0 io.cloudevents:cloudevents-core;2.2.0 io.fabric8:kubernetes-client;6.12.1 diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 6ce481eb82b72..f45cd81bb699e 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -477,6 +477,7 @@ io.clientcore:core;1.0.0-beta.3;1.0.0-beta.4 io.clientcore:http-okhttp3;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:http-stress;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:optional-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 +io.clientcore:annotation-processor;1.0.0-beta.1;1.0.0-beta.1 # Unreleased dependencies: Copy the entry from above, prepend "unreleased_" and remove the current diff --git a/sdk/clientcore/tools/annotation-processor/README.md b/sdk/clientcore/tools/annotation-processor/README.md index e677bb0e2b3db..71e63fbb7ac79 100644 --- a/sdk/clientcore/tools/annotation-processor/README.md +++ b/sdk/clientcore/tools/annotation-processor/README.md @@ -9,9 +9,9 @@ The client-core annotation processor for introducing compile-time code generatio ```xml - io.clientcore.tools + io.clientcore annotation-processor - 1.0.0.beta.1 + 1.0.0.beta.1 provided diff --git a/sdk/clientcore/tools/annotation-processor/pom.xml b/sdk/clientcore/tools/annotation-processor/pom.xml index 0af129a7f40bf..47715a3d5869f 100644 --- a/sdk/clientcore/tools/annotation-processor/pom.xml +++ b/sdk/clientcore/tools/annotation-processor/pom.xml @@ -5,9 +5,10 @@ 4.0.0 - io.clientcore.tools + io.clientcore annotation-processor - 1.0.0-beta.1 + jar + 1.0.0-beta.1 Client Core Compile-Time Annotation Processor The client-core annotation processor for introducing compile-time code generation for libraries based on client core diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 9a487c1d52704..07ff0aff1a3a2 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -240,6 +240,11 @@ 0.8.12 test + + io.clientcore + annotation-processor + 1.0.0-beta.1 + @@ -656,7 +661,6 @@ io.clientcore:* - @@ -734,12 +738,16 @@ - io.clientcore.tools + io.clientcore annotation-processor - 1.0.0-beta.1 + 1.0.0-beta.1 false + + io.clientcore.tools.codegen.AnnotationProcessor + + ${project.build.directory}/generated-sources/ @@ -1220,6 +1228,10 @@ ${java.vm.specification.version} + ${project.build.directory}/generated-sources/ + + io.clientcore.tools.codegen.AnnotationProcessor + From 8c8f4961095e94a770076314d1e354fd82428279 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Wed, 22 Jan 2025 15:45:37 -0800 Subject: [PATCH 04/21] make clientcore:core dependency version --- .../io/clientcore/tools/codegen/AnnotationProcessor.java | 5 ----- sdk/parents/clientcore-parent/pom.xml | 3 +-- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java index dbec6976524e9..a8b05d1ad87f8 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java @@ -47,10 +47,6 @@ @SupportedAnnotationTypes("io.clientcore.core.annotation.*") @SupportedSourceVersion(SourceVersion.RELEASE_17) public class AnnotationProcessor extends AbstractProcessor { - public AnnotationProcessor() { - System.out.println("AnnotationProcessor created"); - } - @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { // We iterate through each interface annotated with @ServiceInterface separately. @@ -71,7 +67,6 @@ public boolean process(Set annotations, RoundEnvironment private void processServiceInterface(Element serviceInterface) { - System.out.println("Processing service interface: " + serviceInterface); if (serviceInterface == null || serviceInterface.getKind() != ElementKind.INTERFACE) { throw new IllegalArgumentException("Invalid service interface provided."); } diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 07ff0aff1a3a2..d414bc0a58a87 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -734,8 +734,7 @@ -Xlint:varargs - - + io.clientcore From 525ffd1c70bf11a7c0528581bb5ab4050be48ba4 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 10:07:09 -0800 Subject: [PATCH 05/21] add annotation-processor-dependency-tests module for testing and ci changes --- sdk/clientcore/ci.yml | 8 + .../core/TestInterfaceClientService.java | 71 ----- .../CHANGELOG.md | 3 + .../README.md | 19 ++ .../pom.xml | 86 +++++ .../tools/codegen/MockHttpResponse.java | 85 +++++ .../codegen}/TestInterfaceServiceVersion.java | 2 +- .../TestInterfaceClientService.java | 45 +++ .../codegen/implementation/package-info.java | 4 + .../tools/codegen/package-info.java | 7 + ...erfaceClientServiceImplGenerationTest.java | 71 +++++ .../tools/annotation-processor/pom.xml | 6 - .../tools/codegen/AnnotationProcessor.java | 73 ++++- .../templating/JavaPoetTemplateProcessor.java | 296 +++++++++--------- .../codegen/templating/TemplateProcessor.java | 3 + .../tools/codegen/utils/PathBuilder.java | 3 + .../utils/ResponseBodyModeGeneration.java | 136 +++++++- .../BodyContentTypeProcessorTest.java | 44 ++- .../HttpPipelineBuilderMethodTest.java | 36 +-- .../utils/ResponseBodyModeGenerationTest.java | 53 +++- sdk/clientcore/tools/pom.xml | 1 + sdk/parents/clientcore-parent/pom.xml | 37 ++- 22 files changed, 787 insertions(+), 302 deletions(-) delete mode 100644 sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/README.md create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java rename sdk/clientcore/{core/src/main/java/io/clientcore/core => tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen}/TestInterfaceServiceVersion.java (95%) create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java create mode 100644 sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index 9089ac38c77f8..abefa8173dd01 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -30,6 +30,10 @@ parameters: displayName: 'http-okhttp3' type: boolean default: false + - name: release_clientcoreannotationprocessor + displayName: 'annotation-processor' + type: boolean + default: false extends: template: /eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -50,6 +54,10 @@ extends: groupId: io.clientcore safeName: httpokhttp3 releaseInBatch: ${{ parameters.release_clientcorehttpokhttp3 }} + - name: annotation-processor + groupId: io.clientcore + safeName: annotationprocessor + releaseInBatch: ${{ parameters.release_clientcoreannotationprocessor }} AdditionalModules: - name: optional-dependency-tests groupId: io.clientcore diff --git a/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java b/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java deleted file mode 100644 index 70b9e0aa52849..0000000000000 --- a/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceClientService.java +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package io.clientcore.core; - -import io.clientcore.core.annotation.ServiceInterface; -import io.clientcore.core.http.annotation.BodyParam; -import io.clientcore.core.http.annotation.HeaderParam; -import io.clientcore.core.http.annotation.HttpRequestInformation; -import io.clientcore.core.http.annotation.PathParam; -import io.clientcore.core.http.models.HttpMethod; -import io.clientcore.core.http.models.Response; -import io.clientcore.core.http.pipeline.HttpPipeline; -import io.clientcore.core.util.binarydata.BinaryData; -import io.clientcore.core.util.serializer.ObjectSerializer; - -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.nio.ByteBuffer; - -@ServiceInterface(name = "myService", host = "https://somecloud.com") -public interface TestInterfaceClientService { - static TestInterfaceClientService getInstance(HttpPipeline pipeline, ObjectSerializer serializer, - TestInterfaceServiceVersion serviceVersion) { - if (pipeline == null) { - throw new IllegalArgumentException("pipeline cannot be null"); - } - try { - Class clazz = Class.forName("com.service.clientlibrary.implementation.TestInterfaceClientServiceImpl"); - return (TestInterfaceClientService) clazz - .getMethod("getInstance", HttpPipeline.class, ObjectSerializer.class, TestInterfaceServiceVersion.class) - .invoke(null, pipeline, serializer, serviceVersion); - } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException - | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - static void reset() { - try { - Class clazz = Class.forName("com.service.clientlibrary.implementation.TestInterfaceClientServiceImpl"); - clazz.getMethod("reset").invoke(null); - } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException - | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - - @HttpRequestInformation(method = HttpMethod.POST, path = "my/uri/path", expectedStatusCodes = { 200 }) - Response testMethod(@BodyParam("application/octet-stream") ByteBuffer request, - @HeaderParam("Content-Type") String contentType, @HeaderParam("Content-Length") Long contentLength); - - @HttpRequestInformation(method = HttpMethod.POST, path = "my/uri/path", expectedStatusCodes = { 200 }) - Response testMethod(@BodyParam("application/octet-stream") BinaryData data, - @HeaderParam("Content-Type") String contentType, @HeaderParam("Content-Length") Long contentLength); - - @HttpRequestInformation(method = HttpMethod.GET, path = "{nextLink}", expectedStatusCodes = { 200 }) - Response testListNext(@PathParam(value = "nextLink", encoded = true) String nextLink); - - @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) - Void testMethodReturnsVoid(); - - @HttpRequestInformation(method = HttpMethod.HEAD, path = "my/uri/path", expectedStatusCodes = { 200 }) - void testHeadMethod(); - - @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) - Response testMethodReturnsResponseVoid(); - - @HttpRequestInformation(method = HttpMethod.GET, path = "my/uri/path", expectedStatusCodes = { 200 }) - Response testDownload(); -} diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md b/sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md new file mode 100644 index 0000000000000..4144f75694a03 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md @@ -0,0 +1,3 @@ +# Release History + +## 1.0.0-beta.1 (Unreleased) diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/README.md b/sdk/clientcore/tools/annotation-processor-dependency-tests/README.md new file mode 100644 index 0000000000000..0a49e72536807 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/README.md @@ -0,0 +1,19 @@ +# Core Tests shared library for Java + +Tests that validate annotation-processor features of generating Service Interface Implementation for the Core library. + +## Getting started + +## Key concepts + +## Examples + +## Troubleshooting + +## Next steps + +## Contributing + + + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%clientcore%2Fannotation-processor-dependency-tests%2FREADME.png) diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml b/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml new file mode 100644 index 0000000000000..927128317732a --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + io.clientcore + clientcore-parent + 1.0.0-beta.1 + ../../../parents/clientcore-parent + + + io.clientcore + annotation-processor-dependency-tests + jar + 1.0.0-beta.1 + + Java Core library tests for annotation-processor features. + Tests that validate features of the annotation-processor tooling. + https://github.com/Azure/azure-sdk-for-java + + + + The MIT License (MIT) + http://opensource.org/licenses/MIT + repo + + + + + https://github.com/Azure/azure-sdk-for-java + scm:git:https://github.com/Azure/azure-sdk-for-java.git + scm:git:https://github.com/Azure/azure-sdk-for-java.git + + + + UTF-8 + true + + true + + + + + true + true + + + + + io.clientcore + core + 1.0.0-beta.2 + + + + + org.junit.jupiter + junit-jupiter-api + 5.11.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.11.2 + test + + + org.junit.jupiter + junit-jupiter-params + 5.11.2 + test + + + + + + + ${project.build.directory}/generated-sources + + + + diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java new file mode 100644 index 0000000000000..9e3f9fa01df85 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.tools.codegen; + +import io.clientcore.core.http.models.HttpHeaders; +import io.clientcore.core.http.models.HttpRequest; +import io.clientcore.core.http.models.HttpResponse; +import io.clientcore.core.implementation.util.JsonSerializer; +import io.clientcore.core.util.binarydata.BinaryData; +import io.clientcore.core.util.serializer.ObjectSerializer; + +/** + * A mock implementation of {@link HttpResponse} that can be used for testing. + */ +public class MockHttpResponse extends HttpResponse { + private static final ObjectSerializer SERIALIZER = new JsonSerializer(); + + /** + * Creates an HTTP response associated with a {@code request}, returns the {@code statusCode}, and has an empty + * response body. + * + * @param request HttpRequest associated with the response. + * @param statusCode Status code of the response. + */ + public MockHttpResponse(HttpRequest request, int statusCode) { + this(request, statusCode, BinaryData.empty()); + } + + /** + * Creates an HTTP response associated with a {@code request}, returns the {@code statusCode}, and response body of + * {@code bodyBytes}. + * + * @param request HttpRequest associated with the response. + * @param statusCode Status code of the response. + * @param body Contents of the response. + */ + public MockHttpResponse(HttpRequest request, int statusCode, BinaryData body) { + this(request, statusCode, new HttpHeaders(), body); + } + + /** + * Creates an HTTP response associated with a {@code request}, returns the {@code statusCode}, and http headers. + * + * @param request HttpRequest associated with the response. + * @param statusCode Status code of the response. + * @param headers Headers of the response. + */ + public MockHttpResponse(HttpRequest request, int statusCode, HttpHeaders headers) { + this(request, statusCode, headers, BinaryData.empty()); + } + + /** + * Creates an HTTP response associated with a {@code request}, returns the {@code statusCode}, contains the + * {@code headers}, and response body of {@code bodyBytes}. + * + * @param request HttpRequest associated with the response. + * @param statusCode Status code of the response. + * @param headers HttpHeaders of the response. + * @param body Contents of the response. + */ + public MockHttpResponse(HttpRequest request, int statusCode, HttpHeaders headers, BinaryData body) { + super(request, statusCode, headers, body); + } + + /** + * Creates an HTTP response associated with a {@code request}, returns the {@code statusCode}, and response body + * that is JSON serialized from {@code serializable}. + * + * @param request HttpRequest associated with the response. + * @param statusCode Status code of the response. + * @param serializable Contents to be serialized into JSON for the response. + */ + public MockHttpResponse(HttpRequest request, int statusCode, Object serializable) { + this(request, statusCode, new HttpHeaders(), serialize(serializable)); + } + + private static BinaryData serialize(Object serializable) { + if (serializable == null) { + return null; + } + + return BinaryData.fromObject(serializable, SERIALIZER); + } +} diff --git a/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceServiceVersion.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java similarity index 95% rename from sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceServiceVersion.java rename to sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java index f30e930302ab4..f5c9ab2b168a4 100644 --- a/sdk/clientcore/core/src/main/java/io/clientcore/core/TestInterfaceServiceVersion.java +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.core; +package io.clientcore.tools.codegen; import io.clientcore.core.http.models.ServiceVersion; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java new file mode 100644 index 0000000000000..494f81894b24e --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.tools.codegen.implementation; + +import io.clientcore.core.annotation.ServiceInterface; +import io.clientcore.core.http.annotation.HttpRequestInformation; +import io.clientcore.core.http.models.HttpMethod; +import io.clientcore.core.http.pipeline.HttpPipeline; +import io.clientcore.core.util.serializer.ObjectSerializer; +import io.clientcore.tools.codegen.TestInterfaceServiceVersion; + +import java.lang.reflect.InvocationTargetException; + +@ServiceInterface(name = "myService", host = "https://somecloud.com") +public interface TestInterfaceClientService { + static TestInterfaceClientService getInstance(HttpPipeline pipeline, ObjectSerializer serializer, + TestInterfaceServiceVersion serviceVersion) { + if (pipeline == null) { + throw new IllegalArgumentException("pipeline cannot be null"); + } + try { + Class clazz = Class.forName("io.clientcore.tools.codegen.implementation.TestInterfaceClientServiceImpl"); + return (TestInterfaceClientService) clazz + .getMethod("getInstance", HttpPipeline.class, ObjectSerializer.class, TestInterfaceServiceVersion.class) + .invoke(null, pipeline, serializer, serviceVersion); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException + | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + static void reset() { + try { + Class clazz = Class.forName("io.clientcore.tools.codegen.implementation.TestInterfaceClientServiceImpl"); + clazz.getMethod("reset").invoke(null); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException + | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + @HttpRequestInformation(method = HttpMethod.HEAD, path = "my/uri/path", expectedStatusCodes = { 200 }) + void testHeadMethod(); +} diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java new file mode 100644 index 0000000000000..caf1a319c64d2 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.tools.codegen.implementation; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java new file mode 100644 index 0000000000000..1b5aa48fca819 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing the implementation of the code generation. + */ +package io.clientcore.tools.codegen; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java new file mode 100644 index 0000000000000..7802e79981f39 --- /dev/null +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package io.clientcore.tools.codegen; + +import io.clientcore.core.http.client.HttpClient; +import io.clientcore.core.http.models.HttpHeaderName; +import io.clientcore.core.http.models.HttpMethod; +import io.clientcore.core.http.models.HttpRequest; +import io.clientcore.core.http.models.Response; +import io.clientcore.core.http.pipeline.HttpPipeline; +import io.clientcore.core.http.pipeline.HttpPipelineBuilder; +import io.clientcore.tools.codegen.implementation.TestInterfaceClientService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Test class for the generated client service implementation. + */ +public class TestInterfaceClientServiceImplGenerationTest { + + @BeforeEach + public void resetState() { + TestInterfaceClientService.reset(); + } + + @Test + public void testGetInstance() { + HttpClient client = new LocalHttpClient(); + HttpPipeline pipeline = new HttpPipelineBuilder().httpClient(client).build(); + + TestInterfaceClientService testInterface = TestInterfaceClientService.getInstance(pipeline, null, null); + assertNotNull(testInterface); + } + + private static final class LocalHttpClient implements HttpClient { + private volatile HttpRequest lastHttpRequest; + private volatile boolean closeCalledOnResponse; + + @Override + public Response send(HttpRequest request) { + lastHttpRequest = request; + boolean success = request.getUri().getPath().equals("/my/uri/path"); + + if (request.getHttpMethod().equals(HttpMethod.POST)) { + success &= "application/json".equals(request.getHeaders().getValue(HttpHeaderName.CONTENT_TYPE)); + } else { + success &= request.getHttpMethod().equals(HttpMethod.GET) + || request.getHttpMethod().equals(HttpMethod.HEAD); + } + + return new MockHttpResponse(request, success ? 200 : 400) { + @Override + public void close() throws IOException { + closeCalledOnResponse = true; + + super.close(); + } + }; + } + + public HttpRequest getLastHttpRequest() { + return lastHttpRequest; + } + } + +} diff --git a/sdk/clientcore/tools/annotation-processor/pom.xml b/sdk/clientcore/tools/annotation-processor/pom.xml index 47715a3d5869f..420e4433d7e7a 100644 --- a/sdk/clientcore/tools/annotation-processor/pom.xml +++ b/sdk/clientcore/tools/annotation-processor/pom.xml @@ -56,12 +56,6 @@ HEAD - - 8 - 8 - ${project.build.directory} - - com.squareup diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java index a8b05d1ad87f8..2f9979ae72de7 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java @@ -36,6 +36,9 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -44,9 +47,13 @@ import java.util.Set; import java.util.stream.Collectors; +/** + * Annotation processor that generates client code based on annotated interfaces. + */ @SupportedAnnotationTypes("io.clientcore.core.annotation.*") @SupportedSourceVersion(SourceVersion.RELEASE_17) public class AnnotationProcessor extends AbstractProcessor { + @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { // We iterate through each interface annotated with @ServiceInterface separately. @@ -65,7 +72,6 @@ public boolean process(Set annotations, RoundEnvironment return true; } - private void processServiceInterface(Element serviceInterface) { if (serviceInterface == null || serviceInterface.getKind() != ElementKind.INTERFACE) { throw new IllegalArgumentException("Invalid service interface provided."); @@ -150,9 +156,8 @@ private HttpRequestContext createHttpRequestContext(ExecutableElement requestMet method.setExpectedStatusCodes(httpRequestInfo.expectedStatusCodes()); // Add return type as an import - String returnTypeShortName = templateInput.addImport(requestMethod.getReturnType()); - method.setMethodReturnType(returnTypeShortName); - + setReturnTypeFormMethod(method, requestMethod, templateInput); + boolean isEncoded = false; // Process parameters for (VariableElement param : requestMethod.getParameters()) { // Cache annotations for each parameter @@ -169,6 +174,9 @@ private HttpRequestContext createHttpRequestContext(ExecutableElement requestMet param.getSimpleName().toString(), hostParam.encoded())); } else if (pathParam != null) { + if (pathParam.encoded()) { + isEncoded = true; + } method.addSubstitution(new Substitution( pathParam.value(), param.getSimpleName().toString(), @@ -191,14 +199,65 @@ private HttpRequestContext createHttpRequestContext(ExecutableElement requestMet } // Pre-compute host substitutions - method.setHost(getHost(templateInput, method)); + method.setHost(getHost(templateInput, method, isEncoded)); return method; } - private static String getHost(TemplateInput templateInput, HttpRequestContext method) { - String rawHost = templateInput.getHost() + method.getPath(); + private void setReturnTypeFormMethod(HttpRequestContext method, ExecutableElement requestMethod, + TemplateInput templateInput) { + // Get the return type from the method + TypeMirror returnType = requestMethod.getReturnType(); + + // If the return type is a declared type (e.g., Response) + if (returnType.getKind() == TypeKind.DECLARED) { + DeclaredType declaredType = (DeclaredType) returnType; + TypeElement typeElement = (TypeElement) declaredType.asElement(); + String fullTypeName = typeElement.getQualifiedName().toString(); + + + // Handle generic arguments for declared types + List typeArguments = declaredType.getTypeArguments(); + if (!typeArguments.isEmpty()) { + StringBuilder typeWithArguments = new StringBuilder(fullTypeName); + typeWithArguments.append("<"); + + for (int i = 0; i < typeArguments.size(); i++) { + TypeMirror typeArgument = typeArguments.get(i); + // Add the type argument to the final type string + typeWithArguments.append(typeArgument.toString()); + if (i < typeArguments.size() - 1) { + typeWithArguments.append(", "); + } + } + typeWithArguments.append(">"); + method.setMethodReturnType(typeWithArguments.toString()); + } else { + // If no generic arguments, set the return type to the base type + method.setMethodReturnType(fullTypeName); + } + } else { + // For non-declared types (simple types like String, int, etc.) + String returnTypeShortName = templateInput.addImport(requestMethod.getReturnType()); + method.setMethodReturnType(returnTypeShortName); + } + + } + + private static String getHost(TemplateInput templateInput, HttpRequestContext method, boolean isEncoded) { + String rawHost; + if (isEncoded) { + rawHost = method.getPath(); + } else { + String host = templateInput.getHost(); + String path = method.getPath(); + if (!host.endsWith("/") && !path.startsWith("/")) { + rawHost = host + "/" + path; + } else { + rawHost = host + path; + } + } return PathBuilder.buildPath(rawHost, method); } } diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java index 8b7794de0083b..756e48c149bd5 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java @@ -3,9 +3,6 @@ package io.clientcore.tools.codegen.templating; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.TemplateInput; -import io.clientcore.tools.codegen.utils.ResponseBodyModeGeneration; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.JavaFile; @@ -15,29 +12,44 @@ import com.squareup.javapoet.TypeSpec; import io.clientcore.core.http.models.ContentType; import io.clientcore.core.http.models.HttpHeaderName; +import io.clientcore.core.http.models.HttpHeaders; import io.clientcore.core.http.models.HttpMethod; +import io.clientcore.core.http.models.HttpRequest; +import io.clientcore.core.http.models.Response; +import io.clientcore.core.http.pipeline.HttpPipeline; +import io.clientcore.core.implementation.util.JsonSerializer; +import io.clientcore.core.instrumentation.logging.ClientLogger; import io.clientcore.core.util.binarydata.BinaryData; import io.clientcore.core.util.serializer.ObjectSerializer; +import io.clientcore.tools.codegen.models.HttpRequestContext; +import io.clientcore.tools.codegen.models.TemplateInput; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Modifier; import java.io.IOException; -import java.io.UncheckedIOException; import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Modifier; +import static io.clientcore.tools.codegen.utils.ResponseBodyModeGeneration.generateResponseHandling; + +/** + * This class generates the implementation of the service interface. + */ public class JavaPoetTemplateProcessor implements TemplateProcessor { - private static final ClassName HTTP_HEADER_NAME = ClassName.get("io.clientcore.core.http.models", "HttpHeaderName"); - private static final ClassName CONTENT_TYPE = ClassName.get("io.clientcore.core.http.models", "ContentType"); + private static final ClassName HTTP_HEADER_NAME = ClassName.bestGuess(HttpHeaderName.class.getName()); + private static final ClassName HTTP_HEADERS = ClassName.bestGuess(HttpHeaders.class.getName()); + private static final ClassName CONTENT_TYPE = ClassName.bestGuess(ContentType.class.getName()); - private final ClassName HTTP_REQUEST = ClassName.get("io.clientcore.core.http.models", "HttpRequest"); - private final ClassName RESPONSE = ClassName.get("io.clientcore.core.http" + - ".models", "Response"); - private final ClassName HTTP_METHOD = ClassName.get("io.clientcore.core.http.models", "HttpMethod"); + private final ClassName HTTP_REQUEST = ClassName.bestGuess(HttpRequest.class.getName()); + private final ClassName RESPONSE = ClassName.bestGuess(Response.class.getName()); + private final ClassName HTTP_METHOD = ClassName.bestGuess(HttpMethod.class.getName()); private TypeSpec.Builder classBuilder; - final ClassName HTTP_PIPELINE = ClassName.get("io.clientcore.core.http.pipeline", "HttpPipeline"); - static ClassName SERVICE_VERSION_TYPE; - final ClassName CLIENTLOGGER_NAME = ClassName.get("io.clientcore.core.instrumentation.logging", "ClientLogger"); + + private final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); + private static ClassName SERVICE_VERSION_TYPE; + private final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); + private ClassName OBJECT_SERIALIZER = ClassName.bestGuess(ObjectSerializer.class.getName()); @Override public void process(TemplateInput templateInput, ProcessingEnvironment processingEnv) { @@ -60,41 +72,64 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin .build(); // Create the endpoint field - FieldSpec endpoint = FieldSpec.builder(String.class, "endpoint", Modifier.PRIVATE, Modifier.FINAL) - .build(); + //FieldSpec endpoint = FieldSpec.builder(String.class, "endpoint", Modifier.PRIVATE, Modifier.FINAL) + // .build(); // Create the serviceVersion field - ClassName serviceVersionType = getServiceVersionType(packageName, serviceInterfaceShortName); + String serviceVersionPackageName = packageName.substring(0, packageName.lastIndexOf(".")); + SERVICE_VERSION_TYPE = ClassName.get(serviceVersionPackageName, serviceInterfaceShortName.substring(0, serviceInterfaceShortName.indexOf("ClientService")) + "ServiceVersion"); FieldSpec serviceVersion = - FieldSpec.builder(serviceVersionType, "serviceVersion", Modifier.PRIVATE, Modifier.FINAL) - .build(); + FieldSpec.builder(SERVICE_VERSION_TYPE, "serviceVersion", Modifier.PRIVATE).build(); // Create the constructor - MethodSpec constructor = getServiceImplConstructor(packageName, serviceInterfaceShortName); + MethodSpec constructor = getServiceImplConstructor(); FieldSpec apiVersion = FieldSpec.builder(String.class, "apiVersion") .addModifiers(Modifier.PRIVATE) .build(); + // Add instance field + FieldSpec instanceField = FieldSpec.builder(ClassName.get(packageName, serviceInterfaceImplShortName), + "instance", Modifier.PRIVATE, Modifier.STATIC).build(); + + // Add the static getInstance method + MethodSpec getInstanceMethod = MethodSpec.methodBuilder("getInstance") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.SYNCHRONIZED) + .returns(ClassName.get(packageName, serviceInterfaceImplShortName)) + .addParameter(HTTP_PIPELINE, "pipeline") + .addParameter(OBJECT_SERIALIZER, "serializer") + .addParameter(SERVICE_VERSION_TYPE, "serviceVersion") + .beginControlFlow("if (instance == null)") + .addStatement("instance = new $T(pipeline, serializer, serviceVersion)", ClassName.get(packageName, serviceInterfaceImplShortName)) + .endControlFlow() + .addStatement("return instance") + .build(); + + // Add reset instance method + MethodSpec resetInstanceMethod = MethodSpec.methodBuilder("reset") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.SYNCHRONIZED) + .addStatement("instance = null") + .build(); + classBuilder = TypeSpec.classBuilder(serviceInterfaceImplShortName) .addModifiers(Modifier.PUBLIC) .addSuperinterface(interfaceType) .addField(loggerField) .addField(defaultPipeline) .addField(serializer) - .addField(endpoint) .addField(serviceVersion) .addField(apiVersion) - .addMethod(getEndpointMethod()) .addMethod(getPipelineMethod()) .addMethod(getServiceVersionMethod()) - .addMethod(constructor); + .addMethod(constructor) + .addField(instanceField) + .addMethod(getInstanceMethod) + .addMethod(resetInstanceMethod); getGeneratedServiceMethods(templateInput); TypeSpec typeSpec = classBuilder.build(); - // Sets the indentation for the generated source file to four spaces. JavaFile javaFile = JavaFile.builder(packageName, typeSpec) .indent(" ") // four spaces .build(); @@ -108,30 +143,34 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin void getGeneratedServiceMethods(TemplateInput templateInput) { for (HttpRequestContext method : templateInput.getHttpRequestContexts()) { - classBuilder.addMethod(generatePublicMethod(method)); - generateInternalMethod(method); + boolean generateInternalOnly = method.getParameters().isEmpty() || method.getParameters().stream() + .anyMatch(parameter -> !(parameter.getName().equals("endpoint") || parameter.getName().equals("apiVersion"))); + + if (generateInternalOnly) { + generateInternalMethod(method); // Generate the internal method + } else { + classBuilder.addMethod(generatePublicMethod(method)); + generateInternalMethod(method); + } } } FieldSpec getLoggerField(String packageName, String serviceInterfaceShortName) { - return FieldSpec.builder(CLIENTLOGGER_NAME, "LOGGER", Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) - .initializer("new $T($T.class)", CLIENTLOGGER_NAME, ClassName.get(packageName, serviceInterfaceShortName)) + return FieldSpec.builder(CLIENT_LOGGER_NAME, "LOGGER", Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL) + .initializer("new $T($T.class)", CLIENT_LOGGER_NAME, ClassName.get(packageName, serviceInterfaceShortName)) .build(); } - MethodSpec getServiceImplConstructor(String packageName, String serviceInterfaceShortName) { + MethodSpec getServiceImplConstructor() { return MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC) .addParameter(HTTP_PIPELINE, "defaultPipeline") .addStatement("this.defaultPipeline = defaultPipeline") - .addParameter(ClassName.get("io.clientcore.core.util.serializer", "ObjectSerializer"), "serializer") - .addStatement("this.serializer = serializer") - .addParameter(String.class, "endpoint") - .addStatement("this.endpoint = endpoint") - .addParameter(getServiceVersionType(packageName, serviceInterfaceShortName), - "serviceVersion") - .addStatement("this.apiVersion = serviceVersion.getVersion()") - .addStatement("this.serviceVersion = serviceVersion") + .addParameter(OBJECT_SERIALIZER, "serializer") + .addParameter(SERVICE_VERSION_TYPE, "serviceVersion") + .addStatement("this.serializer = serializer == null ? new $T() : serializer", JsonSerializer.class) + .addStatement("this.serviceVersion = serviceVersion == null ? $T.getLatest() : serviceVersion", SERVICE_VERSION_TYPE) + .addStatement("this.apiVersion = this.serviceVersion.getVersion()") .build(); } @@ -198,33 +237,45 @@ MethodSpec generatePublicMethod(HttpRequestContext method) { private void generateInternalMethod(HttpRequestContext method) { TypeName returnTypeName = inferTypeNameFromReturnType(method.getMethodReturnType()); - MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(method.getMethodName()) - .addModifiers(Modifier.PRIVATE) - .addAnnotation(Override.class) + MethodSpec.Builder methodBuilder = createMethodBuilder(method, returnTypeName); + + addMethodParameters(methodBuilder, method); + initializeHttpRequest(methodBuilder, method); + addHeadersToRequest(methodBuilder, method); + addRequestBody(methodBuilder, method); + + finalizeHttpRequest(methodBuilder, returnTypeName, method); + + classBuilder.addMethod(methodBuilder.build()); + } + + // Helper methods + private MethodSpec.Builder createMethodBuilder(HttpRequestContext method, TypeName returnTypeName) { + return MethodSpec.methodBuilder(method.getMethodName()) + .addModifiers(Modifier.PUBLIC) .returns(returnTypeName); + } - // add method parameters, as well as the HttpPipeline at the front + private void addMethodParameters(MethodSpec.Builder methodBuilder, HttpRequestContext method) { for (HttpRequestContext.MethodParameter parameter : method.getParameters()) { methodBuilder.addParameter(TypeName.get(parameter.getTypeMirror()), parameter.getName()); } - - // add field pipeline methodBuilder.addStatement("HttpPipeline pipeline = this.getPipeline()"); + } - methodBuilder - .addStatement("String host = $L", method.getHost()) + private void initializeHttpRequest(MethodSpec.Builder methodBuilder, HttpRequestContext method) { + methodBuilder.addStatement("String host = $L", method.getHost()) .addCode("\n") - .addComment("create the request") - .addStatement("$T httpRequest = new $T($T.$L, host)", HTTP_REQUEST, HTTP_REQUEST, HTTP_METHOD, - method.getHttpMethod()); + .addComment("Create the HTTP request") + .addStatement("$T httpRequest = new $T($T.$L, host)", HTTP_REQUEST, HTTP_REQUEST, HTTP_METHOD, method.getHttpMethod()); + } - // add headers + private void addHeadersToRequest(MethodSpec.Builder methodBuilder, HttpRequestContext method) { if (!method.getHeaders().isEmpty()) { methodBuilder .addCode("\n") .addComment("set the headers") - .addStatement("$T headers = new $T()", ClassName.get("io.clientcore.core.http.models", "HttpHeaders"), - ClassName.get("io.clientcore.core.http.models", "HttpHeaders")); + .addStatement("$T headers = new $T()", HTTP_HEADERS, HTTP_HEADERS); for (Map.Entry header : method.getHeaders().entrySet()) { String enumHeaderKey = header.getKey().toUpperCase().replace("-", "_"); boolean isEnumExists = false; @@ -234,53 +285,52 @@ private void generateInternalMethod(HttpRequestContext method) { break; } } + + boolean isStringType = method.getParameters().stream() + .anyMatch(parameter -> parameter.getName().equals(header.getValue()) && TypeName.get(parameter.getTypeMirror()).equals(TypeName.get(String.class))); + String value = isStringType ? header.getValue() : "String.valueOf(" + header.getValue() + ")"; + if (isEnumExists) { - methodBuilder.addStatement("headers.add($T.$L, $L)", - HTTP_HEADER_NAME, enumHeaderKey, header.getValue()); + methodBuilder.addStatement("headers.add($T.$L, $L)", HTTP_HEADER_NAME, enumHeaderKey, value); } else { - methodBuilder.addStatement("headers.add($T.fromString($S), $L)", - HTTP_HEADER_NAME, header.getKey(), header.getValue()); + methodBuilder.addStatement("headers.add($T.fromString($S), $L)", HTTP_HEADER_NAME, header.getKey(), value); } } - methodBuilder.addStatement("httpRequest.setHeaders(headers)"); } + } - methodBuilder - .addCode("\n") - .addComment("add RequestOptions to the request") - .addStatement("httpRequest.setRequestOptions(requestOptions)"); - - // [TODO] set SSE listener if available + private void addRequestBody(MethodSpec.Builder methodBuilder, HttpRequestContext method) { + methodBuilder.addCode("\n").addComment("Set the request body"); + HttpRequestContext.Body body = method.getBody(); + boolean isContentTypeSetInHeaders = method.getParameters().stream() + .anyMatch(parameter -> parameter.getName().equals("contentType")); - // set the body - methodBuilder - .addCode("\n") - .addComment("set the body content if present"); - if (method.getBody() != null) { - HttpRequestContext.Body body = method.getBody(); - String contentType = body.getContentType(); - String parameterType = body.getParameterType(); - String parameterName = body.getParameterName(); - - configureRequestWithBodyAndContentType(methodBuilder, parameterType, contentType, parameterName); + if (body != null) { + configureRequestWithBodyAndContentType(methodBuilder, body.getParameterType(), body.getContentType(), + body.getParameterName(), isContentTypeSetInHeaders); } else { - methodBuilder - .addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S)", HttpHeaderName.class, "0"); - methodBuilder.addComment("no body content to set"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S)", HttpHeaderName.class, "0"); } + } - // send request through pipeline - methodBuilder - .addCode("\n") - .addComment("send the request through the pipeline") + private void finalizeHttpRequest(MethodSpec.Builder methodBuilder, TypeName returnTypeName, HttpRequestContext method) { + methodBuilder.addCode("\n").addComment("Send the request through the pipeline") .addStatement("$T response = pipeline.send(httpRequest)", RESPONSE); - // check for expected status codes + if (!method.getExpectedStatusCodes().isEmpty()) { + validateResponseStatus(methodBuilder, method); + } + + // requestOptions is not used in the generated code for RestProxyTests + generateResponseHandling(methodBuilder, returnTypeName, false); + } + + private void validateResponseStatus(MethodSpec.Builder methodBuilder, HttpRequestContext method) { if (!method.getExpectedStatusCodes().isEmpty()) { methodBuilder .addCode("\n") - .addStatement("final int responseCode = response.getStatusCode()"); + .addStatement("int responseCode = response.getStatusCode()"); if (method.getExpectedStatusCodes().size() == 1) { methodBuilder.addStatement("boolean expectedResponse = responseCode == $L", method.getExpectedStatusCodes().get(0)); @@ -294,71 +344,9 @@ private void generateInternalMethod(HttpRequestContext method) { .addStatement("throw new $T(\"Unexpected response code: \" + responseCode)", RuntimeException.class) .endControlFlow(); } - - // add return statement if method return type is not "void" - if (returnTypeName.toString().contains("void") && returnTypeName.toString().contains("Void")) { - methodBuilder.addStatement("return"); - } else if (returnTypeName.toString().contains("Response")) { - if (returnTypeName.toString().contains("Void")) { - methodBuilder.beginControlFlow("try") - .addStatement("response.close()") - .nextControlFlow("catch ($T e)", IOException.class) - .addStatement("throw LOGGER.logThrowableAsError(new $T(e))", UncheckedIOException.class) - .endControlFlow(); - createResponseIfNecessary(returnTypeName, methodBuilder); - } else { - // Step 1: Generate ResponseBodyMode assignment - ResponseBodyModeGeneration.generateResponseBodyModeAssignment(methodBuilder); - - // Step 2: Generate DESERIALIZE handling - ResponseBodyModeGeneration.generateDeserializeResponseHandling(methodBuilder); - - // Step 3: Generate non-DESERIALIZE handling - ResponseBodyModeGeneration.generateNonDeserializeResponseHandling(methodBuilder); - - // Step 4: Create the response if necessary - createResponseIfNecessary(returnTypeName, methodBuilder); - } - } else { - handleResponseModeToCreateResponse(method, returnTypeName, methodBuilder); - } - - classBuilder.addMethod(methodBuilder.build()); } - private static void createResponseIfNecessary(TypeName returnTypeName, MethodSpec.Builder methodBuilder) { - // TODO: Fix me - methodBuilder.addStatement("return ($T) response", returnTypeName); - } - - private static void handleResponseModeToCreateResponse(HttpRequestContext method, TypeName returnTypeName, - MethodSpec.Builder methodBuilder) { - HttpMethod httpMethod = method.getHttpMethod(); - if (httpMethod == HttpMethod.HEAD && - (returnTypeName.toString().contains("Boolean") || returnTypeName.toString().contains("boolean"))) { - methodBuilder.addStatement("return (responseCode / 100) == 2"); - } else if (returnTypeName.toString().contains("byte[]")) { - methodBuilder - .addStatement("$T responseBody = response.getBody()", BinaryData.class) - .addStatement("byte[] responseBodyBytes = responseBody != null ? responseBody.toBytes() : null") - .addStatement( - "return responseBodyBytes != null ? (responseBodyBytes.length == 0 ? null : responseBodyBytes) : null"); - } else if (returnTypeName.toString().contains("InputStream")) { - methodBuilder - .addStatement("$T responseBody = response.getBody()", BinaryData.class) - .addStatement("return responseBody.toStream()"); - } else if (returnTypeName.toString().contains("BinaryData")) { - methodBuilder - .addStatement("$T responseBody = response.getBody()", BinaryData.class); - } else { - methodBuilder - .addStatement("$T responseBody = response.getBody()", BinaryData.class) - .addStatement("return decodeByteArray(responseBody.toBytes(), response, serializer, methodParser)"); - } - } - - public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuilder, String parameterType, - String contentType, String parameterName) { + public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuilder, String parameterType, String contentType, String parameterName, boolean isContentTypeSetInHeaders) { if (parameterType == null) { // No body content to set methodBuilder @@ -374,7 +362,10 @@ public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuil contentType = ContentType.APPLICATION_JSON; } } - setContentTypeHeader(methodBuilder, contentType); + // Set the content type header if it is not already set in the headers + if (!isContentTypeSetInHeaders) { + setContentTypeHeader(methodBuilder, contentType); + } if (parameterType.equals("io.clientcore.core.util.binarydata.BinaryData")) { methodBuilder .addStatement("$T binaryData = ($T) $L", BinaryData.class, BinaryData.class, parameterName) @@ -405,28 +396,28 @@ private static void setContentTypeHeader(MethodSpec.Builder methodBuilder, Strin switch (contentType) { case ContentType.APPLICATION_JSON: methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - ClassName.get("io.clientcore.core.http.models", "HttpHeaderName"), + HTTP_HEADER_NAME, "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_JSON"); break; case ContentType.APPLICATION_OCTET_STREAM: methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - ClassName.get("io.clientcore.core.http.models", "HttpHeaderName"), + HTTP_HEADER_NAME, "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_OCTET_STREAM"); break; case ContentType.APPLICATION_X_WWW_FORM_URLENCODED: methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - ClassName.get("io.clientcore.core.http.models", "HttpHeaderName"), + HTTP_HEADER_NAME, "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_X_WWW_FORM_URLENCODED"); break; case ContentType.TEXT_EVENT_STREAM: methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - ClassName.get("io.clientcore.core.http.models", "HttpHeaderName"), + HTTP_HEADER_NAME, "CONTENT_TYPE", CONTENT_TYPE, "TEXT_EVENT_STREAM"); @@ -474,6 +465,9 @@ private void updateRequestWithBodyContent(MethodSpec.Builder methodBuilder, bool * Get a TypeName for a parameterized type, given the raw type and type arguments as Class objects. */ private static TypeName inferTypeNameFromReturnType(String typeString) { + if (typeString == null) { + return TypeName.VOID; + } // Split the string into raw type and type arguments int angleBracketIndex = typeString.indexOf('<'); if (angleBracketIndex == -1) { diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java index cb15935bffeba..820e6724f5cee 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java @@ -7,6 +7,9 @@ import javax.annotation.processing.ProcessingEnvironment; +/** + * Interface for processing templates. + */ public interface TemplateProcessor { static TemplateProcessor getInstance() { return new JavaPoetTemplateProcessor(); diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java index 5877213caf671..e0908f25fd4d7 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java @@ -11,6 +11,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * This class is responsible for building the path of the request URL by replacing the placeholders with the actual + */ public class PathBuilder { // this class takes a 'raw host' string that contains {} delimited parameters, and needs to convert it into a // Java string concatenation that can be used in the generated code. For example, the raw host string: diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java index 187f4d57ce91c..6349b61a5bf46 100644 --- a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java +++ b/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java @@ -4,36 +4,150 @@ package io.clientcore.tools.codegen.utils; import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.TypeName; import io.clientcore.core.http.models.HttpResponse; import io.clientcore.core.http.models.ResponseBodyMode; import io.clientcore.core.implementation.http.HttpResponseAccessHelper; import io.clientcore.core.util.binarydata.BinaryData; +import java.io.IOException; +import java.io.UncheckedIOException; -/* +/** * Utility class to generate response body mode assignment and response handling based on the response body mode. */ public class ResponseBodyModeGeneration { - public static void generateResponseBodyModeAssignment(MethodSpec.Builder methodBuilder) { - methodBuilder.addStatement("$T responseBodyMode = null", ResponseBodyMode.class) - .beginControlFlow("if (requestOptions != null)") - .addStatement("responseBodyMode = requestOptions.getResponseBodyMode()") - .endControlFlow(); + + /** + * Generates response body mode assignment based on request options and return type. + * + * @param methodBuilder the method builder to append generated code. + * @param returnTypeName the return type of the method. + * @param useRequestOptions whether request options are used. + */ + public static void generateResponseBodyMode(MethodSpec.Builder methodBuilder, TypeName returnTypeName, + boolean useRequestOptions) { + methodBuilder.addStatement("$T responseBodyMode = null", ResponseBodyMode.class); + + // Assign responseBodyMode based on request options. + // TODO: Temporary fix for TestInterface + if (useRequestOptions) { + methodBuilder.beginControlFlow( + "if (requestOptions != null && requestOptions.getResponseBodyMode() != null)") + .addStatement("responseBodyMode = requestOptions.getResponseBodyMode()") + .endControlFlow(); + } + + // Fallback to assignment based on return type if responseBodyMode is still null. + methodBuilder.beginControlFlow("if (responseBodyMode == null)"); + if (returnTypeName.toString().contains("InputStream")) { + methodBuilder.addStatement("responseBodyMode = $T.STREAM", ResponseBodyMode.class); + } else if (returnTypeName.toString().contains("byte[]")) { + methodBuilder.addStatement("responseBodyMode = $T.BYTES", ResponseBodyMode.class); + } else if (returnTypeName.toString().contains("BinaryData")) { + methodBuilder.addStatement("responseBodyMode = $T.IGNORE", ResponseBodyMode.class); + } else { + methodBuilder.addStatement("responseBodyMode = $T.DESERIALIZE", ResponseBodyMode.class); + } + methodBuilder.endControlFlow(); } - public static void generateDeserializeResponseHandling(MethodSpec.Builder methodBuilder) { + /** + * Handles deserialization response mode logic. + * + * @param methodBuilder the method builder to append generated code. + */ + public static void handleDeserializeResponse(MethodSpec.Builder methodBuilder) { methodBuilder.beginControlFlow("if (responseBodyMode == $T.DESERIALIZE)", ResponseBodyMode.class) .addStatement("$T responseBody = response.getBody()", BinaryData.class) - .addStatement("$T.setValue(($T) response, responseBody)", - HttpResponseAccessHelper.class, HttpResponse.class) - .endControlFlow(); + .addStatement("$T.setValue(($T) response, responseBody)", HttpResponseAccessHelper.class, + HttpResponse.class); } - public static void generateNonDeserializeResponseHandling(MethodSpec.Builder methodBuilder) { + /** + * Handles non-deserialization response mode logic. + * + * @param methodBuilder the method builder to append generated code. + */ + public static void handleNonDeserializeResponse(MethodSpec.Builder methodBuilder) { methodBuilder.nextControlFlow("else") .addStatement("$T responseBody = response.getBody()", BinaryData.class) .addStatement("$T.setBodyDeserializer(($T) response, (body) -> responseBody)", HttpResponseAccessHelper.class, HttpResponse.class) .endControlFlow(); } + + /** + * Handles the generation of the complete response processing flow based on the return type. + * + * @param methodBuilder the method builder to append generated code. + * @param returnTypeName the return type of the method. + * @param useRequestOptions whether request options are used. + */ + public static void generateResponseHandling(MethodSpec.Builder methodBuilder, TypeName returnTypeName, + boolean useRequestOptions) { + if (returnTypeName.toString().equals("void")) { + closeResponse(methodBuilder); + methodBuilder.addStatement("return"); + } else if (returnTypeName.toString().equals("java.lang.Void")) { + closeResponse(methodBuilder); + // TODO: Fix whole namespace return type + methodBuilder.addStatement("return null"); + } else if (returnTypeName.toString().contains("Response")) { + if (returnTypeName.toString().contains("Void")) { + closeResponse(methodBuilder); + createResponseIfNecessary(returnTypeName, methodBuilder); + } else { + generateResponseBodyMode(methodBuilder, returnTypeName, useRequestOptions); + handleDeserializeResponse(methodBuilder); + handleNonDeserializeResponse(methodBuilder); + createResponseIfNecessary(returnTypeName, methodBuilder); + } + } else { + handleResponseModeToCreateResponse(returnTypeName, methodBuilder); + } + } + + private static void closeResponse(MethodSpec.Builder methodBuilder) { + methodBuilder.beginControlFlow("try") + .addStatement("response.close()") + .nextControlFlow("catch ($T e)", IOException.class) + .addStatement("throw LOGGER.logThrowableAsError(new $T(e))", UncheckedIOException.class) + .endControlFlow(); + } + + /** + * Adds a return statement for response handling when necessary. + * + * @param returnTypeName the return type of the method. + * @param methodBuilder the method builder to append generated code. + */ + public static void createResponseIfNecessary(TypeName returnTypeName, MethodSpec.Builder methodBuilder) { + methodBuilder.addStatement("return ($T) response", returnTypeName); + } + + /** + * Handles different response processing modes based on the return type and method. + * + * @param returnTypeName the return type of the method. + * @param methodBuilder the method builder to append generated code. + */ + public static void handleResponseModeToCreateResponse(TypeName returnTypeName, MethodSpec.Builder methodBuilder) { + if (returnTypeName.toString().contains("Boolean") || returnTypeName.toString().contains("boolean")) { + methodBuilder.addStatement("return (response.getStatusCode() / 100) == 2"); + } else if (returnTypeName.toString().contains("byte[]")) { + methodBuilder.addStatement("$T responseBody = response.getBody()", BinaryData.class) + .addStatement("byte[] responseBodyBytes = responseBody != null ? responseBody.toBytes() : null") + .addStatement( + "return responseBodyBytes != null ? (responseBodyBytes.length == 0 ? null : responseBodyBytes) : null"); + } else if (returnTypeName.toString().contains("InputStream")) { + methodBuilder.addStatement("$T responseBody = response.getBody()", BinaryData.class) + .addStatement("return responseBody.toStream()"); + } else if (returnTypeName.toString().contains("BinaryData")) { + methodBuilder.addStatement("$T responseBody = response.getBody()", BinaryData.class); + } else { + methodBuilder.addStatement("$T responseBody = response.getBody()", BinaryData.class) + .addStatement("return decodeByteArray(responseBody.toBytes(), response, serializer, methodParser)"); + } + } } diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java index d2efb5dcb83d7..ce8de3ebc4d7e 100644 --- a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java +++ b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java @@ -3,15 +3,16 @@ package io.clientcore.tools.codegen.templating; -import io.clientcore.tools.codegen.models.HttpRequestContext; import com.squareup.javapoet.MethodSpec; -import java.util.stream.Stream; +import io.clientcore.tools.codegen.models.HttpRequestContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.util.stream.Stream; + import static org.junit.jupiter.api.Assertions.assertTrue; public class BodyContentTypeProcessorTest { @@ -43,7 +44,7 @@ public void bodyParamAnnotationPriorityOverContentTypeHeaderTest() { MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("testMethod"); processor.configureRequestWithBodyAndContentType(methodBuilder, body.getParameterType(), body.getContentType(), - body.getParameterName()); + body.getParameterName(), false); MethodSpec methodSpec = methodBuilder.build(); // Expected output @@ -63,7 +64,7 @@ public void bodyParamAnnotationPriorityOverContentTypeHeaderTest() { public void testConfigureRequestWithBodyAndParameterType(HttpRequestContext.Body body, String expectedOutput) { MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("testMethod"); processor.configureRequestWithBodyAndContentType(methodBuilder, body.getParameterType(), body.getContentType(), - body.getParameterName()); + body.getParameterName(), false); MethodSpec methodSpec = methodBuilder.build(); // Actual output @@ -82,7 +83,7 @@ public void testConfigureRequestWithBodyAndContentType(String parameterType, Str MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("testMethod"); processor.configureRequestWithBodyAndContentType(methodBuilder, context.getBody().getParameterType(), - context.getBody().getContentType(), context.getBody().getParameterName()); + context.getBody().getContentType(), context.getBody().getParameterName(), false); MethodSpec methodSpec = methodBuilder.build(); // Expected output @@ -96,6 +97,39 @@ public void testConfigureRequestWithBodyAndContentType(String parameterType, Str assertTrue(actualOutput.contains(expectedOutput)); } + @Test + public void contentTypeHeaderPriorityOverBodyParamAnnotationTest() { + // Create a new HttpRequestContext + HttpRequestContext context = new HttpRequestContext(); + byte[] bytes = "hello".getBytes(); + + // Set the body + // BodyParam annotation is set to "application/octet-stream" + context.setBody(new HttpRequestContext.Body("application/octet-stream", "ByteBuffer", "request")); + + // Add headers + // Content-Type header is set to "application/json" + context.addHeader("Content-Type", "application/json"); + context.addHeader("Content-Length", String.valueOf((long) bytes.length)); + HttpRequestContext.Body body = context.getBody(); + + MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("testMethod"); + processor.configureRequestWithBodyAndContentType(methodBuilder, body.getParameterType(), body.getContentType(), + body.getParameterName(), true); + MethodSpec methodSpec = methodBuilder.build(); + + // Expected output + String expectedOutput = + "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes(((ByteBuffer) request).array()));"; + + // Actual output + String actualOutput = methodSpec.toString(); + + assertTrue(actualOutput.contains(expectedOutput)); + // Verify headers in a separate test request content type header is set to application/octet-stream + } + + private static Stream knownContentTypesProvider() { return Stream.of( Arguments.of("byte[]", "io.clientcore.core.http.models.ContentType.APPLICATION_OCTET_STREAM"), diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java index f22f7c492b951..332a13bc05ae5 100644 --- a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java +++ b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java @@ -3,21 +3,24 @@ package io.clientcore.tools.codegen.templating; -import io.clientcore.tools.codegen.models.TemplateInput; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.MethodSpec; +import io.clientcore.core.http.pipeline.HttpPipeline; +import io.clientcore.core.instrumentation.logging.ClientLogger; +import io.clientcore.tools.codegen.models.TemplateInput; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import javax.annotation.processing.Filer; +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Modifier; +import javax.tools.JavaFileObject; import java.io.IOException; import java.io.Writer; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import javax.annotation.processing.Filer; -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Modifier; -import javax.tools.JavaFileObject; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -37,6 +40,8 @@ public class HttpPipelineBuilderMethodTest { private JavaPoetTemplateProcessor processor; private ProcessingEnvironment processingEnv; private TemplateInput templateInput; + private final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); + private final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); @BeforeEach public void setUp() { @@ -81,7 +86,7 @@ public void testGetPipelineMethod() { MethodSpec method = processor.getPipelineMethod(); assertEquals("getPipeline", method.name); assertEquals(Modifier.PUBLIC, method.modifiers.iterator().next()); - assertEquals(processor.HTTP_PIPELINE, method.returnType); + assertEquals(HTTP_PIPELINE, method.returnType); } @Test @@ -99,25 +104,12 @@ public void testGetServiceVersionType() { SERVICE_INTERFACE_SHORT_NAME).toString()); } - @Test - public void testServiceImplConstructorGeneration() { - MethodSpec constructor = processor.getServiceImplConstructor(PACKAGE_NAME, - SERVICE_INTERFACE_SHORT_NAME); - assertEquals(Modifier.PUBLIC, constructor.modifiers.iterator().next()); - assertEquals(4, constructor.parameters.size()); - assertTrue(constructor.code.toString().contains("this.defaultPipeline = defaultPipeline")); - assertTrue(constructor.code.toString().contains("this.serializer = serializer")); - assertTrue(constructor.code.toString().contains("this.endpoint = endpoint")); - assertTrue(constructor.code.toString().contains("this.apiVersion = serviceVersion.getVersion()")); - assertTrue(constructor.code.toString().contains("this.serviceVersion = serviceVersion")); - } - @Test public void testLoggerFieldGeneration() { FieldSpec loggerField = processor.getLoggerField(PACKAGE_NAME, SERVICE_INTERFACE_SHORT_NAME); assertEquals(new HashSet<>(Arrays.asList(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)), loggerField.modifiers); - assertEquals(processor.CLIENTLOGGER_NAME, loggerField.type); + assertEquals(CLIENT_LOGGER_NAME, loggerField.type); assertEquals("LOGGER", loggerField.name); assertTrue(loggerField.initializer.toString().contains("new io.clientcore.core.instrumentation.logging.ClientLogger(com.example.ExampleClientServiceImpl.class)")); } diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java index 418cfc6edcbc0..5f22c40e0a060 100644 --- a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java +++ b/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java @@ -4,12 +4,17 @@ package io.clientcore.tools.codegen.utils; import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.TypeName; +import io.clientcore.core.http.models.HttpResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; -class ResponseBodyModeGenerationTest { +/** + * This class tests ResponseBodyModeGeneration methods. + */ +public class ResponseBodyModeGenerationTest { private MethodSpec.Builder methodBuilder; @@ -19,25 +24,45 @@ void setUp() { } @Test - void generateResponseBodyModeAssignment_withRequestOptions() { - ResponseBodyModeGeneration.generateResponseBodyModeAssignment(methodBuilder); + void generateResponseBodyMode_withRequestOptions() { + TypeName returnTypeName = TypeName.get(String.class); + ResponseBodyModeGeneration.generateResponseBodyMode(methodBuilder, returnTypeName, true); MethodSpec methodSpec = methodBuilder.build(); assertTrue(methodSpec.toString().contains("responseBodyMode = requestOptions.getResponseBodyMode()")); } @Test - void generateResponseHandling_withDeserializeMode() { - ResponseBodyModeGeneration.generateDeserializeResponseHandling(methodBuilder); + void generateResponseBodyMode_withoutRequestOptions() { + TypeName returnTypeName = TypeName.get(String.class); + ResponseBodyModeGeneration.generateResponseBodyMode(methodBuilder, returnTypeName, false); MethodSpec methodSpec = methodBuilder.build(); - // verify generation calls HttpResponseAccessHelper.setValue() with the correct parameters; - assertTrue(methodSpec.toString().contains("HttpResponseAccessHelper.setValue((io.clientcore.core.http.models.HttpResponse) response, responseBody);")); + assertTrue(methodSpec.toString().contains("responseBodyMode = io.clientcore.core.http.models" + + ".ResponseBodyMode.DESERIALIZE")); } - //@Test - //void generateResponseHandling_withNonDeserializeMode() { - // ResponseBodyModeGeneration.generateNonDeserializeResponseHandling(methodBuilder); - // MethodSpec methodSpec = methodBuilder.build(); - // // verify generation calls HttpResponseAccessHelper.setValue() with the correct parameters; - // assertTrue(methodSpec.toString().contains("HttpResponseAccessHelper.setValue((io.clientcore.core.http.models.HttpResponse) response, responseBody);")); - //} + @Test + void generateResponseHandling_withVoidReturnType() { + TypeName returnTypeName = TypeName.VOID; + ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); + MethodSpec methodSpec = methodBuilder.build(); + assertTrue(methodSpec.toString().contains("return")); + } + + @Test + void generateResponseHandling_withResponseReturnType() { + TypeName returnTypeName = TypeName.get(HttpResponse.class); + ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); + MethodSpec methodSpec = methodBuilder.build(); + assertTrue(methodSpec.toString() + .contains("io.clientcore.core.implementation.http.HttpResponseAccessHelper.setValue")); + } + + @Test + void generateResponseHandling_withNonDeserializeMode() { + TypeName returnTypeName = TypeName.get(HttpResponse.class); + ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); + MethodSpec methodSpec = methodBuilder.build(); + assertTrue(methodSpec.toString().contains( + "io.clientcore.core.implementation.http.HttpResponseAccessHelper.setBodyDeserializer")); + } } diff --git a/sdk/clientcore/tools/pom.xml b/sdk/clientcore/tools/pom.xml index c4a6300b10085..3f1c68d3b2e32 100644 --- a/sdk/clientcore/tools/pom.xml +++ b/sdk/clientcore/tools/pom.xml @@ -10,5 +10,6 @@ 1.0.0 annotation-processor + annotation-processor-dependency-tests diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index d414bc0a58a87..e12830cf39d76 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -94,7 +94,6 @@ 0.30 false false - ../../.. @@ -240,11 +239,6 @@ 0.8.12 test - - io.clientcore - annotation-processor - 1.0.0-beta.1 - @@ -1216,6 +1210,10 @@ -Xlint:removal -Xlint:-requires-transitive-automatic + ${project.build.directory}/generated-test-sources/ + + io.clientcore.tools.codegen.AnnotationProcessor + @@ -1227,10 +1225,6 @@ ${java.vm.specification.version} - ${project.build.directory}/generated-sources/ - - io.clientcore.tools.codegen.AnnotationProcessor - @@ -1264,10 +1258,6 @@ module-info.java - ${project.build.directory}/generated-sources/ - - io.clientcore.tools.codegen.AnnotationProcessor - @@ -1304,6 +1294,25 @@ + + org.codehaus.mojo + build-helper-maven-plugin + 3.6.0 + + + add-test-sources + generate-test-sources + + add-test-source + + + + ${project.build.directory}/generated-sources/ + + + + + org.apache.maven.plugins From bdaaf570723ae936493488685da5f47935dacde5 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 10:14:48 -0800 Subject: [PATCH 06/21] add annotation-processor-dependency-tests to versioning --- eng/versioning/version_client.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index f45cd81bb699e..5cd7b0e2e0c45 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -478,6 +478,7 @@ io.clientcore:http-okhttp3;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:http-stress;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:optional-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:annotation-processor;1.0.0-beta.1;1.0.0-beta.1 +io.clientcore:annotation-processor-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 # Unreleased dependencies: Copy the entry from above, prepend "unreleased_" and remove the current From f9a0b5a8d87c4313f8512bc4704c13077d4a69af Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 11:02:37 -0800 Subject: [PATCH 07/21] add toggle flag --- .../pom.xml | 16 ++++++++++++++++ .../tools/annotation-processor/pom.xml | 10 ---------- sdk/parents/clientcore-parent/pom.xml | 4 +++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml b/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml index 927128317732a..4d6bf22069a88 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml +++ b/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml @@ -76,6 +76,22 @@ + + + enable-annotation-processing + + + enable.annotation.processing + true + + + + false + + + + + diff --git a/sdk/clientcore/tools/annotation-processor/pom.xml b/sdk/clientcore/tools/annotation-processor/pom.xml index 420e4433d7e7a..3706f2549cc63 100644 --- a/sdk/clientcore/tools/annotation-processor/pom.xml +++ b/sdk/clientcore/tools/annotation-processor/pom.xml @@ -103,15 +103,5 @@ true - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index e12830cf39d76..7a5b4cc6bd8e4 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -228,6 +228,8 @@ false + + false @@ -733,7 +735,7 @@ io.clientcore annotation-processor - 1.0.0-beta.1 + 1.0.0-beta.1 false From df8c41abf3fe08ae18a043ac2c295b6d20f6d922 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 11:20:24 -0800 Subject: [PATCH 08/21] move annotation-processor modules under clientcore --- .../CHANGELOG.md | 0 .../README.md | 0 .../pom.xml | 4 ++-- .../annotation/processor/test}/MockHttpResponse.java | 2 +- .../processor/test}/TestInterfaceServiceVersion.java | 2 +- .../test}/implementation/TestInterfaceClientService.java | 4 ++-- .../processor/test}/implementation/package-info.java | 2 +- .../clientcore/annotation/processor/test}/package-info.java | 2 +- .../test}/TestInterfaceClientServiceImplGenerationTest.java | 4 ++-- sdk/clientcore/{tools => }/annotation-processor/README.md | 0 sdk/clientcore/{tools => }/annotation-processor/pom.xml | 0 .../java/io/clientcore/tools/codegen/AnnotationProcessor.java | 0 .../codegen/exceptions/MissingSubstitutionException.java | 0 .../clientcore/tools/codegen/models/HttpRequestContext.java | 0 .../java/io/clientcore/tools/codegen/models/Substitution.java | 0 .../io/clientcore/tools/codegen/models/TemplateInput.java | 0 .../tools/codegen/templating/JavaPoetTemplateProcessor.java | 0 .../tools/codegen/templating/TemplateProcessor.java | 0 .../java/io/clientcore/tools/codegen/utils/PathBuilder.java | 0 .../tools/codegen/utils/ResponseBodyModeGeneration.java | 0 .../maven/services/javax.annotation.processing.Processor | 0 .../io/clientcore/tools/codegen/models/TemplateInputTest.java | 0 .../tools/codegen/templating/APIGenerationTest.java | 0 .../codegen/templating/BodyContentTypeProcessorTest.java | 0 .../codegen/templating/HttpPipelineBuilderMethodTest.java | 0 .../io/clientcore/tools/codegen/utils/PathBuilderTest.java | 0 .../tools/codegen/utils/ResponseBodyModeGenerationTest.java | 0 sdk/clientcore/ci.yml | 2 ++ sdk/clientcore/pom.xml | 2 ++ sdk/clientcore/tools/pom.xml | 4 ---- 30 files changed, 14 insertions(+), 14 deletions(-) rename sdk/clientcore/{tools/annotation-processor-dependency-tests => annotation-processor-tests}/CHANGELOG.md (100%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests => annotation-processor-tests}/README.md (100%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests => annotation-processor-tests}/pom.xml (96%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen => annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test}/MockHttpResponse.java (98%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen => annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test}/TestInterfaceServiceVersion.java (94%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen => annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test}/implementation/TestInterfaceClientService.java (93%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen => annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test}/implementation/package-info.java (60%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen => annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test}/package-info.java (77%) rename sdk/clientcore/{tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen => annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test}/TestInterfaceClientServiceImplGenerationTest.java (94%) rename sdk/clientcore/{tools => }/annotation-processor/README.md (100%) rename sdk/clientcore/{tools => }/annotation-processor/pom.xml (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java (100%) rename sdk/clientcore/{tools => }/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java (100%) diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md b/sdk/clientcore/annotation-processor-tests/CHANGELOG.md similarity index 100% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/CHANGELOG.md rename to sdk/clientcore/annotation-processor-tests/CHANGELOG.md diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/README.md b/sdk/clientcore/annotation-processor-tests/README.md similarity index 100% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/README.md rename to sdk/clientcore/annotation-processor-tests/README.md diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml b/sdk/clientcore/annotation-processor-tests/pom.xml similarity index 96% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml rename to sdk/clientcore/annotation-processor-tests/pom.xml index 4d6bf22069a88..bc36ffb8b4b03 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/pom.xml +++ b/sdk/clientcore/annotation-processor-tests/pom.xml @@ -9,11 +9,11 @@ io.clientcore clientcore-parent 1.0.0-beta.1 - ../../../parents/clientcore-parent + ../../parents/clientcore-parent/pom.xml io.clientcore - annotation-processor-dependency-tests + annotation-processor-tests jar 1.0.0-beta.1 diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java similarity index 98% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java rename to sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java index 9e3f9fa01df85..5bd0d2bf913ef 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/MockHttpResponse.java +++ b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen; +package io.clientcore.annotation.processor.test; import io.clientcore.core.http.models.HttpHeaders; import io.clientcore.core.http.models.HttpRequest; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java similarity index 94% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java rename to sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java index f5c9ab2b168a4..cde597ef50e21 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/TestInterfaceServiceVersion.java +++ b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen; +package io.clientcore.annotation.processor.test; import io.clientcore.core.http.models.ServiceVersion; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java similarity index 93% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java rename to sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java index 494f81894b24e..05f29e5906fa2 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/TestInterfaceClientService.java +++ b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.implementation; +package io.clientcore.annotation.processor.test.implementation; import io.clientcore.core.annotation.ServiceInterface; import io.clientcore.core.http.annotation.HttpRequestInformation; import io.clientcore.core.http.models.HttpMethod; import io.clientcore.core.http.pipeline.HttpPipeline; import io.clientcore.core.util.serializer.ObjectSerializer; -import io.clientcore.tools.codegen.TestInterfaceServiceVersion; +import io.clientcore.annotation.processor.test.TestInterfaceServiceVersion; import java.lang.reflect.InvocationTargetException; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java similarity index 60% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java rename to sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java index caf1a319c64d2..401b9baf6796b 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/implementation/package-info.java +++ b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java @@ -1,4 +1,4 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.implementation; +package io.clientcore.annotation.processor.test.implementation; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/package-info.java similarity index 77% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java rename to sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/package-info.java index 1b5aa48fca819..0fdd68e56f53f 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/main/java/io/clientcore/tools/codegen/package-info.java +++ b/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/package-info.java @@ -4,4 +4,4 @@ /** * Package containing the implementation of the code generation. */ -package io.clientcore.tools.codegen; +package io.clientcore.annotation.processor.test; diff --git a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java b/sdk/clientcore/annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java similarity index 94% rename from sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java rename to sdk/clientcore/annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java index 7802e79981f39..2a1fd19cfb92b 100644 --- a/sdk/clientcore/tools/annotation-processor-dependency-tests/src/test/java/io/clientcore/tools/codegen/TestInterfaceClientServiceImplGenerationTest.java +++ b/sdk/clientcore/annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen; +package io.clientcore.annotation.processor.test; import io.clientcore.core.http.client.HttpClient; import io.clientcore.core.http.models.HttpHeaderName; @@ -10,7 +10,7 @@ import io.clientcore.core.http.models.Response; import io.clientcore.core.http.pipeline.HttpPipeline; import io.clientcore.core.http.pipeline.HttpPipelineBuilder; -import io.clientcore.tools.codegen.implementation.TestInterfaceClientService; +import io.clientcore.annotation.processor.test.implementation.TestInterfaceClientService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/sdk/clientcore/tools/annotation-processor/README.md b/sdk/clientcore/annotation-processor/README.md similarity index 100% rename from sdk/clientcore/tools/annotation-processor/README.md rename to sdk/clientcore/annotation-processor/README.md diff --git a/sdk/clientcore/tools/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml similarity index 100% rename from sdk/clientcore/tools/annotation-processor/pom.xml rename to sdk/clientcore/annotation-processor/pom.xml diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java diff --git a/sdk/clientcore/tools/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor b/sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor rename to sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java diff --git a/sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java similarity index 100% rename from sdk/clientcore/tools/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index abefa8173dd01..7159c431526c2 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -61,3 +61,5 @@ extends: AdditionalModules: - name: optional-dependency-tests groupId: io.clientcore + - name: annotation-processor-tests + groupId: io.clientcore diff --git a/sdk/clientcore/pom.xml b/sdk/clientcore/pom.xml index 252a22840d50d..d269172854cf7 100644 --- a/sdk/clientcore/pom.xml +++ b/sdk/clientcore/pom.xml @@ -14,6 +14,8 @@ http-okhttp3 optional-dependency-tests http-stress + annotation-processor + annotation-processor-tests tools diff --git a/sdk/clientcore/tools/pom.xml b/sdk/clientcore/tools/pom.xml index 3f1c68d3b2e32..b7a1e49daef25 100644 --- a/sdk/clientcore/tools/pom.xml +++ b/sdk/clientcore/tools/pom.xml @@ -8,8 +8,4 @@ clientcore-tools-parent pom 1.0.0 - - annotation-processor - annotation-processor-dependency-tests - From 3cc9fddfd4f4a89d5046aa848e390bedc335ada0 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 11:35:35 -0800 Subject: [PATCH 09/21] fixes for cspell and readme --- .vscode/cspell.json | 2 ++ eng/.docsettings.yml | 2 ++ eng/versioning/version_client.txt | 2 +- sdk/clientcore/annotation-processor-tests/README.md | 2 +- sdk/clientcore/annotation-processor-tests/pom.xml | 2 +- sdk/clientcore/annotation-processor/CHANGELOG.md | 3 +++ sdk/clientcore/annotation-processor/README.md | 4 ++-- 7 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 sdk/clientcore/annotation-processor/CHANGELOG.md diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 1141fc83e4a26..f697a0f45a0c0 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -200,6 +200,8 @@ "sdk/loadtesting/azure-developer-loadtesting/**", "sdk/clientcore/core/**", "sdk/clientcore/http-okhttp3/**", + "sdk/clientcore/annotation-processor/**", + "sdk/clientcore/annotation-processor-tests/**", "sdk/clientcore/tools/**", "sdk/serialization/azure-json-gson/**", "sdk/serialization/azure-json/**", diff --git a/eng/.docsettings.yml b/eng/.docsettings.yml index fe80ed5dca5ec..82219acc40676 100644 --- a/eng/.docsettings.yml +++ b/eng/.docsettings.yml @@ -101,6 +101,8 @@ known_content_issues: - ['sdk/clientcore/http-okhttp3/README.md', '#3113'] - ['sdk/clientcore/tools/annotation-processor/README.md', '#3113'] - ['sdk/clientcore/optional-dependency-tests/README.md', '#3113'] + - ['sdk/clientcore/annotation-processor/README.md', '#3113'] + - ['sdk/clientcore/annotation-processor-tests/README.md', '#3113'] - ['sdk/core/azure-core-experimental/README.md', '#3113'] - ['sdk/cosmos/faq/README.md', '#3113'] - ['sdk/cosmos/azure-cosmos-benchmark/README.md', '#3113'] diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 5cd7b0e2e0c45..b9da20cb729d7 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -478,7 +478,7 @@ io.clientcore:http-okhttp3;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:http-stress;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:optional-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:annotation-processor;1.0.0-beta.1;1.0.0-beta.1 -io.clientcore:annotation-processor-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 +io.clientcore:annotation-processor-tests;1.0.0-beta.1;1.0.0-beta.1 # Unreleased dependencies: Copy the entry from above, prepend "unreleased_" and remove the current diff --git a/sdk/clientcore/annotation-processor-tests/README.md b/sdk/clientcore/annotation-processor-tests/README.md index 0a49e72536807..3a24b061ceaed 100644 --- a/sdk/clientcore/annotation-processor-tests/README.md +++ b/sdk/clientcore/annotation-processor-tests/README.md @@ -16,4 +16,4 @@ Tests that validate annotation-processor features of generating Service Interfac -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%clientcore%2Fannotation-processor-dependency-tests%2FREADME.png) +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%clientcore%2Fannotation-processor-tests%2FREADME.png) diff --git a/sdk/clientcore/annotation-processor-tests/pom.xml b/sdk/clientcore/annotation-processor-tests/pom.xml index bc36ffb8b4b03..a9093d3bb1f1b 100644 --- a/sdk/clientcore/annotation-processor-tests/pom.xml +++ b/sdk/clientcore/annotation-processor-tests/pom.xml @@ -15,7 +15,7 @@ io.clientcore annotation-processor-tests jar - 1.0.0-beta.1 + 1.0.0-beta.1 Java Core library tests for annotation-processor features. Tests that validate features of the annotation-processor tooling. diff --git a/sdk/clientcore/annotation-processor/CHANGELOG.md b/sdk/clientcore/annotation-processor/CHANGELOG.md new file mode 100644 index 0000000000000..4144f75694a03 --- /dev/null +++ b/sdk/clientcore/annotation-processor/CHANGELOG.md @@ -0,0 +1,3 @@ +# Release History + +## 1.0.0-beta.1 (Unreleased) diff --git a/sdk/clientcore/annotation-processor/README.md b/sdk/clientcore/annotation-processor/README.md index 71e63fbb7ac79..dc489813d0574 100644 --- a/sdk/clientcore/annotation-processor/README.md +++ b/sdk/clientcore/annotation-processor/README.md @@ -11,7 +11,7 @@ The client-core annotation processor for introducing compile-time code generatio io.clientcore annotation-processor - 1.0.0.beta.1 + 1.0.0.beta.1 provided @@ -22,7 +22,7 @@ The client-core annotation processor for introducing compile-time code generatio org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.13.0 ${project.build.directory}/generated-sources/ From 9284e8bb363d64c17b9d6ff0d4c8f74913035920 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 12:51:24 -0800 Subject: [PATCH 10/21] update for directory naming for annotation-processor* --- .vscode/cspell.json | 2 +- eng/.docsettings.yml | 2 +- eng/versioning/version_client.txt | 2 +- .../CHANGELOG.md | 0 .../README.md | 2 +- .../pom.xml | 4 ++-- .../annotation/processor/test/MockHttpResponse.java | 0 .../processor/test/TestInterfaceServiceVersion.java | 0 .../implementation/TestInterfaceClientService.java | 0 .../processor/test/implementation/package-info.java | 0 .../annotation/processor/test/package-info.java | 0 ...TestInterfaceClientServiceImplGenerationTest.java | 0 sdk/clientcore/annotation-processor/README.md | 2 +- sdk/clientcore/annotation-processor/pom.xml | 10 ++++++++++ .../processor}/AnnotationProcessor.java | 12 ++++++------ .../exceptions/MissingSubstitutionException.java | 2 +- .../processor}/models/HttpRequestContext.java | 2 +- .../processor}/models/Substitution.java | 2 +- .../processor}/models/TemplateInput.java | 2 +- .../templating/JavaPoetTemplateProcessor.java | 8 ++++---- .../processor}/templating/TemplateProcessor.java | 4 ++-- .../processor}/utils/PathBuilder.java | 8 ++++---- .../processor}/utils/ResponseBodyModeGeneration.java | 2 +- .../services/javax.annotation.processing.Processor | 2 +- .../processor}/models/TemplateInputTest.java | 2 +- .../processor}/templating/APIGenerationTest.java | 8 ++++---- .../templating/BodyContentTypeProcessorTest.java | 4 ++-- .../templating/HttpPipelineBuilderMethodTest.java | 4 ++-- .../processor}/utils/PathBuilderTest.java | 8 ++++---- .../utils/ResponseBodyModeGenerationTest.java | 2 +- sdk/clientcore/ci.yml | 2 +- sdk/clientcore/pom.xml | 2 +- sdk/parents/clientcore-parent/pom.xml | 4 ++-- 33 files changed, 57 insertions(+), 47 deletions(-) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/CHANGELOG.md (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/README.md (93%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/pom.xml (97%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/main/java/io/clientcore/annotation/processor/test/package-info.java (100%) rename sdk/clientcore/{annotation-processor-tests => annotation-processor-test}/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java (100%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/AnnotationProcessor.java (97%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/exceptions/MissingSubstitutionException.java (89%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/models/HttpRequestContext.java (99%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/models/Substitution.java (97%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/models/TemplateInput.java (99%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/templating/JavaPoetTemplateProcessor.java (98%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/templating/TemplateProcessor.java (78%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/utils/PathBuilder.java (93%) rename sdk/clientcore/annotation-processor/src/main/java/io/clientcore/{tools/codegen => annotation/processor}/utils/ResponseBodyModeGeneration.java (99%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/models/TemplateInputTest.java (98%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/templating/APIGenerationTest.java (89%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/templating/BodyContentTypeProcessorTest.java (98%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/templating/HttpPipelineBuilderMethodTest.java (97%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/utils/PathBuilderTest.java (98%) rename sdk/clientcore/annotation-processor/src/test/java/io/clientcore/{tools/codegen => annotation/processor}/utils/ResponseBodyModeGenerationTest.java (98%) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index f697a0f45a0c0..a762efd036620 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -201,7 +201,7 @@ "sdk/clientcore/core/**", "sdk/clientcore/http-okhttp3/**", "sdk/clientcore/annotation-processor/**", - "sdk/clientcore/annotation-processor-tests/**", + "sdk/clientcore/annotation-processor-test/**", "sdk/clientcore/tools/**", "sdk/serialization/azure-json-gson/**", "sdk/serialization/azure-json/**", diff --git a/eng/.docsettings.yml b/eng/.docsettings.yml index 82219acc40676..3714861166107 100644 --- a/eng/.docsettings.yml +++ b/eng/.docsettings.yml @@ -102,7 +102,7 @@ known_content_issues: - ['sdk/clientcore/tools/annotation-processor/README.md', '#3113'] - ['sdk/clientcore/optional-dependency-tests/README.md', '#3113'] - ['sdk/clientcore/annotation-processor/README.md', '#3113'] - - ['sdk/clientcore/annotation-processor-tests/README.md', '#3113'] + - ['sdk/clientcore/annotation-processor-test/README.md', '#3113'] - ['sdk/core/azure-core-experimental/README.md', '#3113'] - ['sdk/cosmos/faq/README.md', '#3113'] - ['sdk/cosmos/azure-cosmos-benchmark/README.md', '#3113'] diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index b9da20cb729d7..3165c2b4d4117 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -478,7 +478,7 @@ io.clientcore:http-okhttp3;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:http-stress;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:optional-dependency-tests;1.0.0-beta.1;1.0.0-beta.1 io.clientcore:annotation-processor;1.0.0-beta.1;1.0.0-beta.1 -io.clientcore:annotation-processor-tests;1.0.0-beta.1;1.0.0-beta.1 +io.clientcore:annotation-processor-test;1.0.0-beta.1;1.0.0-beta.1 # Unreleased dependencies: Copy the entry from above, prepend "unreleased_" and remove the current diff --git a/sdk/clientcore/annotation-processor-tests/CHANGELOG.md b/sdk/clientcore/annotation-processor-test/CHANGELOG.md similarity index 100% rename from sdk/clientcore/annotation-processor-tests/CHANGELOG.md rename to sdk/clientcore/annotation-processor-test/CHANGELOG.md diff --git a/sdk/clientcore/annotation-processor-tests/README.md b/sdk/clientcore/annotation-processor-test/README.md similarity index 93% rename from sdk/clientcore/annotation-processor-tests/README.md rename to sdk/clientcore/annotation-processor-test/README.md index 3a24b061ceaed..d96391dff7f7c 100644 --- a/sdk/clientcore/annotation-processor-tests/README.md +++ b/sdk/clientcore/annotation-processor-test/README.md @@ -16,4 +16,4 @@ Tests that validate annotation-processor features of generating Service Interfac -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%clientcore%2Fannotation-processor-tests%2FREADME.png) +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%clientcore%2Fannotation-processor-test%2FREADME.png) diff --git a/sdk/clientcore/annotation-processor-tests/pom.xml b/sdk/clientcore/annotation-processor-test/pom.xml similarity index 97% rename from sdk/clientcore/annotation-processor-tests/pom.xml rename to sdk/clientcore/annotation-processor-test/pom.xml index a9093d3bb1f1b..8a11f0ec8c41a 100644 --- a/sdk/clientcore/annotation-processor-tests/pom.xml +++ b/sdk/clientcore/annotation-processor-test/pom.xml @@ -13,9 +13,9 @@ io.clientcore - annotation-processor-tests + annotation-processor-test jar - 1.0.0-beta.1 + 1.0.0-beta.1 Java Core library tests for annotation-processor features. Tests that validate features of the annotation-processor tooling. diff --git a/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java b/sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java rename to sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/MockHttpResponse.java diff --git a/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java b/sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java rename to sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/TestInterfaceServiceVersion.java diff --git a/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java b/sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java rename to sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/implementation/TestInterfaceClientService.java diff --git a/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java b/sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java rename to sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/implementation/package-info.java diff --git a/sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/package-info.java b/sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/package-info.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/main/java/io/clientcore/annotation/processor/test/package-info.java rename to sdk/clientcore/annotation-processor-test/src/main/java/io/clientcore/annotation/processor/test/package-info.java diff --git a/sdk/clientcore/annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java b/sdk/clientcore/annotation-processor-test/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java similarity index 100% rename from sdk/clientcore/annotation-processor-tests/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java rename to sdk/clientcore/annotation-processor-test/src/test/java/io/clientcore/annotation/processor/test/TestInterfaceClientServiceImplGenerationTest.java diff --git a/sdk/clientcore/annotation-processor/README.md b/sdk/clientcore/annotation-processor/README.md index dc489813d0574..6f16ed2d40f2c 100644 --- a/sdk/clientcore/annotation-processor/README.md +++ b/sdk/clientcore/annotation-processor/README.md @@ -26,7 +26,7 @@ The client-core annotation processor for introducing compile-time code generatio ${project.build.directory}/generated-sources/ - io.generation.tools.codegen.AnnotationProcessor + io.clientcore.annotation.processor.AnnotationProcessor diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 3706f2549cc63..420e4433d7e7a 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -103,5 +103,15 @@ true + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java similarity index 97% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 2f9979ae72de7..41c445970d49b 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen; +package io.clientcore.annotation.processor; import io.clientcore.core.annotation.ServiceInterface; import io.clientcore.core.http.annotation.BodyParam; @@ -20,11 +20,11 @@ import io.clientcore.core.http.pipeline.HttpPipeline; import io.clientcore.core.util.Context; import io.clientcore.core.util.binarydata.BinaryData; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.Substitution; -import io.clientcore.tools.codegen.models.TemplateInput; -import io.clientcore.tools.codegen.templating.TemplateProcessor; -import io.clientcore.tools.codegen.utils.PathBuilder; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.Substitution; +import io.clientcore.annotation.processor.models.TemplateInput; +import io.clientcore.annotation.processor.templating.TemplateProcessor; +import io.clientcore.annotation.processor.utils.PathBuilder; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/MissingSubstitutionException.java similarity index 89% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/MissingSubstitutionException.java index 112b101e95705..0678e3fafe86c 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/exceptions/MissingSubstitutionException.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/MissingSubstitutionException.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.exceptions; +package io.clientcore.annotation.processor.exceptions; /** * Exception thrown when a substitution is missing from the template. diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java similarity index 99% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java index d6d18b110d6a2..e800d5d53e7c8 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/HttpRequestContext.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.models; +package io.clientcore.annotation.processor.models; import io.clientcore.core.http.models.HttpMethod; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java similarity index 97% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java index adb282d06ed98..3f7ad1487ed77 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/Substitution.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.models; +package io.clientcore.annotation.processor.models; /** * A Substitution is a value that can be used to replace placeholder values in a URL. Placeholders look like: diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java similarity index 99% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java index b40d9c0b0aa6b..bb9b1577d0c6f 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/models/TemplateInput.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.models; +package io.clientcore.annotation.processor.models; import io.clientcore.core.http.annotation.UnexpectedResponseExceptionDetail; import javax.lang.model.element.TypeElement; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java similarity index 98% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java index 756e48c149bd5..e880bb20d9afb 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/JavaPoetTemplateProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.templating; +package io.clientcore.annotation.processor.templating; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; @@ -21,8 +21,8 @@ import io.clientcore.core.instrumentation.logging.ClientLogger; import io.clientcore.core.util.binarydata.BinaryData; import io.clientcore.core.util.serializer.ObjectSerializer; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.TemplateInput; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.TemplateInput; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Modifier; @@ -30,7 +30,7 @@ import java.util.Map; import java.util.stream.Collectors; -import static io.clientcore.tools.codegen.utils.ResponseBodyModeGeneration.generateResponseHandling; +import static io.clientcore.annotation.processor.utils.ResponseBodyModeGeneration.generateResponseHandling; /** * This class generates the implementation of the service interface. diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java similarity index 78% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java index 820e6724f5cee..06f734db1a846 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/templating/TemplateProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.templating; +package io.clientcore.annotation.processor.templating; -import io.clientcore.tools.codegen.models.TemplateInput; +import io.clientcore.annotation.processor.models.TemplateInput; import javax.annotation.processing.ProcessingEnvironment; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java similarity index 93% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java index e0908f25fd4d7..0d3bffa5a138d 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/PathBuilder.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.utils; +package io.clientcore.annotation.processor.utils; -import io.clientcore.tools.codegen.exceptions.MissingSubstitutionException; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.Substitution; +import io.clientcore.annotation.processor.exceptions.MissingSubstitutionException; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.Substitution; import java.util.Objects; import java.util.regex.Matcher; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java similarity index 99% rename from sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java rename to sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java index 6349b61a5bf46..d84bd41e6ce7d 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGeneration.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.utils; +package io.clientcore.annotation.processor.utils; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; diff --git a/sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor b/sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor index 7966f81cda3f7..e38a84e9ceacd 100644 --- a/sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor +++ b/sdk/clientcore/annotation-processor/src/main/resources/META-INF/maven/services/javax.annotation.processing.Processor @@ -1 +1 @@ -io.clientcore.tools.codegen.AnnotationProcessor +io.clientcore.annotation.processor.AnnotationProcessor diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java similarity index 98% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java index 5deedb7b0ba62..412771ef8954f 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/models/TemplateInputTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.models; +package io.clientcore.annotation.processor.models; import io.clientcore.core.http.annotation.UnexpectedResponseExceptionDetail; import java.util.Collections; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java similarity index 89% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java index ebd90fbc74d71..6380145dceb21 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/APIGenerationTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.templating; +package io.clientcore.annotation.processor.templating; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.Substitution; -import io.clientcore.tools.codegen.models.TemplateInput; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.Substitution; +import io.clientcore.annotation.processor.models.TemplateInput; import com.squareup.javapoet.MethodSpec; import io.clientcore.core.http.models.HttpMethod; import java.util.Collections; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java similarity index 98% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java index ce8de3ebc4d7e..41ea3b485e356 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/BodyContentTypeProcessorTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.templating; +package io.clientcore.annotation.processor.templating; import com.squareup.javapoet.MethodSpec; -import io.clientcore.tools.codegen.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.HttpRequestContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java similarity index 97% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java index 332a13bc05ae5..26d7f3c9faef7 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/templating/HttpPipelineBuilderMethodTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.templating; +package io.clientcore.annotation.processor.templating; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.MethodSpec; import io.clientcore.core.http.pipeline.HttpPipeline; import io.clientcore.core.instrumentation.logging.ClientLogger; -import io.clientcore.tools.codegen.models.TemplateInput; +import io.clientcore.annotation.processor.models.TemplateInput; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java similarity index 98% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java index 21c4d9bd7d115..ed011a5ae80ed 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/PathBuilderTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.utils; +package io.clientcore.annotation.processor.utils; -import io.clientcore.tools.codegen.exceptions.MissingSubstitutionException; -import io.clientcore.tools.codegen.models.HttpRequestContext; -import io.clientcore.tools.codegen.models.Substitution; +import io.clientcore.annotation.processor.exceptions.MissingSubstitutionException; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.Substitution; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java similarity index 98% rename from sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java rename to sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java index 5f22c40e0a060..7d37ae7b01ac2 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/tools/codegen/utils/ResponseBodyModeGenerationTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package io.clientcore.tools.codegen.utils; +package io.clientcore.annotation.processor.utils; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index 7159c431526c2..4b1121763fae9 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -61,5 +61,5 @@ extends: AdditionalModules: - name: optional-dependency-tests groupId: io.clientcore - - name: annotation-processor-tests + - name: annotation-processor-test groupId: io.clientcore diff --git a/sdk/clientcore/pom.xml b/sdk/clientcore/pom.xml index d269172854cf7..56ab973687d06 100644 --- a/sdk/clientcore/pom.xml +++ b/sdk/clientcore/pom.xml @@ -15,7 +15,7 @@ optional-dependency-tests http-stress annotation-processor - annotation-processor-tests + annotation-processor-test tools diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 7a5b4cc6bd8e4..a0f5ba13377a1 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -740,7 +740,7 @@ false - io.clientcore.tools.codegen.AnnotationProcessor + io.clientcore.annotation.processor.AnnotationProcessor ${project.build.directory}/generated-sources/ @@ -1159,7 +1159,7 @@ 1.8 ${project.build.directory}/generated-sources/ - io.clientcore.tools.codegen.AnnotationProcessor + io.clientcore.annotation.processor.AnnotationProcessor From a0495aa0681011cb88e83a47b680bf89717eeb93 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 13:21:52 -0800 Subject: [PATCH 11/21] remove annotation processor config from java 18 --- sdk/clientcore/annotation-processor/pom.xml | 16 ++++++---------- .../processor/AnnotationProcessor.java | 2 +- sdk/parents/clientcore-parent/pom.xml | 1 + 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 420e4433d7e7a..064e83a6e18f6 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -56,6 +56,12 @@ HEAD + + 8 + 8 + ${project.build.directory} + + com.squareup @@ -103,15 +109,5 @@ true - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 41c445970d49b..7f42149c59d0c 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -51,7 +51,7 @@ * Annotation processor that generates client code based on annotated interfaces. */ @SupportedAnnotationTypes("io.clientcore.core.annotation.*") -@SupportedSourceVersion(SourceVersion.RELEASE_17) +@SupportedSourceVersion(SourceVersion.RELEASE_8) public class AnnotationProcessor extends AbstractProcessor { @Override diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index a0f5ba13377a1..d5dcf3303978c 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -1296,6 +1296,7 @@ + org.codehaus.mojo build-helper-maven-plugin From 13bc3c0c7a9f1002b429a3a33af06a610ed48b95 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Thu, 23 Jan 2025 15:38:14 -0800 Subject: [PATCH 12/21] add ci step to install annotation-processor --- .../processor/AnnotationProcessor.java | 13 ++++------ sdk/clientcore/ci.yml | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 7f42149c59d0c..699b3003374af 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -3,6 +3,11 @@ package io.clientcore.annotation.processor; +import io.clientcore.annotation.processor.models.HttpRequestContext; +import io.clientcore.annotation.processor.models.Substitution; +import io.clientcore.annotation.processor.models.TemplateInput; +import io.clientcore.annotation.processor.templating.TemplateProcessor; +import io.clientcore.annotation.processor.utils.PathBuilder; import io.clientcore.core.annotation.ServiceInterface; import io.clientcore.core.http.annotation.BodyParam; import io.clientcore.core.http.annotation.HeaderParam; @@ -20,17 +25,10 @@ import io.clientcore.core.http.pipeline.HttpPipeline; import io.clientcore.core.util.Context; import io.clientcore.core.util.binarydata.BinaryData; -import io.clientcore.annotation.processor.models.HttpRequestContext; -import io.clientcore.annotation.processor.models.Substitution; -import io.clientcore.annotation.processor.models.TemplateInput; -import io.clientcore.annotation.processor.templating.TemplateProcessor; -import io.clientcore.annotation.processor.utils.PathBuilder; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; @@ -51,7 +49,6 @@ * Annotation processor that generates client code based on annotated interfaces. */ @SupportedAnnotationTypes("io.clientcore.core.annotation.*") -@SupportedSourceVersion(SourceVersion.RELEASE_8) public class AnnotationProcessor extends AbstractProcessor { @Override diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index 4b1121763fae9..d4a8b96bf5259 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -38,6 +38,30 @@ parameters: extends: template: /eng/pipelines/templates/stages/archetype-sdk-client.yml parameters: + stages: + - stage: InstallAnnotationProcessor + jobs: + - job: InstallAnnotationProcessor + timeoutInMinutes: 10 + + pool: + name: $(LINUXPOOL) + image: $(LINUXVMIMAGE) + os: linux + + steps: + - task: Maven@4 + displayName: 'Build and install annotation-processor' + inputs: + mavenPomFile: /annotation-processor/pom.xml + goals: 'install' + options: '$(DefaultOptions) -T 2C -DskipTests -Dgpg.skip -Dmaven.javadoc.skip=true -Dcodesnippet.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true -Djacoco.skip=true -Drevapi.skip=true -Dshade.skip=true -Dspotless.skip=true -pl io.clientcore:annotation-processor' + mavenOptions: '$(MemoryOptions) $(LoggingOptions)' + javaHomeOption: 'JDKVersion' + jdkVersionOption: $(JavaBuildVersion) + jdkArchitectureOption: 'x64' + publishJUnitResults: false + ServiceDirectory: clientcore MatrixConfigs: - Name: clientcore_ci_test_base From 9f3def0acf76913e457ec8c9a1e88db1e08db03d Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Fri, 24 Jan 2025 10:38:02 -0800 Subject: [PATCH 13/21] use prebuild steps --- sdk/clientcore/ci.yml | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index d4a8b96bf5259..0d551df7c060f 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -38,30 +38,6 @@ parameters: extends: template: /eng/pipelines/templates/stages/archetype-sdk-client.yml parameters: - stages: - - stage: InstallAnnotationProcessor - jobs: - - job: InstallAnnotationProcessor - timeoutInMinutes: 10 - - pool: - name: $(LINUXPOOL) - image: $(LINUXVMIMAGE) - os: linux - - steps: - - task: Maven@4 - displayName: 'Build and install annotation-processor' - inputs: - mavenPomFile: /annotation-processor/pom.xml - goals: 'install' - options: '$(DefaultOptions) -T 2C -DskipTests -Dgpg.skip -Dmaven.javadoc.skip=true -Dcodesnippet.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true -Djacoco.skip=true -Drevapi.skip=true -Dshade.skip=true -Dspotless.skip=true -pl io.clientcore:annotation-processor' - mavenOptions: '$(MemoryOptions) $(LoggingOptions)' - javaHomeOption: 'JDKVersion' - jdkVersionOption: $(JavaBuildVersion) - jdkArchitectureOption: 'x64' - publishJUnitResults: false - ServiceDirectory: clientcore MatrixConfigs: - Name: clientcore_ci_test_base @@ -87,3 +63,15 @@ extends: groupId: io.clientcore - name: annotation-processor-test groupId: io.clientcore + PreBuildSteps: + - task: Maven@4 + displayName: 'Build and install annotation-processor' + inputs: + mavenPomFile: sdk/clientcore/annotation-processor/pom.xml + goals: 'install' + options: '$(DefaultOptions) -T 2C -DskipTests -Dgpg.skip -Dmaven.javadoc.skip=true -Dcodesnippet.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true -Djacoco.skip=true -Drevapi.skip=true -Dshade.skip=true -Dspotless.skip=true -pl io.clientcore:annotation-processor' + mavenOptions: '$(MemoryOptions) $(LoggingOptions)' + javaHomeOption: 'JDKVersion' + jdkVersionOption: $(JavaBuildVersion) + jdkArchitectureOption: 'x64' + publishJUnitResults: false From eb924c82cf95e5f3d6181f57ad9ca97b63457bfe Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Fri, 24 Jan 2025 13:08:12 -0800 Subject: [PATCH 14/21] fix source version --- .../annotation/processor/AnnotationProcessor.java | 14 ++++++++++++++ sdk/parents/clientcore-parent/pom.xml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 699b3003374af..42242a88af859 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -29,6 +29,8 @@ import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; @@ -49,8 +51,20 @@ * Annotation processor that generates client code based on annotated interfaces. */ @SupportedAnnotationTypes("io.clientcore.core.annotation.*") +@SupportedSourceVersion(SourceVersion.RELEASE_8) public class AnnotationProcessor extends AbstractProcessor { + @Override + public SourceVersion getSupportedSourceVersion() { + // Reflective fallback if SourceVersion.RELEASE_8 isn't available at compile time + try { + return SourceVersion.valueOf("RELEASE_8"); + } catch (IllegalArgumentException e) { + // Fallback to the latest supported version + return SourceVersion.latest(); + } + } + @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { // We iterate through each interface annotated with @ServiceInterface separately. diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index d5dcf3303978c..6fbbeef218042 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -1214,7 +1214,7 @@ ${project.build.directory}/generated-test-sources/ - io.clientcore.tools.codegen.AnnotationProcessor + io.clientcore.annotation.processor.AnnotationProcessor From 7279c756b3108fb34be5d3bc811f35d32d6e0824 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Sun, 26 Jan 2025 10:15:50 -0800 Subject: [PATCH 15/21] add annotation-processor to respective pom --- .../annotation-processor-test/pom.xml | 33 +++++++------ sdk/parents/clientcore-parent/pom.xml | 48 ++----------------- 2 files changed, 23 insertions(+), 58 deletions(-) diff --git a/sdk/clientcore/annotation-processor-test/pom.xml b/sdk/clientcore/annotation-processor-test/pom.xml index 8a11f0ec8c41a..5fbfc744329e4 100644 --- a/sdk/clientcore/annotation-processor-test/pom.xml +++ b/sdk/clientcore/annotation-processor-test/pom.xml @@ -76,21 +76,6 @@ - - - enable-annotation-processing - - - enable.annotation.processing - true - - - - false - - - - @@ -98,5 +83,23 @@ ${project.build.directory}/generated-sources + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + io.clientcore + annotation-processor + 1.0.0-beta.1 + + + + + + diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 6fbbeef218042..6b3fe5e967ebc 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -94,6 +94,7 @@ 0.30 false false + ../../.. @@ -228,8 +229,6 @@ false - - false @@ -657,6 +656,7 @@ io.clientcore:* + @@ -730,19 +730,10 @@ -Xlint:varargs - - - - io.clientcore - annotation-processor - 1.0.0-beta.1 - - + + ${compiler.proc} + false - - io.clientcore.annotation.processor.AnnotationProcessor - - ${project.build.directory}/generated-sources/ @@ -1157,10 +1148,6 @@ 1.8 1.8 - ${project.build.directory}/generated-sources/ - - io.clientcore.annotation.processor.AnnotationProcessor - @@ -1172,7 +1159,6 @@ module-info.java - @@ -1212,10 +1198,6 @@ -Xlint:removal -Xlint:-requires-transitive-automatic - ${project.build.directory}/generated-test-sources/ - - io.clientcore.annotation.processor.AnnotationProcessor - @@ -1296,26 +1278,6 @@ - - - org.codehaus.mojo - build-helper-maven-plugin - 3.6.0 - - - add-test-sources - generate-test-sources - - add-test-source - - - - ${project.build.directory}/generated-sources/ - - - - - org.apache.maven.plugins From 0e1aa85e379d111df59fb77db032a34f822de282 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Sun, 26 Jan 2025 18:34:52 -0800 Subject: [PATCH 16/21] spotbugs/checktyle updates --- .../annotation-processor-test/pom.xml | 53 ++--- .../checkstyle-suppressions.xml | 9 + sdk/clientcore/annotation-processor/pom.xml | 99 +++++++-- .../annotation-processor/spotbugs-exclude.xml | 37 ++++ .../processor/AnnotationProcessor.java | 41 ++-- .../processor/exceptions/package-info.java | 7 + .../processor/models/HttpRequestContext.java | 13 +- .../processor/models/Substitution.java | 5 + .../processor/models/TemplateInput.java | 3 +- .../processor/models/package-info.java | 7 + .../annotation/processor/package-info.java | 7 + .../templating/JavaPoetTemplateProcessor.java | 199 +++++++++--------- .../templating/TemplateProcessor.java | 12 ++ .../processor/templating/package-info.java | 7 + .../processor/utils/PathBuilder.java | 16 +- .../utils/ResponseBodyModeGeneration.java | 13 +- .../processor/utils/package-info.java | 7 + .../processor/models/TemplateInputTest.java | 4 +- .../templating/APIGenerationTest.java | 10 +- .../BodyContentTypeProcessorTest.java | 24 +-- .../HttpPipelineBuilderMethodTest.java | 12 +- .../processor/utils/PathBuilderTest.java | 58 +++-- .../utils/ResponseBodyModeGenerationTest.java | 22 +- sdk/clientcore/ci.yml | 2 +- sdk/clientcore/http-stress/pom.xml | 4 +- sdk/parents/clientcore-parent/pom.xml | 2 +- 26 files changed, 424 insertions(+), 249 deletions(-) create mode 100644 sdk/clientcore/annotation-processor/checkstyle-suppressions.xml create mode 100644 sdk/clientcore/annotation-processor/spotbugs-exclude.xml create mode 100644 sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/package-info.java create mode 100644 sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/package-info.java create mode 100644 sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/package-info.java create mode 100644 sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/package-info.java create mode 100644 sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/package-info.java diff --git a/sdk/clientcore/annotation-processor-test/pom.xml b/sdk/clientcore/annotation-processor-test/pom.xml index 5fbfc744329e4..587318d83db8f 100644 --- a/sdk/clientcore/annotation-processor-test/pom.xml +++ b/sdk/clientcore/annotation-processor-test/pom.xml @@ -38,12 +38,7 @@ UTF-8 true - true - - - - true true @@ -52,7 +47,7 @@ io.clientcore core - 1.0.0-beta.2 + 1.0.0-beta.3 @@ -76,30 +71,28 @@ - - - - ${project.build.directory}/generated-sources - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.13.0 - - - - io.clientcore - annotation-processor - 1.0.0-beta.1 - - - - - - + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + false + ${project.build.directory}/generated-sources/ + + + io.clientcore + annotation-processor + 1.0.0-beta.1 + + + + io.clientcore.annotation.processor.AnnotationProcessor + + + + diff --git a/sdk/clientcore/annotation-processor/checkstyle-suppressions.xml b/sdk/clientcore/annotation-processor/checkstyle-suppressions.xml new file mode 100644 index 0000000000000..2a9ea7d735e4f --- /dev/null +++ b/sdk/clientcore/annotation-processor/checkstyle-suppressions.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 064e83a6e18f6..7aa31190b0ece 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -1,8 +1,8 @@ - + - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 io.clientcore @@ -12,23 +12,19 @@ Client Core Compile-Time Annotation Processor The client-core annotation processor for introducing compile-time code generation for libraries based on client core - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - https://github.com/azure/azure-sdk-for-java Microsoft Corporation http://microsoft.com + + + io.clientcore + clientcore-parent + 1.0.0-beta.1 + ../../parents/clientcore-parent + + The MIT License (MIT) @@ -44,9 +40,50 @@ + + + + ossrh + Sonatype Snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + default + + true + daily + + + + + + + ossrh + Sonatype Snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + default + + true + always + + + + + + + ossrh + Sonatype Snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + true + default + + + azure-java-build-docs + ${site.url}/site/ + + + GitHub - https://github.com/Azure/azure-sdk-for-java/issues + ${issues.url} @@ -57,9 +94,15 @@ - 8 - 8 - ${project.build.directory} + UTF-8 + https://azuresdkartifacts.blob.core.windows.net/azure-sdk-for-java + 1.8 + 1.8 + checkstyle-suppressions.xml + false + spotbugs-exclude.xml + true + true @@ -72,7 +115,6 @@ io.clientcore core 1.0.0-beta.3 - compile @@ -109,5 +151,22 @@ true + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.5.0 + + + + + com.squareup:javapoet:[1.13.0] + + + + + + + diff --git a/sdk/clientcore/annotation-processor/spotbugs-exclude.xml b/sdk/clientcore/annotation-processor/spotbugs-exclude.xml new file mode 100644 index 0000000000000..3149c0d9f2da0 --- /dev/null +++ b/sdk/clientcore/annotation-processor/spotbugs-exclude.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 42242a88af859..5f449b1fda476 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -71,14 +71,14 @@ public boolean process(Set annotations, RoundEnvironment // This outer for-loop is not strictly necessary, as we only have one annotation that we care about // (@ServiceInterface), but we'll leave it here for now annotations.stream() - .map(roundEnv::getElementsAnnotatedWith) - .flatMap(Set::stream) - .filter(element -> element.getKind().isInterface()) - .forEach(element -> { - if (element.getAnnotation(ServiceInterface.class) != null) { - this.processServiceInterface(element); - } - }); + .map(roundEnv::getElementsAnnotatedWith) + .flatMap(Set::stream) + .filter(element -> element.getKind().isInterface()) + .forEach(element -> { + if (element.getAnnotation(ServiceInterface.class) != null) { + this.processServiceInterface(element); + } + }); return true; } @@ -114,7 +114,8 @@ private void processServiceInterface(Element serviceInterface) { addImports(templateInput); // Collect methods annotated with @HttpRequestInformation - List httpRequestMethods = serviceInterface.getEnclosedElements().stream() + List httpRequestMethods = serviceInterface.getEnclosedElements() + .stream() .filter(element -> element.getKind() == ElementKind.METHOD) .filter(element -> element.getAnnotation(HttpRequestInformation.class) != null) .map(ExecutableElement.class::cast) @@ -180,33 +181,28 @@ private HttpRequestContext createHttpRequestContext(ExecutableElement requestMet // Switch based on annotations if (hostParam != null) { - method.addSubstitution(new Substitution( - hostParam.value(), - param.getSimpleName().toString(), - hostParam.encoded())); + method.addSubstitution( + new Substitution(hostParam.value(), param.getSimpleName().toString(), hostParam.encoded())); } else if (pathParam != null) { if (pathParam.encoded()) { isEncoded = true; } - method.addSubstitution(new Substitution( - pathParam.value(), - param.getSimpleName().toString(), - pathParam.encoded())); + method.addSubstitution( + new Substitution(pathParam.value(), param.getSimpleName().toString(), pathParam.encoded())); } else if (headerParam != null) { method.addHeader(headerParam.value(), param.getSimpleName().toString()); } else if (queryParam != null) { method.addQueryParam(queryParam.value(), param.getSimpleName().toString()); // TODO: Add support for multipleQueryParams and encoded handling } else if (bodyParam != null) { - method.setBody(new HttpRequestContext.Body( - bodyParam.value(), - param.asType().toString(), + method.setBody(new HttpRequestContext.Body(bodyParam.value(), param.asType().toString(), param.getSimpleName().toString())); } // Add parameter details to method context String shortParamName = templateInput.addImport(param.asType()); - method.addParameter(new HttpRequestContext.MethodParameter(param.asType(), shortParamName, param.getSimpleName().toString())); + method.addParameter(new HttpRequestContext.MethodParameter(param.asType(), shortParamName, + param.getSimpleName().toString())); } // Pre-compute host substitutions @@ -216,7 +212,7 @@ private HttpRequestContext createHttpRequestContext(ExecutableElement requestMet } private void setReturnTypeFormMethod(HttpRequestContext method, ExecutableElement requestMethod, - TemplateInput templateInput) { + TemplateInput templateInput) { // Get the return type from the method TypeMirror returnType = requestMethod.getReturnType(); @@ -226,7 +222,6 @@ private void setReturnTypeFormMethod(HttpRequestContext method, ExecutableElemen TypeElement typeElement = (TypeElement) declaredType.asElement(); String fullTypeName = typeElement.getQualifiedName().toString(); - // Handle generic arguments for declared types List typeArguments = declaredType.getTypeArguments(); if (!typeArguments.isEmpty()) { diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/package-info.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/package-info.java new file mode 100644 index 0000000000000..95c08ab487f2e --- /dev/null +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/exceptions/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing exceptions for the annotation processor. + */ +package io.clientcore.annotation.processor.exceptions; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java index e800d5d53e7c8..e6700b2b0ced7 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/HttpRequestContext.java @@ -172,7 +172,7 @@ public Map getHeaders() { /** * Adds a header. * - * @param key the header key. + * @param key the header key. * @param value the header value. */ public void addHeader(String key, String value) { @@ -191,7 +191,7 @@ public Map getQueryParams() { /** * Adds a query parameter. * - * @param key the query parameter key. + * @param key the query parameter key. * @param value the query parameter value. * @throws IllegalArgumentException if a duplicate query parameter is added. */ @@ -210,7 +210,8 @@ public void addQueryParam(String key, String value) { */ public void addSubstitution(Substitution substitution) { if (substitutions.containsKey(substitution.getParameterName())) { - throw new IllegalArgumentException("Cannot add duplicate substitution for parameter '" + substitution.getParameterName() + "'"); + throw new IllegalArgumentException( + "Cannot add duplicate substitution for parameter '" + substitution.getParameterName() + "'"); } substitutions.put(substitution.getParameterName(), substitution); } @@ -275,9 +276,9 @@ public static class MethodParameter { /** * Constructs a new MethodParameter. * - * @param type the type of the parameter. + * @param type the type of the parameter. * @param shortTypeName the short type name of the parameter. - * @param name the name of the parameter. + * @param name the name of the parameter. */ public MethodParameter(TypeMirror type, String shortTypeName, String name) { this.type = type; @@ -330,7 +331,7 @@ public static class Body { /** * Constructs a new Body. * - * @param contentType the content type. + * @param contentType the content type. * @param parameterType the parameter type. * @param parameterName the parameter name. */ diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java index 3f7ad1487ed77..1f5925f94d4bd 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/Substitution.java @@ -45,6 +45,11 @@ public String getParameterName() { return parameterName; } + /** + * Get the variable name that will be used to replace the placeholder in the target URL. + * + * @return The name of the variable that will be used to replace the placeholder in the target URL. + */ public String getParameterVariableName() { return parameterVariableName; } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java index bb9b1577d0c6f..f2f25e57abb70 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java @@ -219,7 +219,8 @@ public List getUnexpectedResponseExceptionDet * * @param unexpectedResponseExceptionDetails the list of unexpected response exception details to set. */ - public void setUnexpectedResponseExceptionDetails(List unexpectedResponseExceptionDetails) { + public void setUnexpectedResponseExceptionDetails( + List unexpectedResponseExceptionDetails) { this.unexpectedResponseExceptionDetails = unexpectedResponseExceptionDetails; } } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/package-info.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/package-info.java new file mode 100644 index 0000000000000..2476c67f64a3e --- /dev/null +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing the models used in the annotation processor. + */ +package io.clientcore.annotation.processor.models; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/package-info.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/package-info.java new file mode 100644 index 0000000000000..55568961e64a3 --- /dev/null +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing the implementation of the annotation processor. + */ +package io.clientcore.annotation.processor; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java index e880bb20d9afb..d685cb3947792 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java @@ -40,16 +40,16 @@ public class JavaPoetTemplateProcessor implements TemplateProcessor { private static final ClassName HTTP_HEADERS = ClassName.bestGuess(HttpHeaders.class.getName()); private static final ClassName CONTENT_TYPE = ClassName.bestGuess(ContentType.class.getName()); - private final ClassName HTTP_REQUEST = ClassName.bestGuess(HttpRequest.class.getName()); - private final ClassName RESPONSE = ClassName.bestGuess(Response.class.getName()); - private final ClassName HTTP_METHOD = ClassName.bestGuess(HttpMethod.class.getName()); + private static final ClassName HTTP_REQUEST = ClassName.bestGuess(HttpRequest.class.getName()); + private static final ClassName RESPONSE = ClassName.bestGuess(Response.class.getName()); + private static final ClassName HTTP_METHOD = ClassName.bestGuess(HttpMethod.class.getName()); private TypeSpec.Builder classBuilder; - private final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); - private static ClassName SERVICE_VERSION_TYPE; - private final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); - private ClassName OBJECT_SERIALIZER = ClassName.bestGuess(ObjectSerializer.class.getName()); + private static final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); + private static final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); + private static final ClassName OBJECT_SERIALIZER = ClassName.bestGuess(ObjectSerializer.class.getName()); + private static ClassName serviceVersionType; @Override public void process(TemplateInput templateInput, ProcessingEnvironment processingEnv) { @@ -63,13 +63,12 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin FieldSpec loggerField = getLoggerField(packageName, serviceInterfaceShortName); // Create the defaultPipeline field - FieldSpec defaultPipeline = - FieldSpec.builder(HTTP_PIPELINE, "defaultPipeline", Modifier.PRIVATE, Modifier.FINAL) - .build(); + FieldSpec defaultPipeline + = FieldSpec.builder(HTTP_PIPELINE, "defaultPipeline", Modifier.PRIVATE, Modifier.FINAL).build(); // Create the serializer field - FieldSpec serializer = FieldSpec.builder(ObjectSerializer.class, "serializer", Modifier.PRIVATE, Modifier.FINAL) - .build(); + FieldSpec serializer + = FieldSpec.builder(ObjectSerializer.class, "serializer", Modifier.PRIVATE, Modifier.FINAL).build(); // Create the endpoint field //FieldSpec endpoint = FieldSpec.builder(String.class, "endpoint", Modifier.PRIVATE, Modifier.FINAL) @@ -77,20 +76,22 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin // Create the serviceVersion field String serviceVersionPackageName = packageName.substring(0, packageName.lastIndexOf(".")); - SERVICE_VERSION_TYPE = ClassName.get(serviceVersionPackageName, serviceInterfaceShortName.substring(0, serviceInterfaceShortName.indexOf("ClientService")) + "ServiceVersion"); - FieldSpec serviceVersion = - FieldSpec.builder(SERVICE_VERSION_TYPE, "serviceVersion", Modifier.PRIVATE).build(); + serviceVersionType = ClassName.get(serviceVersionPackageName, + serviceInterfaceShortName.substring(0, serviceInterfaceShortName.indexOf("ClientService")) + + "ServiceVersion"); + FieldSpec serviceVersion = FieldSpec.builder(serviceVersionType, "serviceVersion", Modifier.PRIVATE).build(); // Create the constructor MethodSpec constructor = getServiceImplConstructor(); - FieldSpec apiVersion = FieldSpec.builder(String.class, "apiVersion") - .addModifiers(Modifier.PRIVATE) - .build(); + FieldSpec apiVersion = FieldSpec.builder(String.class, "apiVersion").addModifiers(Modifier.PRIVATE).build(); // Add instance field - FieldSpec instanceField = FieldSpec.builder(ClassName.get(packageName, serviceInterfaceImplShortName), - "instance", Modifier.PRIVATE, Modifier.STATIC).build(); + FieldSpec instanceField + = FieldSpec + .builder(ClassName.get(packageName, serviceInterfaceImplShortName), "instance", Modifier.PRIVATE, + Modifier.STATIC) + .build(); // Add the static getInstance method MethodSpec getInstanceMethod = MethodSpec.methodBuilder("getInstance") @@ -98,9 +99,10 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin .returns(ClassName.get(packageName, serviceInterfaceImplShortName)) .addParameter(HTTP_PIPELINE, "pipeline") .addParameter(OBJECT_SERIALIZER, "serializer") - .addParameter(SERVICE_VERSION_TYPE, "serviceVersion") + .addParameter(serviceVersionType, "serviceVersion") .beginControlFlow("if (instance == null)") - .addStatement("instance = new $T(pipeline, serializer, serviceVersion)", ClassName.get(packageName, serviceInterfaceImplShortName)) + .addStatement("instance = new $T(pipeline, serializer, serviceVersion)", + ClassName.get(packageName, serviceInterfaceImplShortName)) .endControlFlow() .addStatement("return instance") .build(); @@ -143,8 +145,11 @@ public void process(TemplateInput templateInput, ProcessingEnvironment processin void getGeneratedServiceMethods(TemplateInput templateInput) { for (HttpRequestContext method : templateInput.getHttpRequestContexts()) { - boolean generateInternalOnly = method.getParameters().isEmpty() || method.getParameters().stream() - .anyMatch(parameter -> !(parameter.getName().equals("endpoint") || parameter.getName().equals("apiVersion"))); + boolean generateInternalOnly = method.getParameters().isEmpty() + || method.getParameters() + .stream() + .anyMatch(parameter -> !(parameter.getName().equals("endpoint") + || parameter.getName().equals("apiVersion"))); if (generateInternalOnly) { generateInternalMethod(method); // Generate the internal method @@ -167,17 +172,19 @@ MethodSpec getServiceImplConstructor() { .addParameter(HTTP_PIPELINE, "defaultPipeline") .addStatement("this.defaultPipeline = defaultPipeline") .addParameter(OBJECT_SERIALIZER, "serializer") - .addParameter(SERVICE_VERSION_TYPE, "serviceVersion") + .addParameter(serviceVersionType, "serviceVersion") .addStatement("this.serializer = serializer == null ? new $T() : serializer", JsonSerializer.class) - .addStatement("this.serviceVersion = serviceVersion == null ? $T.getLatest() : serviceVersion", SERVICE_VERSION_TYPE) + .addStatement("this.serviceVersion = serviceVersion == null ? $T.getLatest() : serviceVersion", + serviceVersionType) .addStatement("this.apiVersion = this.serviceVersion.getVersion()") .build(); } static ClassName getServiceVersionType(String packageName, String serviceInterfaceShortName) { - SERVICE_VERSION_TYPE = ClassName.get(packageName, serviceInterfaceShortName.substring(0, - serviceInterfaceShortName.indexOf("ClientService")) + "ServiceVersion"); - return SERVICE_VERSION_TYPE; + serviceVersionType = ClassName.get(packageName, + serviceInterfaceShortName.substring(0, serviceInterfaceShortName.indexOf("ClientService")) + + "ServiceVersion"); + return serviceVersionType; } MethodSpec getEndpointMethod() { @@ -199,7 +206,7 @@ MethodSpec getPipelineMethod() { MethodSpec getServiceVersionMethod() { return MethodSpec.methodBuilder("getServiceVersion") .addModifiers(Modifier.PUBLIC) - .returns(SERVICE_VERSION_TYPE) + .returns(serviceVersionType) .addStatement("return serviceVersion") .build(); } @@ -219,17 +226,16 @@ MethodSpec generatePublicMethod(HttpRequestContext method) { } // add call to the overloaded version of this method - String params = method.getParameters().stream() + String params = method.getParameters() + .stream() .map(HttpRequestContext.MethodParameter::getName) .reduce((a, b) -> a + ", " + b) .orElse(""); if (!"void".equals(method.getMethodReturnType())) { - methodBuilder.addStatement("return $L($L)", - method.getMethodName(), params); + methodBuilder.addStatement("return $L($L)", method.getMethodName(), params); } else { - methodBuilder.addStatement("$L($L)", - method.getMethodName(), params); + methodBuilder.addStatement("$L($L)", method.getMethodName(), params); } return methodBuilder.build(); @@ -251,9 +257,7 @@ private void generateInternalMethod(HttpRequestContext method) { // Helper methods private MethodSpec.Builder createMethodBuilder(HttpRequestContext method, TypeName returnTypeName) { - return MethodSpec.methodBuilder(method.getMethodName()) - .addModifiers(Modifier.PUBLIC) - .returns(returnTypeName); + return MethodSpec.methodBuilder(method.getMethodName()).addModifiers(Modifier.PUBLIC).returns(returnTypeName); } private void addMethodParameters(MethodSpec.Builder methodBuilder, HttpRequestContext method) { @@ -267,13 +271,13 @@ private void initializeHttpRequest(MethodSpec.Builder methodBuilder, HttpRequest methodBuilder.addStatement("String host = $L", method.getHost()) .addCode("\n") .addComment("Create the HTTP request") - .addStatement("$T httpRequest = new $T($T.$L, host)", HTTP_REQUEST, HTTP_REQUEST, HTTP_METHOD, method.getHttpMethod()); + .addStatement("$T httpRequest = new $T($T.$L, host)", HTTP_REQUEST, HTTP_REQUEST, HTTP_METHOD, + method.getHttpMethod()); } private void addHeadersToRequest(MethodSpec.Builder methodBuilder, HttpRequestContext method) { if (!method.getHeaders().isEmpty()) { - methodBuilder - .addCode("\n") + methodBuilder.addCode("\n") .addComment("set the headers") .addStatement("$T headers = new $T()", HTTP_HEADERS, HTTP_HEADERS); for (Map.Entry header : method.getHeaders().entrySet()) { @@ -286,14 +290,17 @@ private void addHeadersToRequest(MethodSpec.Builder methodBuilder, HttpRequestCo } } - boolean isStringType = method.getParameters().stream() - .anyMatch(parameter -> parameter.getName().equals(header.getValue()) && TypeName.get(parameter.getTypeMirror()).equals(TypeName.get(String.class))); + boolean isStringType = method.getParameters() + .stream() + .anyMatch(parameter -> parameter.getName().equals(header.getValue()) + && TypeName.get(parameter.getTypeMirror()).equals(TypeName.get(String.class))); String value = isStringType ? header.getValue() : "String.valueOf(" + header.getValue() + ")"; if (isEnumExists) { methodBuilder.addStatement("headers.add($T.$L, $L)", HTTP_HEADER_NAME, enumHeaderKey, value); } else { - methodBuilder.addStatement("headers.add($T.fromString($S), $L)", HTTP_HEADER_NAME, header.getKey(), value); + methodBuilder.addStatement("headers.add($T.fromString($S), $L)", HTTP_HEADER_NAME, header.getKey(), + value); } } methodBuilder.addStatement("httpRequest.setHeaders(headers)"); @@ -303,19 +310,22 @@ private void addHeadersToRequest(MethodSpec.Builder methodBuilder, HttpRequestCo private void addRequestBody(MethodSpec.Builder methodBuilder, HttpRequestContext method) { methodBuilder.addCode("\n").addComment("Set the request body"); HttpRequestContext.Body body = method.getBody(); - boolean isContentTypeSetInHeaders = method.getParameters().stream() - .anyMatch(parameter -> parameter.getName().equals("contentType")); + boolean isContentTypeSetInHeaders + = method.getParameters().stream().anyMatch(parameter -> parameter.getName().equals("contentType")); if (body != null) { configureRequestWithBodyAndContentType(methodBuilder, body.getParameterType(), body.getContentType(), body.getParameterName(), isContentTypeSetInHeaders); } else { - methodBuilder.addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S)", HttpHeaderName.class, "0"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S)", HttpHeaderName.class, + "0"); } } - private void finalizeHttpRequest(MethodSpec.Builder methodBuilder, TypeName returnTypeName, HttpRequestContext method) { - methodBuilder.addCode("\n").addComment("Send the request through the pipeline") + private void finalizeHttpRequest(MethodSpec.Builder methodBuilder, TypeName returnTypeName, + HttpRequestContext method) { + methodBuilder.addCode("\n") + .addComment("Send the request through the pipeline") .addStatement("$T response = pipeline.send(httpRequest)", RESPONSE); if (!method.getExpectedStatusCodes().isEmpty()) { @@ -328,14 +338,13 @@ private void finalizeHttpRequest(MethodSpec.Builder methodBuilder, TypeName retu private void validateResponseStatus(MethodSpec.Builder methodBuilder, HttpRequestContext method) { if (!method.getExpectedStatusCodes().isEmpty()) { - methodBuilder - .addCode("\n") - .addStatement("int responseCode = response.getStatusCode()"); + methodBuilder.addCode("\n").addStatement("int responseCode = response.getStatusCode()"); if (method.getExpectedStatusCodes().size() == 1) { methodBuilder.addStatement("boolean expectedResponse = responseCode == $L", method.getExpectedStatusCodes().get(0)); } else { - String statusCodes = method.getExpectedStatusCodes().stream() + String statusCodes = method.getExpectedStatusCodes() + .stream() .map(code -> "responseCode == " + code) .collect(Collectors.joining(" || ")); methodBuilder.addStatement("boolean expectedResponse = " + statusCodes); @@ -346,15 +355,23 @@ private void validateResponseStatus(MethodSpec.Builder methodBuilder, HttpReques } } - public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuilder, String parameterType, String contentType, String parameterName, boolean isContentTypeSetInHeaders) { + /** + * Configures the request with the body content and content type. + * @param methodBuilder The method builder to add the statements to + * @param parameterType The type of the parameter + * @param contentType The content type of the request + * @param parameterName The name of the parameter + * @param isContentTypeSetInHeaders Whether the content type is set in the headers + */ + public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuilder, String parameterType, + String contentType, String parameterName, boolean isContentTypeSetInHeaders) { if (parameterType == null) { // No body content to set - methodBuilder - .addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S))", HttpHeaderName.class, 0); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.CONTENT_LENGTH, $S))", HttpHeaderName.class, 0); } else { if (contentType == null || contentType.isEmpty()) { - if (parameterType.equals("byte[]") || parameterType.equals("String")) { + if ("byte[]".equals(parameterType) || "String".equals(parameterType)) { contentType = ContentType.APPLICATION_OCTET_STREAM; } else { @@ -366,9 +383,8 @@ public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuil if (!isContentTypeSetInHeaders) { setContentTypeHeader(methodBuilder, contentType); } - if (parameterType.equals("io.clientcore.core.util.binarydata.BinaryData")) { - methodBuilder - .addStatement("$T binaryData = ($T) $L", BinaryData.class, BinaryData.class, parameterName) + if ("io.clientcore.core.util.binarydata.BinaryData".equals(parameterType)) { + methodBuilder.addStatement("$T binaryData = ($T) $L", BinaryData.class, BinaryData.class, parameterName) .beginControlFlow("if (binaryData.getLength() != null)") .addStatement( "httpRequest.getHeaders().set($T.CONTENT_LENGTH, String.valueOf(binaryData.getLength()))", @@ -395,32 +411,28 @@ public void configureRequestWithBodyAndContentType(MethodSpec.Builder methodBuil private static void setContentTypeHeader(MethodSpec.Builder methodBuilder, String contentType) { switch (contentType) { case ContentType.APPLICATION_JSON: - methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - HTTP_HEADER_NAME, - "CONTENT_TYPE", - CONTENT_TYPE, - "APPLICATION_JSON"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", HTTP_HEADER_NAME, + "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_JSON"); break; + case ContentType.APPLICATION_OCTET_STREAM: - methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - HTTP_HEADER_NAME, - "CONTENT_TYPE", - CONTENT_TYPE, - "APPLICATION_OCTET_STREAM"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", HTTP_HEADER_NAME, + "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_OCTET_STREAM"); break; + case ContentType.APPLICATION_X_WWW_FORM_URLENCODED: - methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - HTTP_HEADER_NAME, - "CONTENT_TYPE", - CONTENT_TYPE, - "APPLICATION_X_WWW_FORM_URLENCODED"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", HTTP_HEADER_NAME, + "CONTENT_TYPE", CONTENT_TYPE, "APPLICATION_X_WWW_FORM_URLENCODED"); break; + case ContentType.TEXT_EVENT_STREAM: - methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", - HTTP_HEADER_NAME, - "CONTENT_TYPE", - CONTENT_TYPE, - "TEXT_EVENT_STREAM"); + methodBuilder.addStatement("httpRequest.getHeaders().set($T.$L, $T.$L)", HTTP_HEADER_NAME, + "CONTENT_TYPE", CONTENT_TYPE, "TEXT_EVENT_STREAM"); + break; + + default: + methodBuilder.addStatement("httpRequest.getHeaders().set($T.fromString($S), $S)", HTTP_HEADER_NAME, + "CONTENT_TYPE", contentType); break; } } @@ -431,15 +443,15 @@ private void updateRequestWithBodyContent(MethodSpec.Builder methodBuilder, bool return; } if (isJson) { - methodBuilder - .addStatement("httpRequest.setBody($T.fromObject($L, serializer))", BinaryData.class, parameterName); - } else if (parameterType.equals("byte[]")) { - methodBuilder - .addStatement("httpRequest.setBody($T.fromBytes((byte[]) $L))", BinaryData.class, parameterName); - } else if (parameterType.equals("String")) { - methodBuilder - .addStatement("httpRequest.setBody($T.fromString((String) $L))", BinaryData.class, parameterName); - } else if (parameterType.equals("ByteBuffer")) { + methodBuilder.addStatement("httpRequest.setBody($T.fromObject($L, serializer))", BinaryData.class, + parameterName); + } else if ("byte[]".equals(parameterType)) { + methodBuilder.addStatement("httpRequest.setBody($T.fromBytes((byte[]) $L))", BinaryData.class, + parameterName); + } else if ("String".equals(parameterType)) { + methodBuilder.addStatement("httpRequest.setBody($T.fromString((String) $L))", BinaryData.class, + parameterName); + } else if ("ByteBuffer".equals(parameterType)) { // TODO: confirm behavior //if (((ByteBuffer) bodyContentObject).hasArray()) { // methodBuilder @@ -451,13 +463,12 @@ private void updateRequestWithBodyContent(MethodSpec.Builder methodBuilder, bool // methodBuilder // .addStatement("httpRequest.setBody($T.fromBytes($L))", BinaryData.class, array); //} - methodBuilder - .addStatement("httpRequest.setBody($T.fromBytes(((ByteBuffer) $L).array()))", BinaryData.class, - parameterName); + methodBuilder.addStatement("httpRequest.setBody($T.fromBytes(((ByteBuffer) $L).array()))", BinaryData.class, + parameterName); } else { - methodBuilder - .addStatement("httpRequest.setBody($T.fromObject($L, serializer))", BinaryData.class, parameterName); + methodBuilder.addStatement("httpRequest.setBody($T.fromObject($L, serializer))", BinaryData.class, + parameterName); } } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java index 06f734db1a846..1e312704f747d 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/TemplateProcessor.java @@ -11,9 +11,21 @@ * Interface for processing templates. */ public interface TemplateProcessor { + + /** + * Returns an instance of the TemplateProcessor. + * + * @return a new instance of JavaPoetTemplateProcessor + */ static TemplateProcessor getInstance() { return new JavaPoetTemplateProcessor(); } + /** + * Processes the given template input using the provided processing environment. + * + * @param templateInput the input data for the template + * @param processingEnv the environment used for processing + */ void process(TemplateInput templateInput, ProcessingEnvironment processingEnv); } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/package-info.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/package-info.java new file mode 100644 index 0000000000000..145cc3f3c6b19 --- /dev/null +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing the implementation of the templating. + */ +package io.clientcore.annotation.processor.templating; diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java index 0d3bffa5a138d..14c550823b134 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java @@ -23,6 +23,15 @@ public class PathBuilder { // Note that query parameters may also exist, and should be appended to the end of the URL string using // a Map containing key-value pairs. // Note that the 'endpoint' parameter is special - it is always the first parameter, and is always a host parameter. + /** + * Builds the path of the request URL by replacing the placeholders with the actual values. + * @param rawHost The raw host string that contains {} delimited parameters. + * @param method The HttpRequestContext object that contains the method's configuration, parameters, headers, and other details. + * @return The path of the request URL with the placeholders replaced with the actual values. + * @throws NullPointerException If the method is null. + * @throws MissingSubstitutionException If a substitution is missing for a placeholder in the raw host string. + * @throws IllegalArgumentException If the query parameter key or value is empty. + */ public static String buildPath(String rawHost, HttpRequestContext method) { if (method == null) { throw new NullPointerException("method cannot be null"); @@ -41,9 +50,7 @@ public static String buildPath(String rawHost, HttpRequestContext method) { if (substitution != null) { String substitutionValue = substitution.getParameterVariableName(); - String replacementValue = substitutionValue != null - ? Objects.toString(substitutionValue, "null") - : ""; + String replacementValue = substitutionValue != null ? Objects.toString(substitutionValue, "null") : ""; matcher.appendReplacement(buffer, ""); if (buffer.length() != 0) { @@ -51,7 +58,8 @@ public static String buildPath(String rawHost, HttpRequestContext method) { } buffer.append(replacementValue).append(" + \""); } else { - throw new MissingSubstitutionException("Could not find substitution for '" + paramName + "' in method '" + method.getMethodName() + "'"); + throw new MissingSubstitutionException( + "Could not find substitution for '" + paramName + "' in method '" + method.getMethodName() + "'"); } } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java index d84bd41e6ce7d..b7fa612c0ddb3 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java @@ -25,14 +25,14 @@ public class ResponseBodyModeGeneration { * @param useRequestOptions whether request options are used. */ public static void generateResponseBodyMode(MethodSpec.Builder methodBuilder, TypeName returnTypeName, - boolean useRequestOptions) { + boolean useRequestOptions) { methodBuilder.addStatement("$T responseBodyMode = null", ResponseBodyMode.class); // Assign responseBodyMode based on request options. // TODO: Temporary fix for TestInterface if (useRequestOptions) { - methodBuilder.beginControlFlow( - "if (requestOptions != null && requestOptions.getResponseBodyMode() != null)") + methodBuilder + .beginControlFlow("if (requestOptions != null && requestOptions.getResponseBodyMode() != null)") .addStatement("responseBodyMode = requestOptions.getResponseBodyMode()") .endControlFlow(); } @@ -84,7 +84,7 @@ public static void handleNonDeserializeResponse(MethodSpec.Builder methodBuilder * @param useRequestOptions whether request options are used. */ public static void generateResponseHandling(MethodSpec.Builder methodBuilder, TypeName returnTypeName, - boolean useRequestOptions) { + boolean useRequestOptions) { if (returnTypeName.toString().equals("void")) { closeResponse(methodBuilder); methodBuilder.addStatement("return"); @@ -119,7 +119,7 @@ private static void closeResponse(MethodSpec.Builder methodBuilder) { * Adds a return statement for response handling when necessary. * * @param returnTypeName the return type of the method. - * @param methodBuilder the method builder to append generated code. + * @param methodBuilder the method builder to append generated code. */ public static void createResponseIfNecessary(TypeName returnTypeName, MethodSpec.Builder methodBuilder) { methodBuilder.addStatement("return ($T) response", returnTypeName); @@ -129,7 +129,7 @@ public static void createResponseIfNecessary(TypeName returnTypeName, MethodSpec * Handles different response processing modes based on the return type and method. * * @param returnTypeName the return type of the method. - * @param methodBuilder the method builder to append generated code. + * @param methodBuilder the method builder to append generated code. */ public static void handleResponseModeToCreateResponse(TypeName returnTypeName, MethodSpec.Builder methodBuilder) { if (returnTypeName.toString().contains("Boolean") || returnTypeName.toString().contains("boolean")) { @@ -150,4 +150,3 @@ public static void handleResponseModeToCreateResponse(TypeName returnTypeName, M } } } - diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/package-info.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/package-info.java new file mode 100644 index 0000000000000..ddfa09cb7b2af --- /dev/null +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing utility classes for the annotation processor. + */ +package io.clientcore.annotation.processor.utils; diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java index 412771ef8954f..c1668e7118aa5 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/models/TemplateInputTest.java @@ -92,8 +92,8 @@ void setAndGetServiceInterfaceFQN() { @Test void setAndGetUnexpectedResponseExceptionDetails() { TemplateInput templateInput = new TemplateInput(); - List details = - Collections.singletonList(mock(UnexpectedResponseExceptionDetail.class)); + List details + = Collections.singletonList(mock(UnexpectedResponseExceptionDetail.class)); templateInput.setUnexpectedResponseExceptionDetails(details); assertEquals(details, templateInput.getUnexpectedResponseExceptionDetails()); } diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java index 6380145dceb21..3699b2cc175ad 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/APIGenerationTest.java @@ -41,14 +41,12 @@ public void testPublicAPIUserMethodGeneration() { getUserMethodContext.setHttpMethod(HttpMethod.GET); getUserMethodContext.setPath("/users/{userId}"); - getUserMethodContext.setExpectedStatusCodes(new int[]{200}); + getUserMethodContext.setExpectedStatusCodes(new int[] { 200 }); getUserMethodContext.setMethodName("getUser"); getUserMethodContext.setMethodReturnType("User"); - getUserMethodContext.addSubstitution(new Substitution( - "String", - "userId", - false)); - getUserMethodContext.setBody(new HttpRequestContext.Body("multipart/form-data", "BinaryData", "audioTranscriptionOptions")); + getUserMethodContext.addSubstitution(new Substitution("String", "userId", false)); + getUserMethodContext + .setBody(new HttpRequestContext.Body("multipart/form-data", "BinaryData", "audioTranscriptionOptions")); templateInput.setHttpRequestContexts(Collections.singletonList(getUserMethodContext)); MethodSpec getUserMethodGenerationSpec = processor.generatePublicMethod(getUserMethodContext); diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java index 41ea3b485e356..76fc3aa661233 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/BodyContentTypeProcessorTest.java @@ -48,8 +48,8 @@ public void bodyParamAnnotationPriorityOverContentTypeHeaderTest() { MethodSpec methodSpec = methodBuilder.build(); // Expected output - String expectedOutput = - "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes(((ByteBuffer) request).array()));"; + String expectedOutput + = "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes(((ByteBuffer) request).array()));"; // Actual output String actualOutput = methodSpec.toString(); @@ -87,9 +87,9 @@ public void testConfigureRequestWithBodyAndContentType(String parameterType, Str MethodSpec methodSpec = methodBuilder.build(); // Expected output - String expectedOutput = - "httpRequest.getHeaders().set(io.clientcore.core.http.models.HttpHeaderName.CONTENT_TYPE, " + - expectedContentType; + String expectedOutput + = "httpRequest.getHeaders().set(io.clientcore.core.http.models.HttpHeaderName.CONTENT_TYPE, " + + expectedContentType; // Actual output String actualOutput = methodSpec.toString(); @@ -119,8 +119,8 @@ public void contentTypeHeaderPriorityOverBodyParamAnnotationTest() { MethodSpec methodSpec = methodBuilder.build(); // Expected output - String expectedOutput = - "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes(((ByteBuffer) request).array()));"; + String expectedOutput + = "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes(((ByteBuffer) request).array()));"; // Actual output String actualOutput = methodSpec.toString(); @@ -129,15 +129,12 @@ public void contentTypeHeaderPriorityOverBodyParamAnnotationTest() { // Verify headers in a separate test request content type header is set to application/octet-stream } - private static Stream knownContentTypesProvider() { - return Stream.of( - Arguments.of("byte[]", "io.clientcore.core.http.models.ContentType.APPLICATION_OCTET_STREAM"), + return Stream.of(Arguments.of("byte[]", "io.clientcore.core.http.models.ContentType.APPLICATION_OCTET_STREAM"), Arguments.of("String", "io.clientcore.core.http.models.ContentType.APPLICATION_OCTET_STREAM"), Arguments.of("BinaryData", "io.clientcore.core.http.models.ContentType.APPLICATION_JSON"), Arguments.of("Object", "io.clientcore.core.http.models.ContentType.APPLICATION_JSON"), - Arguments.of("ByteBuffer", "io.clientcore.core.http.models.ContentType.APPLICATION_JSON") - ); + Arguments.of("ByteBuffer", "io.clientcore.core.http.models.ContentType.APPLICATION_JSON")); } private static Stream knownParameterTypesProvider() { @@ -173,7 +170,6 @@ private static Stream knownParameterTypesProvider() { "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromBytes((byte[]) request));"), // Add scenario for parameterType == "String" Arguments.of(new HttpRequestContext.Body("application/octet-stream", "String", "request"), - "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromString((String) request));") - ); + "httpRequest.setBody(io.clientcore.core.util.binarydata.BinaryData.fromString((String) request));")); } } diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java index 26d7f3c9faef7..bb94b452286c3 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/templating/HttpPipelineBuilderMethodTest.java @@ -37,11 +37,11 @@ public class HttpPipelineBuilderMethodTest { private static final String PACKAGE_NAME = "com.example"; private static final String SERVICE_INTERFACE_SHORT_NAME = getExampleClientServiceImpl(); + private static final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); + private static final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); private JavaPoetTemplateProcessor processor; private ProcessingEnvironment processingEnv; private TemplateInput templateInput; - private final ClassName CLIENT_LOGGER_NAME = ClassName.bestGuess(ClientLogger.class.getName()); - private final ClassName HTTP_PIPELINE = ClassName.bestGuess(HttpPipeline.class.getName()); @BeforeEach public void setUp() { @@ -100,8 +100,8 @@ public void testGetServiceVersionMethod() { @Test public void testGetServiceVersionType() { - assertEquals("com.example.ExampleServiceVersion", processor.getServiceVersionType(PACKAGE_NAME, - SERVICE_INTERFACE_SHORT_NAME).toString()); + assertEquals("com.example.ExampleServiceVersion", + JavaPoetTemplateProcessor.getServiceVersionType(PACKAGE_NAME, SERVICE_INTERFACE_SHORT_NAME).toString()); } @Test @@ -111,6 +111,8 @@ public void testLoggerFieldGeneration() { loggerField.modifiers); assertEquals(CLIENT_LOGGER_NAME, loggerField.type); assertEquals("LOGGER", loggerField.name); - assertTrue(loggerField.initializer.toString().contains("new io.clientcore.core.instrumentation.logging.ClientLogger(com.example.ExampleClientServiceImpl.class)")); + assertTrue(loggerField.initializer.toString() + .contains( + "new io.clientcore.core.instrumentation.logging.ClientLogger(com.example.ExampleClientServiceImpl.class)")); } } diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java index ed011a5ae80ed..3e2de00bb3a55 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/PathBuilderTest.java @@ -82,7 +82,8 @@ public void buildsPathWithMultipleQueryParameters() { context.addQueryParam("key2", "value2"); context.addQueryParam("key3", "value3"); String result = PathBuilder.buildPath("https://{endpoint}/keys", context); - assertEquals("\"https://\" + myEndpoint + \"/keys?key1=\" + value1 + \"&key2=\" + value2 + \"&key3=\" + value3", result); + assertEquals("\"https://\" + myEndpoint + \"/keys?key1=\" + value1 + \"&key2=\" + value2 + \"&key3=\" + value3", + result); } @Test @@ -121,7 +122,8 @@ public void buildsPathWithMultipleSameQueryParameters() { public void buildsPathWithClashingSubstitutionNames() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); - assertThrows(IllegalArgumentException.class, () -> context.addSubstitution(new Substitution("endpoint", "myEndpoint2"))); + assertThrows(IllegalArgumentException.class, + () -> context.addSubstitution(new Substitution("endpoint", "myEndpoint2"))); } @Test @@ -134,14 +136,17 @@ public void buildsPathWithMultipleSubstitutionsAndQueryParameters() { context.addQueryParam("key2", "value2"); context.addQueryParam("key3", "value3"); String result = PathBuilder.buildPath("https://{endpoint}/keys/{path1}/{path2}", context); - assertEquals("\"https://\" + myEndpoint + \"/keys/\" + myPath + \"/\" + myPath2 + \"?key1=\" + value1 + \"&key2=\" + value2 + \"&key3=\" + value3", result); + assertEquals( + "\"https://\" + myEndpoint + \"/keys/\" + myPath + \"/\" + myPath2 + \"?key1=\" + value1 + \"&key2=\" + value2 + \"&key3=\" + value3", + result); } @Test public void buildsPathWithMissingSubstitution() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint}/keys/{path1}", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint}/keys/{path1}", context)); } @Test @@ -149,7 +154,8 @@ public void buildsPathWithMissingQueryParameter() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); context.addQueryParam("key1", "value1"); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint}/keys?key2={value2}", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint}/keys?key2={value2}", context)); } @Test @@ -328,7 +334,8 @@ public void buildsPathWithMultipleSubstitutionsFollowedByDifferentCharacters() { context.addSubstitution(new Substitution("path2", "myPath2")); context.addSubstitution(new Substitution("path3", "myPath3")); String result = PathBuilder.buildPath("https://{endpoint}*1a{path1}\u00A9 {path2}/keys/{path3}", context); - assertEquals("\"https://\" + myEndpoint + \"*1a\" + myPath1 + \"\u00A9 \" + myPath2 + \"/keys/\" + myPath3", result); + assertEquals("\"https://\" + myEndpoint + \"*1a\" + myPath1 + \"\u00A9 \" + myPath2 + \"/keys/\" + myPath3", + result); } @Test @@ -344,7 +351,8 @@ public void buildsPathWithNestedSubstitutions() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); context.addSubstitution(new Substitution("path", "myPath")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{{endpoint}/keys/{path}", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{{endpoint}/keys/{path}", context)); } @Test @@ -352,7 +360,8 @@ public void buildsPathWithMissingClosingBrace() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); context.addSubstitution(new Substitution("path", "myPath")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint/keys/{path}", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint/keys/{path}", context)); } @Test @@ -360,35 +369,40 @@ public void buildsPathWithMissingOpeningBrace() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint", "myEndpoint")); context.addSubstitution(new Substitution("path", "myPath")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://endpoint}/keys/{path}", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://endpoint}/keys/{path}", context)); } @Test public void buildsPathWithSubstitutionContainingOpeningBrace() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint{", "myEndpoint")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint{/keys", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint{/keys", context)); } @Test public void buildsPathWithSubstitutionContainingClosingBrace() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint}", "myEndpoint")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint}/keys", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint}/keys", context)); } @Test public void buildsPathWithSubstitutionContainingBothBraces() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint{}", "myEndpoint")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint{}}/keys", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint{}}/keys", context)); } @Test public void buildsPathWithSubstitutionContainingMultipleBraces() { HttpRequestContext context = new HttpRequestContext(); context.addSubstitution(new Substitution("endpoint{{}}", "myEndpoint")); - assertThrows(MissingSubstitutionException.class, () -> PathBuilder.buildPath("https://{endpoint{{}}}/keys", context)); + assertThrows(MissingSubstitutionException.class, + () -> PathBuilder.buildPath("https://{endpoint{{}}}/keys", context)); } @Test @@ -429,13 +443,13 @@ public void buildsPathWithoutProtocolWithSubstitutionsAndQueryParameters() { // TODO: Currently, the context adds subsitition using the parameter name as key so i // Is this a valid case? -// @Test -// public void buildsPathWithHostAndPathUsingSameSubstitutionName() { -// HttpRequestContext context = new HttpRequestContext(); -// context.addSubstitution(new Substitution("sub1", "hostSub1")); -// context.addSubstitution(new Substitution("sub1", "pathSub1")); -// -// String result = PathBuilder.buildPath("https://{sub1}.host.com/keys/{sub1}", context); -// assertEquals("\"https://\" + hostSub1 + \".host.com/keys/\" + pathSub1", result); -// } + // @Test + // public void buildsPathWithHostAndPathUsingSameSubstitutionName() { + // HttpRequestContext context = new HttpRequestContext(); + // context.addSubstitution(new Substitution("sub1", "hostSub1")); + // context.addSubstitution(new Substitution("sub1", "pathSub1")); + // + // String result = PathBuilder.buildPath("https://{sub1}.host.com/keys/{sub1}", context); + // assertEquals("\"https://\" + hostSub1 + \".host.com/keys/\" + pathSub1", result); + // } } diff --git a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java index 7d37ae7b01ac2..bc1d51e564302 100644 --- a/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java +++ b/sdk/clientcore/annotation-processor/src/test/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGenerationTest.java @@ -24,7 +24,7 @@ void setUp() { } @Test - void generateResponseBodyMode_withRequestOptions() { + void generateResponseBodyModeWithRequestOptions() { TypeName returnTypeName = TypeName.get(String.class); ResponseBodyModeGeneration.generateResponseBodyMode(methodBuilder, returnTypeName, true); MethodSpec methodSpec = methodBuilder.build(); @@ -32,16 +32,16 @@ void generateResponseBodyMode_withRequestOptions() { } @Test - void generateResponseBodyMode_withoutRequestOptions() { + void generateResponseBodyModeWithoutRequestOptions() { TypeName returnTypeName = TypeName.get(String.class); ResponseBodyModeGeneration.generateResponseBodyMode(methodBuilder, returnTypeName, false); MethodSpec methodSpec = methodBuilder.build(); - assertTrue(methodSpec.toString().contains("responseBodyMode = io.clientcore.core.http.models" + - ".ResponseBodyMode.DESERIALIZE")); + assertTrue(methodSpec.toString() + .contains("responseBodyMode = io.clientcore.core.http.models" + ".ResponseBodyMode.DESERIALIZE")); } @Test - void generateResponseHandling_withVoidReturnType() { + void generateResponseHandlingWithVoidReturnType() { TypeName returnTypeName = TypeName.VOID; ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); MethodSpec methodSpec = methodBuilder.build(); @@ -49,20 +49,20 @@ void generateResponseHandling_withVoidReturnType() { } @Test - void generateResponseHandling_withResponseReturnType() { + void generateResponseHandlingWithResponseReturnType() { TypeName returnTypeName = TypeName.get(HttpResponse.class); ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); MethodSpec methodSpec = methodBuilder.build(); - assertTrue(methodSpec.toString() - .contains("io.clientcore.core.implementation.http.HttpResponseAccessHelper.setValue")); + assertTrue( + methodSpec.toString().contains("io.clientcore.core.implementation.http.HttpResponseAccessHelper.setValue")); } @Test - void generateResponseHandling_withNonDeserializeMode() { + void generateResponseHandlingWithNonDeserializeMode() { TypeName returnTypeName = TypeName.get(HttpResponse.class); ResponseBodyModeGeneration.generateResponseHandling(methodBuilder, returnTypeName, false); MethodSpec methodSpec = methodBuilder.build(); - assertTrue(methodSpec.toString().contains( - "io.clientcore.core.implementation.http.HttpResponseAccessHelper.setBodyDeserializer")); + assertTrue(methodSpec.toString() + .contains("io.clientcore.core.implementation.http.HttpResponseAccessHelper.setBodyDeserializer")); } } diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index 0d551df7c060f..498dd3918341a 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -64,7 +64,7 @@ extends: - name: annotation-processor-test groupId: io.clientcore PreBuildSteps: - - task: Maven@4 + - task: Maven@4 displayName: 'Build and install annotation-processor' inputs: mavenPomFile: sdk/clientcore/annotation-processor/pom.xml diff --git a/sdk/clientcore/http-stress/pom.xml b/sdk/clientcore/http-stress/pom.xml index f829d0460b186..589938ca58691 100644 --- a/sdk/clientcore/http-stress/pom.xml +++ b/sdk/clientcore/http-stress/pom.xml @@ -1,5 +1,5 @@ - - + diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 6b3fe5e967ebc..0fece0c2045a1 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -731,7 +731,7 @@ - ${compiler.proc} + false From 8de047b78fc14143e927fab07f96c1903521b8e9 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Mon, 27 Jan 2025 15:37:43 -0800 Subject: [PATCH 17/21] remove prebuild step, tools module and override proc in testing module --- sdk/clientcore/annotation-processor-test/pom.xml | 9 +++++++-- sdk/clientcore/ci.yml | 12 ------------ sdk/clientcore/pom.xml | 1 - sdk/clientcore/tools/pom.xml | 11 ----------- sdk/parents/clientcore-parent/pom.xml | 2 +- 5 files changed, 8 insertions(+), 27 deletions(-) delete mode 100644 sdk/clientcore/tools/pom.xml diff --git a/sdk/clientcore/annotation-processor-test/pom.xml b/sdk/clientcore/annotation-processor-test/pom.xml index 587318d83db8f..25d0f60f24797 100644 --- a/sdk/clientcore/annotation-processor-test/pom.xml +++ b/sdk/clientcore/annotation-processor-test/pom.xml @@ -9,12 +9,11 @@ io.clientcore clientcore-parent 1.0.0-beta.1 - ../../parents/clientcore-parent/pom.xml + ../../parents/clientcore-parent io.clientcore annotation-processor-test - jar 1.0.0-beta.1 Java Core library tests for annotation-processor features. @@ -41,6 +40,8 @@ true true true + true + all,-missing @@ -78,6 +79,7 @@ maven-compiler-plugin 3.13.0 + only false ${project.build.directory}/generated-sources/ @@ -91,6 +93,9 @@ io.clientcore.annotation.processor.AnnotationProcessor + + ${project.build.directory}/generated-sources/ + diff --git a/sdk/clientcore/ci.yml b/sdk/clientcore/ci.yml index 498dd3918341a..4b1121763fae9 100644 --- a/sdk/clientcore/ci.yml +++ b/sdk/clientcore/ci.yml @@ -63,15 +63,3 @@ extends: groupId: io.clientcore - name: annotation-processor-test groupId: io.clientcore - PreBuildSteps: - - task: Maven@4 - displayName: 'Build and install annotation-processor' - inputs: - mavenPomFile: sdk/clientcore/annotation-processor/pom.xml - goals: 'install' - options: '$(DefaultOptions) -T 2C -DskipTests -Dgpg.skip -Dmaven.javadoc.skip=true -Dcodesnippet.skip=true -Dcheckstyle.skip=true -Dspotbugs.skip=true -Djacoco.skip=true -Drevapi.skip=true -Dshade.skip=true -Dspotless.skip=true -pl io.clientcore:annotation-processor' - mavenOptions: '$(MemoryOptions) $(LoggingOptions)' - javaHomeOption: 'JDKVersion' - jdkVersionOption: $(JavaBuildVersion) - jdkArchitectureOption: 'x64' - publishJUnitResults: false diff --git a/sdk/clientcore/pom.xml b/sdk/clientcore/pom.xml index 56ab973687d06..fd0ab8dc800c0 100644 --- a/sdk/clientcore/pom.xml +++ b/sdk/clientcore/pom.xml @@ -16,6 +16,5 @@ http-stress annotation-processor annotation-processor-test - tools diff --git a/sdk/clientcore/tools/pom.xml b/sdk/clientcore/tools/pom.xml deleted file mode 100644 index b7a1e49daef25..0000000000000 --- a/sdk/clientcore/tools/pom.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - 4.0.0 - io.clientcore - clientcore-tools-parent - pom - 1.0.0 - diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 0fece0c2045a1..8f386d0fa2904 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -731,7 +731,7 @@ - + ${compiler.proc} false From 9e2b773f0a5ae80073a3c4ef0b4166d9707a1b9a Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Mon, 27 Jan 2025 16:39:23 -0800 Subject: [PATCH 18/21] update properties --- sdk/clientcore/annotation-processor/pom.xml | 5 ----- .../annotation/processor/AnnotationProcessor.java | 6 ++++++ .../annotation/processor/models/TemplateInput.java | 7 +++++++ .../processor/templating/JavaPoetTemplateProcessor.java | 7 +++++++ .../clientcore/annotation/processor/utils/PathBuilder.java | 5 ++++- .../processor/utils/ResponseBodyModeGeneration.java | 5 ++++- 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 7aa31190b0ece..76bb7cd543777 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -96,13 +96,8 @@ UTF-8 https://azuresdkartifacts.blob.core.windows.net/azure-sdk-for-java - 1.8 - 1.8 checkstyle-suppressions.xml - false spotbugs-exclude.xml - true - true diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java index 5f449b1fda476..c8249e94ebb23 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/AnnotationProcessor.java @@ -54,6 +54,12 @@ @SupportedSourceVersion(SourceVersion.RELEASE_8) public class AnnotationProcessor extends AbstractProcessor { + /** + * Creates a new instance of the AnnotationProcessor. + */ + public AnnotationProcessor() { + } + @Override public SourceVersion getSupportedSourceVersion() { // Reflective fallback if SourceVersion.RELEASE_8 isn't available at compile time diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java index f2f25e57abb70..ea3dd8d1876ad 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/models/TemplateInput.java @@ -16,6 +16,13 @@ * Represents the input required for generating a template. */ public class TemplateInput { + + /** + * Initializes a new instance of the {@link TemplateInput} class. + */ + public TemplateInput() { + } + // A map of fully-qualified class names to their short names private final Map imports = new TreeMap<>(); diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java index d685cb3947792..000e04764230b 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/templating/JavaPoetTemplateProcessor.java @@ -36,6 +36,13 @@ * This class generates the implementation of the service interface. */ public class JavaPoetTemplateProcessor implements TemplateProcessor { + + /** + * Initializes a new instance of the {@link JavaPoetTemplateProcessor} class. + */ + public JavaPoetTemplateProcessor() { + } + private static final ClassName HTTP_HEADER_NAME = ClassName.bestGuess(HttpHeaderName.class.getName()); private static final ClassName HTTP_HEADERS = ClassName.bestGuess(HttpHeaders.class.getName()); private static final ClassName CONTENT_TYPE = ClassName.bestGuess(ContentType.class.getName()); diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java index 14c550823b134..ee6bb810bbade 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/PathBuilder.java @@ -14,7 +14,7 @@ /** * This class is responsible for building the path of the request URL by replacing the placeholders with the actual */ -public class PathBuilder { +public final class PathBuilder { // this class takes a 'raw host' string that contains {} delimited parameters, and needs to convert it into a // Java string concatenation that can be used in the generated code. For example, the raw host string: // https://{endpoint}/keys/{path1} @@ -110,4 +110,7 @@ public static String buildPath(String rawHost, HttpRequestContext method) { return result; } + + private PathBuilder() { + } } diff --git a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java index b7fa612c0ddb3..fa81f2c6ec7d1 100644 --- a/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java +++ b/sdk/clientcore/annotation-processor/src/main/java/io/clientcore/annotation/processor/utils/ResponseBodyModeGeneration.java @@ -15,7 +15,7 @@ /** * Utility class to generate response body mode assignment and response handling based on the response body mode. */ -public class ResponseBodyModeGeneration { +public final class ResponseBodyModeGeneration { /** * Generates response body mode assignment based on request options and return type. @@ -149,4 +149,7 @@ public static void handleResponseModeToCreateResponse(TypeName returnTypeName, M .addStatement("return decodeByteArray(responseBody.toBytes(), response, serializer, methodParser)"); } } + + private ResponseBodyModeGeneration() { + } } From a26ef6d19f483460898f6573eadf7871cabc6ad2 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Mon, 27 Jan 2025 19:13:00 -0800 Subject: [PATCH 19/21] update with jackson --- sdk/clientcore/annotation-processor/pom.xml | 6 ------ sdk/parents/clientcore-parent/pom.xml | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 76bb7cd543777..367839c869cb6 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -119,12 +119,6 @@ 5.11.2 test - - org.junit.jupiter - junit-jupiter-engine - 5.11.2 - test - org.junit.jupiter junit-jupiter-params diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 8f386d0fa2904..4482a43632fc5 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -1002,6 +1002,11 @@ jackson-databind 2.17.2 + + com.fasterxml.jackson.core + jackson-core + 2.17.2 + From ee026daccdb65f27b11e2c9b2b410ce1a6d05857 Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Tue, 28 Jan 2025 09:58:32 -0800 Subject: [PATCH 20/21] remove jackson-core and fix parent dep --- sdk/clientcore/annotation-processor/pom.xml | 4 ++-- sdk/parents/clientcore-parent/pom.xml | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index 367839c869cb6..cc973887d4fce 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -21,7 +21,7 @@ io.clientcore clientcore-parent - 1.0.0-beta.1 + 1.0.0-beta.2 ../../parents/clientcore-parent @@ -109,7 +109,7 @@ io.clientcore core - 1.0.0-beta.3 + 1.0.0-beta.3 diff --git a/sdk/parents/clientcore-parent/pom.xml b/sdk/parents/clientcore-parent/pom.xml index 4482a43632fc5..8f386d0fa2904 100644 --- a/sdk/parents/clientcore-parent/pom.xml +++ b/sdk/parents/clientcore-parent/pom.xml @@ -1002,11 +1002,6 @@ jackson-databind 2.17.2 - - com.fasterxml.jackson.core - jackson-core - 2.17.2 - From 67fca35032c7b245846d03be7cbd57bc2668618f Mon Sep 17 00:00:00 2001 From: "Sameeksha Vaity (from Dev Box)" Date: Tue, 28 Jan 2025 10:30:00 -0800 Subject: [PATCH 21/21] revapi skip --- sdk/clientcore/annotation-processor/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/clientcore/annotation-processor/pom.xml b/sdk/clientcore/annotation-processor/pom.xml index cc973887d4fce..df4e0963d8180 100644 --- a/sdk/clientcore/annotation-processor/pom.xml +++ b/sdk/clientcore/annotation-processor/pom.xml @@ -98,6 +98,7 @@ https://azuresdkartifacts.blob.core.windows.net/azure-sdk-for-java checkstyle-suppressions.xml spotbugs-exclude.xml + true