Search in sources :

Example 11 with TypeDefinition

use of org.apache.dubbo.metadata.definition.model.TypeDefinition in project dubbo by alibaba.

the class MapTypeDefinitionBuilderTest method buildAndAssertTypeDefinition.

static void buildAndAssertTypeDefinition(ProcessingEnvironment processingEnv, VariableElement field, String expectedType, String keyType, String valueType, TypeDefinitionBuilder builder, BiConsumer<TypeDefinition, TypeDefinition>... assertions) {
    TypeDefinition typeDefinition = TypeDefinitionBuilder.build(processingEnv, field);
    TypeDefinition keyTypeDefinition = typeDefinition.getItems().get(0);
    TypeDefinition valueTypeDefinition = typeDefinition.getItems().get(1);
    assertEquals(expectedType, typeDefinition.getType());
    // assertEquals(field.getSimpleName().toString(), typeDefinition.get$ref());
    assertEquals(keyType, keyTypeDefinition.getType());
    assertEquals(valueType, valueTypeDefinition.getType());
    // assertEquals(builder.getClass().getName(), typeDefinition.getTypeBuilderName());
    Stream.of(assertions).forEach(assertion -> assertion.accept(typeDefinition, keyTypeDefinition));
}
Also used : TypeDefinition(org.apache.dubbo.metadata.definition.model.TypeDefinition)

Example 12 with TypeDefinition

use of org.apache.dubbo.metadata.definition.model.TypeDefinition in project dubbo by alibaba.

the class ArrayTypeDefinitionBuilderTest method buildAndAssertTypeDefinition.

static void buildAndAssertTypeDefinition(ProcessingEnvironment processingEnv, VariableElement field, String expectedType, String compositeType, TypeDefinitionBuilder builder, BiConsumer<TypeDefinition, TypeDefinition>... assertions) {
    TypeDefinition typeDefinition = TypeDefinitionBuilder.build(processingEnv, field);
    TypeDefinition subTypeDefinition = typeDefinition.getItems().get(0);
    assertEquals(expectedType, typeDefinition.getType());
    // assertEquals(field.getSimpleName().toString(), typeDefinition.get$ref());
    assertEquals(compositeType, subTypeDefinition.getType());
    // assertEquals(builder.getClass().getName(), typeDefinition.getTypeBuilderName());
    Stream.of(assertions).forEach(assertion -> assertion.accept(typeDefinition, subTypeDefinition));
}
Also used : TypeDefinition(org.apache.dubbo.metadata.definition.model.TypeDefinition)

Example 13 with TypeDefinition

use of org.apache.dubbo.metadata.definition.model.TypeDefinition in project dubbo by alibaba.

the class DefaultTypeBuilder method build.

public static TypeDefinition build(Class<?> clazz, Map<Class<?>, TypeDefinition> typeCache) {
    // final String canonicalName = clazz.getCanonicalName();
    final String name = clazz.getName();
    TypeDefinition td = new TypeDefinition(name);
    // Try to get a cached definition
    if (typeCache.containsKey(clazz)) {
        return typeCache.get(clazz);
    }
    // Primitive type
    if (!JaketConfigurationUtils.needAnalyzing(clazz)) {
        return td;
    }
    // Custom type
    TypeDefinition ref = new TypeDefinition(name);
    ref.set$ref(name);
    typeCache.put(clazz, ref);
    if (!clazz.isPrimitive() && !isSimpleType(clazz)) {
        List<Field> fields = ClassUtils.getNonStaticFields(clazz);
        for (Field field : fields) {
            String fieldName = field.getName();
            Class<?> fieldClass = field.getType();
            Type fieldType = field.getGenericType();
            TypeDefinition fieldTd = TypeDefinitionBuilder.build(fieldType, fieldClass, typeCache);
            td.getProperties().put(fieldName, fieldTd);
        }
    }
    typeCache.put(clazz, td);
    return td;
}
Also used : Field(java.lang.reflect.Field) ClassUtils.isSimpleType(org.apache.dubbo.common.utils.ClassUtils.isSimpleType) Type(java.lang.reflect.Type) TypeDefinition(org.apache.dubbo.metadata.definition.model.TypeDefinition)

Example 14 with TypeDefinition

use of org.apache.dubbo.metadata.definition.model.TypeDefinition in project dubbo by alibaba.

the class MapTypeBuilder method build.

