EntityRelationDiagramColumnWrapperGenerator.java

package ru.volnenko.maven.plugin.databasedoc.generator.impl;

import lombok.NonNull;
import ru.volnenko.maven.plugin.databasedoc.enumerated.ErdType;
import ru.volnenko.maven.plugin.databasedoc.generator.IEntityRelationDiagramColumnWrapperGenerator;
import ru.volnenko.maven.plugin.databasedoc.model.impl.Column;
import ru.volnenko.maven.plugin.databasedoc.model.impl.ColumnWrapper;
import ru.volnenko.maven.plugin.databasedoc.model.impl.CreateTable;
import ru.volnenko.maven.plugin.databasedoc.util.StringUtil;

import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public final class EntityRelationDiagramColumnWrapperGenerator extends AbstractGenerator implements IEntityRelationDiagramColumnWrapperGenerator {

    @NonNull
    private final EntityRelationDiagramColumnGenerator entityRelationDiagramColumnGenerator = new EntityRelationDiagramColumnGenerator();

    @NonNull
    private CreateTable createTable = new CreateTable();

    @NonNull
    private List<ColumnWrapper> columnWrappers = Collections.emptyList();

    @NonNull
    private ErdType erdType = ErdType.PHYSIC;

    @Override
    @NonNull
    public ErdType erdType() {
        return erdType;
    }

    @Override
    @NonNull
    public EntityRelationDiagramColumnWrapperGenerator erdType(@NonNull final ErdType erdType) {
        this.erdType = erdType;
        return this;
    }

    @NonNull
    @Override
    public IEntityRelationDiagramColumnWrapperGenerator createTable(@NonNull final CreateTable createTable) {
        this.createTable = createTable;
        return this;
    }

    @NonNull
    @Override
    public IEntityRelationDiagramColumnWrapperGenerator stringBuilder(@NonNull final StringBuilder stringBuilder) {
        this.stringBuilder = stringBuilder;
        return this;
    }

    @NonNull
    @Override
    public IEntityRelationDiagramColumnWrapperGenerator columnWrappers(@NonNull final List<ColumnWrapper> columnWrappers) {
        this.columnWrappers = columnWrappers;
        return this;
    }

    private static final Predicate<ColumnWrapper> PK_PREDICATE = new Predicate<ColumnWrapper>() {
        @Override
        public boolean test(ColumnWrapper columnWrapper) {
            if (columnWrapper == null) return false;
            if (columnWrapper.getColumn() == null) return false;
            if (columnWrapper.getColumn().getConstraints() == null) return false;
            if (columnWrapper.getColumn().getConstraints().getPrimaryKey() == null) return false;
            return columnWrapper.getColumn().getConstraints().getPrimaryKey();
        }
    };

    private static final Predicate<ColumnWrapper> NOT_PK_PREDICATE = new Predicate<ColumnWrapper>() {
        @Override
        public boolean test(ColumnWrapper columnWrapper) {
            if (columnWrapper == null) return false;
            if (columnWrapper.getColumn() == null) return false;
            if (columnWrapper.getColumn().getConstraints() == null) return false;
            if (columnWrapper.getColumn().getConstraints().getPrimaryKey() == null) return false;
            return !columnWrapper.getColumn().getConstraints().getPrimaryKey();
        }
    };

    private boolean hasPK() {
        return columnWrappers.stream().anyMatch(PK_PREDICATE);
    }

    @NonNull
    private String tableName() {
        @NonNull final String tableName = StringUtil.format(createTable.getTableName());
        if (erdType.isPhysic()) return "\"" + tableName + "\"";
        if (erdType.isLogic()) {
            final String name = createTable.getRemarks();
            if (name == null || name.isEmpty()) return "\"" + tableName + "\"";
            return "\"" + name + "\" as " + tableName;
        }
        return "\"" + tableName + "\"";
    }

    @NonNull
    @Override
    public StringBuilder append(@NonNull final StringBuilder stringBuilder) {
        stringBuilder.append("entity " + tableName() + " {");
        stringBuilder.append("\n");
        if (hasPK()) {
            for (final ColumnWrapper columnWrapper: columnWrappers.stream().filter(PK_PREDICATE).collect(Collectors.toList())) {
                final Column column = columnWrapper.getColumn();
                if (column == null) continue;
                entityRelationDiagramColumnGenerator.erdType(erdType).column(column).append(stringBuilder);

            }
            stringBuilder.append("---\n");
        }
        for (final ColumnWrapper columnWrapper: columnWrappers.stream().filter(NOT_PK_PREDICATE).collect(Collectors.toList())) {
            final Column column = columnWrapper.getColumn();
            if (column == null) continue;
            entityRelationDiagramColumnGenerator.erdType(erdType).column(columnWrapper.getColumn()).append(stringBuilder);
        }
        stringBuilder.append("}");
        stringBuilder.append("\n");
        stringBuilder.append("\n");
        return stringBuilder;
    }

}