All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gabrielittner.auto.value.contentvalues.AutoValueContentValuesExtension Maven / Gradle / Ivy

package com.gabrielittner.auto.value.contentvalues;

import com.gabrielittner.auto.value.ColumnProperty;
import com.gabrielittner.auto.value.util.Property;
import com.google.auto.common.MoreElements;
import com.google.auto.service.AutoService;
import com.google.auto.value.extension.AutoValueExtension;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;

import static com.gabrielittner.auto.value.cursor.AutoValueCursorExtension.addColumnAdaptersToMethod;
import static com.gabrielittner.auto.value.cursor.AutoValueCursorExtension.getColumnAdapters;
import static com.gabrielittner.auto.value.util.AutoValueUtil.error;
import static com.gabrielittner.auto.value.util.AutoValueUtil.newTypeSpecBuilder;
import static com.gabrielittner.auto.value.util.ElementUtil.getMatchingAbstractMethod;
import static javax.lang.model.element.Modifier.PUBLIC;

@AutoService(AutoValueExtension.class)
public class AutoValueContentValuesExtension extends AutoValueExtension {

    private static final ClassName CONTENT_VALUES =
            ClassName.get("android.content", "ContentValues");

    private Set methods(Context context) {
        //TODO AutoValue 1.3: replace with context.getAbstractMethods()
        Elements elements = context.processingEnvironment().getElementUtils();
        TypeElement valueClass = context.autoValueClass();
        return MoreElements.getLocalAndInheritedMethods(valueClass, elements);
    }

    @Override
    public boolean applicable(Context context) {
        return getMatchingAbstractMethod(methods(context), CONTENT_VALUES).isPresent();
    }

    @Override
    public Set consumeProperties(Context context) {
        Optional method =
                getMatchingAbstractMethod(methods(context), CONTENT_VALUES);
        if (method.isPresent()) {
            for (Map.Entry element : context.properties().entrySet()) {
                if (element.getValue().equals(method.get())) {
                    String methodName = method.get().getSimpleName().toString();
                    return ImmutableSet.copyOf(Arrays.asList(methodName, element.getKey()));
                }
            }
        }
        return Collections.emptySet();
    }

    @Override
    public String generateClass(
            Context context, String className, String classToExtend, boolean isFinal) {
        Optional method =
                getMatchingAbstractMethod(methods(context), CONTENT_VALUES);
        if (!method.isPresent()) throw new AssertionError("Method is null");
        ImmutableList properties = ColumnProperty.from(context);

        TypeSpec.Builder subclass =
                newTypeSpecBuilder(context, className, classToExtend, isFinal)
                        .addMethod(createToContentValuesMethod(context, method.get(), properties));

        return JavaFile.builder(context.packageName(), subclass.build()).build().toString();
    }

    private MethodSpec createToContentValuesMethod(
            Context context,
            ExecutableElement methodToImplement,
            ImmutableList properties) {
        String methodName = methodToImplement.getSimpleName().toString();

        MethodSpec.Builder writeMethod =
                MethodSpec.methodBuilder(methodName)
                        .addAnnotation(Override.class)
                        .addModifiers(PUBLIC)
                        .returns(CONTENT_VALUES)
                        .addStatement(
                                "$1T values = new $1T($2L)", CONTENT_VALUES, properties.size());

        ImmutableMap columnAdapters = getColumnAdapters(properties);
        addColumnAdaptersToMethod(writeMethod, properties, columnAdapters);

        for (ColumnProperty property : properties) {
            TypeMirror factory = property.columnAdapter();
            if (factory != null) {
                writeMethod.addStatement(
                        "$N.toContentValues(values, $S, $L())",
                        columnAdapters.get(property),
                        property.columnName(),
                        property.methodName());
            } else if (property.supportedType()) {
                writeMethod.addStatement(
                        "values.put($S, $L())", property.columnName(), property.methodName());
            } else {
                error(context, property, "Property has type that can't be put into ContentValues.");
            }
        }
        return writeMethod.addStatement("return values").build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy