diff --git a/.chronus/changes/refactor-api-metadata-2026-08-04-13-50-00.md b/.chronus/changes/refactor-api-metadata-2026-08-04-13-50-00.md new file mode 100644 index 00000000000..15f6c0e8729 --- /dev/null +++ b/.chronus/changes/refactor-api-metadata-2026-08-04-13-50-00.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/http-client-java" +--- + +Centralize generated API metadata in a dedicated model. diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMapper.java index 7efaac9fcc3..defdc27ef35 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMapper.java @@ -24,6 +24,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.SealedChoiceSchema; import com.microsoft.typespec.http.client.generator.core.extension.model.extensionmodel.XmsExtensions; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.AsyncSyncClient; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Client; @@ -342,7 +343,7 @@ public Client map(CodeModel codeModel) { String clientBuilderName = clientName + builderSuffix; ClientBuilder clientBuilder = new ClientBuilder(builderPackage, clientBuilderName, serviceClient, (syncClient == null) ? List.of() : List.of(syncClient), List.of(asyncClient), - serviceClient.getCrossLanguageDefinitionId()); + serviceClient.getApiMetadata()); addBuilderTraits(clientBuilder, serviceClient); clientBuilders.add(clientBuilder); @@ -356,7 +357,7 @@ public Client map(CodeModel codeModel) { } else { // service client builder ClientBuilder clientBuilder = new ClientBuilder(builderPackage, builderName, serviceClient, - syncClientsLocal, asyncClientsLocal, serviceClient.getCrossLanguageDefinitionId()); + syncClientsLocal, asyncClientsLocal, serviceClient.getApiMetadata()); addBuilderTraits(clientBuilder, serviceClient); clientBuilders.add(clientBuilder); @@ -370,7 +371,8 @@ public Client map(CodeModel codeModel) { asyncClients.addAll(asyncClientsLocal); } builder.clientBuilders(clientBuilders); - builder.crossLanguageDefinitionId(codeModel.getLanguage().getJava().getName()); + builder.apiMetadata( + new ApiMetadata.Builder().crossLanguageDefinitionId(codeModel.getLanguage().getJava().getName()).build()); // example/test if (settings.isDataPlaneClient() && (settings.isGenerateSamples() || settings.isGenerateTests())) { diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java index bfcf3fc3461..88c3f7ea0d7 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMethodMapper.java @@ -9,6 +9,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings.SyncMethodsGeneration; import com.microsoft.typespec.http.client.generator.core.implementation.OperationInstrumentationInfo; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethodParameter; @@ -131,7 +132,11 @@ private List createClientMethods(Operation operation, boolean isPr .clientReference((operation.getOperationGroup() == null || operation.getOperationGroup().getLanguage().getJava().getName().isEmpty()) ? "this" : "this.client") .operationInstrumentationInfo(new OperationInstrumentationInfo(operation)) - .setCrossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(operation)); + .apiMetadata(new ApiMetadata.Builder() + .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(operation)) + .devMessage( + operation.getLanguage().getJava() == null ? null : operation.getLanguage().getJava().getComment()) + .build()); setJavaDoc(builder, operation); @@ -285,13 +290,6 @@ private static void setJavaDoc(ClientMethod.Builder builder, Operation operation builder.description(SchemaUtil.mergeSummaryWithDescription(summary, description)); } - if (operation.getLanguage().getJava() != null - && !CoreUtils.isNullOrEmpty(operation.getLanguage().getJava().getComment())) { - // API comment. - builder.implementationDetails( - new ImplementationDetails.Builder().comment(operation.getLanguage().getJava().getComment()).build()); - } - if (operation.getExternalDocs() != null) { final ExternalDocumentation externalDocumentation = new ExternalDocumentation.Builder().description(operation.getExternalDocs().getDescription()) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MapperUtils.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MapperUtils.java index 494bb6b5470..a968f2ba5fd 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MapperUtils.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MapperUtils.java @@ -10,6 +10,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Schema; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.SchemaContext; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientEnumValue; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; @@ -91,7 +92,9 @@ public static IType createEnumType(ChoiceSchema enumType, boolean expandable, bo .implementationDetails( new ImplementationDetails.Builder().usages(SchemaUtil.mapSchemaContext(enumType.getUsage())) .build()) - .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(enumType)) + .apiMetadata(new ApiMetadata.Builder() + .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(enumType)) + .build()) .fromMethodName(deserializationMethodName) .toMethodName(serializationMethodName) .build(); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MethodGroupMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MethodGroupMapper.java index 4e2903d68cd..1bbdd66fdb9 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MethodGroupMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/MethodGroupMapper.java @@ -7,6 +7,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Operation; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.OperationGroup; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModels; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; @@ -166,7 +167,9 @@ private MethodGroupClient createMethodGroupClient(OperationGroup methodGroup, .collect(Collectors.toList())); } - builder.crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(methodGroup)); + builder.apiMetadata( + new ApiMetadata.Builder().crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(methodGroup)) + .build()); return builder.build(); } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java index 84a672e0ddd..068a9e19d6a 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java @@ -12,6 +12,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Schema; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.XmlSerializationFormat; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModel; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModelProperty; @@ -347,7 +348,9 @@ public ClientModel map(ObjectSchema compositeType) { builder.properties(properties); builder.propertyReferences(propertyReferences); - builder.crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(compositeType)); + builder.apiMetadata(new ApiMetadata.Builder() + .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(compositeType)) + .build()); result = builder.build(); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadata.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadata.java new file mode 100644 index 00000000000..31d86e67fcc --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadata.java @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.model.clientmodel; + +/** + * Metadata associated with a generated API. + */ +public final class ApiMetadata { + private final String crossLanguageDefinitionId; + private final String devMessage; + + private ApiMetadata(String crossLanguageDefinitionId, String devMessage) { + this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.devMessage = devMessage; + } + + /** + * Gets the cross-language definition ID. + * + * @return the cross-language definition ID. + */ + public String getCrossLanguageDefinitionId() { + return crossLanguageDefinitionId; + } + + /** + * Gets the message for SDK developers. + * + * @return the message for SDK developers. + */ + public String getDevMessage() { + return devMessage; + } + + /** + * Creates a builder initialized with this metadata. + * + * @return the initialized builder. + */ + public Builder newBuilder() { + return new Builder().crossLanguageDefinitionId(crossLanguageDefinitionId).devMessage(devMessage); + } + + /** + * Builder for {@link ApiMetadata}. + */ + public static final class Builder { + private String crossLanguageDefinitionId; + private String devMessage; + + /** + * Sets the cross-language definition ID. + * + * @param crossLanguageDefinitionId the cross-language definition ID. + * @return this builder. + */ + public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { + this.crossLanguageDefinitionId = crossLanguageDefinitionId; + return this; + } + + /** + * Sets the message for SDK developers. + * + * @param devMessage the message for SDK developers. + * @return this builder. + */ + public Builder devMessage(String devMessage) { + this.devMessage = devMessage; + return this; + } + + /** + * Builds the API metadata. + * + * @return the API metadata. + */ + public ApiMetadata build() { + return new ApiMetadata(crossLanguageDefinitionId, devMessage); + } + } +} diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/AsyncSyncClient.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/AsyncSyncClient.java index 2c0158c119e..992a373c07a 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/AsyncSyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/AsyncSyncClient.java @@ -19,24 +19,24 @@ public class AsyncSyncClient { private final ServiceClient serviceClient; private final List convenienceMethods; - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; // There is also reference from Client to ClientBuilder via "@ServiceClient(builder = ClientBuilder.class)" // clientBuilder can be null, if builder is disabled via "disable-client-builder" private ClientBuilder clientBuilder; private AsyncSyncClient(String packageName, String className, MethodGroupClient methodGroupClient, - ServiceClient serviceClient, List convenienceMethods, String crossLanguageDefinitionId) { + ServiceClient serviceClient, List convenienceMethods, ApiMetadata apiMetadata) { this.packageName = packageName; this.className = className; this.methodGroupClient = methodGroupClient; this.serviceClient = serviceClient; this.convenienceMethods = convenienceMethods; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } /** @@ -125,7 +125,7 @@ public static class Builder { private ServiceClient serviceClient; private List convenienceMethods = List.of(); - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); /** * Sets the class name. @@ -182,8 +182,8 @@ public Builder convenienceMethods(List convenienceMethods) { return this; } - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -194,7 +194,7 @@ public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { */ public AsyncSyncClient build() { return new AsyncSyncClient(packageName, className, methodGroupClient, serviceClient, convenienceMethods, - crossLanguageDefinitionId); + apiMetadata); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/Client.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/Client.java index 7fad582249e..1d44e00953d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/Client.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/Client.java @@ -9,7 +9,7 @@ * A container for the types associated for accessing a specific service. */ public class Client { - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; /** * The name of this service client. @@ -91,7 +91,7 @@ private Client(String clientName, String clientDescription, List enums List serviceClients, ModuleInfo moduleInfo, List syncClients, List asyncClients, List clientBuilders, List protocolExamples, List liveTests, List unionModels, List clientMethodExamples, - String crossLanguageDefinitionId, GraalVmConfig graalVmConfig) { + ApiMetadata apiMetadata, GraalVmConfig graalVmConfig) { this.clientName = clientName; this.clientDescription = clientDescription; this.enums = enums; @@ -111,12 +111,12 @@ private Client(String clientName, String clientDescription, List enums this.liveTests = liveTests; this.unionModels = unionModels; this.clientMethodExamples = clientMethodExamples; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; this.graalVmConfig = graalVmConfig; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } public final String getClientName() { @@ -227,10 +227,10 @@ public static class Builder { private List unionModels = List.of(); private List clientMethodExamples = List.of(); private GraalVmConfig graalVmConfig; - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -443,8 +443,8 @@ public Client build() { } return new Client(clientName, clientDescription, enums, exceptions, xmlSequenceWrappers, responseModels, models, packageInfos, manager, serviceClient, serviceClients, moduleInfo, syncClients, asyncClients, - clientBuilders, protocolExamples, liveTests, unionModels, clientMethodExamples, - crossLanguageDefinitionId, graalVmConfig); + clientBuilders, protocolExamples, liveTests, unionModels, clientMethodExamples, apiMetadata, + graalVmConfig); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientBuilder.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientBuilder.java index 245b1dc6b64..e3bc9f658b2 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientBuilder.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientBuilder.java @@ -22,16 +22,16 @@ public class ClientBuilder { private final List syncClients; private final List asyncClients; private final List builderTraits = new ArrayList<>(); - private String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; public ClientBuilder(String packageName, String className, ServiceClient serviceClient, - List syncClients, List asyncClients, String crossLanguageDefinitionId) { + List syncClients, List asyncClients, ApiMetadata apiMetadata) { this.packageName = Objects.requireNonNull(packageName); this.className = Objects.requireNonNull(className); this.serviceClient = Objects.requireNonNull(serviceClient); this.syncClients = Objects.requireNonNull(syncClients); this.asyncClients = Objects.requireNonNull(asyncClients); - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; } public String getPackageName() { @@ -80,7 +80,7 @@ public List getBuilderTraits() { return this.builderTraits; } - public String getCrossLanguageDefinitionId() { - return this.crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethod.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethod.java index b4f91f90b32..6f00a39e93d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethod.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientMethod.java @@ -29,7 +29,7 @@ public class ClientMethod { "StatusCheckPollingStrategy", "SyncDefaultPollingStrategy", "SyncChainedPollingStrategy", "SyncOperationResourcePollingStrategy", "SyncLocationPollingStrategy", "SyncStatusCheckPollingStrategy"); - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; /** * The description of this ClientMethod. */ @@ -138,7 +138,7 @@ public ClientMethod.Builder newBuilder() { .methodPollingDetails(methodPollingDetails) .methodDocumentation(externalDocumentation) .operationInstrumentationInfo(instrumentationInfo) - .setCrossLanguageDefinitionId(crossLanguageDefinitionId) + .apiMetadata(apiMetadata) .hasWithContextOverload(hasWithContextOverload) .overloadedClientMethod(overloadedClientMethod); } @@ -172,9 +172,9 @@ protected ClientMethod(String description, ReturnValue returnValue, String name, String groupedParameterTypeName, MethodPageDetails methodPageDetails, ParameterTransformations parameterTransformations, JavaVisibility methodVisibility, JavaVisibility methodVisibilityInWrapperClient, ImplementationDetails implementationDetails, - MethodPollingDetails methodPollingDetails, ExternalDocumentation externalDocumentation, - String crossLanguageDefinitionId, boolean hasWithContextOverload, - OperationInstrumentationInfo instrumentationInfo, ClientMethod overloadedClientMethod) { + MethodPollingDetails methodPollingDetails, ExternalDocumentation externalDocumentation, ApiMetadata apiMetadata, + boolean hasWithContextOverload, OperationInstrumentationInfo instrumentationInfo, + ClientMethod overloadedClientMethod) { this.description = description; this.returnValue = returnValue; this.name = name; @@ -204,7 +204,7 @@ protected ClientMethod(String description, ReturnValue returnValue, String name, this.methodPollingDetails = methodPollingDetails; this.externalDocumentation = externalDocumentation; this.methodVisibilityInWrapperClient = methodVisibilityInWrapperClient; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; this.hasWithContextOverload = hasWithContextOverload; if (isPageStreamingType() && methodPageDetails != null) { this.parametersDeclaration = getMethodInputParameters().stream() @@ -248,8 +248,8 @@ public int hashCode() { parameterTransformations, methodVisibility); } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } public final String getDescription() { @@ -636,14 +636,14 @@ public static class Builder { protected ImplementationDetails implementationDetails; protected MethodPollingDetails methodPollingDetails; protected ExternalDocumentation externalDocumentation; - protected String crossLanguageDefinitionId; + protected ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); protected boolean hasWithContextOverload; protected boolean hidePageableParams; protected OperationInstrumentationInfo instrumentationInfo; protected ClientMethod overloadedClientMethod; - public Builder setCrossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -910,7 +910,7 @@ public ClientMethod build() { clientReference, CollectionUtil.toImmutableList(requiredNullableParameterExpressions), isGroupedParameterRequired, groupedParameterTypeName, methodPageDetails, parameterTransformations, methodVisibility, methodVisibilityInWrapperClient, implementationDetails, methodPollingDetails, - externalDocumentation, crossLanguageDefinitionId, hasWithContextOverload, instrumentationInfo, + externalDocumentation, apiMetadata, hasWithContextOverload, instrumentationInfo, overloadedClientMethod); } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModel.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModel.java index e9445c4368d..01fa45e5f07 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModel.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModel.java @@ -125,7 +125,7 @@ public class ClientModel { /** * The cross language definition id for the model. */ - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; // Set of non-final properties that are set on access. // This pattern is used as when the ClientModel is initialized the ModelMapper may not have mapped all models @@ -170,7 +170,7 @@ public class ClientModel { * @param stronglyTypedHeader Whether this model is a strongly-typed HTTP headers class. * @param implementationDetails The implementation details for the model. * @param usedInXml Whether the model is used in XML serialization. - * @param crossLanguageDefinitionId The cross language definition id for the model. + * @param apiMetadata The API metadata for the model. */ protected ClientModel(String packageKeyword, String name, List imports, String description, boolean isPolymorphic, ClientModelProperty polymorphicDiscriminator, String polymorphicDiscriminatorName, @@ -178,7 +178,7 @@ protected ClientModel(String packageKeyword, String name, List imports, String xmlName, String xmlNamespace, List properties, List propertyReferences, IType modelType, boolean stronglyTypedHeader, ImplementationDetails implementationDetails, boolean usedInXml, Set serializationFormats, - String crossLanguageDefinitionId) { + ApiMetadata apiMetadata) { this.packageName = packageKeyword; this.name = name; this.fullName = packageName + "." + name; @@ -201,7 +201,7 @@ protected ClientModel(String packageKeyword, String name, List imports, this.stronglyTypedHeader = stronglyTypedHeader; this.implementationDetails = implementationDetails; this.usedInXml = usedInXml; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; this.serializationFormats = serializationFormats; } @@ -210,8 +210,8 @@ protected ClientModel(String packageKeyword, String name, List imports, * * @return the cross language definition id for the model. */ - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } /** @@ -642,7 +642,7 @@ public static class Builder { private boolean stronglyTypedHeader; private ImplementationDetails implementationDetails; private boolean usedInXml; - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); private Set serializationFormats = Set.of(); /** @@ -849,13 +849,13 @@ public Builder usedInXml(boolean usedInXml) { } /** - * Sets the cross language definition id for the model. + * Sets the API metadata for the model. * - * @param crossLanguageDefinitionId the cross language definition id for the model. + * @param apiMetadata the API metadata for the model. * @return the Builder itself */ - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -879,7 +879,7 @@ public ClientModel build() { return new ClientModel(packageName, name, imports, description, isPolymorphic, polymorphicDiscriminator, polymorphicDiscriminatorName, serializedName, needsFlatten, parentModelName, derivedModels, xmlName, xmlNamespace, properties, propertyReferences, modelType, stronglyTypedHeader, implementationDetails, - usedInXml, serializationFormats, crossLanguageDefinitionId); + usedInXml, serializationFormats, apiMetadata); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientResponse.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientResponse.java index a9b280b1e21..93f053ce7dc 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientResponse.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientResponse.java @@ -12,16 +12,16 @@ public final class ClientResponse { private String description; private IType headersType; private IType bodyType; - private String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; private ClientResponse(String name, String packageKeyword, String description, IType headersType, IType bodyType, - String crossLanguageDefinitionId) { + ApiMetadata apiMetadata) { this.name = name; packageName = packageKeyword; this.description = description; this.headersType = headersType; this.bodyType = bodyType; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; } public String getName() { @@ -44,8 +44,8 @@ public IType getBodyType() { return bodyType; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } public static class Builder { @@ -55,7 +55,7 @@ public static class Builder { private IType headersType; private IType bodyType; - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); public Builder name(String name) { this.name = name; @@ -82,13 +82,13 @@ public Builder bodyType(IType bodyType) { return this; } - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } public ClientResponse build() { - return new ClientResponse(name, packageName, description, headersType, bodyType, crossLanguageDefinitionId); + return new ClientResponse(name, packageName, description, headersType, bodyType, apiMetadata); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/EnumType.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/EnumType.java index 1fe427e7d1f..748d621d5f9 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/EnumType.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/EnumType.java @@ -34,7 +34,7 @@ public class EnumType implements IType, ConvertToJsonTypeTrait, ConvertFromJsonT private final ImplementationDetails implementationDetails; - private String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; private final String fromMethodName; private final String toMethodName; @@ -50,7 +50,7 @@ public class EnumType implements IType, ConvertToJsonTypeTrait, ConvertFromJsonT */ private EnumType(String packageKeyword, String name, String description, boolean expandable, List values, IType elementType, ImplementationDetails implementationDetails, - String crossLanguageDefinitionId, String fromMethodName, String toMethodName) { + ApiMetadata apiMetadata, String fromMethodName, String toMethodName) { this.name = name; this.packageName = packageKeyword; this.description = description; @@ -58,13 +58,13 @@ private EnumType(String packageKeyword, String name, String description, boolean this.values = values; this.elementType = elementType; this.implementationDetails = implementationDetails; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; this.fromMethodName = fromMethodName; this.toMethodName = toMethodName; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } public final String getName() { @@ -248,7 +248,7 @@ public static class Builder { private ImplementationDetails implementationDetails; - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); private String fromMethodName; private String toMethodName; @@ -331,8 +331,8 @@ public Builder implementationDetails(ImplementationDetails implementationDetails return this; } - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -351,7 +351,7 @@ public Builder toMethodName(String toMethodName) { */ public EnumType build() { return new EnumType(packageName, name, description, expandable, values, elementType, implementationDetails, - crossLanguageDefinitionId, fromMethodName, toMethodName); + apiMetadata, fromMethodName, toMethodName); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ImplementationDetails.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ImplementationDetails.java index 4132fb1f632..44051e6ea30 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ImplementationDetails.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ImplementationDetails.java @@ -164,8 +164,6 @@ public static Usage fromSchemaContext(SchemaContext schemaContext) { private final Set usages; - private final String comment; - /** * Usually on a method, that it is only required in implementation class (FooClientImpl), but not in public class * (FooClient). @@ -230,30 +228,19 @@ public boolean isException() { return usages.contains(Usage.EXCEPTION); } - /** - * Get the API comment. - * - * @return API comment. - */ - public String getComment() { - return comment; - } - /** * Creates an instance of ImplementationDetails class. * * @param implementationOnly whether only required in implementation class. * @param usages usage of the model or method. - * @param comment API comment. */ - protected ImplementationDetails(boolean implementationOnly, Set usages, String comment) { + protected ImplementationDetails(boolean implementationOnly, Set usages) { this.implementationOnly = implementationOnly; this.usages = usages; - this.comment = comment; } public Builder newBuilder() { - return new Builder().implementationOnly(implementationOnly).usages(usages).comment(comment); + return new Builder().implementationOnly(implementationOnly).usages(usages); } /** @@ -262,7 +249,6 @@ public Builder newBuilder() { public static final class Builder { private boolean implementationOnly = false; private Set usages = new LinkedHashSet<>(); - private String comment; /** * Creates an instance of Builder class. @@ -292,24 +278,13 @@ public Builder usages(Set usages) { return this; } - /** - * Sets API comment. - * - * @param comment API comment. - * @return the Builder itself. - */ - public Builder comment(String comment) { - this.comment = comment; - return this; - } - /** * Builds an instance of ImplementationDetails class. * * @return the ImplementationDetails instance. */ public ImplementationDetails build() { - return new ImplementationDetails(implementationOnly, CollectionUtil.toImmutableSet(usages), comment); + return new ImplementationDetails(implementationOnly, CollectionUtil.toImmutableSet(usages)); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/MethodGroupClient.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/MethodGroupClient.java index 446a81398e0..0ee7067ea61 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/MethodGroupClient.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/MethodGroupClient.java @@ -58,7 +58,7 @@ public class MethodGroupClient { private final List properties; - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; /** * Create a new MethodGroupClient with the provided properties. @@ -76,7 +76,7 @@ public class MethodGroupClient { protected MethodGroupClient(String packageKeyword, String className, String interfaceName, List implementedInterfaces, Proxy proxy, String serviceClientName, String variableType, String variableName, List clientMethods, List supportedInterfaces, String classBaseName, - List properties, String crossLanguageDefinitionId) { + List properties, ApiMetadata apiMetadata) { packageName = packageKeyword; this.className = className; this.interfaceName = interfaceName; @@ -91,7 +91,7 @@ protected MethodGroupClient(String packageKeyword, String className, String inte ? classBaseName : (className.endsWith("Impl") ? className.substring(0, className.length() - 4) : className); this.properties = properties; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; } public final String getPackage() { @@ -142,8 +142,8 @@ public List getProperties() { return properties; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } /** @@ -201,7 +201,7 @@ public static class Builder { protected List supportedInterfaces; protected String classBaseName; private List properties; - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); /** * Sets the name of the package. @@ -335,21 +335,15 @@ public Builder properties(List properties) { return this; } - /** - * Sets crossLanguageDefinitionId. - * - * @param crossLanguageDefinitionId the crossLanguageDefinitionId. - * @return the Builder itself - */ - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } public MethodGroupClient build() { return new MethodGroupClient(packageName, className, interfaceName, implementedInterfaces, proxy, serviceClientName, variableType, variableName, clientMethods, supportedInterfaces, classBaseName, - properties, crossLanguageDefinitionId); + properties, apiMetadata); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ServiceClient.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ServiceClient.java index 35adc7f93a1..0a9de43d7da 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ServiceClient.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ServiceClient.java @@ -12,7 +12,7 @@ * The details of a ServiceClient. */ public class ServiceClient { - private final String crossLanguageDefinitionId; + private final ApiMetadata apiMetadata; /** * The package that this service client belongs to. */ @@ -110,7 +110,7 @@ protected ServiceClient(String packageName, String className, String interfaceNa ClientMethodParameter defaultPollIntervalParameter, String defaultCredentialScopes, boolean builderDisabled, String builderPackageName, SecurityInfo securityInfo, String baseUrl, PipelinePolicyDetails pipelinePolicyDetails, List clientAccessorMethods, - String crossLanguageDefinitionId) { + ApiMetadata apiMetadata) { this.packageName = packageName; this.className = className; this.interfaceName = interfaceName; @@ -132,7 +132,7 @@ protected ServiceClient(String packageName, String className, String interfaceNa this.baseUrl = baseUrl; this.pipelinePolicyDetails = pipelinePolicyDetails; this.clientAccessorMethods = clientAccessorMethods; - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + this.apiMetadata = apiMetadata; } public final String getPackage() { @@ -274,8 +274,8 @@ public void setSyncClient(AsyncSyncClient syncClient) { this.syncClient = syncClient; } - public String getCrossLanguageDefinitionId() { - return crossLanguageDefinitionId; + public ApiMetadata getApiMetadata() { + return apiMetadata; } /** @@ -392,7 +392,7 @@ public static class Builder { protected String baseUrl; protected PipelinePolicyDetails pipelinePolicyDetails; protected List clientAccessorMethods = List.of(); - private String crossLanguageDefinitionId; + private ApiMetadata apiMetadata = new ApiMetadata.Builder().build(); /** * Sets the package that this service client belongs to. @@ -608,8 +608,8 @@ public Builder clientAccessorMethods(List clientAccessorMe return this; } - public Builder crossLanguageDefinitionId(String crossLanguageDefinitionId) { - this.crossLanguageDefinitionId = crossLanguageDefinitionId; + public Builder apiMetadata(ApiMetadata apiMetadata) { + this.apiMetadata = apiMetadata; return this; } @@ -617,8 +617,7 @@ public ServiceClient build() { return new ServiceClient(packageName, className, interfaceName, proxy, methodGroupClients, properties, constructors, clientMethods, azureEnvironmentParameter, tokenCredentialParameter, httpPipelineParameter, serializerAdapterParameter, defaultPollIntervalParameter, defaultCredentialScopes, builderDisabled, - builderPackageName, securityInfo, baseUrl, pipelinePolicyDetails, clientAccessorMethods, - crossLanguageDefinitionId); + builderPackageName, securityInfo, baseUrl, pipelinePolicyDetails, clientAccessorMethods, apiMetadata); } } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/WrapperClientMethodTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/WrapperClientMethodTemplate.java index 8dd1148d407..37a162525c3 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/WrapperClientMethodTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/WrapperClientMethodTemplate.java @@ -70,9 +70,8 @@ public void write(ClientMethod clientMethod, JavaType typeBlock) { Consumer method = function -> { // API comment - if (clientMethod.getImplementationDetails() != null - && !CoreUtils.isNullOrEmpty(clientMethod.getImplementationDetails().getComment())) { - function.line("// " + clientMethod.getImplementationDetails().getComment()); + if (!CoreUtils.isNullOrEmpty(clientMethod.getApiMetadata().getDevMessage())) { + function.line("// " + clientMethod.getApiMetadata().getDevMessage()); } boolean shouldReturn = true; diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClientModelUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClientModelUtil.java index 8489f847137..c41a3bde1d5 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClientModelUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClientModelUtil.java @@ -13,6 +13,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Parameter; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; import com.microsoft.typespec.http.client.generator.core.mapper.Mappers; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.AsyncSyncClient; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethod; @@ -92,9 +93,12 @@ public static void getAsyncSyncClients(Client client, ServiceClient serviceClien // 1. ServiceClient has operations // 2. ServiceClient has sub clients - AsyncSyncClient.Builder builder = new AsyncSyncClient.Builder().packageName(packageName) - .serviceClient(serviceClient) - .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)); + AsyncSyncClient.Builder builder + = new AsyncSyncClient.Builder().packageName(packageName) + .serviceClient(serviceClient) + .apiMetadata(new ApiMetadata.Builder() + .crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)) + .build()); final List convenienceMethods = client.getOperationGroups() .stream() @@ -129,7 +133,7 @@ public static void getAsyncSyncClients(Client client, ServiceClient serviceClien AsyncSyncClient.Builder builder = new AsyncSyncClient.Builder().packageName(packageName) .serviceClient(serviceClient) .methodGroupClient(methodGroupClient) - .crossLanguageDefinitionId(methodGroupClient.getCrossLanguageDefinitionId()); + .apiMetadata(methodGroupClient.getApiMetadata()); final List convenienceMethods = client.getOperationGroups() .stream() diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadataTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadataTests.java new file mode 100644 index 00000000000..c0eb38f79fc --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ApiMetadataTests.java @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.model.clientmodel; + +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ApiMetadataTests { + @Test + public void storesApiMetadata() { + ApiMetadata metadata = new ApiMetadata.Builder().crossLanguageDefinitionId("Example.Widget.get") + .devMessage("Convenience API is not generated.") + .build(); + + Assertions.assertEquals("Example.Widget.get", metadata.getCrossLanguageDefinitionId()); + Assertions.assertEquals("Convenience API is not generated.", metadata.getDevMessage()); + } + + @Test + public void newBuilderPreservesExistingValues() { + ApiMetadata metadata = new ApiMetadata.Builder().crossLanguageDefinitionId("Example.Widget.get") + .devMessage("Original message") + .build(); + + ApiMetadata updated = metadata.newBuilder().devMessage("Updated message").build(); + + Assertions.assertEquals("Example.Widget.get", updated.getCrossLanguageDefinitionId()); + Assertions.assertEquals("Updated message", updated.getDevMessage()); + } + + @Test + public void clientMethodStoresApiMetadata() { + ClientMethod method = new ClientMethod.Builder().name("get") + .description("Gets a widget.") + .parameters(List.of()) + .returnValue(new ReturnValue("the widget", ClassType.STRING)) + .apiMetadata(new ApiMetadata.Builder().crossLanguageDefinitionId("Example.Widget.get") + .devMessage("Convenience API is not generated.") + .build()) + .build(); + + Assertions.assertEquals("Example.Widget.get", method.getApiMetadata().getCrossLanguageDefinitionId()); + Assertions.assertEquals("Convenience API is not generated.", method.getApiMetadata().getDevMessage()); + } +} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java index 02e2979c900..3405d4a324d 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java @@ -374,17 +374,17 @@ private Map collectCrossLanguageDefinitions(Client client) { client.getAsyncClients() .forEach(asyncClient -> crossLanguageDefinitionsMap.put( asyncClient.getPackageName() + "." + asyncClient.getClassName(), - asyncClient.getCrossLanguageDefinitionId())); + asyncClient.getApiMetadata().getCrossLanguageDefinitionId())); client.getSyncClients() .forEach(syncClient -> crossLanguageDefinitionsMap.put( syncClient.getPackageName() + "." + syncClient.getClassName(), - syncClient.getCrossLanguageDefinitionId())); + syncClient.getApiMetadata().getCrossLanguageDefinitionId())); client.getClientBuilders() .forEach(clientBuilder -> crossLanguageDefinitionsMap.put( clientBuilder.getPackageName() + "." + clientBuilder.getClassName(), - clientBuilder.getCrossLanguageDefinitionId())); + clientBuilder.getApiMetadata().getCrossLanguageDefinitionId())); // Method for (AsyncSyncClient asyncClient : client.getAsyncClients()) { @@ -395,13 +395,13 @@ private Map collectCrossLanguageDefinitions(Client client) { .filter(method -> !method.getName().endsWith("Async")) .forEach(method -> crossLanguageDefinitionsMap.put( asyncClient.getPackageName() + "." + asyncClient.getClassName() + "." + method.getName(), - method.getCrossLanguageDefinitionId())); + method.getApiMetadata().getCrossLanguageDefinitionId())); if (!convenienceMethod.getProtocolMethod().getName().endsWith("Async")) { crossLanguageDefinitionsMap.put( asyncClient.getPackageName() + "." + asyncClient.getClassName() + "." + convenienceMethod.getProtocolMethod().getName(), - convenienceMethod.getProtocolMethod().getCrossLanguageDefinitionId()); + convenienceMethod.getProtocolMethod().getApiMetadata().getCrossLanguageDefinitionId()); } } } @@ -414,13 +414,13 @@ private Map collectCrossLanguageDefinitions(Client client) { .filter(method -> !method.getName().endsWith("Async")) .forEach(method -> crossLanguageDefinitionsMap.put( syncClient.getPackageName() + "." + syncClient.getClassName() + "." + method.getName(), - method.getCrossLanguageDefinitionId())); + method.getApiMetadata().getCrossLanguageDefinitionId())); if (!convenienceMethod.getProtocolMethod().getName().endsWith("Async")) { crossLanguageDefinitionsMap.put( syncClient.getPackageName() + "." + syncClient.getClassName() + "." + convenienceMethod.getProtocolMethod().getName(), - convenienceMethod.getProtocolMethod().getCrossLanguageDefinitionId()); + convenienceMethod.getProtocolMethod().getApiMetadata().getCrossLanguageDefinitionId()); } } } @@ -428,13 +428,13 @@ private Map collectCrossLanguageDefinitions(Client client) { // Client model client.getModels().stream().filter(ModelUtil::isGeneratingModel).forEach(model -> { crossLanguageDefinitionsMap.put(model.getPackage() + "." + model.getName(), - model.getCrossLanguageDefinitionId()); + model.getApiMetadata().getCrossLanguageDefinitionId()); }); // Enum client.getEnums().stream().filter(ModelUtil::isGeneratingModel).forEach(model -> { crossLanguageDefinitionsMap.put(model.getPackage() + "." + model.getName(), - model.getCrossLanguageDefinitionId()); + model.getApiMetadata().getCrossLanguageDefinitionId()); }); return crossLanguageDefinitionsMap; diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentPlugin.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentPlugin.java index 6206313f771..4f47c9c5912 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentPlugin.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentPlugin.java @@ -232,18 +232,18 @@ private Map collectCrossLanguageDefinitions(Client client) { // Client interface crossLanguageDefinitionsMap.put(interfacePackage + "." + client.getServiceClient().getInterfaceName(), - client.getServiceClient().getCrossLanguageDefinitionId()); + client.getServiceClient().getApiMetadata().getCrossLanguageDefinitionId()); client.getServiceClient() .getMethodGroupClients() .forEach(methodGroupClient -> crossLanguageDefinitionsMap.put( interfacePackage + "." + methodGroupClient.getInterfaceName(), - methodGroupClient.getCrossLanguageDefinitionId())); + methodGroupClient.getApiMetadata().getCrossLanguageDefinitionId())); client.getClientBuilders() .forEach(clientBuilder -> crossLanguageDefinitionsMap.put( clientBuilder.getPackageName() + "." + clientBuilder.getClassName(), - clientBuilder.getCrossLanguageDefinitionId())); + clientBuilder.getApiMetadata().getCrossLanguageDefinitionId())); // Methods client.getServiceClient() @@ -252,20 +252,20 @@ private Map collectCrossLanguageDefinitions(Client client) { if (method.getMethodVisibility() == JavaVisibility.Public) { crossLanguageDefinitionsMap.put( interfacePackage + "." + methodGroupClient.getInterfaceName() + "." + method.getName(), - method.getCrossLanguageDefinitionId()); + method.getApiMetadata().getCrossLanguageDefinitionId()); } })); // Client model client.getModels().forEach(model -> { crossLanguageDefinitionsMap.put(model.getPackage() + "." + model.getName(), - model.getCrossLanguageDefinitionId()); + model.getApiMetadata().getCrossLanguageDefinitionId()); }); // Enum client.getEnums().forEach(model -> { crossLanguageDefinitionsMap.put(model.getPackage() + "." + model.getName(), - model.getCrossLanguageDefinitionId()); + model.getApiMetadata().getCrossLanguageDefinitionId()); }); return crossLanguageDefinitionsMap; diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecServiceClientMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecServiceClientMapper.java index 963a5c48cdf..cba380f94e5 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecServiceClientMapper.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecServiceClientMapper.java @@ -9,6 +9,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Parameter; import com.microsoft.typespec.http.client.generator.core.mapper.Mappers; import com.microsoft.typespec.http.client.generator.core.mapper.ServiceClientMapper; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ApiMetadata; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientAccessorMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; @@ -86,7 +87,9 @@ public ServiceClient map(Client client, CodeModel codeModel) { processPipelinePolicyDetails(builder, client); - builder.crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)); + builder.apiMetadata( + new ApiMetadata.Builder().crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)) + .build()); List clientAccessorMethods = new ArrayList<>(); for (Client subClient : client.getSubClients()) {