use of com.bluelinelabs.logansquare.processor.type.field.TypeConverterFieldType in project LoganSquare by bluelinelabs.
the class ObjectMapperInjector method getTypeSpec.
private TypeSpec getTypeSpec() {
TypeSpec.Builder builder = TypeSpec.classBuilder(mJsonObjectHolder.injectedClassName).addModifiers(Modifier.PUBLIC, Modifier.FINAL);
builder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unsafe,unchecked\"").build());
builder.superclass(ParameterizedTypeName.get(ClassName.get(JsonMapper.class), mJsonObjectHolder.objectTypeName));
for (TypeParameterElement typeParameterElement : mJsonObjectHolder.typeParameters) {
builder.addTypeVariable(TypeVariableName.get((TypeVariable) typeParameterElement.asType()));
}
if (mJsonObjectHolder.hasParentClass()) {
FieldSpec.Builder parentMapperBuilder;
if (mJsonObjectHolder.parentTypeParameters.size() == 0) {
parentMapperBuilder = FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(JsonMapper.class), mJsonObjectHolder.parentTypeName), PARENT_OBJECT_MAPPER_VARIABLE_NAME).addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL).initializer("$T.mapperFor($T.class)", LoganSquare.class, mJsonObjectHolder.parentTypeName);
} else {
parentMapperBuilder = FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(JsonMapper.class), mJsonObjectHolder.getParameterizedParentTypeName()), PARENT_OBJECT_MAPPER_VARIABLE_NAME).addModifiers(Modifier.PRIVATE);
if (mJsonObjectHolder.typeParameters.size() == 0) {
parentMapperBuilder.initializer("$T.mapperFor(new $T<$T>() { })", LoganSquare.class, ParameterizedType.class, mJsonObjectHolder.getParameterizedParentTypeName());
}
}
builder.addField(parentMapperBuilder.build());
}
// TypeConverters could be expensive to create, so just use one per class
Set<ClassName> typeConvertersUsed = new HashSet<>();
for (JsonFieldHolder fieldHolder : mJsonObjectHolder.fieldMap.values()) {
if (fieldHolder.type instanceof TypeConverterFieldType) {
typeConvertersUsed.add(((TypeConverterFieldType) fieldHolder.type).getTypeConverterClassName());
}
}
for (ClassName typeConverter : typeConvertersUsed) {
builder.addField(FieldSpec.builder(typeConverter, getStaticFinalTypeConverterVariableName(typeConverter)).addModifiers(Modifier.PROTECTED, Modifier.STATIC, Modifier.FINAL).initializer("new $T()", typeConverter).build());
}
MethodSpec.Builder constructorBuilder = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);
List<String> createdJsonMappers = new ArrayList<>();
if (mJsonObjectHolder.typeParameters.size() > 0) {
constructorBuilder.addParameter(ClassName.get(ParameterizedType.class), "type");
constructorBuilder.addStatement("partialMappers.put(type, this)");
for (TypeParameterElement typeParameterElement : mJsonObjectHolder.typeParameters) {
final String typeName = typeParameterElement.getSimpleName().toString();
final String typeArgumentName = typeName + "Type";
final String jsonMapperVariableName = getJsonMapperVariableNameForTypeParameter(typeName);
if (!createdJsonMappers.contains(jsonMapperVariableName)) {
createdJsonMappers.add(jsonMapperVariableName);
// Add a JsonMapper reference
builder.addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(JsonMapper.class), TypeVariableName.get(typeName)), jsonMapperVariableName).addModifiers(Modifier.PRIVATE, Modifier.FINAL).build());
constructorBuilder.addParameter(ClassName.get(ParameterizedType.class), typeArgumentName);
constructorBuilder.addStatement("$L = $T.mapperFor($L, partialMappers)", jsonMapperVariableName, LoganSquare.class, typeArgumentName);
}
}
constructorBuilder.addParameter(ParameterizedTypeName.get(ClassName.get(SimpleArrayMap.class), ClassName.get(ParameterizedType.class), ClassName.get(JsonMapper.class)), "partialMappers");
}
for (JsonFieldHolder jsonFieldHolder : mJsonObjectHolder.fieldMap.values()) {
if (jsonFieldHolder.type instanceof ParameterizedTypeField) {
final String jsonMapperVariableName = getJsonMapperVariableNameForTypeParameter(((ParameterizedTypeField) jsonFieldHolder.type).getParameterName());
if (!createdJsonMappers.contains(jsonMapperVariableName)) {
ParameterizedTypeName parameterizedType = ParameterizedTypeName.get(ClassName.get(JsonMapper.class), jsonFieldHolder.type.getTypeName());
createdJsonMappers.add(jsonMapperVariableName);
builder.addField(FieldSpec.builder(parameterizedType, jsonMapperVariableName).addModifiers(Modifier.PRIVATE, Modifier.FINAL).build());
String typeName = jsonMapperVariableName + "Type";
constructorBuilder.addStatement("$T $L = new $T<$T>() { }", ParameterizedType.class, typeName, ParameterizedType.class, jsonFieldHolder.type.getTypeName());
if (mJsonObjectHolder.typeParameters.size() > 0) {
constructorBuilder.beginControlFlow("if ($L.equals(type))", typeName);
constructorBuilder.addStatement("$L = ($T)this", jsonMapperVariableName, JsonMapper.class);
constructorBuilder.nextControlFlow("else");
constructorBuilder.addStatement("$L = $T.mapperFor($L, partialMappers)", jsonMapperVariableName, LoganSquare.class, typeName);
constructorBuilder.endControlFlow();
} else {
constructorBuilder.addStatement("$L = $T.mapperFor($L)", jsonMapperVariableName, LoganSquare.class, typeName);
}
}
}
}
if (createdJsonMappers.size() > 0) {
if (mJsonObjectHolder.hasParentClass()) {
constructorBuilder.addStatement("$L = $T.mapperFor(new $T<$T>() { })", PARENT_OBJECT_MAPPER_VARIABLE_NAME, LoganSquare.class, ParameterizedType.class, mJsonObjectHolder.getParameterizedParentTypeName());
}
builder.addMethod(constructorBuilder.build());
}
builder.addMethod(getParseMethod());
builder.addMethod(getParseFieldMethod());
builder.addMethod(getSerializeMethod());
addUsedJsonMapperVariables(builder);
addUsedTypeConverterMethods(builder);
return builder.build();
}
Aggregations