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

com.grosner.processor.utils.ModelUtils Maven / Gradle / Ivy

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

import com.grosner.dbflow.annotation.ForeignKeyReference;
import com.grosner.dbflow.sql.QueryBuilder;
import com.grosner.processor.Classes;
import com.grosner.processor.definition.TypeConverterDefinition;
import com.grosner.processor.model.ProcessorManager;
import com.grosner.processor.model.builder.AdapterQueryBuilder;
import com.grosner.processor.writer.LoadCursorWriter;
import com.squareup.javawriter.JavaWriter;

import java.io.IOException;

import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.MirroredTypeException;

/**
 * Author: andrewgrosner
 * Description:
 */
public class ModelUtils {

    public static String getNewModelStatement(String modelClassName) {
        return modelClassName + " " + ModelUtils.getVariable(false) + " = new " + modelClassName + "()";
    }

    public static String getStaticMember(String classname, String fieldName) {
        return new StringBuilder(classname).append(".").append(fieldName.toUpperCase()).toString();
    }

    public static void writeContentValueStatement(JavaWriter javaWriter,
                                                  String putValue, String localColumnName,
                                                  String castedClass, String foreignColumnName,
                                                  String containerKeyName,
                                                  boolean isContainer, boolean isModelContainer,
                                                  boolean isForeignKey,
                                                  boolean requiresTypeConverter, String databaseTypeName) throws IOException {
        AdapterQueryBuilder contentValue = new AdapterQueryBuilder();
        contentValue.appendContentValues();
        contentValue.appendPut(putValue);
        String accessStatement = getAccessStatement(localColumnName, castedClass,
                foreignColumnName, containerKeyName, isContainer, isModelContainer, isForeignKey, requiresTypeConverter);
        if (requiresTypeConverter) {
            contentValue.appendTypeConverter(castedClass, databaseTypeName, false);
        }
        String query = contentValue.append(accessStatement).append(")").append(requiresTypeConverter ? "))" : "").getQuery();



        javaWriter.emitStatement(query);
    }

    public static String getAccessStatement(String localColumnName,
                                            String castedClass, String foreignColumnName, String containerKeyName,
                                            boolean isContainer, boolean isModelContainer, boolean isForeignKey, boolean requiresTypeConverter) {
        AdapterQueryBuilder contentValue = new AdapterQueryBuilder();

        if (!requiresTypeConverter) {
            contentValue.appendCast(castedClass);
        }
        contentValue.appendVariable(isContainer).append(".");
        if (isContainer) {
            contentValue.appendGetValue(containerKeyName);
        } else if (isModelContainer) {
            contentValue.append(localColumnName)
                    .append(".")
                    .appendGetValue(foreignColumnName);
        } else {
            if (isForeignKey) {
                contentValue.append(localColumnName)
                        .append(".");
            }
            contentValue.append(foreignColumnName);
        }

        if (!requiresTypeConverter) {
            contentValue.append(")");
        }
        return contentValue.getQuery();
    }

