diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/AbstractRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/AbstractRequestClassExporter.kt index 6966b05f..880f517d 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/AbstractRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/AbstractRequestClassExporter.kt @@ -171,7 +171,7 @@ abstract class AbstractRequestClassExporter : ClassExporter, Worker { processResponse(method, request) - processCompleted(method, request) + processCompleted(method, kv, request) docHandle(request) } @@ -192,7 +192,7 @@ abstract class AbstractRequestClassExporter : ClassExporter, Worker { return ruleComputer!!.computer(ClassExportRuleKeys.PARAM_DEFAULT_VALUE, param) } - protected open fun processCompleted(method: ExplicitMethod, request: Request) { + protected open fun processCompleted(method: ExplicitMethod, kv: KV, request: Request) { //parse additionalHeader by config val additionalHeader = ruleComputer!!.computer(ClassExportRuleKeys.METHOD_ADDITIONAL_HEADER, method) diff --git a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/SpringRequestClassExporter.kt b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/SpringRequestClassExporter.kt index 066e11b6..66fd3d9e 100644 --- a/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/SpringRequestClassExporter.kt +++ b/idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/SpringRequestClassExporter.kt @@ -8,12 +8,9 @@ import com.intellij.psi.PsiParameter import com.itangcent.common.constant.HttpMethod import com.itangcent.common.model.Header import com.itangcent.common.model.Request -import com.itangcent.common.utils.KV -import com.itangcent.common.utils.any -import com.itangcent.common.utils.isNullOrEmpty -import com.itangcent.common.utils.tinyString -import com.itangcent.intellij.config.rule.computer +import com.itangcent.common.utils.* import com.itangcent.idea.plugin.utils.SpringClassName +import com.itangcent.intellij.config.rule.computer import com.itangcent.intellij.jvm.AnnotationHelper import com.itangcent.intellij.jvm.element.ExplicitMethod import com.itangcent.intellij.jvm.element.ExplicitParameter @@ -188,6 +185,7 @@ open class SpringRequestClassExporter : AbstractRequestClassExporter() { val basePath: String? = kv.getAs("basePath") val ctrlHttpMethod: String? = kv.getAs("ctrlHttpMethod") val requestMapping = findRequestMappingInAnn(method.psi()) + kv["requestMapping"] = requestMapping var httpMethod = findHttpMethod(requestMapping) if (httpMethod == HttpMethod.NO_METHOD && ctrlHttpMethod != HttpMethod.NO_METHOD) { httpMethod = ctrlHttpMethod!! @@ -198,6 +196,11 @@ open class SpringRequestClassExporter : AbstractRequestClassExporter() { requestHelper!!.setPath(request, httpPath) } + override fun processCompleted(method: ExplicitMethod, kv: KV, request: Request) { + val requestMapping: Pair, String>? = kv.getAs("requestMapping") + requestMapping?.let { resolveParamInRequestMapping(request, it) } + } + //region process spring annotation------------------------------------------------------------------- private fun findHttpPath(requestMappingAnn: Pair, String>?): String? { @@ -209,6 +212,57 @@ open class SpringRequestClassExporter : AbstractRequestClassExporter() { } } + protected open fun resolveParamInRequestMapping(request: Request, requestMappingAnn: Pair, String>) { + val params = requestMappingAnn.first["params"] ?: return + if (params is Array<*>) { + params.map { it.tinyString() } + .filter { it.notNullOrEmpty() } + .forEach { resolveParamStr(request, it!!) } + } else { + params.tinyString() + ?.takeIf { it.notNullOrEmpty() } + ?.let { resolveParamStr(request, it) } + } + } + + protected open fun resolveParamStr(request: Request, params: String) { + when { + params.startsWith("!") -> { + requestHelper!!.appendDesc(request, "parameter [${params.removeSuffix("!")}] should not be present") + } + params.contains("!=") -> { + val name = params.substringBefore("!=").trim() + val value = params.substringAfter("!=").trim() + val param = request.querys?.find { it.name == name } + if (param == null) { + requestHelper!!.appendDesc(request, "parameter [$name] " + + "should not equal to [$value]") + } else { + param.desc = param.desc.append("should not equal to [$value]", "\n") + } + } + !params.contains('=') -> { + val param = request.querys?.find { it.name == params } + if (param == null) { + requestHelper!!.addParam(request, params, null, true, null) + } else { + param.required = true + } + } + else -> { + val name = params.substringBefore("=").trim() + val value = params.substringAfter("=").trim() + val param = request.querys?.find { it.name == name } + if (param == null) { + requestHelper!!.addParam(request, name, value, true, null) + } else { + param.required = true + param.value = value + } + } + } + } + private fun findHttpMethod(requestMappingAnn: Pair, String>?): String { if (requestMappingAnn != null) { when { @@ -290,6 +344,6 @@ open class SpringRequestClassExporter : AbstractRequestClassExporter() { } } - //endregion process spring annotation------------------------------------------------------------------- +//endregion process spring annotation------------------------------------------------------------------- }