diff --git a/src/main/java/com/power/doc/builder/openapi/AbstractOpenApiBuilder.java b/src/main/java/com/power/doc/builder/openapi/AbstractOpenApiBuilder.java index b41219e6e..763c74351 100644 --- a/src/main/java/com/power/doc/builder/openapi/AbstractOpenApiBuilder.java +++ b/src/main/java/com/power/doc/builder/openapi/AbstractOpenApiBuilder.java @@ -1,24 +1,24 @@ /* - * smart-doc https://github.com/smart-doc-group/smart-doc + *smart-doc https://github.com/smart-doc-group/smart-doc * - * Copyright (C) 2018-2023 smart-doc + *Copyright(C)2018-2023smart-doc * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at + *Licensed to the Apache Software Foundation(ASF)under one + *or more contributor license agreements.See the NOTICE file + *distributed with this work for additional information + *regarding copyright ownership.The ASF licenses this file + *to you under the Apache License,Version2.0(the + *"License");you may not use this file except in compliance + *with the License.You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + *http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. + *Unless required by applicable law or agreed to in writing, + *software distributed under the License is distributed on an + *"AS IS"BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY + *KIND,either express or implied.See the License for the + *specific language governing permissions and limitations + *under the License. */ package com.power.doc.builder.openapi; @@ -27,6 +27,7 @@ import com.power.common.util.StringUtil; import com.power.doc.builder.DocBuilderTemplate; import com.power.doc.builder.ProjectDocConfigBuilder; +import com.power.doc.constants.ComponentTypeEnum; import com.power.doc.constants.DocGlobalConstants; import com.power.doc.factory.BuildTemplateFactory; import com.power.doc.model.*; @@ -164,7 +165,7 @@ public Map buildContentBody(ApiConfig apiConfig, ApiMethodDoc ap } else if (!isRep && Objects.nonNull(apiMethodDoc.getRequestSchema())) { content.put("schema", apiMethodDoc.getRequestSchema()); } else { - content.put("schema", buildBodySchema(apiMethodDoc, isRep)); + content.put("schema", buildBodySchema(apiMethodDoc, ComponentTypeEnum.getComponentEnumByCode(apiConfig.getComponentType()), isRep)); } if (OPENAPI_2_COMPONENT_KRY.equals(componentKey) && !isRep) { @@ -184,17 +185,18 @@ public Map buildContentBody(ApiConfig apiConfig, ApiMethodDoc ap * @param apiMethodDoc ApiMethodDoc * @param isRep is response */ - public Map buildBodySchema(ApiMethodDoc apiMethodDoc, boolean isRep) { + public Map buildBodySchema(ApiMethodDoc apiMethodDoc, ComponentTypeEnum componentTypeEnum, boolean isRep) { Map schema = new HashMap<>(10); Map innerScheme = new HashMap<>(10); String requestRef; + String randomName = ComponentTypeEnum.getRandomName(componentTypeEnum, apiMethodDoc); if (apiMethodDoc.getContentType().equals(DocGlobalConstants.URL_CONTENT_TYPE)) { - requestRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getQueryParams(), COMPONENT_REQUEST_SUFFIX); + requestRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getQueryParams()); } else { - requestRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getRequestParams(), COMPONENT_REQUEST_SUFFIX); + requestRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getRequestParams()); } //remove special characters in url - String responseRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getResponseParams(), COMPONENT_RESPONSE_SUFFIX); + String responseRef = componentKey + OpenApiSchemaUtil.getClassNameFromParams(apiMethodDoc.getResponseParams()); if (!isRep && CollectionUtil.isNotEmpty(apiMethodDoc.getRequestParams())) { if (apiMethodDoc.getIsRequestArray() == 1) { schema.put("type", ARRAY); @@ -303,7 +305,7 @@ public static Map buildParametersSchema(ApiReqParam header) { Map schema = new HashMap<>(10); String openApiType = DocUtil.javaTypeToOpenApiTypeConvert(header.getType()); schema.put("type", openApiType); - schema.put("format", "int16".equals(header.getType()) ? "int32" : header.getType()); + schema.put("format", openApiType); return schema; } @@ -324,7 +326,7 @@ public Map buildResponses(ApiConfig apiConfig, ApiMethodDoc apiM * * @param apiDocs List of ApiDoc */ - abstract public Map buildComponentsSchema(List apiDocs); + abstract public Map buildComponentsSchema(List apiDocs, ComponentTypeEnum componentTypeEnum); /** * component schema properties @@ -390,8 +392,7 @@ private Map buildPropertiesData(ApiParam apiParam, Map arrayRef = new HashMap<>(4); - String suffix = isResp ? COMPONENT_RESPONSE_SUFFIX : COMPONENT_REQUEST_SUFFIX; - String childSchemaName = OpenApiSchemaUtil.getClassNameFromParams(apiParam.getChildren(), suffix); + String childSchemaName = OpenApiSchemaUtil.getClassNameFromParams(apiParam.getChildren()); if (childSchemaName.contains(OpenApiSchemaUtil.NO_BODY_PARAM)) { propertiesData.put("type", "object"); propertiesData.put("description", apiParam.getDesc() + "(object)"); @@ -417,9 +418,8 @@ private Map buildPropertiesData(ApiParam apiParam, Map getOpenApiDocs(ApiConfig config, JavaProjectBuilder projectB IDocBuildTemplate docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework()); return docBuildTemplate.getApiData(configBuilder); } -} +} \ No newline at end of file diff --git a/src/main/java/com/power/doc/builder/openapi/OpenApiBuilder.java b/src/main/java/com/power/doc/builder/openapi/OpenApiBuilder.java index 0f7b1b2d9..769a20e61 100644 --- a/src/main/java/com/power/doc/builder/openapi/OpenApiBuilder.java +++ b/src/main/java/com/power/doc/builder/openapi/OpenApiBuilder.java @@ -24,6 +24,7 @@ import com.power.common.util.CollectionUtil; import com.power.common.util.FileUtil; +import com.power.doc.constants.ComponentTypeEnum; import com.power.doc.constants.DocGlobalConstants; import com.power.doc.constants.Methods; import com.power.doc.helper.JavaProjectBuilderHelper; @@ -88,7 +89,7 @@ public void openApiCreate(ApiConfig config, List apiDocList) { Set tags = new HashSet<>(); json.put("tags", tags); json.put("paths", buildPaths(config, apiDocList, tags)); - json.put("components", buildComponentsSchema(apiDocList)); + json.put("components", buildComponentsSchema(apiDocList, ComponentTypeEnum.getComponentEnumByCode(config.getComponentType()))); String filePath = config.getOutPath(); filePath = filePath + DocGlobalConstants.OPEN_API_JSON; @@ -265,23 +266,23 @@ Map getStringParams(ApiParam apiParam, boolean hasItems) { } @Override - public Map buildComponentsSchema(List apiDocs) { + public Map buildComponentsSchema(List apiDocs, ComponentTypeEnum componentTypeEnum) { Map schemas = new HashMap<>(4); Map component = new HashMap<>(); - component.put("string", STRING_COMPONENT); + component.put(DEFAULT_PRIMITIVE, STRING_COMPONENT); apiDocs.forEach( a -> { List apiMethodDocs = a.getList(); apiMethodDocs.forEach( method -> { //request components - String requestSchema = OpenApiSchemaUtil.getClassNameFromParams(method.getRequestParams(), COMPONENT_REQUEST_SUFFIX); + String requestSchema = OpenApiSchemaUtil.getClassNameFromParams(method.getRequestParams()); List requestParams = method.getRequestParams(); Map prop = buildProperties(requestParams, component, false); component.put(requestSchema, prop); //response components List responseParams = method.getResponseParams(); - String schemaName = OpenApiSchemaUtil.getClassNameFromParams(method.getResponseParams(), COMPONENT_RESPONSE_SUFFIX); + String schemaName = OpenApiSchemaUtil.getClassNameFromParams(method.getResponseParams()); component.put(schemaName, buildProperties(responseParams, component, true)); } ); diff --git a/src/main/java/com/power/doc/builder/openapi/SwaggerBuilder.java b/src/main/java/com/power/doc/builder/openapi/SwaggerBuilder.java index cec48cbc6..24a5d7e4f 100644 --- a/src/main/java/com/power/doc/builder/openapi/SwaggerBuilder.java +++ b/src/main/java/com/power/doc/builder/openapi/SwaggerBuilder.java @@ -25,6 +25,7 @@ import com.power.common.util.CollectionUtil; import com.power.common.util.FileUtil; import com.power.common.util.StringUtil; +import com.power.doc.constants.ComponentTypeEnum; import com.power.doc.constants.DocGlobalConstants; import com.power.doc.helper.JavaProjectBuilderHelper; import com.power.doc.model.*; @@ -90,7 +91,7 @@ public void openApiCreate(ApiConfig config, List apiDocList) { Set tags = new HashSet<>(); json.put("tags", tags); json.put("paths", buildPaths(config, apiDocList, tags)); - json.put("definitions", buildComponentsSchema(apiDocList)); + json.put("definitions", buildComponentsSchema(apiDocList, ComponentTypeEnum.getComponentEnumByCode(config.getComponentType()))); String filePath = config.getOutPath(); filePath = filePath + DocGlobalConstants.OPEN_API_JSON; @@ -277,22 +278,22 @@ Map getStringParams(ApiParam apiParam, boolean hasItems) { } @Override - public Map buildComponentsSchema(List apiDocs) { + public Map buildComponentsSchema(List apiDocs, ComponentTypeEnum componentTypeEnum) { Map component = new HashMap<>(); - component.put("string", STRING_COMPONENT); + component.put(DEFAULT_PRIMITIVE, STRING_COMPONENT); apiDocs.forEach( a -> { List apiMethodDocs = a.getList(); apiMethodDocs.forEach( method -> { //request components - String requestSchema = OpenApiSchemaUtil.getClassNameFromParams(method.getRequestParams(), COMPONENT_REQUEST_SUFFIX); + String requestSchema = OpenApiSchemaUtil.getClassNameFromParams(method.getRequestParams()); List requestParams = method.getRequestParams(); Map prop = buildProperties(requestParams, component, false); component.put(requestSchema, prop); //response components List responseParams = method.getResponseParams(); - String schemaName = OpenApiSchemaUtil.getClassNameFromParams(method.getResponseParams(), COMPONENT_RESPONSE_SUFFIX); + String schemaName = OpenApiSchemaUtil.getClassNameFromParams(method.getResponseParams()); component.put(schemaName, buildProperties(responseParams, component, true)); } ); diff --git a/src/main/java/com/power/doc/constants/ComponentTypeEnum.java b/src/main/java/com/power/doc/constants/ComponentTypeEnum.java new file mode 100644 index 000000000..252d14602 --- /dev/null +++ b/src/main/java/com/power/doc/constants/ComponentTypeEnum.java @@ -0,0 +1,49 @@ +package com.power.doc.constants; + +import com.power.doc.model.ApiMethodDoc; +import org.apache.commons.lang3.StringUtils; + +/** + * @author xingzi + * Date 2023/9/10 14:47 + */ +public enum ComponentTypeEnum { + /** + * support @Validated + */ + RANDOM("RANDOM"), + /** + * don't support @Validated, + * for openapi generator + */ + NORMAL("NORMAL"); + + ComponentTypeEnum(String componentType) { + this.componentType = componentType; + } + + /** + * openapi component generator Key type + */ + private final String componentType; + + public static String getRandomName(ComponentTypeEnum componentTypeEnum, ApiMethodDoc apiMethodDoc) { + if (componentTypeEnum.equals(RANDOM)) { + return apiMethodDoc.getUrl(); + } + return StringUtils.EMPTY; + } + + public String getComponentType() { + return componentType; + } + + public static ComponentTypeEnum getComponentEnumByCode(String code) { + for (ComponentTypeEnum typeEnum : ComponentTypeEnum.values()) { + if (typeEnum.getComponentType().equals(code)) { + return typeEnum; + } + } + return RANDOM; + } +} diff --git a/src/main/java/com/power/doc/constants/DocGlobalConstants.java b/src/main/java/com/power/doc/constants/DocGlobalConstants.java index 41dfbcbad..fab20c034 100644 --- a/src/main/java/com/power/doc/constants/DocGlobalConstants.java +++ b/src/main/java/com/power/doc/constants/DocGlobalConstants.java @@ -251,9 +251,6 @@ public interface DocGlobalConstants { String OPENAPI_3_COMPONENT_KRY = "#/components/schemas/"; - String COMPONENT_REQUEST_SUFFIX = "_request"; - - String COMPONENT_RESPONSE_SUFFIX = "_response"; String SWAGGER_FILE_TAG = "formData"; @@ -262,4 +259,6 @@ public interface DocGlobalConstants { String DEFAULT_FILTER_METHOD = "*"; String JAR_TEMP = "./smart-temp/"; + + String DEFAULT_PRIMITIVE = "defaultPrimitive"; } diff --git a/src/main/java/com/power/doc/model/ApiConfig.java b/src/main/java/com/power/doc/model/ApiConfig.java index 055796275..753c37900 100644 --- a/src/main/java/com/power/doc/model/ApiConfig.java +++ b/src/main/java/com/power/doc/model/ApiConfig.java @@ -40,6 +40,15 @@ */ public class ApiConfig { + private final static ApiConfig apiConfig = new ApiConfig(); + + private ApiConfig() { + } + + public static ApiConfig getInstance() { + return apiConfig; + } + /** * Web server base url */ @@ -364,6 +373,21 @@ public class ApiConfig { */ private boolean randomMock; + /** + * build random component for openApi + * @see com.power.doc.constants.ComponentTypeEnum + */ + private String componentType; + + public String getComponentType() { + return componentType; + } + + public ApiConfig setComponentType(String componentType) { + this.componentType = componentType; + return this; + } + public String getCodePath() { return codePath; } diff --git a/src/main/java/com/power/doc/utils/OpenApiSchemaUtil.java b/src/main/java/com/power/doc/utils/OpenApiSchemaUtil.java index 9e8ec9665..61fe52367 100644 --- a/src/main/java/com/power/doc/utils/OpenApiSchemaUtil.java +++ b/src/main/java/com/power/doc/utils/OpenApiSchemaUtil.java @@ -31,8 +31,17 @@ import java.util.regex.Pattern; import com.power.common.util.CollectionUtil; +import com.power.common.util.MD6Util; import com.power.common.util.StringUtil; +import com.power.doc.constants.ComponentTypeEnum; +import com.power.doc.constants.DocGlobalConstants; +import com.power.doc.model.ApiConfig; +import com.power.doc.model.ApiMethodDoc; import com.power.doc.model.ApiParam; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; + +import static com.power.doc.constants.TornaConstants.GSON; /** * @author yu 2020/11/29. @@ -81,16 +90,22 @@ public static Map returnSchema(String returnGicName) { return map; } - public static String getClassNameFromParams(List apiParams, String suffix) { + public static String getClassNameFromParams(List apiParams) { + ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.getComponentEnumByCode(ApiConfig.getInstance().getComponentType()); // if array[Primitive] or Primitive if (CollectionUtil.isNotEmpty(apiParams) && apiParams.size() == 1 && StringUtil.isEmpty(apiParams.get(0).getClassName()) && CollectionUtil.isEmpty(apiParams.get(0).getChildren())) { - return "string"; + return DocGlobalConstants.DEFAULT_PRIMITIVE; + } + //random name + if (componentTypeEnum.equals(ComponentTypeEnum.RANDOM)) { + return DigestUtils.md5Hex(GSON.toJson(apiParams)); } + //className for (ApiParam a : apiParams) { if (StringUtil.isNotEmpty(a.getClassName())) { - return OpenApiSchemaUtil.delClassName(a.getClassName()) + suffix; + return OpenApiSchemaUtil.delClassName(a.getClassName()); } } return NO_BODY_PARAM; diff --git a/src/test/java/com/power/doc/ApiDocTest.java b/src/test/java/com/power/doc/ApiDocTest.java index 5d84c5f82..b819fd2b2 100644 --- a/src/test/java/com/power/doc/ApiDocTest.java +++ b/src/test/java/com/power/doc/ApiDocTest.java @@ -19,9 +19,11 @@ public class ApiDocTest { /** * 包括设置请求头,缺失注释的字段批量在文档生成期使用定义好的注释 */ + @Deprecated @Test public void testBuilderControllersApi() { - ApiConfig config = new ApiConfig(); + @Deprecated + ApiConfig config = ApiConfig.getInstance(); config.setServerUrl("http://127.0.0.1:8899"); // config.setStrict(true); config.setOpenUrl("http://localhost:7700/api"); diff --git a/src/test/java/com/power/doc/qbox/QboxScanSourceTest.java b/src/test/java/com/power/doc/qbox/QboxScanSourceTest.java index 3b14d44bb..883b08083 100644 --- a/src/test/java/com/power/doc/qbox/QboxScanSourceTest.java +++ b/src/test/java/com/power/doc/qbox/QboxScanSourceTest.java @@ -25,7 +25,7 @@ public void scanError() { String outPath = Paths.get("target").toAbsolutePath().toString(); // config and scan - ApiConfig config = new ApiConfig(); + ApiConfig config = ApiConfig.getInstance(); config.setServerUrl("HSF://127.0.0.1:8088"); config.setOpenUrl("http://demo.torna.cn/api"); config.setDebugEnvName("测试环境");