From fd2b5560a9aa95f7a3ab6d8a88a1fadccecd41dd Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 16 Jul 2020 13:29:18 +0800 Subject: [PATCH] fluent, remove 404 in status code, for get/list --- .../fluent/transformer/FluentTransformer.java | 1 + .../ResponseStatusCodeNormalization.java | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/ResponseStatusCodeNormalization.java diff --git a/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/FluentTransformer.java b/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/FluentTransformer.java index 15eedfe2b1..1c5b035c7d 100644 --- a/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/FluentTransformer.java +++ b/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/FluentTransformer.java @@ -45,6 +45,7 @@ public CodeModel postTransform(CodeModel codeModel) { codeModel = new OperationNameNormalization().process(codeModel); codeModel = new ResourceTypeNormalization().process(codeModel); codeModel = new ErrorTypeNormalization().process(codeModel); + codeModel = new ResponseStatusCodeNormalization().process(codeModel); if (fluentJavaSettings.isResourcePropertyAsSubResource()) { codeModel = new ResourcePropertyNormalization().process(codeModel); } diff --git a/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/ResponseStatusCodeNormalization.java b/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/ResponseStatusCodeNormalization.java new file mode 100644 index 0000000000..89dc005839 --- /dev/null +++ b/fluentnamer/src/main/java/com/azure/autorest/fluent/transformer/ResponseStatusCodeNormalization.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + */ + +package com.azure.autorest.fluent.transformer; + +import com.azure.autorest.extension.base.model.codemodel.CodeModel; +import com.azure.autorest.extension.base.model.codemodel.Response; +import com.azure.autorest.fluent.util.Utils; +import com.azure.core.http.HttpMethod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class ResponseStatusCodeNormalization { + + private static final Logger logger = LoggerFactory.getLogger(ResponseStatusCodeNormalization.class); + + private static final boolean REMOVE_404_IN_GET_RESPONSE = true; + + public CodeModel process(CodeModel codeModel) { + codeModel.getOperationGroups().stream().flatMap(og -> og.getOperations().stream()) + // only for GET method + .filter(o -> o.getRequests().stream() + .anyMatch(r -> r.getProtocol() != null && r.getProtocol().getHttp() != null + && HttpMethod.GET.name().equalsIgnoreCase(r.getProtocol().getHttp().getMethod()))) + .forEach(operation -> { + List responsesToRemove = new ArrayList<>(); + for (Response response : operation.getResponses()) { + if (response.getProtocol() != null && response.getProtocol().getHttp() != null && response.getProtocol().getHttp().getStatusCodes() != null) { + if (response.getProtocol().getHttp().getStatusCodes().contains("404")) { + logger.warn("Operation {} expect 404 status code, in group {}", + Utils.getJavaName(operation), Utils.getJavaName(operation.getOperationGroup())); + + if (REMOVE_404_IN_GET_RESPONSE) { + String operationNameInLower = Utils.getJavaName(operation).toLowerCase(Locale.ROOT); + if (operationNameInLower.startsWith("get") || operationNameInLower.startsWith("list")) { + logger.info("Remove 404 status code in operation {}, in group {}", + Utils.getJavaName(operation), Utils.getJavaName(operation.getOperationGroup())); + if (response.getProtocol().getHttp().getStatusCodes().size() == 1) { + // remove the response with only 404 + responsesToRemove.add(response); + } else { + response.getProtocol().getHttp().getStatusCodes().remove("404"); + } + } + } + } + } + } + if (!responsesToRemove.isEmpty()) { + operation.getResponses().removeAll(responsesToRemove); + } + }); + + return codeModel; + } +}