@Override
public TypeDefinition build(Type type, Class<?> clazz, Map<Class<?>, TypeDefinition> typeCache) {
    if (!(type instanceof ParameterizedType)) {
        return new TypeDefinition(clazz.getName());
    }
    ParameterizedType parameterizedType = (ParameterizedType) type;
    Type[] actualTypeArgs = parameterizedType.getActualTypeArguments();
    int actualTypeArgsLength = actualTypeArgs == null ? 0 : actualTypeArgs.length;
    if (actualTypeArgsLength != 2) {
        throw new IllegalArgumentException(MessageFormat.format("[ServiceDefinitionBuilder] Map type [{0}] with unexpected amount of arguments [{1}]." + Arrays.toString(actualTypeArgs), type, actualTypeArgs));
    }
    String mapType = type.toString();
    TypeDefinition typeDefinition = new TypeDefinition(mapType);
    for (int i = 0; i < actualTypeArgsLength; i++) {
        Type actualType = actualTypeArgs[i];
        TypeDefinition item = null;
        Class<?> rawType = getRawClass(actualType);
        if (isParameterizedType(actualType)) {
            // Nested collection or map.
            item = TypeDefinitionBuilder.build(actualType, rawType, typeCache);
        } else if (isClass(actualType)) {
            item = TypeDefinitionBuilder.build(null, rawType, typeCache);
        }
        typeDefinition.getItems().add(item);
    }
    return typeDefinition;
}
Also used : ParameterizedType(java.lang.reflect.ParameterizedType) TypeUtils.isParameterizedType(org.apache.dubbo.common.utils.TypeUtils.isParameterizedType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) TypeUtils.isParameterizedType(org.apache.dubbo.common.utils.TypeUtils.isParameterizedType) TypeDefinition(org.apache.dubbo.metadata.definition.model.TypeDefinition)

Example 15 with TypeDefinition

use of org.apache.dubbo.metadata.definition.model.TypeDefinition in project dubbo by alibaba.

the class MethodDefinitionBuilder method build.

/**
 * Build the instance of {@link MethodDefinition}
 *
 * @param method {@link Method}
 * @return non-null
 */
public MethodDefinition build(Method method) {
    MethodDefinition md = new MethodDefinition();
    md.setName(method.getName());
    // Process the parameters
    Class<?>[] paramTypes = method.getParameterTypes();
    Type[] genericParamTypes = method.getGenericParameterTypes();
    int paramSize = paramTypes.length;
    String[] parameterTypes = new String[paramSize];
    List<TypeDefinition> parameters = new ArrayList<>(paramSize);
    for (int i = 0; i < paramSize; i++) {
        TypeDefinition parameter = builder.build(genericParamTypes[i], paramTypes[i]);
        parameterTypes[i] = parameter.getType();
        parameters.add(parameter);
    }
    md.setParameterTypes(parameterTypes);
    md.setParameters(parameters);
    // Process return type.
    TypeDefinition td = builder.build(method.getGenericReturnType(), method.getReturnType());
    md.setReturnType(td.getType());
    return md;
}
Also used : Type(java.lang.reflect.Type) MethodDefinition(org.apache.dubbo.metadata.definition.model.MethodDefinition) ArrayList(java.util.ArrayList) TypeDefinition(org.apache.dubbo.metadata.definition.model.TypeDefinition)

Aggregations

TypeDefinition (org.apache.dubbo.metadata.definition.model.TypeDefinition)24 Type (java.lang.reflect.Type)7 Test (org.junit.jupiter.api.Test)6 MethodDefinition (org.apache.dubbo.metadata.definition.model.MethodDefinition)5 ServiceDefinition (org.apache.dubbo.metadata.definition.model.ServiceDefinition)5 Gson (com.google.gson.Gson)4 Method (java.lang.reflect.Method)4 TestService (org.apache.dubbo.metadata.definition.common.TestService)4 HashMap (java.util.HashMap)3 ParameterizedType (java.lang.reflect.ParameterizedType)2 ArrayList (java.util.ArrayList)2 DefaultTypeBuilder (org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder)2 MapTypeBuilder (org.apache.dubbo.metadata.definition.builder.MapTypeBuilder)2 ByteString (com.google.protobuf.ByteString)1 GeneratedMessageV3 (com.google.protobuf.GeneratedMessageV3)1 ProtocolStringList (com.google.protobuf.ProtocolStringList)1 Annotation (java.lang.annotation.Annotation)1 Field (java.lang.reflect.Field)1 List (java.util.List)1 Map (java.util.Map)1