diff --git a/.chronus/changes/http-client-java-consolidate-mappers-2026-6-24.md b/.chronus/changes/http-client-java-consolidate-mappers-2026-6-24.md new file mode 100644 index 00000000000..2dded7dd1f0 --- /dev/null +++ b/.chronus/changes/http-client-java-consolidate-mappers-2026-6-24.md @@ -0,0 +1,8 @@ +--- +changeKind: internal +packages: + - "@typespec/http-client-java" +--- + +Simplify the mapper class hierarchy by consolidating the TypeSpec-specific mappers into +the shared base mappers. 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 9f130659264..13f573e0560 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 @@ -49,6 +49,7 @@ import com.microsoft.typespec.http.client.generator.core.template.Templates; import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; import com.microsoft.typespec.http.client.generator.core.util.CodeNamer; +import com.microsoft.typespec.http.client.generator.core.util.ModelUtil; import com.microsoft.typespec.http.client.generator.core.util.SchemaUtil; import io.clientcore.core.utils.CoreUtils; import java.util.ArrayList; @@ -481,7 +482,16 @@ private void addProtocolExamples(Client.Builder builder, List s protected Map processClients(List clients, CodeModel codeModel) { - return Map.of(); + Map serviceClientsMap + = new LinkedHashMap<>(); + ServiceClientMapper mapper = new ServiceClientMapper(); + for (com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Client client : clients) { + ServiceClient serviceClient = mapper.map(client, codeModel); + if (serviceClient != null) { + serviceClientsMap.put(serviceClient, client); + } + } + return serviceClientsMap; } private void addBuilderTraits(ClientBuilder clientBuilder, ServiceClient serviceClient) { @@ -615,9 +625,19 @@ public ObjectSchema parseHeader(Operation operation, JavaSettings settings) { } protected String getResponseHeaderName(Header header) { - // We should use header.getLanguage().getDefault().getName() - // kept as header.getHeader() for backward compatibility - return header.getHeader(); + String clientName; + if (header.getLanguage() != null + && header.getLanguage().getJava() != null + && !CoreUtils.isNullOrEmpty(header.getLanguage().getJava().getName())) { + clientName = header.getLanguage().getJava().getName(); + } else if (header.getLanguage() != null + && header.getLanguage().getDefault() != null + && !CoreUtils.isNullOrEmpty(header.getLanguage().getDefault().getName())) { + clientName = header.getLanguage().getDefault().getName(); + } else { + clientName = header.getHeader(); + } + return clientName; } private ClientResponse parseResponse(Operation method, List models, JavaSettings settings) { @@ -693,26 +713,16 @@ private static ModuleInfo getModuleInfo(List modelsPackages, Collection< */ protected List getModelsPackages(List clientModels, List enumTypes, List responseModels) { + Set packages = new LinkedHashSet<>(); - List ret = List.of(); - - JavaSettings settings = JavaSettings.getInstance(); - boolean hasModels = !settings.isDataPlaneClient() // not DPG - // defined models package (it is defined by default) - && (settings.getModelsSubpackage() != null && !settings.getModelsSubpackage().isEmpty()) - // models package is not same as implementation package - && !settings.getModelsSubpackage().equals(settings.getImplementationSubpackage()); - - if (hasModels) { - Set packages = clientModels.stream().map(ClientModel::getPackage).collect(Collectors.toSet()); - - packages.addAll(enumTypes.stream().map(EnumType::getPackage).collect(Collectors.toSet())); - packages.addAll(responseModels.stream().map(ClientResponse::getPackage).collect(Collectors.toSet())); - - ret = new ArrayList<>(packages); - } + clientModels.stream().filter(ModelUtil::isGeneratingModel).map(ClientModel::getPackage).forEach(packages::add); + enumTypes.stream().filter(ModelUtil::isGeneratingModel).map(EnumType::getPackage).forEach(packages::add); + responseModels.stream() + .filter(ModelUtil::isGeneratingModel) + .map(ClientResponse::getPackage) + .forEach(packages::add); - return ret; + return new ArrayList<>(packages); } public static ClassType getClientResponseClassType(Operation method, List models, diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/PrimitiveMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/PrimitiveMapper.java index dff9c07d9f4..179923d3016 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/PrimitiveMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/PrimitiveMapper.java @@ -64,7 +64,7 @@ protected IType createPrimitiveType(PrimitiveSchema primaryType) { return PrimitiveType.CHAR; case DATE: - return isLowLevelClient ? ClassType.STRING : ClassType.LOCAL_DATE; + return ClassType.LOCAL_DATE; case DATE_TIME: DateTimeSchema dateTimeSchema = (DateTimeSchema) primaryType; @@ -127,7 +127,7 @@ protected IType createPrimitiveType(PrimitiveSchema primaryType) { return durationType; case UNIXTIME: - return isLowLevelClient ? PrimitiveType.LONG : PrimitiveType.UNIX_TIME_LONG; + return PrimitiveType.UNIX_TIME_LONG; case UUID: return isLowLevelClient || uuidAsString ? ClassType.STRING : ClassType.UUID; diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ProxyParameterMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ProxyParameterMapper.java index bd345bff299..cf0d4f27b72 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ProxyParameterMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ProxyParameterMapper.java @@ -11,6 +11,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ArrayType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IterableType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ListType; @@ -185,6 +186,8 @@ public ProxyMethodParameter map(Parameter parameter) { } protected boolean isRemoveModelFromParameter(Parameter parameter, IType clientType) { - return JavaSettings.getInstance().isDataPlaneClient(); + boolean isEnumType = clientType instanceof EnumType; + boolean isClientParameter = Parameter.ImplementationLocation.CLIENT.equals(parameter.getImplementation()); + return JavaSettings.getInstance().isDataPlaneClient() && !(isEnumType && isClientParameter); } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ServiceClientMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ServiceClientMapper.java index f201560cfa1..b11b5548e87 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ServiceClientMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ServiceClientMapper.java @@ -13,12 +13,15 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Scheme; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientAccessorMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethodParameter; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Constructor; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.MethodGroupClient; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ParameterSynthesizedOrigin; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.PipelinePolicyDetails; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Proxy; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ProxyMethod; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.SecurityInfo; @@ -32,9 +35,12 @@ import io.clientcore.core.utils.CoreUtils; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -45,6 +51,8 @@ public class ServiceClientMapper implements IMapper { private static final Pattern TRAILING_FORWARD_SLASH = Pattern.compile("/+$"); private static final Pattern URL_PATH = Pattern.compile("(? parsed = new ConcurrentHashMap<>(); + protected ServiceClientMapper() { } @@ -250,8 +258,108 @@ protected List processClientProperties(Client client, Str return serviceClientProperties; } + /** + * Maps a single TypeSpec client to a service client. + * + * @param client the code model client. + * @param codeModel the code model. + * @return the service client. + */ + public ServiceClient map(Client client, CodeModel codeModel) { + if (parsed.containsKey(client)) { + return parsed.get(client); + } + + ServiceClient.Builder builder = createClientBuilder(); + + String baseName = SchemaUtil.getJavaName(client); + String className = ClientModelUtil.getClientImplementClassName(baseName); + String packageName = ClientModelUtil.getServiceClientPackageName(className); + builder.interfaceName(baseName).className(className).packageName(packageName); + if (client.getLanguage().getJava() != null + && !CoreUtils.isNullOrEmpty(client.getLanguage().getJava().getNamespace())) { + builder.builderPackageName(client.getLanguage().getJava().getNamespace()); + } + + builder.builderDisabled(!client.isBuildMethodPublic()); + + Proxy proxy = null; + OperationGroup clientOperationGroup = client.getOperationGroups() + .stream() + .filter(og -> CoreUtils.isNullOrEmpty(SchemaUtil.getJavaName(og))) + .findFirst() + .orElse(null); + if (clientOperationGroup != null) { + proxy = processClientOperations(builder, clientOperationGroup.getOperations(), baseName); + } else { + builder.clientMethods(Collections.emptyList()); + } + + List properties = processClientProperties(client, + client.getServiceVersion() == null ? null : client.getServiceVersion().getLanguage().getJava().getName()); + + List methodGroupClients = new ArrayList<>(); + client.getOperationGroups() + .stream() + .filter(og -> !CoreUtils.isNullOrEmpty(SchemaUtil.getJavaName(og))) + .forEach(og -> methodGroupClients.add(Mappers.getMethodGroupMapper().map(og, properties))); + builder.methodGroupClients(methodGroupClients); + + if (proxy == null + && CoreUtils.isNullOrEmpty(methodGroupClients) + && CoreUtils.isNullOrEmpty(client.getSubClients())) { + // No operation in this client, no operation group, no sub client as well. Abort the processing. + return null; + } + + if (proxy == null && !CoreUtils.isNullOrEmpty(methodGroupClients)) { + proxy = methodGroupClients.iterator().next().getProxy(); + } + + // TODO (weidxu): security definition could be different for different client + processParametersAndConstructors(builder, client, codeModel, properties, proxy); + + processPipelinePolicyDetails(builder, client); + + builder.crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)); + + List clientAccessorMethods = new ArrayList<>(); + for (Client subClient : client.getSubClients()) { + if (subClient.isParentAccessorPublic()) { + ServiceClient subServiceClient = this.map(subClient, codeModel); + clientAccessorMethods.add(new ClientAccessorMethod(subServiceClient)); + } + } + builder.clientAccessorMethods(clientAccessorMethods); + + ServiceClient serviceClient = builder.build(); + + clientAccessorMethods.forEach(m -> { + m.setServiceClient(serviceClient); + m.getSubClient().setParentClient(serviceClient); + }); + + parsed.put(client, serviceClient); + return serviceClient; + } + + private static void processPipelinePolicyDetails(ServiceClient.Builder builder, Client client) { + // handle corner case of RequestIdPolicy with header name "client-request-id" + final String clientRequestIdHeaderName = "client-request-id"; + final boolean clientRequestIdHeaderInClient = client.getOperationGroups() + .stream() + .flatMap(og -> og.getOperations().stream()) + .anyMatch(o -> o.getSpecialHeaders() != null && o.getSpecialHeaders().contains(clientRequestIdHeaderName)); + if (clientRequestIdHeaderInClient) { + builder + .pipelinePolicyDetails(new PipelinePolicyDetails().setRequestIdHeaderName(clientRequestIdHeaderName)); + } + } + protected boolean isRemoveModelFromParameter(Parameter parameter, IType type) { - return JavaSettings.getInstance().isDataPlaneClient(); + boolean isEnumType = type instanceof EnumType; + boolean isClientParameter = Parameter.ImplementationLocation.CLIENT.equals(parameter.getImplementation()); + return JavaSettings.getInstance().isDataPlaneClient() && !(isEnumType && isClientParameter); } protected void processParametersAndConstructors(ServiceClient.Builder builder, Client client, CodeModel codeModel, diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/util/ModelUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelUtil.java similarity index 96% rename from packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/util/ModelUtil.java rename to packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelUtil.java index 4f3b4215ec0..52dfd747474 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/util/ModelUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelUtil.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.microsoft.typespec.http.client.generator.util; +package com.microsoft.typespec.http.client.generator.core.util; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; @@ -11,7 +11,6 @@ import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ImplementationDetails; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.UnionModel; -import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; public final class ModelUtil { diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentChoiceMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentChoiceMapper.java deleted file mode 100644 index 7933acee1a7..00000000000 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentChoiceMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mgmt.mapper; - -import com.microsoft.typespec.http.client.generator.core.mapper.ChoiceMapper; - -public class FluentChoiceMapper extends ChoiceMapper { - private static final FluentChoiceMapper INSTANCE = new FluentChoiceMapper(); - - private FluentChoiceMapper() { - } - - public static FluentChoiceMapper getInstance() { - return INSTANCE; - } - - @Override - protected boolean useCodeModelNameForEnumMember() { - return false; - } -} diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentMapperFactory.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentMapperFactory.java index 4dd9bf090c1..d4f77dbccea 100644 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentMapperFactory.java +++ b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentMapperFactory.java @@ -3,16 +3,14 @@ package com.microsoft.typespec.http.client.generator.mgmt.mapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ChoiceMapper; import com.microsoft.typespec.http.client.generator.core.mapper.ClientMethodMapper; import com.microsoft.typespec.http.client.generator.core.mapper.DefaultMapperFactory; import com.microsoft.typespec.http.client.generator.core.mapper.ExceptionMapper; import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper; import com.microsoft.typespec.http.client.generator.core.mapper.ModelMapper; +import com.microsoft.typespec.http.client.generator.core.mapper.ModelPropertyMapper; import com.microsoft.typespec.http.client.generator.core.mapper.ObjectMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; import com.microsoft.typespec.http.client.generator.core.mapper.ProxyMethodMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.SealedChoiceMapper; public class FluentMapperFactory extends DefaultMapperFactory { @@ -41,23 +39,13 @@ public ClientMethodMapper getClientMethodMapper() { return FluentClientMethodMapper.getInstance(); } - @Override - public PrimitiveMapper getPrimitiveMapper() { - return FluentPrimitiveMapper.getInstance(); - } - @Override public ModelMapper getModelMapper() { return FluentModelMapper.getInstance(); } @Override - public ChoiceMapper getChoiceMapper() { - return FluentChoiceMapper.getInstance(); - } - - @Override - public SealedChoiceMapper getSealedChoiceMapper() { - return FluentSealedChoiceMapper.getInstance(); + public ModelPropertyMapper getModelPropertyMapper() { + return FluentModelPropertyMapper.getInstance(); } } diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelMapper.java index f31e7d4fdd4..833e5c2774d 100644 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelMapper.java +++ b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelMapper.java @@ -3,6 +3,7 @@ package com.microsoft.typespec.http.client.generator.mgmt.mapper; +import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.ObjectSchema; import com.microsoft.typespec.http.client.generator.core.mapper.ModelMapper; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.mgmt.model.FluentType; @@ -19,6 +20,11 @@ public static FluentModelMapper getInstance() { return INSTANCE; } + @Override + public boolean isPlainObject(ObjectSchema compositeType) { + return false; + } + @Override protected boolean isPredefinedModel(ClassType modelType) { return !FluentType.nonResourceType(modelType) diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelPropertyMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelPropertyMapper.java similarity index 57% rename from packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelPropertyMapper.java rename to packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelPropertyMapper.java index a005b9deb0f..689da9668b3 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelPropertyMapper.java +++ b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentModelPropertyMapper.java @@ -1,15 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.microsoft.typespec.http.client.generator.fluent; +package com.microsoft.typespec.http.client.generator.mgmt.mapper; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.ObjectSchema; import com.microsoft.typespec.http.client.generator.core.mapper.ModelPropertyMapper; -public class TypeSpecFluentModelPropertyMapper extends ModelPropertyMapper { - private static final TypeSpecFluentModelPropertyMapper INSTANCE = new TypeSpecFluentModelPropertyMapper(); +public class FluentModelPropertyMapper extends ModelPropertyMapper { + private static final FluentModelPropertyMapper INSTANCE = new FluentModelPropertyMapper(); - public static TypeSpecFluentModelPropertyMapper getInstance() { + public static FluentModelPropertyMapper getInstance() { return INSTANCE; } diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentObjectMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentObjectMapper.java index 03d64195c04..f8c4dc5d26e 100644 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentObjectMapper.java +++ b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentObjectMapper.java @@ -29,6 +29,11 @@ protected boolean isInnerModel(ObjectSchema compositeType) { return innerModels.contains(compositeType); } + @Override + public boolean isPlainObject(ObjectSchema compositeType) { + return false; + } + @Override protected ClassType mapPredefinedModel(ObjectSchema compositeType) { ClassType result = null; diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentPrimitiveMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentPrimitiveMapper.java deleted file mode 100644 index 666f3b1d5c0..00000000000 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentPrimitiveMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mgmt.mapper; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.PrimitiveSchema; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Schema; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; - -public class FluentPrimitiveMapper extends PrimitiveMapper { - - private static final FluentPrimitiveMapper INSTANCE = new FluentPrimitiveMapper(); - - public static FluentPrimitiveMapper getInstance() { - return INSTANCE; - } - - @Override - public IType map(PrimitiveSchema primaryType) { - if (primaryType == null) { - return null; - } - if (parsed.containsKey(primaryType)) { - return parsed.get(primaryType); - } - if (primaryType.getType() == Schema.AllSchemaTypes.CREDENTIAL) { - // swagger is "format": "password", which mostly serve as a hint - IType type = ClassType.STRING; - parsed.put(primaryType, type); - return type; - } else { - return super.map(primaryType); - } - } -} diff --git a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentSealedChoiceMapper.java b/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentSealedChoiceMapper.java deleted file mode 100644 index 412e981fd22..00000000000 --- a/packages/http-client-java/generator/http-client-generator-mgmt/src/main/java/com/microsoft/typespec/http/client/generator/mgmt/mapper/FluentSealedChoiceMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mgmt.mapper; - -import com.microsoft.typespec.http.client.generator.core.mapper.SealedChoiceMapper; - -public class FluentSealedChoiceMapper extends SealedChoiceMapper { - private static final FluentSealedChoiceMapper INSTANCE = new FluentSealedChoiceMapper(); - - private FluentSealedChoiceMapper() { - } - - public static FluentSealedChoiceMapper getInstance() { - return INSTANCE; - } - - @Override - protected boolean useCodeModelNameForEnumMember() { - return false; - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java index c3abc2d89f1..0344d56ce1d 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/Main.java @@ -13,7 +13,6 @@ import com.microsoft.typespec.http.client.generator.core.model.javamodel.JavaPackage; import com.microsoft.typespec.http.client.generator.core.postprocessor.Postprocessor; import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; -import com.microsoft.typespec.http.client.generator.fluent.TypeSpecFluentPlugin; import com.microsoft.typespec.http.client.generator.mgmt.model.clientmodel.FluentStatic; import com.microsoft.typespec.http.client.generator.mgmt.model.javamodel.FluentJavaPackage; import com.microsoft.typespec.http.client.generator.mgmt.util.FluentUtils; diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentNamer.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecFluentNamer.java similarity index 94% rename from packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentNamer.java rename to packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecFluentNamer.java index fafe276cfb9..2795b7f95f8 100644 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentNamer.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecFluentNamer.java @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.microsoft.typespec.http.client.generator.fluent; +package com.microsoft.typespec.http.client.generator; -import com.microsoft.typespec.http.client.generator.TypeSpecPlugin; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.CodeModel; import com.microsoft.typespec.http.client.generator.core.extension.plugin.NewPlugin; import com.microsoft.typespec.http.client.generator.mgmt.FluentNamer; 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/TypeSpecFluentPlugin.java similarity index 95% rename from packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentPlugin.java rename to packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecFluentPlugin.java index 71e2c7bd428..b11cd9f90c3 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/TypeSpecFluentPlugin.java @@ -1,14 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.microsoft.typespec.http.client.generator.fluent; +package com.microsoft.typespec.http.client.generator; -import com.microsoft.typespec.http.client.generator.JavaSettingsAccessor; -import com.microsoft.typespec.http.client.generator.TypeSpecPlugin; import com.microsoft.typespec.http.client.generator.core.extension.model.Message; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.CodeModel; 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.Client; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.TypeSpecMetadata; import com.microsoft.typespec.http.client.generator.core.model.javamodel.JavaFile; @@ -16,7 +13,6 @@ import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; import com.microsoft.typespec.http.client.generator.mgmt.FluentGen; import com.microsoft.typespec.http.client.generator.mgmt.FluentNamer; -import com.microsoft.typespec.http.client.generator.mgmt.mapper.FluentMapper; import com.microsoft.typespec.http.client.generator.mgmt.model.javamodel.FluentJavaPackage; import com.microsoft.typespec.http.client.generator.mgmt.util.FluentUtils; import com.microsoft.typespec.http.client.generator.model.EmitterOptions; @@ -151,13 +147,6 @@ public void writeFile(String fileName, String content, List sourceMap) { LOGGER.info("Write file: {}", outputFile.toAbsolutePath()); } - @Override - protected FluentMapper getFluentMapper() { - FluentMapper fluentMapper = super.getFluentMapper(); - Mappers.setFactory(new TypeSpecFluentMapperFactory()); - return fluentMapper; - } - private static final Map SETTINGS_MAP = new LinkedHashMap<>(); // from fluentnamer/readme.md 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 218d6f8853b..9bb35475ad4 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 @@ -9,6 +9,8 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.CodeModel; 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.mapper.azurevnext.AzureVNextMapperFactory; +import com.microsoft.typespec.http.client.generator.core.mapper.clientcore.ClientCoreMapperFactory; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.AsyncSyncClient; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Client; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientException; @@ -20,12 +22,10 @@ import com.microsoft.typespec.http.client.generator.core.preprocessor.Preprocessor; import com.microsoft.typespec.http.client.generator.core.preprocessor.tranformer.Transformer; import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; -import com.microsoft.typespec.http.client.generator.mapper.TypeSpecAzureVNextMapperFactory; -import com.microsoft.typespec.http.client.generator.mapper.TypeSpecClientCoreMapperFactory; -import com.microsoft.typespec.http.client.generator.mapper.TypeSpecMapperFactory; +import com.microsoft.typespec.http.client.generator.core.util.ModelUtil; +import com.microsoft.typespec.http.client.generator.mapper.AzureDataPlaneMapperFactory; import com.microsoft.typespec.http.client.generator.model.EmitterOptions; import com.microsoft.typespec.http.client.generator.util.FileUtil; -import com.microsoft.typespec.http.client.generator.util.ModelUtil; import io.clientcore.core.serialization.json.JsonReader; import io.clientcore.core.utils.CoreUtils; import io.clientcore.core.utils.IOExceptionCheckedFunction; @@ -306,11 +306,11 @@ public TypeSpecPlugin(EmitterOptions options, boolean sdkIntegration) { LOGGER.info("Namespace: {}", JavaSettings.getInstance().getPackage()); if (options.getFlavor() != null && options.getFlavor().equalsIgnoreCase("azure")) { - Mappers.setFactory(new TypeSpecMapperFactory()); + Mappers.setFactory(new AzureDataPlaneMapperFactory()); } else if (options.getFlavor() != null && options.getFlavor().equalsIgnoreCase("azurev2")) { - Mappers.setFactory(new TypeSpecAzureVNextMapperFactory()); + Mappers.setFactory(new AzureVNextMapperFactory()); } else { - Mappers.setFactory(new TypeSpecClientCoreMapperFactory()); + Mappers.setFactory(new ClientCoreMapperFactory()); } } diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentMapperFactory.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentMapperFactory.java deleted file mode 100644 index 23ff984b09e..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentMapperFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.fluent; - -import com.microsoft.typespec.http.client.generator.core.mapper.ChoiceMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ClientMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ModelMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ModelPropertyMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ObjectMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.SealedChoiceMapper; -import com.microsoft.typespec.http.client.generator.mapper.TypeSpecClientMapper; -import com.microsoft.typespec.http.client.generator.mapper.TypeSpecPrimitiveMapper; -import com.microsoft.typespec.http.client.generator.mgmt.mapper.FluentMapperFactory; - -public class TypeSpecFluentMapperFactory extends FluentMapperFactory { - @Override - public ClientMapper getClientMapper() { - return TypeSpecClientMapper.getInstance(); - } - - @Override - public PrimitiveMapper getPrimitiveMapper() { - return TypeSpecPrimitiveMapper.getInstance(); - } - - @Override - public ObjectMapper getObjectMapper() { - return TypeSpecFluentObjectMapper.getInstance(); - } - - @Override - public ModelMapper getModelMapper() { - return TypeSpecFluentModelMapper.getInstance(); - } - - @Override - public ModelPropertyMapper getModelPropertyMapper() { - return TypeSpecFluentModelPropertyMapper.getInstance(); - } - - @Override - public ChoiceMapper getChoiceMapper() { - return ChoiceMapper.getInstance(); - } - - @Override - public SealedChoiceMapper getSealedChoiceMapper() { - return SealedChoiceMapper.getInstance(); - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelMapper.java deleted file mode 100644 index dc1c521a507..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentModelMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.fluent; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.ObjectSchema; -import com.microsoft.typespec.http.client.generator.mgmt.mapper.FluentModelMapper; - -public class TypeSpecFluentModelMapper extends FluentModelMapper { - private static final TypeSpecFluentModelMapper INSTANCE = new TypeSpecFluentModelMapper(); - - public static TypeSpecFluentModelMapper getInstance() { - return INSTANCE; - } - - @Override - public boolean isPlainObject(ObjectSchema compositeType) { - return false; - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentObjectMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentObjectMapper.java deleted file mode 100644 index b996f7b0844..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/fluent/TypeSpecFluentObjectMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.fluent; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.ObjectSchema; -import com.microsoft.typespec.http.client.generator.mgmt.mapper.FluentObjectMapper; - -public class TypeSpecFluentObjectMapper extends FluentObjectMapper { - private static final TypeSpecFluentObjectMapper INSTANCE = new TypeSpecFluentObjectMapper(); - - public static TypeSpecFluentObjectMapper getInstance() { - return INSTANCE; - } - - @Override - public boolean isPlainObject(ObjectSchema compositeType) { - return false; - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMapperFactory.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMapperFactory.java new file mode 100644 index 00000000000..47d543974e3 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMapperFactory.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.mapper; + +import com.microsoft.typespec.http.client.generator.core.mapper.DefaultMapperFactory; +import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper; + +public class AzureDataPlaneMapperFactory extends DefaultMapperFactory { + + @Override + public MethodGroupMapper getMethodGroupMapper() { + return AzureDataPlaneMethodGroupMapper.getInstance(); + } +} diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/TypeSpecMethodGroupMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMethodGroupMapper.java similarity index 57% rename from packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/TypeSpecMethodGroupMapper.java rename to packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMethodGroupMapper.java index 0711aaa6d19..24f1f6a6e9d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/TypeSpecMethodGroupMapper.java +++ b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/AzureDataPlaneMethodGroupMapper.java @@ -1,23 +1,24 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.microsoft.typespec.http.client.generator.core.mapper; +package com.microsoft.typespec.http.client.generator.mapper; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Client; +import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper; import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; import com.microsoft.typespec.http.client.generator.core.util.SchemaUtil; /** - * Mapper entry point for TypeSpec-specific method group customizations. + * Mapper entry point for Azure data-plane method group customizations. */ -public class TypeSpecMethodGroupMapper extends MethodGroupMapper { - private static final TypeSpecMethodGroupMapper INSTANCE = new TypeSpecMethodGroupMapper(); +public class AzureDataPlaneMethodGroupMapper extends MethodGroupMapper { + private static final AzureDataPlaneMethodGroupMapper INSTANCE = new AzureDataPlaneMethodGroupMapper(); - protected TypeSpecMethodGroupMapper() { + protected AzureDataPlaneMethodGroupMapper() { super(); } - public static TypeSpecMethodGroupMapper getInstance() { + public static AzureDataPlaneMethodGroupMapper getInstance() { return INSTANCE; } diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecAzureVNextMapperFactory.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecAzureVNextMapperFactory.java deleted file mode 100644 index f7f47ae93d9..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecAzureVNextMapperFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.mapper.ClientMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.azurevnext.AzureVNextMapperFactory; - -public class TypeSpecAzureVNextMapperFactory extends AzureVNextMapperFactory { - @Override - public ClientMapper getClientMapper() { - return TypeSpecClientMapper.getInstance(); - } - - @Override - public PrimitiveMapper getPrimitiveMapper() { - return TypeSpecPrimitiveMapper.getInstance(); - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientCoreMapperFactory.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientCoreMapperFactory.java deleted file mode 100644 index d5093b0a698..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientCoreMapperFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.mapper.ClientMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.clientcore.ClientCoreMapperFactory; - -public class TypeSpecClientCoreMapperFactory extends ClientCoreMapperFactory { - - @Override - public ClientMapper getClientMapper() { - return TypeSpecClientMapper.getInstance(); - } - - @Override - public PrimitiveMapper getPrimitiveMapper() { - return TypeSpecPrimitiveMapper.getInstance(); - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientMapper.java deleted file mode 100644 index cb9ddca6e87..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecClientMapper.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Client; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.CodeModel; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Header; -import com.microsoft.typespec.http.client.generator.core.mapper.ClientMapper; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModel; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientResponse; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ServiceClient; -import com.microsoft.typespec.http.client.generator.util.ModelUtil; -import io.clientcore.core.utils.CoreUtils; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class TypeSpecClientMapper extends ClientMapper { - - private static final ClientMapper INSTANCE = new TypeSpecClientMapper(); - - public static ClientMapper getInstance() { - return INSTANCE; - } - - protected TypeSpecClientMapper() { - } - - @Override - protected Map processClients(List clients, CodeModel codeModel) { - Map serviceClientsMap = new LinkedHashMap<>(); - TypeSpecServiceClientMapper mapper = new TypeSpecServiceClientMapper(); - for (Client client : clients) { - ServiceClient serviceClient = mapper.map(client, codeModel); - if (serviceClient != null) { - serviceClientsMap.put(serviceClient, client); - } - } - return serviceClientsMap; - } - - @Override - protected List getModelsPackages(List clientModels, List enumTypes, - List responseModels) { - Set packages = new LinkedHashSet<>(); - - clientModels.stream().filter(ModelUtil::isGeneratingModel).map(ClientModel::getPackage).forEach(packages::add); - enumTypes.stream().filter(ModelUtil::isGeneratingModel).map(EnumType::getPackage).forEach(packages::add); - responseModels.stream() - .filter(ModelUtil::isGeneratingModel) - .map(ClientResponse::getPackage) - .forEach(packages::add); - - return new ArrayList<>(packages); - } - - @Override - protected String getResponseHeaderName(Header header) { - String clientName; - if (header.getLanguage() != null - && header.getLanguage().getJava() != null - && !CoreUtils.isNullOrEmpty(header.getLanguage().getJava().getName())) { - clientName = header.getLanguage().getJava().getName(); - } else if (header.getLanguage() != null - && header.getLanguage().getDefault() != null - && !CoreUtils.isNullOrEmpty(header.getLanguage().getDefault().getName())) { - clientName = header.getLanguage().getDefault().getName(); - } else { - clientName = header.getHeader(); - } - return clientName; - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecMapperFactory.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecMapperFactory.java deleted file mode 100644 index 28d64fc2e5a..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecMapperFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.mapper.ClientMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.DefaultMapperFactory; -import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.ProxyParameterMapper; -import com.microsoft.typespec.http.client.generator.core.mapper.TypeSpecMethodGroupMapper; - -public class TypeSpecMapperFactory extends DefaultMapperFactory { - - @Override - public ClientMapper getClientMapper() { - return TypeSpecClientMapper.getInstance(); - } - - @Override - public PrimitiveMapper getPrimitiveMapper() { - return TypeSpecPrimitiveMapper.getInstance(); - } - - @Override - public ProxyParameterMapper getProxyParameterMapper() { - return TypeSpecProxyParameterMapper.getInstance(); - } - - @Override - public MethodGroupMapper getMethodGroupMapper() { - return TypeSpecMethodGroupMapper.getInstance(); - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecPrimitiveMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecPrimitiveMapper.java deleted file mode 100644 index fe2214aab87..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecPrimitiveMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.PrimitiveSchema; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Schema; -import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.PrimitiveType; - -public class TypeSpecPrimitiveMapper extends PrimitiveMapper { - - private static final PrimitiveMapper INSTANCE = new TypeSpecPrimitiveMapper(); - - public static PrimitiveMapper getInstance() { - return INSTANCE; - } - - @Override - protected IType createPrimitiveType(PrimitiveSchema primaryType) { - if (primaryType.getType() == Schema.AllSchemaTypes.DATE) { - return ClassType.LOCAL_DATE; - } else if (primaryType.getType() == Schema.AllSchemaTypes.UNIXTIME) { - return PrimitiveType.UNIX_TIME_LONG; - } else { - return super.createPrimitiveType(primaryType); - } - } -} diff --git a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecProxyParameterMapper.java b/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecProxyParameterMapper.java deleted file mode 100644 index 5afd5830f5e..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecProxyParameterMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Parameter; -import com.microsoft.typespec.http.client.generator.core.mapper.ProxyParameterMapper; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; - -public class TypeSpecProxyParameterMapper extends ProxyParameterMapper { - private static final ProxyParameterMapper INSTANCE = new TypeSpecProxyParameterMapper(); - - public static ProxyParameterMapper getInstance() { - return INSTANCE; - } - - @Override - protected boolean isRemoveModelFromParameter(Parameter parameter, IType type) { - // if it is typespec and enum type client parameter, do not remove model from parameter - boolean isEnumType = type instanceof EnumType; - boolean isClientParameter = Parameter.ImplementationLocation.CLIENT.equals(parameter.getImplementation()); - return super.isRemoveModelFromParameter(parameter, type) && !(isEnumType && isClientParameter); - } -} 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 deleted file mode 100644 index 963a5c48cdf..00000000000 --- a/packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/mapper/TypeSpecServiceClientMapper.java +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package com.microsoft.typespec.http.client.generator.mapper; - -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Client; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.CodeModel; -import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.OperationGroup; -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.ClientAccessorMethod; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.MethodGroupClient; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.PipelinePolicyDetails; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Proxy; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ServiceClient; -import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ServiceClientProperty; -import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil; -import com.microsoft.typespec.http.client.generator.core.util.SchemaUtil; -import io.clientcore.core.utils.CoreUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class TypeSpecServiceClientMapper extends ServiceClientMapper { - - private final Map parsed = new ConcurrentHashMap<>(); - - public ServiceClient map(Client client, CodeModel codeModel) { - if (parsed.containsKey(client)) { - return parsed.get(client); - } - - ServiceClient.Builder builder = createClientBuilder(); - - String baseName = SchemaUtil.getJavaName(client); - String className = ClientModelUtil.getClientImplementClassName(baseName); - String packageName = ClientModelUtil.getServiceClientPackageName(className); - builder.interfaceName(baseName).className(className).packageName(packageName); - if (client.getLanguage().getJava() != null - && !CoreUtils.isNullOrEmpty(client.getLanguage().getJava().getNamespace())) { - builder.builderPackageName(client.getLanguage().getJava().getNamespace()); - } - - builder.builderDisabled(!client.isBuildMethodPublic()); - - Proxy proxy = null; - OperationGroup clientOperationGroup = client.getOperationGroups() - .stream() - .filter(og -> CoreUtils.isNullOrEmpty(SchemaUtil.getJavaName(og))) - .findFirst() - .orElse(null); - if (clientOperationGroup != null) { - proxy = processClientOperations(builder, clientOperationGroup.getOperations(), baseName); - } else { - builder.clientMethods(Collections.emptyList()); - } - - List properties = processClientProperties(client, - client.getServiceVersion() == null ? null : client.getServiceVersion().getLanguage().getJava().getName()); - - List methodGroupClients = new ArrayList<>(); - client.getOperationGroups() - .stream() - .filter(og -> !CoreUtils.isNullOrEmpty(SchemaUtil.getJavaName(og))) - .forEach(og -> methodGroupClients.add(Mappers.getMethodGroupMapper().map(og, properties))); - builder.methodGroupClients(methodGroupClients); - - if (proxy == null - && CoreUtils.isNullOrEmpty(methodGroupClients) - && CoreUtils.isNullOrEmpty(client.getSubClients())) { - // No operation in this client, no operation group, no sub client as well. Abort the processing. - return null; - } - - if (proxy == null && !CoreUtils.isNullOrEmpty(methodGroupClients)) { - proxy = methodGroupClients.iterator().next().getProxy(); - } - - // TODO (weidxu): security definition could be different for different client - processParametersAndConstructors(builder, client, codeModel, properties, proxy); - - processPipelinePolicyDetails(builder, client); - - builder.crossLanguageDefinitionId(SchemaUtil.getCrossLanguageDefinitionId(client)); - - List clientAccessorMethods = new ArrayList<>(); - for (Client subClient : client.getSubClients()) { - if (subClient.isParentAccessorPublic()) { - ServiceClient subServiceClient = this.map(subClient, codeModel); - clientAccessorMethods.add(new ClientAccessorMethod(subServiceClient)); - } - } - builder.clientAccessorMethods(clientAccessorMethods); - - ServiceClient serviceClient = builder.build(); - - clientAccessorMethods.forEach(m -> { - m.setServiceClient(serviceClient); - m.getSubClient().setParentClient(serviceClient); - }); - - parsed.put(client, serviceClient); - return serviceClient; - } - - private static void processPipelinePolicyDetails(ServiceClient.Builder builder, Client client) { - // handle corner case of RequestIdPolicy with header name "client-request-id" - final String clientRequestIdHeaderName = "client-request-id"; - final boolean clientRequestIdHeaderInClient = client.getOperationGroups() - .stream() - .flatMap(og -> og.getOperations().stream()) - .anyMatch(o -> o.getSpecialHeaders() != null && o.getSpecialHeaders().contains(clientRequestIdHeaderName)); - if (clientRequestIdHeaderInClient) { - builder - .pipelinePolicyDetails(new PipelinePolicyDetails().setRequestIdHeaderName(clientRequestIdHeaderName)); - } - } - - @Override - protected boolean isRemoveModelFromParameter(Parameter parameter, IType type) { - boolean isEnumType = type instanceof EnumType; - boolean isClientParameter = Parameter.ImplementationLocation.CLIENT.equals(parameter.getImplementation()); - return super.isRemoveModelFromParameter(parameter, type) && !(isEnumType && isClientParameter); - } -}