List of usage examples for com.google.gwt.core.ext.typeinfo JArrayType getRank
int getRank();
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(); }