    public static void writeLoadFromCursorDefinitionField(JavaWriter javaWriter, ProcessorManager processorManager, String columnFieldType, String columnFieldName, String columnName,
                                                          String foreignColumnName, String containerKeyName,
                                                          Element modelType, boolean hasTypeConverter, boolean isModelContainerDefinition, boolean isFieldModelContainer) throws IOException {
        AdapterQueryBuilder queryBuilder = new AdapterQueryBuilder().appendVariable(isModelContainerDefinition);
        if (isFieldModelContainer) {
            queryBuilder.append(".").append(columnFieldName);
        }
        if (isModelContainerDefinition) {
            queryBuilder.appendPut(containerKeyName);
        } else if (isFieldModelContainer) {
            queryBuilder.appendPut(foreignColumnName);
        } else {
            queryBuilder.append(".").append(columnFieldName).appendSpaceSeparated("=");
        }

        // TODO: find a way to convert a type properly
        String newFieldType = null;
        if (hasTypeConverter) {
            TypeConverterDefinition typeConverterDefinition = processorManager.getTypeConverterDefinition((TypeElement) modelType);
            if (typeConverterDefinition != null) {
                newFieldType = typeConverterDefinition.getDbElement().asType().toString();
            }
        } else {
            newFieldType = columnFieldType;
        }

        javaWriter.emitStatement(getColumnIndex(columnName));
        javaWriter.beginControlFlow("if (%1s != -1) ", "index" + columnName);

        String cursorStatment = ModelUtils.getCursorStatement(newFieldType, columnName);
        if (hasTypeConverter && !isModelContainerDefinition) {
            queryBuilder.appendTypeConverter(columnFieldType, columnFieldType, true);
        }

        queryBuilder.append(cursorStatment);
        if (hasTypeConverter && !isModelContainerDefinition) {
            queryBuilder.append("))");
        } else if (isModelContainerDefinition || isFieldModelContainer) {
            queryBuilder.append(")");
        }

        javaWriter.emitStatement(queryBuilder.getQuery());
        javaWriter.endControlFlow();
    }

    public static String getContainerValueStatement(String columnFieldName) {
        return String.format("getValue(%1s)", "\"" + columnFieldName + "\"");
    }

    public static String getContainerStatement(String columnFieldName) {
        return String.format("modelContainer.%1s", getContainerValueStatement(columnFieldName));
    }

    public static String getModelStatement(String columnFieldName) {
        return "model." + columnFieldName;
    }

    public static String getColumnIndex(String columnName) {
        return "int index" + columnName + " = cursor.getColumnIndex(\"" + columnName + "\")";
    }

    public static String getCursorStatement(String columnFieldType, String columnName) {
        String cursorMethod = LoadCursorWriter.CURSOR_METHOD_MAP.get(columnFieldType);
        return "cursor." + cursorMethod + "(index" + columnName + ")";
    }

    public static String getFieldClass(String columnFieldType) {
        return columnFieldType + ".class";
    }

    public static String getClassFromAnnotation(ForeignKeyReference annotation) {
        String clazz = null;
        if (annotation != null) {
            try {
                annotation.columnType();
            } catch (MirroredTypeException mte) {
                clazz = mte.getTypeMirror().toString();
            }
        }
        return clazz;
    }

    public static String getCastedValue(String columnFieldType, String statement) {
        return String.format("((%1s)%1s)", columnFieldType, statement);
    }

    public static String getVariable(boolean isModelContainer) {
        return isModelContainer ? "modelContainer" : "model";
    }

    public static String getParameter(boolean isModelContainer, String modelClassName) {
        return isModelContainer ? "ModelContainer<" + modelClassName + ", ?>" : modelClassName;

    }

    public static String getUtils(boolean isModelContainer) {
        return isModelContainer ? Classes.MODEL_CONTAINER_UTILS : Classes.SQL_UTILS;
    }

    public static void writeColumnIndexCheckers(JavaWriter javaWriter, ForeignKeyReference[] foreignKeyReferences) throws IOException {

        for (ForeignKeyReference foreignKeyReference : foreignKeyReferences) {
            javaWriter.emitStatement(ModelUtils.getColumnIndex(foreignKeyReference.columnName()));
        }

        QueryBuilder queryBuilder = new QueryBuilder("if ( ");
        for (int i = 0; i < foreignKeyReferences.length; i++) {
            ForeignKeyReference foreignKeyReference = foreignKeyReferences[i];
            queryBuilder.append("index").append(foreignKeyReference.columnName()).append(" != -1");

            if(i < foreignKeyReferences.length - 1) {
                queryBuilder.appendSpaceSeparated("&&");
            }
        }
        queryBuilder.append(")");
        javaWriter.beginControlFlow(queryBuilder.getQuery());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy