JgitStorageHibernateSchemaFilterProvider.java

package com.taxonomy.dsl.storage;

import java.util.Locale;
import java.util.Set;

import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.mapping.Table;
import org.hibernate.tool.schema.spi.SchemaFilter;
import org.hibernate.tool.schema.spi.SchemaFilterProvider;

/**
 * Keeps every Flyway-owned JGit Core table outside Hibernate schema mutation.
 *
 * <p>The entities remain mapped and are still included in schema validation. Only
 * create, migrate, truncate and drop operations exclude the complete released Core
 * schema. This is deliberately a table allow-list rather than a {@code git_*}
 * wildcard so an unrelated application table cannot silently escape Hibernate's
 * lifecycle.</p>
 */
public final class JgitStorageHibernateSchemaFilterProvider implements SchemaFilterProvider {

    private static final Set<String> FLYWAY_OWNED_TABLES = Set.of(
            "git_packs",
            "git_reflog",
            "git_repository_lock",
            "git_pack_chunks");

    private static final SchemaFilter MUTATION_FILTER = new SchemaFilter() {
        @Override
        public boolean includeNamespace(Namespace namespace) {
            return true;
        }

        @Override
        public boolean includeTable(Table table) {
            return !FLYWAY_OWNED_TABLES.contains(table.getName().toLowerCase(Locale.ROOT));
        }

        @Override
        public boolean includeSequence(Sequence sequence) {
            return true;
        }
    };

    @Override
    public SchemaFilter getCreateFilter() {
        return MUTATION_FILTER;
    }

    @Override
    public SchemaFilter getDropFilter() {
        return MUTATION_FILTER;
    }

    @Override
    public SchemaFilter getTruncatorFilter() {
        return MUTATION_FILTER;
    }

    @Override
    public SchemaFilter getMigrateFilter() {
        return MUTATION_FILTER;
    }

    @Override
    public SchemaFilter getValidateFilter() {
        return SchemaFilter.ALL;
    }
}