Example usage for com.google.gwt.core.ext.typeinfo JType isGenericType

List of usage examples for com.google.gwt.core.ext.typeinfo JType isGenericType

Introduction

In this page you can find the example usage for com.google.gwt.core.ext.typeinfo JType isGenericType.

Prototype

JGenericType isGenericType();

Source Link

Usage

From source file:com.github.nmorel.gwtjackson.rebind.AbstractCreator.java

License:Apache License

/**
 * Build a {@link JSerializerType} that instantiate a {@link JsonSerializer} for the given type. If the type is a bean,
 * the implementation of {@link AbstractBeanJsonSerializer} will be created.
 *
 * @param type type//w w  w  . j  a v  a2s.c  om
 * @param subtype true if the serializer is for a subtype
 *
 * @return the {@link JSerializerType}. Examples:
 * <ul>
 * <li>ctx.getIntegerSerializer()</li>
 * <li>new org.PersonBeanJsonSerializer()</li>
 * </ul>
 */
protected final JSerializerType getJsonSerializerFromType(JType type, boolean subtype)
        throws UnableToCompleteException, UnsupportedTypeException {

    JSerializerType.Builder builder = new JSerializerType.Builder().type(type);
    if (null != type.isWildcard()) {
        // For wildcard type, we use the base type to find the serializer.
        type = type.isWildcard().getBaseType();
    }

    if (null != type.isRawType()) {
        // For raw type, we use the base type to find the serializer.
        type = type.isRawType().getBaseType();
    }

    JTypeParameter typeParameter = type.isTypeParameter();
    if (null != typeParameter) {
        // It's a type parameter like T in 'MyClass<T>'
        if (!subtype || typeParameter.getDeclaringClass() == getMapperInfo().get().getType()) {
            // The serializer is created for the main type so we use the serializer field declared for this type.
            return builder.instance(CodeBlock.builder()
                    .add(String.format(TYPE_PARAMETER_SERIALIZER_FIELD_NAME, typeParameter.getOrdinal()))
                    .add(".json()").build()).build();
        } else {
            // There is no declared serializer so we use the base type to find a serializer.
            type = typeParameter.getBaseType();
        }
    }

    Optional<MapperInstance> configuredSerializer = configuration.getSerializer(type);
    if (configuredSerializer.isPresent()) {
        // The type is configured in AbstractConfiguration.
        if (null != type.isParameterized() || null != type.isGenericType()) {
            JClassType[] typeArgs;
            if (null != type.isGenericType()) {
                typeArgs = type.isGenericType().asParameterizedByWildcards().getTypeArgs();
            } else {
                typeArgs = type.isParameterized().getTypeArgs();
            }

            ImmutableList.Builder<JSerializerType> parametersSerializerBuilder = ImmutableList.builder();
            for (int i = 0; i < typeArgs.length; i++) {
                JSerializerType parameterSerializerType;
                if (configuredSerializer.get().getParameters().length <= i) {
                    break;
                }
                if (MapperType.KEY_SERIALIZER == configuredSerializer.get().getParameters()[i]) {
                    parameterSerializerType = getKeySerializerFromType(typeArgs[i]);
                } else {
                    parameterSerializerType = getJsonSerializerFromType(typeArgs[i], subtype);
                }
                parametersSerializerBuilder.add(parameterSerializerType);
            }
            ImmutableList<JSerializerType> parametersSerializer = parametersSerializerBuilder.build();
            builder.parameters(parametersSerializer);
            builder.instance(
                    methodCallCodeWithJMapperTypeParameters(configuredSerializer.get(), parametersSerializer));

        } else {
            // The serializer has no parameters.
            builder.instance(methodCallCode(configuredSerializer.get()));
        }
        return builder.build();
    }

    if (typeOracle.isJavaScriptObject(type)) {
        // It's a JSO and the user didn't give a custom serializer. We use the default one.
        configuredSerializer = configuration.getSerializer(typeOracle.getJavaScriptObject());
        return builder.instance(methodCallCode(configuredSerializer.get())).build();
    }

    if (typeOracle.isEnum(type) || typeOracle.isEnumSupertype(type)) {
        configuredSerializer = configuration.getSerializer(typeOracle.getEnum());
        return builder.instance(methodCallCode(configuredSerializer.get())).build();
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        Class arraySerializer;
        if (arrayType.getRank() == 1) {
            // One dimension array
            arraySerializer = ArrayJsonSerializer.class;
        } else if (arrayType.getRank() == 2) {
            // Two dimension array
            arraySerializer = Array2dJsonSerializer.class;
        } else if (arrayType.getRank() == 3) {
            // Three dimension array
            arraySerializer = Array3dJsonSerializer.class;
        } else {
            // More dimensions are not supported
            String message = "Arrays with 4 or more dimensions are not supported";
            logger.log(TreeLogger.Type.WARN, message);
            throw new UnsupportedTypeException(message);
        }
        JSerializerType parameterSerializerType = getJsonSerializerFromType(arrayType.getLeafType(), subtype);
        builder.parameters(ImmutableList.of(parameterSerializerType));
        builder.instance(CodeBlock.builder()
                .add("$T.newInstance($L)", arraySerializer, parameterSerializerType.getInstance()).build());
        return builder.build();
    }

    if (null != type.isAnnotation()) {
        String message = "Annotations are not supported";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    JClassType classType = type.isClassOrInterface();
    if (null != classType) {
        // The type is a class or interface and has no default serializer. We generate one.
        JClassType baseClassType = classType;
        JParameterizedType parameterizedType = classType.isParameterized();
        if (null != parameterizedType) {
            // It's a bean with generics, we create a serializer based on generic type.
            baseClassType = parameterizedType.getBaseType();
        }

        BeanJsonSerializerCreator beanJsonSerializerCreator = new BeanJsonSerializerCreator(
                logger.branch(Type.DEBUG, "Creating serializer for " + baseClassType.getQualifiedSourceName()),
                context, configuration, typeOracle, baseClassType);
        BeanJsonMapperInfo mapperInfo = beanJsonSerializerCreator.create();

        // Generics and parameterized types serializers have no default constructor. They need serializers for each parameter.
        ImmutableList<? extends JType> typeParameters = getTypeParameters(classType, subtype);
        ImmutableList.Builder<JParameterizedSerializer> parametersSerializerBuilder = ImmutableList.builder();
        ImmutableList.Builder<JSerializerType> parametersJsonSerializerBuilder = ImmutableList.builder();
        for (JType argType : typeParameters) {
            JSerializerType jsonSerializer = getJsonSerializerFromType(argType, subtype);
            parametersSerializerBuilder.add(new JParameterizedSerializer(
                    getKeySerializerFromType(argType, subtype, true), jsonSerializer));
            parametersJsonSerializerBuilder.add(jsonSerializer);
        }

        builder.parameters(parametersJsonSerializerBuilder.build());
        builder.beanMapper(true);
        builder.instance(constructorCallCode(
                ClassName.get(mapperInfo.getPackageName(), mapperInfo.getSimpleSerializerClassName()),
                parametersSerializerBuilder.build()));
        return builder.build();
    }

    String message = "Type '" + type.getQualifiedSourceName() + "' is not supported";
    logger.log(TreeLogger.Type.WARN, message);
    throw new UnsupportedTypeException(message);
}

From source file:com.github.nmorel.gwtjackson.rebind.AbstractCreator.java

License:Apache License

/**
 * Build a {@link JDeserializerType} that instantiate a {@link JsonSerializer} for the given type. If the type is a bean,
 * the implementation of {@link AbstractBeanJsonSerializer} will be created.
 *
 * @param type type//  ww w. ja v  a  2 s.  c om
 * @param subtype true if the deserializer is for a subtype
 *
 * @return the {@link JDeserializerType}. Examples:
 * <ul>
 * <li>ctx.getIntegerDeserializer()</li>
 * <li>new org .PersonBeanJsonDeserializer()</li>
 * </ul>
 */
protected final JDeserializerType getJsonDeserializerFromType(JType type, boolean subtype)
        throws UnableToCompleteException, UnsupportedTypeException {
    JDeserializerType.Builder builder = new JDeserializerType.Builder().type(type);
    if (null != type.isWildcard()) {
        // For wildcard type, we use the base type to find the deserializer.
        type = type.isWildcard().getBaseType();
    }

    if (null != type.isRawType()) {
        // For raw type, we use the base type to find the deserializer.
        type = type.isRawType().getBaseType();
    }

    JTypeParameter typeParameter = type.isTypeParameter();
    if (null != typeParameter) {
        // It's a type parameter like T in 'MyClass<T>'
        if (!subtype || typeParameter.getDeclaringClass() == getMapperInfo().get().getType()) {
            // The deserializer is created for the main type so we use the deserializer field declared for this type.
            return builder.instance(CodeBlock.builder()
                    .add(String.format(TYPE_PARAMETER_DESERIALIZER_FIELD_NAME, typeParameter.getOrdinal()))
                    .add(".json()").build()).build();
        } else {
            // There is no declared deserializer so we use the base type to find a deserializer.
            type = typeParameter.getBaseType();
        }
    }

    if (typeOracle.isEnumSupertype(type)) {
        String message = "Type java.lang.Enum is not supported by deserialization";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    Optional<MapperInstance> configuredDeserializer = configuration.getDeserializer(type);
    if (configuredDeserializer.isPresent()) {
        // The type is configured in AbstractConfiguration.
        if (null != type.isParameterized() || null != type.isGenericType()) {
            JClassType[] typeArgs;
            if (null != type.isGenericType()) {
                typeArgs = type.isGenericType().asParameterizedByWildcards().getTypeArgs();
            } else {
                typeArgs = type.isParameterized().getTypeArgs();
            }

            ImmutableList.Builder<JDeserializerType> parametersDeserializerBuilder = ImmutableList.builder();
            for (int i = 0; i < typeArgs.length; i++) {
                JDeserializerType parameterDeserializerType;
                if (MapperType.KEY_DESERIALIZER == configuredDeserializer.get().getParameters()[i]) {
                    parameterDeserializerType = getKeyDeserializerFromType(typeArgs[i]);
                } else {
                    parameterDeserializerType = getJsonDeserializerFromType(typeArgs[i], subtype);
                }
                parametersDeserializerBuilder.add(parameterDeserializerType);
            }
            ImmutableList<JDeserializerType> parametersDeserializer = parametersDeserializerBuilder.build();
            builder.parameters(parametersDeserializer);
            builder.instance(methodCallCodeWithJMapperTypeParameters(configuredDeserializer.get(),
                    parametersDeserializer));

        } else {
            // The deserializer has no parameters.
            builder.instance(methodCallCode(configuredDeserializer.get()));
        }
        return builder.build();
    }

    if (typeOracle.isJavaScriptObject(type)) {
        // It's a JSO and the user didn't give a custom deserializer. We use the default one.
        configuredDeserializer = configuration.getDeserializer(typeOracle.getJavaScriptObject());
        return builder.instance(methodCallCode(configuredDeserializer.get())).build();
    }

    if (typeOracle.isEnum(type)) {
        configuredDeserializer = configuration.getDeserializer(typeOracle.getEnum());
        return builder
                .instance(
                        methodCallCodeWithClassParameters(configuredDeserializer.get(), ImmutableList.of(type)))
                .build();
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        TypeSpec arrayCreator;
        Class<?> arrayDeserializer;
        JType leafType = arrayType.getLeafType();
        int arrayRank = arrayType.getRank();

        if (arrayRank < 10) {
            arrayCreator = ArrayCreator.build(arrayType, arrayRank, leafType);
            arrayDeserializer = ArrayJsonDeserializer.class;

        } else {
            // More dimensions are not supported
            String message = "Arrays with 4 or more dimensions are not supported";
            logger.log(TreeLogger.Type.WARN, message);
            throw new UnsupportedTypeException(message);
        }

        JDeserializerType parameterDeserializerType = getJsonDeserializerFromType(leafType, subtype);
        builder.parameters(ImmutableList.of(parameterDeserializerType));
        builder.instance(CodeBlock.builder().add("$T.newInstance($L, $L)", arrayDeserializer,
                parameterDeserializerType.getInstance(), arrayCreator).build());
        return builder.build();
    }

    if (null != type.isAnnotation()) {
        String message = "Annotations are not supported";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    JClassType classType = type.isClassOrInterface();
    if (null != classType) {
        // The type is a class or interface and has no default deserializer. We generate one.
        JClassType baseClassType = classType;
        JParameterizedType parameterizedType = classType.isParameterized();
        if (null != parameterizedType) {
            // It's a bean with generics, we create a deserializer based on generic type.
            baseClassType = parameterizedType.getBaseType();
        }

        BeanJsonDeserializerCreator beanJsonDeserializerCreator = new BeanJsonDeserializerCreator(
                logger.branch(Type.DEBUG,
                        "Creating deserializer for " + baseClassType.getQualifiedSourceName()),
                context, configuration, typeOracle, baseClassType);
        BeanJsonMapperInfo mapperInfo = beanJsonDeserializerCreator.create();

        // Generics and parameterized types deserializers have no default constructor. They need deserializers for each parameter.
        ImmutableList<? extends JType> typeParameters = getTypeParameters(classType, subtype);
        ImmutableList.Builder<JParameterizedDeserializer> parametersDeserializerBuilder = ImmutableList
                .builder();
        ImmutableList.Builder<JDeserializerType> parametersJsonDeserializerBuilder = ImmutableList.builder();
        for (JType argType : typeParameters) {
            JDeserializerType jsonDeserializer = getJsonDeserializerFromType(argType, subtype);
            parametersDeserializerBuilder.add(new JParameterizedDeserializer(
                    getKeyDeserializerFromType(argType, subtype, true), jsonDeserializer));
            parametersJsonDeserializerBuilder.add(jsonDeserializer);
        }

        builder.parameters(parametersJsonDeserializerBuilder.build());
        builder.beanMapper(true);
        builder.instance(constructorCallCode(
                ClassName.get(mapperInfo.getPackageName(), mapperInfo.getSimpleDeserializerClassName()),
                parametersDeserializerBuilder.build()));
        return builder.build();
    }

    String message = "Type '" + type.getQualifiedSourceName() + "' is not supported";
    logger.log(TreeLogger.Type.WARN, message);
    throw new UnsupportedTypeException(message);
}

From source file:com.github.nmorel.gwtjackson.rebind.RebindConfiguration.java

License:Apache License

/**
 * Search a static method or constructor to instantiate the mapper and return a {@link String} calling it.
 *//*from  w w w .  j a  va2 s  .  c om*/
private MapperInstance getInstance(JType mappedType, JClassType classType, boolean isSerializers) {
    int nbParam = 0;
    if (null != mappedType.isGenericType() && (!isSerializers || !typeOracle.isEnumSupertype(mappedType))) {
        nbParam = mappedType.isGenericType().getTypeParameters().length;
    }

    // we first look at static method
    for (JMethod method : classType.getMethods()) {
        // method must be public static, return the instance type and take no parameters
        if (method.isStatic() && null != method.getReturnType().isClassOrInterface()
                && classType.isAssignableTo(method.getReturnType().isClassOrInterface())
                && method.getParameters().length == nbParam && method.isPublic()) {
            MapperType[] parameters = getParameters(mappedType, method, isSerializers);
            if (null == parameters) {
                continue;
            }

            return new MapperInstance(classType, method, parameters);
        }
    }

    // then we search the default constructor
    for (JConstructor constructor : classType.getConstructors()) {
        if (constructor.isPublic() && constructor.getParameters().length == nbParam) {
            MapperType[] parameters = getParameters(mappedType, constructor, isSerializers);
            if (null == parameters) {
                continue;
            }

            return new MapperInstance(classType, constructor, parameters);
        }
    }

    logger.log(Type.WARN, "Cannot instantiate the custom serializer/deserializer "
            + classType.getQualifiedSourceName() + ". It will be ignored");
    return null;
}

From source file:org.jboss.errai.ioc.rebind.ioc.codegen.meta.impl.gwt.GWTUtil.java

License:Apache License

public static MetaType fromType(JType t) {
    if (t.isClassOrInterface() != null) {
        return MetaClassFactory.get(t.isClassOrInterface());
    } else if (t.isTypeParameter() != null) {
        return new GWTTypeVariable(t.isTypeParameter());
    } else if (t.isGenericType() != null) {
        if (t.isArray() != null) {
            return new GWTGenericArrayType(t.isGenericType());
        } else {//from w  w w .j a v a  2  s.c  o  m
            return new GWTGenericDeclaration(t.isGenericType());
        }
    } else if (t.isParameterized() != null) {
        return new GWTParameterizedType(t.isParameterized());
    } else if (t.isWildcard() != null) {
        return new GWTWildcardType(t.isWildcard());
    } else {
        return null;
    }
}

From source file:org.pentaho.ui.xul.gwt.generators.TypeControllerGenerator.java

License:Open Source License

private String getTypeName(JType type) {
    String sType = "";

    if (type.isArray() != null) {
        sType = type.isArray().getQualifiedSourceName();
        if (sType.contains("extends")) {
            sType = sType.substring(sType.indexOf("extends") + 7).trim();
        }//from   w ww . ja v  a  2s  .c  o  m
        if (sType.contains("[]") == false) {
            sType += "[]";
        }

    } else if (type.isGenericType() != null || type.getQualifiedSourceName().contains("extends")) {
        if (type.isGenericType() != null && type.getQualifiedSourceName().contains("extends")) {
            sType = type.isGenericType().getQualifiedSourceName();
        } else {
            sType = "Object";
        }
    } else if (type.isPrimitive() != null) {
        JPrimitiveType primative = type.isPrimitive();
        sType = primative.getQualifiedBoxedSourceName();
    } else {
        sType = type.getQualifiedSourceName();
    }
    return sType;
}