diff --git a/src/main/java/com/power/doc/builder/DocBuilderTemplate.java b/src/main/java/com/power/doc/builder/DocBuilderTemplate.java index 966de46..916f237 100644 --- a/src/main/java/com/power/doc/builder/DocBuilderTemplate.java +++ b/src/main/java/com/power/doc/builder/DocBuilderTemplate.java @@ -7,13 +7,15 @@ import com.power.common.util.StringUtil; import com.power.doc.constants.DocGlobalConstants; import com.power.doc.constants.DocLanguage; import com.power.doc.constants.TemplateVariable; -import com.power.doc.model.ApiConfig; -import com.power.doc.model.ApiDoc; -import com.power.doc.model.ApiErrorCode; +import com.power.doc.model.*; import com.power.doc.utils.BeetlTemplateUtil; import org.beetl.core.Template; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import static com.power.doc.constants.DocGlobalConstants.FILE_SEPARATOR; @@ -23,6 +25,7 @@ import static com.power.doc.constants.DocGlobalConstants.FILE_SEPARATOR; public class DocBuilderTemplate { private static long now = System.currentTimeMillis(); + /** * check condition and init * @@ -101,18 +104,28 @@ public class DocBuilderTemplate { tpl.binding(TemplateVariable.API_DOC_LIST.getVariable(), apiDocList); tpl.binding(TemplateVariable.ERROR_CODE_LIST.getVariable(), config.getErrorCodes()); tpl.binding(TemplateVariable.VERSION_LIST.getVariable(), config.getRevisionLogs()); - tpl.binding(TemplateVariable.VERSION.getVariable(),now); + tpl.binding(TemplateVariable.VERSION.getVariable(), now); tpl.binding(TemplateVariable.CREATE_TIME.getVariable(), strTime); - tpl.binding(TemplateVariable.PROJECT_NAME.getVariable(),config.getProjectName()); + tpl.binding(TemplateVariable.PROJECT_NAME.getVariable(), config.getProjectName()); + if (CollectionUtil.isEmpty(config.getErrorCodes())) { + tpl.binding(TemplateVariable.DICT_ORDER.getVariable(), apiDocList.size() + 1); + } else { + tpl.binding(TemplateVariable.DICT_ORDER.getVariable(), apiDocList.size() + 2); + } if (null != config.getLanguage()) { if (DocLanguage.CHINESE.code.equals(config.getLanguage().getCode())) { tpl.binding(TemplateVariable.ERROR_LIST_TITLE.getVariable(), DocGlobalConstants.ERROR_CODE_LIST_CN_TITLE); + tpl.binding(TemplateVariable.DICT_LIST_TITLE.getVariable(), DocGlobalConstants.DICT_CN_TITLE); } else { tpl.binding(TemplateVariable.ERROR_LIST_TITLE.getVariable(), DocGlobalConstants.ERROR_CODE_LIST_EN_TITLE); + tpl.binding(TemplateVariable.DICT_LIST_TITLE.getVariable(), DocGlobalConstants.DICT_EN_TITLE); } } else { tpl.binding(TemplateVariable.ERROR_LIST_TITLE.getVariable(), DocGlobalConstants.ERROR_CODE_LIST_CN_TITLE); + tpl.binding(TemplateVariable.DICT_LIST_TITLE.getVariable(), DocGlobalConstants.DICT_CN_TITLE); } + List apiDocDictList = buildDictionary(config); + tpl.binding(TemplateVariable.DICT_LIST.getVariable(), apiDocDictList); FileUtil.nioWriteFile(tpl.render(), outPath + FILE_SEPARATOR + outPutFileName); } @@ -151,4 +164,53 @@ public class DocBuilderTemplate { mapper.binding(TemplateVariable.LIST.getVariable(), doc.getList()); FileUtil.writeFileNotAppend(mapper.render(), outPath + FILE_SEPARATOR + doc.getName() + fileExtension); } + + /** + * Build dictionary + * + * @param config api config + * @return list of ApiDocDict + */ + public List buildDictionary(ApiConfig config) { + List apiDataDictionaryList = config.getDataDictConfigs(); + List apiDocDictList = new ArrayList<>(); + try { + int order = 0; + for (ApiDataDictConfig apiDataDictionary : apiDataDictionaryList) { + order++; + ApiDocDict apiDocDict = new ApiDocDict(); + apiDocDict.setOrder(order); + apiDocDict.setTitle(apiDataDictionary.getTitle()); + Class clzz = apiDataDictionary.getEnumClass(); + if (Objects.isNull(clzz)) { + if (StringUtil.isEmpty(apiDataDictionary.getEnumClassName())) { + throw new RuntimeException(" enum class name can't be null."); + } + clzz = Class.forName(apiDataDictionary.getEnumClassName()); + } + if (!clzz.isEnum()) { + throw new RuntimeException(clzz.getCanonicalName() + " is not an enum class."); + } + List dataDictList = new ArrayList<>(); + Object[] objects = clzz.getEnumConstants(); + String valueMethodName = "get" + StringUtil.firstToUpperCase(apiDataDictionary.getValueField()); + String descMethodName = "get" + StringUtil.firstToUpperCase(apiDataDictionary.getDescField()); + Method valueMethod = clzz.getMethod(valueMethodName); + Method descMethod = clzz.getMethod(descMethodName); + for (Object object : objects) { + Object val = valueMethod.invoke(object); + Object desc = descMethod.invoke(object); + DataDict dataDict = new DataDict(); + dataDict.setDesc(desc.toString()); + dataDict.setValue(val.toString()); + dataDictList.add(dataDict); + } + apiDocDict.setDataDictList(dataDictList); + apiDocDictList.add(apiDocDict); + } + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | ClassNotFoundException e) { + e.fillInStackTrace(); + } + return apiDocDictList; + } } diff --git a/src/main/java/com/power/doc/constants/DocGlobalConstants.java b/src/main/java/com/power/doc/constants/DocGlobalConstants.java index 694e50c..e2ce7ef 100644 --- a/src/main/java/com/power/doc/constants/DocGlobalConstants.java +++ b/src/main/java/com/power/doc/constants/DocGlobalConstants.java @@ -77,6 +77,10 @@ public class DocGlobalConstants { public static final String ERROR_CODE_LIST_EN_TITLE = "Error Code List"; + public static final String DICT_CN_TITLE = "数据字典"; + + public static final String DICT_EN_TITLE = "Data Dictionary"; + public static final String FIELD_SPACE = "     "; public static final String ANY_OBJECT_MSG = "any object."; diff --git a/src/main/java/com/power/doc/constants/TemplateVariable.java b/src/main/java/com/power/doc/constants/TemplateVariable.java index a05f1dd..6ce2bcc 100644 --- a/src/main/java/com/power/doc/constants/TemplateVariable.java +++ b/src/main/java/com/power/doc/constants/TemplateVariable.java @@ -16,6 +16,9 @@ public enum TemplateVariable { ERROR_LIST_TITLE("errorListTitle"), CREATE_TIME("createTime"), PROJECT_NAME("projectName"), + DICT_LIST("dictList"), + DICT_LIST_TITLE("dictListTitle"), + DICT_ORDER("dictListOrder"), VERSION("version"); diff --git a/src/main/resources/template/AllInOne.adoc b/src/main/resources/template/AllInOne.adoc index fc36d03..b6e1943 100644 --- a/src/main/resources/template/AllInOne.adoc +++ b/src/main/resources/template/AllInOne.adoc @@ -98,4 +98,24 @@ for(error in errorCodeList){ |${error.value}|${error.desc} <%}%> |==================== +<%}%> + +<%if(isNotEmpty(dictList)){%> +== ${dictListTitle} +<% +for(dict in dictList){ +%> +=== ${dict.title} + +[width="100%",options="header"] +[stripes=even] +|==================== +|Value |Description +<% +for(dataDict in dict.dataDictList){ +%> +|${dataDict.value}|${dataDict.desc} +<%}%> +|==================== +<%}%> <%}%> \ No newline at end of file diff --git a/src/main/resources/template/AllInOne.btl b/src/main/resources/template/AllInOne.btl index 04be0ed..74c5ba5 100644 --- a/src/main/resources/template/AllInOne.btl +++ b/src/main/resources/template/AllInOne.btl @@ -85,4 +85,21 @@ for(error in errorCodeList){ %> ${error.value}|${error.desc} <%}%> +<%}%> + +<%if(isNotEmpty(dictList)){%> +## ${dictListTitle} +<% +for(dict in dictList){ +%> +### ${dict.title} + +Value |Description +---|--- +<% +for(dataDict in dict.dataDictList){ +%> +${dataDict.value}|${dataDict.desc} +<%}%> +<%}%> <%}%> \ No newline at end of file diff --git a/src/main/resources/template/AllInOne.html b/src/main/resources/template/AllInOne.html index 853e1df..4e05027 100644 --- a/src/main/resources/template/AllInOne.html +++ b/src/main/resources/template/AllInOne.html @@ -1,4 +1,4 @@ -API Reference
<%if(isNotEmpty(revisionLogList)){%>
<%for(revisionLog in revisionLogList){%><%}%>
VersionUpdate TimeStatusAuthorDescription

${revisionLog.version}

${revisionLog.revisionTime}

${revisionLog.status}

${revisionLog.author}

${revisionLog.remarks}

<%}%><%for(api in apiDocList){%>

${api.order}. ${api.desc}

<%for(doc in api.list){%>

${api.order}.${doc.order}. ${doc.desc}

Type: ${doc.type}

Content-Type: ${doc.contentType}

Description: ${doc.detail}

<%if(isNotEmpty(doc.requestHeaders)){%>

Request-headers:

<%for(header in doc.requestHeaders){%><%}%>
HeaderTypeDescriptionRequiredSince

${header.name}

${header.type}

${header.desc}

${header.required}

${header.since}

<%}%><%if(isNotEmpty(doc.requestParams)){%>

Request-parameters:

<%for(param in doc.requestParams){%><%}%>
ParameterTypeDescriptionRequiredSince

${param.field}

${param.type}

${param.desc}

${param.required}

${param.version}

<%}%><%if(isNotEmpty(doc.requestUsage)){%>

Request-example:

${doc.requestUsage}
<%}%><%if(isNotEmpty(doc.responseParams)){%>

Response-fields:

<%for(param in doc.responseParams){%><%}%>
FieldTypeDescriptionSince

${param.field}

${param.type}

${param.desc}

${param.version}

<%}%><%if(isNotEmpty(doc.responseUsage)){%>

Response-example:

${doc.responseUsage}
<%}%>
<%}%>
<%}%><%if(isNotEmpty(errorCodeList)){%>

${apiDocList.~size+1}.${errorListTitle}

<%for(error in errorCodeList){%><%}%>
Error codeDescription

${error.value}

${error.desc}

<%}%>
Generated by smart-doc at ${createTime}Suggestions,contact,support and error reporting on Gitee or Github
+API Reference
<%if(isNotEmpty(revisionLogList)){%>
<%for(revisionLog in revisionLogList){%><%}%>
VersionUpdate TimeStatusAuthorDescription

${revisionLog.version}

${revisionLog.revisionTime}

${revisionLog.status}

${revisionLog.author}

${revisionLog.remarks}

<%}%><%for(api in apiDocList){%>

${api.order}. ${api.desc}

<%for(doc in api.list){%>

${api.order}.${doc.order}. ${doc.desc}

Type: ${doc.type}

Content-Type: ${doc.contentType}

Description: ${doc.detail}

<%if(isNotEmpty(doc.requestHeaders)){%>

Request-headers:

<%for(header in doc.requestHeaders){%><%}%>
HeaderTypeDescriptionRequiredSince

${header.name}

${header.type}

${header.desc}

${header.required}

${header.since}

<%}%><%if(isNotEmpty(doc.requestParams)){%>

Request-parameters:

<%for(param in doc.requestParams){%><%}%>
ParameterTypeDescriptionRequiredSince

${param.field}

${param.type}

${param.desc}

${param.required}

${param.version}

<%}%><%if(isNotEmpty(doc.requestUsage)){%>

Request-example:

${doc.requestUsage}
<%}%><%if(isNotEmpty(doc.responseParams)){%>

Response-fields:

<%for(param in doc.responseParams){%><%}%>
FieldTypeDescriptionSince

${param.field}

${param.type}

${param.desc}

${param.version}

<%}%><%if(isNotEmpty(doc.responseUsage)){%>

Response-example:

${doc.responseUsage}
<%}%>
<%}%>
<%}%><%if(isNotEmpty(errorCodeList)){%>

${apiDocList.~size+1}. ${errorListTitle}

<%for(error in errorCodeList){%><%}%>
Error codeDescription

${error.value}

${error.desc}

<%}%><%if(isNotEmpty(dictList)){%>

${dictListOrder}. ${dictListTitle}

<% for(dict in dictList){ %>

${dictListOrder}.${dict.order}. ${dict.title}

<%for(dataDict in dict.dataDictList){%><%}%>
ValueDescription

${dataDict.value}

${dataDict.desc}

<%}%>
<%}%>
Generated by smart-doc at ${createTime}Suggestions,contact,support and error reporting on Gitee or Github