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

com.grosner.processor.definition.ModelViewDefinition Maven / Gradle / Ivy

The newest version!
package com.grosner.processor.definition;

import com.grosner.dbflow.annotation.Column;
import com.grosner.dbflow.annotation.ModelView;
import com.grosner.processor.Classes;
import com.grosner.processor.DBFlowProcessor;
import com.grosner.processor.handler.FlowManagerHandler;
import com.grosner.processor.model.ProcessorManager;
import com.grosner.processor.utils.WriterUtils;
import com.grosner.processor.writer.ExistenceWriter;
import com.grosner.processor.writer.FlowWriter;
import com.grosner.processor.writer.LoadCursorWriter;
import com.grosner.processor.writer.WhereQueryWriter;
import com.squareup.javawriter.JavaWriter;

import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
import java.io.IOException;
import java.util.List;

/**
 * Author: andrewgrosner
 * Contributors: { }
 * Description:
 */
public class ModelViewDefinition extends BaseTableDefinition implements FlowWriter {

    private static final String DBFLOW_MODEL_VIEW_TAG = "$View";

    public String databaseName;

    private String query;

    private String name;

    private TypeElement modelReferenceClass;

    private FlowWriter[] mMethodWriters;

    public ModelViewDefinition(ProcessorManager manager, Element element) {
        super(element, manager);
        setDefinitionClassName(DBFLOW_MODEL_VIEW_TAG);

        ModelView modelView = element.getAnnotation(ModelView.class);
        this.query = modelView.query();
        this.databaseName = modelView.databaseName();
        if(databaseName == null || databaseName.isEmpty()) {
            databaseName = DBFlowProcessor.DEFAULT_DB_NAME;
        }

        this.name = modelView.name();
        if(name == null || name.isEmpty()) {
            name = getModelClassName();
        }

        DeclaredType typeAdapterInterface = null;
        final DeclaredType modelViewType = manager.getTypeUtils().getDeclaredType(
                manager.getElements().getTypeElement(Classes.MODEL_VIEW),
                manager.getTypeUtils().getWildcardType(manager.getElements().getTypeElement(Classes.MODEL).asType(), null)
        );


        for (TypeMirror superType : manager.getTypeUtils().directSupertypes(element.asType())) {
            if (manager.getTypeUtils().isAssignable(superType, modelViewType)) {
                typeAdapterInterface = (DeclaredType) superType;
                break;
            }
        }

        if (typeAdapterInterface != null) {
            final List typeArguments = typeAdapterInterface.getTypeArguments();
            modelReferenceClass = manager.getElements().getTypeElement(typeArguments.get(0).toString());
        }

        createColumnDefinitions((TypeElement) element);

        mMethodWriters = new FlowWriter[] {
                new LoadCursorWriter(this, false),
                new ExistenceWriter(this, false),
                new WhereQueryWriter(this, false)
        };
    }

    @Override
    protected void createColumnDefinitions(TypeElement typeElement) {
        List variableElements = manager.getElements().getAllMembers(typeElement);
        for(Element variableElement: variableElements) {
            if(variableElement.getAnnotation(Column.class) != null) {
                ColumnDefinition columnDefinition = new ColumnDefinition(manager, (VariableElement) variableElement);
                columnDefinitions.add(columnDefinition);

                if(columnDefinition.columnType == Column.PRIMARY_KEY || columnDefinition.columnType == Column.FOREIGN_KEY) {
                    manager.getMessager().printMessage(Diagnostic.Kind.ERROR, "ModelViews cannot have primary or foreign keys");
                }
            }
        }
    }

    @Override
    public List getPrimaryColumnDefinitions() {
        return getColumnDefinitions();
    }

    public String getFullyQualifiedModelClassName() {
        return packageName + "." + getModelClassName();
    }

    @Override
    public String getTableSourceClassName() {
        return modelReferenceClass + TableDefinition.DBFLOW_TABLE_TAG;
    }

    @Override
    protected String[] getImports() {
        return new String[] {
                Classes.CURSOR, Classes.SELECT, Classes.CONDITION_QUERY_BUILDER,
                Classes.CONDITION
        };
    }

    @Override
    protected String getExtendsClass() {
        return String.format("%1s<%1s,%1s>", Classes.MODEL_VIEW_ADAPTER, modelReferenceClass, getModelClassName());
    }

    @Override
    public void onWriteDefinition(JavaWriter javaWriter) throws IOException {
        for (FlowWriter writer: mMethodWriters) {
            writer.write(javaWriter);
        }

        javaWriter.emitEmptyLine();
        javaWriter.emitAnnotation(Override.class);
        WriterUtils.emitMethod(javaWriter, new FlowWriter() {
            @Override
            public void write(JavaWriter javaWriter) throws IOException {
                javaWriter.emitStatement("return \"%1s\"", query);
            }
        }, "String" , "getCreationQuery", FlowManagerHandler.METHOD_MODIFIERS);

        javaWriter.emitEmptyLine();
        javaWriter.emitAnnotation(Override.class);
        WriterUtils.emitMethod(javaWriter, new FlowWriter() {
            @Override
            public void write(JavaWriter javaWriter) throws IOException {
                javaWriter.emitStatement("return \"%1s\"", name);
            }
        }, "String" , "getViewName", FlowManagerHandler.METHOD_MODIFIERS);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy