List of usage examples for com.google.gwt.core.ext.typeinfo JType isArray
JArrayType isArray();
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}<? extends {@link Number}></code>, * <code>{@link Iterable}<? extends {@link String}></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; }