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

io.goodforgod.testcontainers.extensions.cassandra.ScriptCassandraMigrationEngine Maven / Gradle / Ivy

package io.goodforgod.testcontainers.extensions.cassandra;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;

public final class ScriptCassandraMigrationEngine extends AbstractDropCassandraMigrationEngine {

    public ScriptCassandraMigrationEngine(CassandraConnection connection) {
        super(connection);
    }

    private static List getFilesFromLocations(List locations) {
        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
        return locations.stream()
                .flatMap(location -> {
                    final URL url = loader.getResource(location);
                    final String path = url.getPath();
                    final File file = new File(path);
                    return file.isDirectory()
                            ? Arrays.stream(file.listFiles()).sorted(Comparator.comparing(File::getName))
                            : Stream.of(file);
                })
                .collect(Collectors.toList());
    }

    @Override
    public void apply(@NotNull List locations) {
        if (locations.isEmpty()) {
            logger.warn("Empty locations for schema migration for engine '{}' for connection: {}",
                    getClass().getSimpleName(), connection);
            return;
        }

        logger.debug("Starting schema migration for engine '{}' for connection: {}",
                getClass().getSimpleName(), connection);

        final Set validLocations = locations.stream()
                .filter(Objects::nonNull)
                .filter(location -> !location.isBlank())
                .collect(Collectors.toSet());

        if (validLocations.isEmpty()) {
            throw new IllegalArgumentException("Found 0 valid migration paths: " + locations);
        }

        final List filesToUseForMigration = getFilesFromLocations(locations);
        for (File file : filesToUseForMigration) {
            try {
                final String cql = Files.readString(file.toPath());
                final List queries = Arrays.stream(cql.split(";"))
                        .map(String::trim)
                        .filter(query -> !query.isBlank())
                        .map(query -> query.trim() + ";")
                        .collect(Collectors.toList());

                for (String query : queries) {
                    connection.execute(query);
                }
            } catch (IOException e) {
                throw new IllegalArgumentException("Illegal file for migration: " + file.getPath(), e);
            }
        }

        logger.info("Finished schema migration for engine '{}' for connection: {}",
                getClass().getSimpleName(), connection);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy