Skip to content

Commit

Permalink
api模型中responseMessage支持泛型定义
Browse files Browse the repository at this point in the history
  • Loading branch information
entropy-cloud committed Dec 9, 2023
1 parent 5c82073 commit 573ac2e
Show file tree
Hide file tree
Showing 15 changed files with 136 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.nop.api.core.beans.std;

import com.fasterxml.jackson.annotation.JsonInclude;
import io.nop.api.core.annotations.data.DataBean;

@DataBean
public class StdIdRequestBean {
private String id;
private Boolean allowEmpty;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

@JsonInclude(JsonInclude.Include.NON_NULL)
public Boolean getAllowEmpty() {
return allowEmpty;
}

public void setAllowEmpty(Boolean allowEmpty) {
this.allowEmpty = allowEmpty;
}
}
4 changes: 2 additions & 2 deletions nop-codegen/src/main/resources/_vfs/nop/codegen/xlib/gen.xlib
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,9 @@
<source><![CDATA[
let types = new Set();
serviceModel.methods.forEach(method=>{
if(method.requestMessage != method.simpleRequestMessage)
if(method.requestMessage != method.simpleRequestMessage && !method.voidRequest)
types.add(method.requestMessage);
if(method.responseMessage != method.simpleResponseMessage)
if(!method.responseMessage.javaDefaultImportType && method.responseMessage.toString() != method.simpleResponseMessage)
types.add(method.responseMessage);
});
return types;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<when test="${method.tagSet?.contains('sync')}"><![CDATA[
@${method.mutation?'BizMutation':'BizQuery'}
@Override
public ${method.simpleResponseMessage} ${method.name}(@RequestBean ${method.simpleRequestMessage} request,
public ${method.simpleResponseMessage} ${method.name}(${method.voidRequest ? '': '@RequestBean '+method.simpleRequestMessage + ‘ request,’}
FieldSelectionBean selection, IServiceContext ctx){
${method.simpleResponseMessage != 'void' ? 'return null;': ''}
}
Expand All @@ -33,7 +33,7 @@
@${method.mutation?'BizMutation':'BizQuery'}
@Override
public CompletionStage<${method.simpleResponseMessage == 'void' ? 'Void' : method.simpleResponseMessage}> ${method.name}Async(
@RequestBean ${method.simpleRequestMessage} request, FieldSelectionBean selection, IServiceContext ctx){
${method.voidRequest ? '': '@RequestBean '+method.simpleRequestMessage + ‘ request,’}, FieldSelectionBean selection, IServiceContext ctx){
return FutureHelper.success(null);
}
]]></otherwise>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@
/**
* ${method.displayName} ${method.description}
*/
${method.simpleResponseMessage} ${method.name}(${method.simpleRequestMessage} request,
${method.simpleResponseMessage} ${method.name}(${method.voidRequest ? '': method.simpleRequestMessage + ' request,'}
FieldSelectionBean selection, IServiceContext ctx);
]]></when>
<otherwise><![CDATA[
/**
* ${method.displayName} ${method.description}
*/
CompletionStage<${normalizeReturnType(method.simpleResponseMessage)}> ${method.name}Async(${method.simpleRequestMessage} request,
CompletionStage<${normalizeReturnType(method.simpleResponseMessage)}> ${method.name}Async(${method.voidRequest ? '': method.simpleRequestMessage + ' request,'}
FieldSelectionBean selection, IServiceContext ctx);
]]></otherwise>
</c:choose>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<c:for var="method" items="${serviceModel.methods}">
<c:unit xpl:is="${method.mutation?'mutation':'query'}" displayName="${method.displayName}"
x:abstract="${method.tagSet?.contains('biz') ? null: true}">
<arg name="request" kind="RequestBean" type="${method.requestMessage}"/>
<arg name="request" kind="RequestBean" type="${method.requestMessage}" xpl:if="!method.voidRequest"/>
<source xpl:if="method['ext:source']">
${raw(method['ext:source'].xml())}
</source>
Expand Down
43 changes: 41 additions & 2 deletions nop-commons/src/main/java/io/nop/commons/util/StringHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,36 @@
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Deque;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.regex.Pattern;

import static io.nop.commons.CommonConfigs.CFG_UTILS_STRING_MAX_PAD_LEN;
import static io.nop.commons.CommonConfigs.CFG_UTILS_STRING_MAX_REPEAT_LEN;
import static io.nop.commons.CommonErrors.*;
import static io.nop.commons.CommonErrors.ARG_LENGTH;
import static io.nop.commons.CommonErrors.ARG_PARAM_NAME;
import static io.nop.commons.CommonErrors.ARG_QUERY;
import static io.nop.commons.CommonErrors.ARG_STR;
import static io.nop.commons.CommonErrors.ERR_TEXT_ILLEGAL_HEX_STRING;
import static io.nop.commons.CommonErrors.ERR_TEXT_INVALID_UNICODE;
import static io.nop.commons.CommonErrors.ERR_TEXT_INVALID_UUID_RANGE;
import static io.nop.commons.CommonErrors.ERR_UTILS_DUPLICATE_PARAM_NAME_IS_NOT_ALLOWED_IN_SIMPLE_QUERY;
import static io.nop.commons.CommonErrors.ERR_UTILS_INVALID_QUOTED_STRING;

/**
* 所有关于String的常用帮助函数。为方便在EL表达式中调用,所有参数都允许为null。 为了与EL表达式集成,第一个参数一般情况下应该是String或者CharSequence类型。
Expand Down Expand Up @@ -3740,6 +3762,23 @@ public static String normalizeClassName(String className, String packageName, bo
return packageName + '.' + className;
}

@Deterministic
public static boolean isJavaDefaultImportType(String typeName) {
if (isEmpty(typeName))
return false;

StdDataType type = StdDataType.fromJavaClassName(typeName);
if (type != null) {
// native type, such as int , float
if (Character.isLowerCase(typeName.charAt(0)))
return true;
}
if (typeName.startsWith("java.lang.") && countChar(typeName, '.') == 2) {
return true;
}
return false;
}

@Deterministic
public static String classNameToPath(String className) {
if (className == null)
Expand Down
19 changes: 19 additions & 0 deletions nop-core/src/main/java/io/nop/core/type/IGenericType.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@
import io.nop.commons.type.StdDataType;
import io.nop.commons.util.ClassHelper;
import io.nop.commons.util.StringHelper;
import io.nop.core.type.impl.GenericRawTypeReferenceImpl;
import io.nop.core.type.utils.GenericTypeHelper;

import java.io.Serializable;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;

import static io.nop.core.CoreErrors.ARG_TYPE_NAME;
import static io.nop.core.CoreErrors.ERR_TYPE_NOT_ARRAY_OR_LIST_TYPE;
Expand All @@ -39,6 +42,12 @@ public interface IGenericType extends Serializable, Type {
*/
String getTypeName();

default boolean isJavaDefaultImportType() {
if (!isResolved())
return false;
return StringHelper.isJavaDefaultImportType(getRawTypeName());
}

/**
* 不包含泛型参数的类型名
*/
Expand Down Expand Up @@ -217,6 +226,16 @@ default IGenericType refine(ITypeScope resolver) {
return this;
}

default void resolveClassName(Function<String, String> resolver) {
resolve(typeName -> {
String resolvedName = resolver.apply(typeName);
if (resolvedName == null || Objects.equals(resolvedName, typeName)) {
return null;
}
return new GenericRawTypeReferenceImpl(resolvedName);
});
}

/**
* 当前类型如果含有泛型变量,则从contextType中查找对应泛型变量的具体值,并替换本类中的泛型变量。
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,12 @@ public GenericTypeKind getKind() {
}

public String getTypeName() {
if (typeName == null)
typeName = GenericTypeHelper.buildParameterizedTypeName(rawType, typeParameters);
if (typeName == null) {
String buildName = GenericTypeHelper.buildParameterizedTypeName(rawType, typeParameters);
if (isResolved())
this.typeName = buildName;
return buildName;
}
return typeName;
}

Expand Down Expand Up @@ -141,7 +145,7 @@ public IGenericType getFuncReturnType() {
}

@Override
public boolean isCollectionLike(){
public boolean isCollectionLike() {
return rawType.isCollectionLike();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
import io.nop.core.type.IRawTypeReference;
import io.nop.core.type.IRawTypeResolver;

import static io.nop.core.CoreErrors.ARG_CLASS_NAME;
import static io.nop.core.CoreErrors.ARG_TYPE_NAME;
import static io.nop.core.CoreErrors.ERR_TYPE_MULTIPLE_RAW_TYPE_HAS_SAME_NAME;
import static io.nop.core.CoreErrors.ERR_TYPE_REFERENCE_NOT_RESOLVED;

public class GenericRawTypeReferenceImpl extends AbstractGenericType implements IRawTypeReference {
Expand All @@ -33,10 +31,14 @@ public GenericTypeKind getKind() {

@Override
public String getRawTypeName() {
if (rawType != null)
return rawType.getRawTypeName();
return typeName;
}

public String getClassName() {
if (rawType != null)
return rawType.getClassName();
return typeName;
}

Expand All @@ -55,7 +57,7 @@ public IGenericType getGenericType(Class clazz) {
}

public boolean isResolved() {
return rawType != null;
return rawType != null && rawType.isResolved();
}

public Class<?> getRawClass() {
Expand All @@ -68,14 +70,14 @@ public void resolve(IRawTypeResolver resolver) {
if (this.rawType == null) {
this.rawType = resolver.resolveRawType(typeName);
} else {
IGenericType resolved = resolver.resolveRawType(typeName);
if (resolved != null && resolved != rawType)
throw new NopException(ERR_TYPE_MULTIPLE_RAW_TYPE_HAS_SAME_NAME).param(ARG_CLASS_NAME, typeName);
rawType.resolve(resolver);
}
}

@Override
public String getTypeName() {
if (rawType != null)
return rawType.getTypeName();
return typeName;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,11 @@ public void testRefine() {
IGenericType dataType = propType.refine(beanModel.getType(), beanType);
assertEquals(GraphQLRequestBean.class, dataType.getRawClass());
}

@Test
public void testResolveClass() {
IGenericType type = new GenericTypeParser().parseFromText(null, "List<MyBean>");
type.resolveClassName(typeName -> "my." + typeName);
assertEquals("java.util.List<my.MyBean>", type.toString());
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?>

<imp x:schema="/nop/schema/excel/imp.xdef" xmlns:x="/nop/schema/xdsl.xdef"
templatePath="template.api.xlsx"
xdef="/nop/schema/api.xdef">
templatePath="template.api.xlsx" xmlns:c="c" xmlns:xpt="xpt"
xdef="/nop/schema/api.xdef">

<sheets>
<sheet name="目录" ignore="true"/>
Expand Down Expand Up @@ -168,11 +168,10 @@
const beanPackage = rootRecord['ext:apiPackageName']+'.beans';
record.requestMessage = record.requestMessage.$normalizeClassName(
beanPackage,false)
record.responseMessage = record.responseMessage.$normalizeClassName(
beanPackage,true)
record.simpleRequestMessage = record.requestMessage.$simplifyJavaType(beanPackage);
record.simpleResponseMessage = record.responseMessage.$simplifyJavaType(beanPackage);
record.responseMessage.resolveClassName(typeName=> typeName.$normalizeClassName(beanPackage,true));
record.simpleRequestMessage = record.requestMessage.toString().$simplifyJavaType(beanPackage);
record.simpleResponseMessage = record.responseMessage.toString().$simplifyJavaType(beanPackage);
record.voidRequest = record.simpleRequestMessage == 'Void'
]]></c:script>
</normalizeFieldsExpr>

Expand Down Expand Up @@ -203,7 +202,7 @@
</field>

<field name="responseMessage" displayName="响应消息" mandatory="true">
<schema stdDomain="class-name"/>
<schema stdDomain="generic-type"/>
</field>

<field name="description" displayName="描述">
Expand All @@ -215,14 +214,15 @@
</field>

<field name="ext:source" displayName="实现代码">
<schema stdDomain="xml" />
<schema stdDomain="xml"/>
</field>
</fields>
</field>
</fields>
</sheet>

<sheet name="消息定义" namePattern=".*" field="messages" multiple="true" keyProp="name" sheetNameProp="name">
<sheet name="消息定义" namePattern=".*" field="messages" multiple="true" keyProp="name" sheetNameProp="name">

<fields>
<field name="name" displayName="对象名">
<schema stdDomain="class-name"/>
Expand All @@ -249,6 +249,13 @@
</field>

<field name="fields" displayName="字段列表" list="true" keyProp="name">
<normalizeFieldsExpr>
<c:script><![CDATA[
const beanPackage = rootRecord['ext:apiPackageName']+'.beans';
record.schema.type.resolveClassName(typeName=> typeName.$normalizeClassName(beanPackage,true));
]]></c:script>
</normalizeFieldsExpr>

<fields>
<field name="mandatory" displayName="非空" xpt:formatExpr="cell.value ? 'M': ''">
<schema stdDomain="boolean"/>
Expand All @@ -271,7 +278,7 @@

<field name="i18n-en:displayName" displayName="英文名"/>

<field name="schema.domain" displayName="数据域" >
<field name="schema.domain" displayName="数据域">
<schema stdDomain="xml-name"/>
</field>
<field name="schema.type" displayName="类型" mandatory="true">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static void main(String[] args) {
XCodeGenerator.runPostcompile(new File(projectDir, "../nop-rule-codegen"), "/", false);
XCodeGenerator.runPrecompile(new File(projectDir, "../nop-rule-meta"), "/", false);
XCodeGenerator.runPostcompile(new File(projectDir, "../nop-rule-meta"), "/", false);
XCodeGenerator.runPostcompile(new File(projectDir, "../nop-rule-meta"), "/", false);
XCodeGenerator.runPrecompile(projectDir, "/", false);
} finally {
CoreInitialization.destroy();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

import io.nop.wf.api.beans.WfActionRequestBean;

import java.lang.Object;

import io.nop.wf.api.beans.WfCommandRequestBean;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@

import io.nop.wf.api.beans.WfActionRequestBean;

import java.lang.Object;

import io.nop.wf.api.beans.WfCommandRequestBean;


Expand Down
2 changes: 1 addition & 1 deletion nop-xdefs/src/main/resources/_vfs/nop/schema/api.xdef
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<method name="!var-name" displayName="string" tagSet="word-set" xdef:unique-attr="name">
<description xdef:value="string"/>
<requestMessage xdef:value="class-name"/>
<responseMessage xdef:value="class-name"/>
<responseMessage xdef:value="!generic-type"/>
</method>

</service>
Expand Down

0 comments on commit 573ac2e

Please sign in to comment.