Example usage for com.google.gwt.core.ext.typeinfo JArrayType getRank

List of usage examples for com.google.gwt.core.ext.typeinfo JArrayType getRank

Introduction

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

Prototype

int getRank();

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/*from w  w  w. j a va 2s. c  o m*/
 * @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/*from  w  ww  .  jav a  2s  .  c o m*/
 * @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.totsp.gwt.freezedry.rebind.SerializableTypeOracleBuilder.java

License:Apache License

/**
 * The component type of an array must be serializable.
 *///w  w  w .  j a  v  a 2  s  .c  om
private void checkArray(TreeLogger logger, JArrayType array) {
    checkType(logger.branch(TreeLogger.DEBUG, "Analyzing component type:", null), array.getComponentType(),
            true);

    JType leafType = array.getLeafType();
    JClassType classOrInterface = leafType.isClassOrInterface();
    if (leafType.isPrimitive() != null) {
        getMetaTypeInfo(array).setSerializable(true);
    } else if (classOrInterface != null) {
        MetaTypeInfo mti = getMetaTypeInfo(classOrInterface);
        if (mti.isSerializable()) {
            getMetaTypeInfo(array).setSerializable(true);
        }

        JClassType[] subtypes = classOrInterface.getSubtypes();
        for (int i = 0; i < subtypes.length; ++i) {
            JClassType component = subtypes[i];
            JArrayType covariantArray = getArrayType(typeOracle, array.getRank(), component);

            MetaTypeInfo cmti = getMetaTypeInfo(component);
            if (cmti.isSerializable()) {
                logger.branch(TreeLogger.DEBUG, covariantArray.getParameterizedQualifiedSourceName(), null);
                getMetaTypeInfo(covariantArray).setSerializable(true);
            }
        }
    }
}

From source file:org.rapla.rest.gwtjsonrpc.rebind.ProxyCreator.java

License:Apache License

static String[] synthesizeTopLevelClassName(JClassType type, String suffix) {
    // Gets the basic name of the type. If it's a nested type, the type name
    // will contains dots.
    ////from ww w  .  ja va  2 s . c  o m
    String className;
    String packageName;

    JType leafType = type.getLeafType();
    if (leafType.isPrimitive() != null) {
        className = leafType.getSimpleSourceName();
        packageName = "";
    } else {
        JClassType classOrInterface = leafType.isClassOrInterface();
        assert (classOrInterface != null);
        className = classOrInterface.getName();
        packageName = classOrInterface.getPackage().getName();
    }

    JParameterizedType isGeneric = type.isParameterized();
    if (isGeneric != null) {
        for (JClassType param : isGeneric.getTypeArgs()) {
            className += "_";
            className += param.getQualifiedSourceName().replace('.', '_');
        }
    }

    JArrayType isArray = type.isArray();
    if (isArray != null) {
        className += "_Array_Rank_" + isArray.getRank();
    }

    // Add the meaningful suffix.
    //
    className += suffix;

    // Make it a top-level name.
    //
    className = className.replace('.', '_');

    return new String[] { packageName, className };
}

From source file:org.sprintapi.hyperdata.gwt.ArrayAdapterGenerator.java

License:Apache License

private void composeSetMethod(SourceWriter sourceWriter, JArrayType parameterizedType) {
    sourceWriter.print(//from  w w w. jav  a 2 s. com
            "public void set(java.lang.Object array, int dimension, int index, java.lang.Object value) throws org.sprintapi.hyperdata.gwt.client.AdapterException {");

    sourceWriter.print("   if (dimension == 0) {");
    sourceWriter.print("       ((" + parameterizedType.getLeafType().getQualifiedSourceName()
            + "[])array)[index] = (" + parameterizedType.getLeafType().getQualifiedSourceName() + ")value;");
    String suffix = "";
    for (int i = 0; i < parameterizedType.getRank(); i++) {
        suffix += "[]";
        sourceWriter.print("   } else if (dimension == " + (i + 1) + ") {");
        sourceWriter.print("       ((" + parameterizedType.getLeafType().getQualifiedSourceName() + "[]"
                + suffix + ")array)[index] = (" + parameterizedType.getLeafType().getQualifiedSourceName()
                + suffix + ")value;");
    }
    sourceWriter.print("   }");
    sourceWriter.print("}");

    Object o = new Integer[10][];

    ((Integer[][]) o)[0] = new Integer[4];

}

