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

com.grosner.processor.model.ProcessorManager Maven / Gradle / Ivy

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

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.grosner.processor.definition.*;
import com.grosner.processor.handler.BaseContainerHandler;
import com.grosner.processor.handler.Handler;
import com.grosner.processor.writer.DatabaseWriter;

import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.tools.Diagnostic;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Author: andrewgrosner
 * Contributors: { }
 * Description:
 */
public class ProcessorManager implements Handler{

    private ProcessingEnvironment mProcessingEnv;

    private List mUniqueDatabases = Lists.newArrayList();

    private Map mModelToDatabaseMap = Maps.newHashMap();

    private Map mTypeConverters = Maps.newHashMap();

    private Map> mModelContainers = Maps.newHashMap();

    private Map> mTableDefinitions = Maps.newHashMap();

    private Map> mModelViewDefinition = Maps.newHashMap();

    private Map>> mMigrations = Maps.newHashMap();

    private List mManagerWriters = Lists.newArrayList();

    private List mHandlers = new ArrayList<>();

    public ProcessorManager(ProcessingEnvironment processingEnv) {
        mProcessingEnv = processingEnv;
    }

    public void addHandlers(BaseContainerHandler...containerHandlers) {
        for(BaseContainerHandler containerHandler: containerHandlers) {
            if(!mHandlers.contains(containerHandler)) {
                mHandlers.add(containerHandler);
            }
        }
    }

    public Messager getMessager() {
        return mProcessingEnv.getMessager();
    }

    public Types getTypeUtils() {
        return mProcessingEnv.getTypeUtils();
    }

    public Elements getElements() {
        return mProcessingEnv.getElementUtils();
    }

    public ProcessingEnvironment getProcessingEnvironment() {
        return mProcessingEnv;
    }

    public void addDatabase(String database) {
        if(!mUniqueDatabases.contains(database)) {
            mUniqueDatabases.add(database);
        }
    }

    public boolean hasOneDatabase() {
        return mUniqueDatabases.size() == 1;
    }

    public void addFlowManagerWriter(DatabaseWriter databaseWriter) {
        mManagerWriters.add(databaseWriter);
    }

    public List getManagerWriters() {
        return mManagerWriters;
    }

    public void addTypeConverterDefinition(TypeConverterDefinition definition) {
        mTypeConverters.put(definition.getModelClassQualifiedName(), definition);
    }

    public TypeConverterDefinition getTypeConverterDefinition(TypeElement typeElement) {
        return mTypeConverters.get(typeElement.getQualifiedName().toString());
    }

    public void addModelToDatabase(String modelName, String databaseName) {
        addDatabase(databaseName);
        mModelToDatabaseMap.put(modelName, databaseName);
    }

    public String getDatabase(String modelName) {
        return mModelToDatabaseMap.get(modelName);
    }

    public void addModelContainerDefinition(ModelContainerDefinition modelContainerDefinition) {
        String modelClassName = modelContainerDefinition.element.getSimpleName().toString();
        Map modelContainerDefinitionMap = mModelContainers.get(getDatabase(modelClassName));
        if(modelContainerDefinitionMap == null) {
            modelContainerDefinitionMap = Maps.newHashMap();
            mModelContainers.put(getDatabase(modelClassName), modelContainerDefinitionMap);
        }
        modelContainerDefinitionMap.put(modelContainerDefinition.getModelClassQualifiedName(), modelContainerDefinition);
    }

    public ModelContainerDefinition getModelContainerDefinition(String databaseName, TypeElement typeElement) {
        return mModelContainers.get(databaseName).get(typeElement.getQualifiedName().toString());
    }

    public void addTableDefinition(TableDefinition modelContainerDefinition) {
        Map tableDefinitionMap = mTableDefinitions.get(modelContainerDefinition.databaseName);
        if(tableDefinitionMap == null) {
            tableDefinitionMap = Maps.newHashMap();
            mTableDefinitions.put(modelContainerDefinition.databaseName, tableDefinitionMap);
        }
        tableDefinitionMap.put(modelContainerDefinition.element.asType().toString(), modelContainerDefinition);
    }

    public TableDefinition getTableDefinition(String databaseName, TypeElement typeElement) {
        return mTableDefinitions.get(databaseName).get(typeElement.getQualifiedName().toString());
    }

    public void addModelViewDefinition(ModelViewDefinition modelViewDefinition) {
        Map modelViewDefinitionMap = mModelViewDefinition.get(modelViewDefinition.databaseName);
        if(modelViewDefinitionMap == null) {
            modelViewDefinitionMap = Maps.newHashMap();
            mModelViewDefinition.put(modelViewDefinition.databaseName, modelViewDefinitionMap);
        }
        modelViewDefinitionMap.put(modelViewDefinition.element.asType().toString(), modelViewDefinition);
    }

    public ModelViewDefinition getModelViewDefinition(String databaseName, TypeElement typeElement) {
        return mModelViewDefinition.get(databaseName).get(typeElement.getQualifiedName().toString());
    }

    public Set getTypeConverters() {
        return Sets.newHashSet(mTypeConverters.values());
    }

    public Set getModelContainers(String databaseName) {
        Map modelContainerDefinitionMap = mModelContainers.get(databaseName);
        if(modelContainerDefinitionMap!= null) {
            return  Sets.newHashSet(mModelContainers.get(databaseName).values());
        }
        return Sets.newHashSet();
    }

    public Set getTableDefinitions(String databaseName) {
        Map tableDefinitionMap = mTableDefinitions.get(databaseName);
        if(tableDefinitionMap != null) {
            return Sets.newHashSet(mTableDefinitions.get(databaseName).values());
        }
        return Sets.newHashSet();
    }

    public Set getModelViewDefinitions(String databaseName) {
        Map modelViewDefinitionMap = mModelViewDefinition.get(databaseName);
        if(modelViewDefinitionMap != null) {
            return Sets.newHashSet(mModelViewDefinition.get(databaseName).values());
        } else {
            return Sets.newHashSet();
        }
    }

    public void addMigrationDefinition(MigrationDefinition migrationDefinition) {
        Map> migrationDefinitionMap = mMigrations.get(migrationDefinition.databaseName);
        if(migrationDefinitionMap == null) {
            migrationDefinitionMap = Maps.newHashMap();
            mMigrations.put(migrationDefinition.databaseName, migrationDefinitionMap);
        }

        List migrationDefinitions = migrationDefinitionMap.get(migrationDefinition.version);
        if(migrationDefinitions == null) {
            migrationDefinitions = Lists.newArrayList();
            migrationDefinitionMap.put(migrationDefinition.version, migrationDefinitions);
        }

        if(!migrationDefinitions.contains(migrationDefinition)) {
            migrationDefinitions.add(migrationDefinition);
        }
    }

    public Map> getMigrationsForDatabase(String databaseName) {
        Map> migrationDefinitions = mMigrations.get(databaseName);
        if(migrationDefinitions != null) {
            return migrationDefinitions;
        } else {
            return Maps.newHashMap();
        }
    }

    public void logError(String error, Object...args) {
        getMessager().printMessage(Diagnostic.Kind.ERROR, String.format(error, args));
    }

    @Override
    public void handle(ProcessorManager processorManager, RoundEnvironment roundEnvironment) {
        for(BaseContainerHandler containerHandler: mHandlers) {
            containerHandler.handle(processorManager, roundEnvironment);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy