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

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

Introduction

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

Prototype

JArrayType isArray();

Source Link

Usage

From source file:com.cgxlib.xq.rebind.JsonBuilderGenerator.java

License:Apache License

public void generateMethod(SourceWriter sw, JMethod method, String name, TreeLogger logger)
        throws UnableToCompleteException {
    String ifaceName = method.getEnclosingType().getQualifiedSourceName();

    String retType = method.getReturnType().getParameterizedQualifiedSourceName();
    sw.print("public final " + retType + " " + method.getName());
    JParameter[] params = method.getParameters();
    if (params.length == 0) {
        JArrayType arr = method.getReturnType().isArray();
        JParameterizedType list = method.getReturnType().isParameterized();

        sw.println("() {");
        sw.indent();/* ww  w .j a  v  a2  s  .c o  m*/
        if (retType.matches("(java.lang.Boolean|boolean)")) {
            sw.println("return p.getBoolean(\"" + name + "\");");
        } else if (retType.matches("java.util.Date")) {
            sw.println("return new Date(java.lang.Long.parseLong(p.getStr(\"" + name + "\")));");
        } else if (method.getReturnType().isPrimitive() != null) {
            sw.println("return (" + retType + ")p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Character")) {
            sw.println("return (char) p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Byte")) {
            sw.println("return (byte) p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Integer")) {
            sw.println("return (int) p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Float")) {
            sw.println("return p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Double")) {
            sw.println("return (double) p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Long")) {
            sw.println("return (long) p.getFloat(\"" + name + "\");");
        } else if (retType.equals("java.lang.Byte")) {
            sw.println("return (byte) p.getFloat(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), stringType)) {
            sw.println("return p.getStr(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), jsonBuilderType)) {
            String q = method.getReturnType().getQualifiedSourceName();
            sw.println("return " + "((" + q + ")GWT.create(" + q + ".class))" + ".load(getPropertiesBase(\""
                    + name + "\"));");
        } else if (isTypeAssignableTo(method.getReturnType(), settingsType)) {
            String q = method.getReturnType().getQualifiedSourceName();
            sw.println("return " + "((" + q + ")getPropertiesBase(\"" + name + "\"));");
        } else if (retType.equals(Properties.class.getName())) {
            sw.println("return getPropertiesBase(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), jsType)) {
            sw.println("return p.getJavaScriptObject(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), functionType)) {
            sw.println("return p.getFunction(\"" + name + "\");");
        } else if (arr != null || list != null) {
            JType type = arr != null ? arr.getComponentType() : list.getTypeArgs()[0];
            boolean buildType = isTypeAssignableTo(type, jsonBuilderType);
            String t = type.getQualifiedSourceName();
            sw.println("JsArrayMixed a = p.getArray(\"" + name + "\");");
            sw.println("int l = a == null ? 0 : a.length();");
            String ret;
            if (buildType) {
                sw.println(t + "[] r = new " + t + "[l];");
                sw.println("JsObjectArray<?> a1 = p.getArray(\"" + name + "\").cast();");
                sw.println("int l1 = r.length;");
                sw.println("for (int i = 0 ; i < l1 ; i++) {");
                sw.println("  Object w = a1.get(i);");
                sw.println("  " + t + " instance = GWT.create(" + t + ".class);");
                sw.println("  r[i] = instance.load(w);");
                sw.println("}");
                ret = "r";
            } else {
                ret = "getArrayBase(\"" + name + "\", new " + t + "[l], " + t + ".class)";
            }
            if (arr != null) {
                sw.println("return " + ret + ";");
            } else {
                sw.println("return Arrays.asList(" + ret + ");");
            }
        } else if (method.getReturnType().isEnum() != null) {
            sw.println("return " + method.getReturnType().getQualifiedSourceName() + ".valueOf(p.getStr(\""
                    + name + "\"));");
        } else {
            sw.println("System.err.println(\"JsonBuilderGenerator WARN: unknown return type " + retType + " "
                    + ifaceName + "." + name + "()\"); ");
            // We return the object because probably the user knows how to handle it
            sw.println("return p.get(\"" + name + "\");");
        }
        sw.outdent();
        sw.println("}");
    } else if (params.length == 1) {
        JType type = params[0].getType();
        JArrayType arr = type.isArray();
        JParameterizedType list = type.isParameterized();

        sw.print("(" + type.getParameterizedQualifiedSourceName() + " a)");
        sw.println("{");
        sw.indent();
        if (arr != null || list != null) {
            String a = "a";
            if (list != null) {
                a = "a.toArray(new " + list.getTypeArgs()[0].getQualifiedSourceName() + "[0])";
            }
            sw.println("setArrayBase(\"" + name + "\", " + a + ");");
        } else if (type.getParameterizedQualifiedSourceName().matches("java.util.Date")) {
            sw.println("p.setNumber(\"" + name + "\", a.getTime());");
        } else if (type.getParameterizedQualifiedSourceName().matches(
                "(java.lang.(Character|Long|Double|Integer|Float|Byte)|(char|long|double|int|float|byte))")) {
            sw.println("p.setNumber(\"" + name + "\", a);");
        } else if (type.getParameterizedQualifiedSourceName().matches("(java.lang.Boolean|boolean)")) {
            sw.println("p.setBoolean(\"" + name + "\", a);");
        } else if (type.getParameterizedQualifiedSourceName().matches("com.cgxlib.xq.client.Function")) {
            sw.println("p.setFunction(\"" + name + "\", a);");
        } else if (type.isEnum() != null) {
            sw.println("p.set(\"" + name + "\", a.name());");
        } else {
            sw.println("set(\"" + name + "\", a);");
        }
        if (!"void".equals(retType)) {
            if (isTypeAssignableTo(method.getReturnType(), method.getEnclosingType())) {
                sw.println("return this;");
            } else {
                sw.println("return null;");
            }
        }
        sw.outdent();
        sw.println("}");
    }
}

From source file:com.cgxlib.xq.rebind.XmlBuilderGenerator.java

License:Apache License

public void generateMethod(SourceWriter sw, JMethod method, TreeLogger logger)
        throws UnableToCompleteException {
    Name nameAnnotation = method.getAnnotation(Name.class);
    String name = nameAnnotation != null ? nameAnnotation.value()
            : method.getName().replaceFirst("^(get|set)", "");

    if (nameAnnotation == null) {
        name = name.substring(0, 1).toLowerCase() + name.substring(1);
    }/*from   w  w w  . jav  a 2s  . c  o  m*/

    String retType = method.getReturnType().getParameterizedQualifiedSourceName();

    sw.print("public final " + retType + " " + method.getName());
    JParameter[] params = method.getParameters();
    if (params.length == 0) {
        JArrayType arr = method.getReturnType().isArray();
        sw.println("() {");
        sw.indent();
        if (retType.matches("(java.lang.Boolean|boolean)")) {
            sw.println("return getBooleanBase(\"" + name + "\");");
        } else if (method.getReturnType().isPrimitive() != null) {
            sw.println("return (" + retType + ")getFloatBase(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), stringType)) {
            sw.println("return getStrBase(\"" + name + "\");");
        } else if (isTypeAssignableTo(method.getReturnType(), xmlBuilderType)) {
            String q = method.getReturnType().getQualifiedSourceName();
            sw.println("Element e = getElementBase(\"" + name + "\");");
            sw.println(
                    "return e == null ? null : (" + q + ")((" + q + ")GWT.create(" + q + ".class)).load(e);");
        } else if (retType.equals(Properties.class.getName())) {
            sw.println("return getPropertiesBase(\"" + name + "\");");
        } else if (arr != null) {
            String q = arr.getComponentType().getQualifiedSourceName();
            sw.println("ArrayList<" + q + "> l = new ArrayList<" + q + ">();");
            sw.println("for (Element e: getElementsBase(\"" + name + "\")) {");
            sw.println("  " + q + " c = GWT.create(" + q + ".class);");
            sw.println("  c.load(e);");
            sw.println("  l.add(c);");
            sw.println("}");
            sw.println("return l.toArray(new " + q + "[0]);");
        } else {
            sw.println("return null; // Unsupported return type: " + retType);
        }
        sw.outdent();
        sw.println("}");
    } else if (params.length == 1) {
        JType type = params[0].getType();
        JArrayType arr = type.isArray();
        String qname = type.getParameterizedQualifiedSourceName();
        sw.print("(" + qname + " a)");
        sw.println("{");
        sw.indent();
        if (arr != null) {
            sw.println("setArrayBase(\"" + name + "\", a);");
        } else {
            sw.println("setBase(\"" + name + "\", a);");
        }
        if (!"void".equals(retType)) {
            if (isTypeAssignableTo(method.getReturnType(), method.getEnclosingType())) {
                sw.println("return this;");
            } else {
                sw.println("return null;");
            }
        }
        sw.outdent();
        sw.println("}");
    }
}

From source file:com.didactilab.gwt.phprpc.rebind.PhpTools.java

License:Apache License

public static String typeToString(JType type, boolean phpCompatible) {
    String name = "";
    JArrayType arrayType = type.isArray();
    if (arrayType != null) {
        if (phpCompatible)
            name = "array";
        else/*from  w  ww  . j  a v  a  2s  .  co m*/
            name = typeToString(arrayType.getComponentType(), phpCompatible) + "[]";
    } else {
        JClassType classType = type.isClassOrInterface();
        if ((classType != null) && (classType.getEnclosingType() != null))
            name = typeToString(classType.getEnclosingType(), phpCompatible) + "_";
        name += filterType(type.getSimpleSourceName());
        if (!phpCompatible) {
            JParameterizedType params = type.isParameterized();
            if (params != null) {
                JClassType[] args = params.getTypeArgs();
                name += "<";
                for (int i = 0, c = args.length; i < c; i++) {
                    name += typeToString(args[i], phpCompatible);
                    if (i < c - 1)
                        name += ", ";
                }
                name += ">";
            }
        }
    }
    return name;
}

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  ww .  j  a  v a2s.com
 * @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//  w  ww  .j  av  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.github.nmorel.gwtjackson.rebind.JacksonTypeOracle.java

License:Apache License

public JType replaceType(TreeLogger logger, JType type, Annotation deserializeAs)
        throws UnableToCompleteException {
    JClassType classType = type.isClassOrInterface();
    if (null == classType) {
        return type;
    }//  w w  w.j a v a  2  s.  c o  m

    Optional<JClassType> typeAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "as");
    Optional<JClassType> keyAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "keyAs");
    Optional<JClassType> contentAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "contentAs");

    if (!typeAs.isPresent() && !keyAs.isPresent() && !contentAs.isPresent()) {
        return type;
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        if (contentAs.isPresent()) {
            return typeOracle.getArrayType(contentAs.get());
        } else if (typeAs.isPresent()) {
            return typeOracle.getArrayType(typeAs.get());
        } else {
            return classType;
        }
    }

    JParameterizedType parameterizedType = type.isParameterized();
    if (null != parameterizedType) {
        JGenericType genericType;
        if (typeAs.isPresent()) {
            genericType = typeAs.get().isGenericType();
        } else {
            genericType = parameterizedType.getBaseType();
        }

        if (!keyAs.isPresent() && !contentAs.isPresent()) {
            return typeOracle.getParameterizedType(genericType, parameterizedType.getTypeArgs());
        } else if (contentAs.isPresent() && isIterable(parameterizedType)) {
            return typeOracle.getParameterizedType(genericType, new JClassType[] { contentAs.get() });
        } else if (isMap(parameterizedType)) {
            JClassType key;
            if (keyAs.isPresent()) {
                key = keyAs.get();
            } else {
                key = parameterizedType.getTypeArgs()[0];
            }

            JClassType content;
            if (contentAs.isPresent()) {
                content = contentAs.get();
            } else {
                content = parameterizedType.getTypeArgs()[1];
            }

            return typeOracle.getParameterizedType(genericType, new JClassType[] { key, content });
        }
    }

    if (typeAs.isPresent()) {
        return typeAs.get();
    }

    return type;
}

From source file:com.github.nmorel.gwtjackson.rebind.property.PropertyProcessor.java

License:Apache License

/**
 * Extract the bean type from the type given in parameter. For {@link java.util.Collection}, it gives the bounded type. For {@link
 * java.util.Map}, it gives the second bounded type. Otherwise, it gives the type given in parameter.
 *
 * @param type type to extract the bean type
 * @param propertyName name of the property
 *
 * @return the extracted type//  w ww  .  j  a  v a  2  s  .  c om
 */
private static Optional<JClassType> extractBeanType(TreeLogger logger, JacksonTypeOracle typeOracle, JType type,
        String propertyName) {
    if (null != type.isWildcard()) {
        // we use the base type to find the serializer to use
        type = type.isWildcard().getBaseType();
    }

    if (null != type.isRawType()) {
        type = type.isRawType().getBaseType();
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        return extractBeanType(logger, typeOracle, arrayType.getComponentType(), propertyName);
    }

    JClassType classType = type.isClassOrInterface();
    if (null == classType) {
        return Optional.absent();
    } else if (typeOracle.isIterable(classType)) {
        if ((null == classType.isParameterized() || classType.isParameterized().getTypeArgs().length != 1)
                && (null == classType.isGenericType()
                        || classType.isGenericType().getTypeParameters().length != 1)) {
            logger.log(Type.INFO,
                    "Expected one argument for the java.lang.Iterable '" + propertyName
                            + "'. Applying annotations to " + "type "
                            + classType.getParameterizedQualifiedSourceName());
            return Optional.of(classType);
        }
        if (null != classType.isParameterized()) {
            return extractBeanType(logger, typeOracle, classType.isParameterized().getTypeArgs()[0],
                    propertyName);
        } else {
            return extractBeanType(logger, typeOracle,
                    classType.isGenericType().getTypeParameters()[0].getBaseType(), propertyName);
        }
    } else if (typeOracle.isMap(classType)) {
        if ((null == classType.isParameterized() || classType.isParameterized().getTypeArgs().length != 2)
                && (null == classType.isGenericType()
                        || classType.isGenericType().getTypeParameters().length != 2)) {
            logger.log(Type.INFO,
                    "Expected two arguments for the java.util.Map '" + propertyName
                            + "'. Applying annotations to " + "type "
                            + classType.getParameterizedQualifiedSourceName());
            return Optional.of(classType);
        }
        if (null != classType.isParameterized()) {
            return extractBeanType(logger, typeOracle, classType.isParameterized().getTypeArgs()[1],
                    propertyName);
        } else {
            return extractBeanType(logger, typeOracle,
                    classType.isGenericType().getTypeParameters()[1].getBaseType(), propertyName);
        }
    } else {
        return Optional.of(classType);
    }
}

From source file:com.google.code.gwt.database.rebind.ServiceMethodCreator.java

License:Apache License

/**
 * Generates an iterating <code>tx.executeSql(...);</code> call statement.
 * /*  www .  ja  v  a  2s.co m*/
 * @throws UnableToCompleteException
 */
protected void generateExecuteIteratedSqlStatements() throws UnableToCompleteException {
    if (StringUtils.isNotEmpty(foreach)) {
        // Generate code to loop over a collection to create a tx.executeSql()
        // call for each item.

        // Ensure no parameters are specified on the service method named '_':
        if (!"_".equals(GeneratorUtils.getVariableName("_", service.getParameters()))) {
            logger.log(TreeLogger.ERROR, "The service method cannot apply a parameter named '_' when "
                    + "the 'foreach' attribute is also specified on the @Update " + "annotation");
            throw new UnableToCompleteException();
        }

        // Find the types, parameters, assert not-nulls, etc.:
        JType collection = GeneratorUtils.findType(foreach, service.getParameters());
        String forEachType = null;
        if (collection == null) {
            logger.log(TreeLogger.WARN, "no parameter on the service method named '" + foreach
                    + "' found. Using Object as the type for the loop variable '_'");
        } else if (collection.isParameterized() != null) {
            forEachType = genUtils.getTypeParameter(collection);
        } else if (collection.isArray() != null) {
            forEachType = genUtils.getClassName(collection.isArray().getComponentType());
        }
        if (forEachType == null) {
            forEachType = "Object";
        }

        sw.println("for (" + forEachType + " _ : " + foreach + ") {");
        sw.indent();
        generateExecuteSqlStatement();
        sw.outdent();
        sw.println("}");
    }
}

From source file:com.google.code.gwt.database.rebind.ServiceMethodCreator.java

License:Apache License

/**
 * Generates a <code>tx.executeSql(...);</code> call statement.
 * /*from   w  w w  .j  a  v  a  2 s .  c o  m*/
 * @throws UnableToCompleteException
 */
protected void generateExecuteSqlStatement() throws UnableToCompleteException {
    List<String> tokenizedStmt = tokenizeSql(sql);
    if (tokenizedStmt.size() == 0) {
        // No SQL at all. Probably already captured earlier in the process.
        logger.log(TreeLogger.ERROR, "No SQL statement specified");
        throw new UnableToCompleteException();
    }

    if (tokenizedStmt.size() == 1) {
        // No parameters used in the SQL:
        sw.print("exec(" + txVarName + ", " + StringUtils.getEscapedString(tokenizedStmt.get(0)) + ", null");
    } else {
        // At least one parameter used in the SQL:
        String paramsVarName = GeneratorUtils.getVariableName("params", service.getParameters());

        StringBuilder prepParamsArrayStatic = new StringBuilder("Object[] ").append(paramsVarName)
                .append(" = {");
        StringBuilder prepParamsArrayDynamic = new StringBuilder("Object[] ").append(paramsVarName)
                .append(" = new Object[");
        // Determine amount of parameters (to size the array) and whether dynamic
        // parameters are applied:
        boolean hasDynamics = false;
        for (int i = 0; i < tokenizedStmt.size(); i++) {
            if ((i % 2) == 0) {
                // SQL token:
                // ignore while determining parameters
            } else {
                // Parameter token:
                String expression = tokenizedStmt.get(i);
                if (i > 1) {
                    prepParamsArrayDynamic.append(" + ");
                    prepParamsArrayStatic.append(", ");
                }
                if (isDynamicParameter(expression)) {
                    // Aha! We have a collection or array used as input parameter.
                    // This means some different statement builder code!
                    hasDynamics = true;
                    JType type = GeneratorUtils.findType(expression, service.getParameters());
                    if (type.isArray() != null) {
                        prepParamsArrayDynamic.append(expression + ".length");
                    } else {
                        prepParamsArrayDynamic.append(
                                genUtils.getClassName(DataServiceUtils.class) + ".getSize(" + expression + ")");
                    }
                } else {
                    prepParamsArrayDynamic.append("1");
                    prepParamsArrayStatic.append(expression);
                }
            }
        }

        // Now we determined whether the SQL statement to generate incorporates
        // dynamic list(s) of parameters (e.g. IN() statements).
        // This greatly influences the Java code to generate:
        String sqlVarName = GeneratorUtils.getVariableName("sql", service.getParameters());
        String indexVarName = GeneratorUtils.getVariableName("i", service.getParameters());
        if (hasDynamics) {
            prepParamsArrayDynamic.append("];");
            sw.println(prepParamsArrayDynamic.toString());
            sw.println("int " + indexVarName + " = 0;");
            sw.println("StringBuilder " + sqlVarName + " = new StringBuilder();");
        } else {
            prepParamsArrayStatic.append("};");
            sw.println(prepParamsArrayStatic.toString());
        }

        // Define statement in sqlVarName, and parameters in paramsVarName:
        StringBuilder sqlLiteral = new StringBuilder();
        for (int i = 0; i < tokenizedStmt.size(); i++) {
            String token = tokenizedStmt.get(i);
            if ((i % 2) == 0) {
                // SQL token:
                sqlLiteral.append(token);
            } else {
                // Parameter token:
                if (isDynamicParameter(token)) {
                    sw.println(sqlVarName + ".append(" + StringUtils.getEscapedString(sqlLiteral.toString())
                            + ");");
                    sqlLiteral = new StringBuilder();

                    sw.println(indexVarName + " = " + genUtils.getClassName(DataServiceUtils.class)
                            + ".addParameter(" + sqlVarName + ", " + paramsVarName + ", " + indexVarName + ", "
                            + token + ");");
                } else {
                    sqlLiteral.append("?");
                    if (hasDynamics) {
                        sw.println(paramsVarName + "[" + indexVarName + "++] = " + token + ";");
                    }
                }
            }
        }

        if (hasDynamics) {
            if (sqlLiteral.length() > 0) {
                sw.println(
                        sqlVarName + ".append(" + StringUtils.getEscapedString(sqlLiteral.toString()) + ");");
            }

            // Invoke the actual executeSql method:
            sw.print("exec(" + txVarName + ", " + sqlVarName + ".toString(), " + paramsVarName);
        } else {
            // Invoke the actual executeSql method with a String literal:
            sw.print("exec(" + txVarName + ", " + StringUtils.getEscapedString(sqlLiteral.toString()) + ", "
                    + paramsVarName);
        }
    }

    generateStatementCallbackParameter();

    sw.println(");");
}

From source file:com.google.code.gwt.database.rebind.ServiceMethodCreator.java

License:Apache License

/**
 * Appends a parameter to the sql String.
 * /*  w  w w. j  a  v a2s  .co m*/
 * <p>
 * Returns <code>true</code> if the specified <code>expression</code> is an
 * <code>{@link Iterable}&lt;? extends {@link Number}&gt;</code>,
 * <code>{@link Iterable}&lt;? extends {@link String}&gt;</code>.
 * <code>{@link String}[]</code>, <code>{@link Number}[]</code>, <code>{@link primitive}[]</code>.
 * </p>
 */
private boolean isDynamicParameter(String expression) throws UnableToCompleteException {
    JType type = GeneratorUtils.findType(expression, service.getParameters());
    boolean isSuitableDynamic = false;
    String typeParam = null;
    if (type != null) {
        if (genUtils.isAssignableToType(type, Iterable.class)) {
            // OK, we've got our collection. Is the Type parameter 'suitable'?
            typeParam = genUtils.getTypeParameter(type);
            for (String t : new String[] { "String", "Integer", "Number", "Long", "Short", "Double", "Float",
                    "Boolean" }) {
                if (typeParam.equals(t)) {
                    isSuitableDynamic = true;
                    break;
                }
            }
            if (!isSuitableDynamic) {
                logger.log(TreeLogger.ERROR, "The expression in the SQL statement '" + expression
                        + "' is defined as an Iterable, but its type " + "parameter " + typeParam
                        + " is NOT one of String, Long, Integer, Short, Number, " + "Double, Float, Boolean");
                throw new UnableToCompleteException();
            }
        }
        if (type.isArray() != null) {
            // Same as Collection, really:
            typeParam = type.isArray().getComponentType().getSimpleSourceName();
            for (String t : new String[] { "String", "Integer", "int", "Number", "Long", "Short", "Double",
                    "Float", "Boolean" }) {
                if (typeParam.equalsIgnoreCase(t)) {
                    isSuitableDynamic = true;
                    break;
                }
            }
            if (!isSuitableDynamic) {
                logger.log(TreeLogger.ERROR,
                        "The expression in the SQL statement '" + expression
                                + "' is defined as an Array, but its component type " + typeParam
                                + " is NOT one of String, Long/long, Integer/int, "
                                + "Short/short, Number, Double/double, Float/float, " + "Boolean/boolean");
                throw new UnableToCompleteException();
            }
        }
    }
    return isSuitableDynamic;
}