From source file:org.sprintapi.hyperdata.gwt.ArrayAdapterGenerator.java

License:Apache License

private void composeGetArrayClassMethod(SourceWriter sourceWriter, JArrayType parameterizedType) {
    sourceWriter.print("public java.lang.Class<?> getArrayClass(int dimension) {");
    sourceWriter.print("   if (dimension == 0) {");
    sourceWriter.print("      return " + parameterizedType.getLeafType().getQualifiedSourceName() + ".class;");

    String suffix = "";
    for (int i = 0; i < parameterizedType.getRank(); i++) {
        suffix += "[]";
        sourceWriter.print("   } else if (dimension == " + (i + 1) + ") {");
        sourceWriter.print("      return " + parameterizedType.getLeafType().getQualifiedSourceName() + suffix
                + ".class;");
    }//from w w  w  .j a v  a2s .co m

    sourceWriter.print("   }");
    sourceWriter.print("  return null;");
    sourceWriter.print("}");
}

From source file:org.sprintapi.hyperdata.gwt.ArrayAdapterGenerator.java

License:Apache License

private void composeCreateInstanceMethod(SourceWriter sourceWriter, JArrayType parameterizedType) {
    sourceWriter.print("public java.lang.Object createInstance(int length, int dimension) {");

    sourceWriter.print("   if (dimension == 0) {");

    String suffix = "";
    for (int i = 0; i < parameterizedType.getRank(); i++) {
        sourceWriter.print("   } else if (dimension == " + (i + 1) + ") {");
        sourceWriter.print("      return new " + parameterizedType.getLeafType().getQualifiedSourceName()
                + "[length]" + suffix + ";");
        suffix += "[]";
    }//from   ww w  .  ja  v a2 s. c om

    sourceWriter.print("   }");
    sourceWriter.print("  return null;");
    sourceWriter.print("}");
}

From source file:org.sprintapi.hyperdata.gwt.ArrayAdapterGenerator.java

License:Apache License

private void composeDimesionMethod(SourceWriter sourceWriter, JArrayType parameterizedType) {
    sourceWriter.print("public int maxDimension() {");
    sourceWriter.print("  return " + parameterizedType.getRank() + ";");
    sourceWriter.print("}");
}

From source file:rocket.generator.rebind.gwt.JArrayTypeTypeAdapter.java

License:Apache License

/**
 * Returns the runtime name of the class. This method is only necessary due
 * to the use of dollar signs "$" within inner classes rather than dot ".".
 *//*from   w w w .ja  v a 2  s.  c om*/
public String getRuntimeName() {
    // for java.lang.String array the runtime name or signature is
    // [Ljava.lang.String;
    // for a two dimensioned String array the runtime name is
    // [[Ljava.lang.String;
    final Type componentType = this.getComponentType();
    final boolean primitiveComponentType = componentType.isPrimitive();

    final StringBuffer runtimeName = new StringBuffer();
    final JArrayType jArrayType = this.getJArrayType();

    // prefix a [ for each rank.
    final int rank = jArrayType.getRank();
    for (int i = 0; i < rank; i++) {
        runtimeName.append('[');
    }

    if (false == primitiveComponentType) {
        runtimeName.append("L");
    }

    // insert the name.
    final String name = componentType.getRuntimeName();
    final Package packagee = componentType.getPackage();
    final String packageName = null == packagee ? null : packagee.getName();
    String nameLessPackageName = name;

    if (false == Tester.isNullOrEmpty(packageName)) {
        runtimeName.append(packageName);
        runtimeName.append('.');

        nameLessPackageName = name.substring(packageName.length() + 1);
    }

    nameLessPackageName = nameLessPackageName.replace('.', '$');
    runtimeName.append(nameLessPackageName);

    // append a semi-colon
    if (false == primitiveComponentType) {
        runtimeName.append(';');
    }

    return runtimeName.toString();
}