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

com.infobip.testcontainers.InitializerBase Maven / Gradle / Ivy

The newest version!
package com.infobip.testcontainers;

import org.springframework.context.*;
import org.springframework.context.event.ContextClosedEvent;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.lifecycle.Startable;
import org.testcontainers.utility.TestcontainersConfiguration;

import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public abstract class InitializerBase
        implements ApplicationContextInitializer, ApplicationListener {

    public static final String PORT_PLACEHOLDER = "";
    public static final String HOST_PLACEHOLDER = "";

    protected static final Pattern GENERIC_URL_WITH_PORT_GROUP_PATTERN = Pattern.compile(".*://.*:(\\d+)(/.*)?");

    private final AtomicReference container = new AtomicReference<>();

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        C value = container.get();
        if (value != null) {
            value.stop();
        }
    }

    protected void start(C container) {
        this.container.set(container);
        container.start();
    }

    protected String replaceHostAndPortPlaceholders(String source,
                                                    Container container,
                                                    Integer originalContainerPort) {
        return source.replaceAll(HOST_PLACEHOLDER, container.getHost())
                     .replaceAll(PORT_PLACEHOLDER, container.getMappedPort(originalContainerPort).toString());
    }

    protected Optional resolveStaticPort(String connectionString, Pattern urlPatternWithPortGroup) {
        return Optional.ofNullable(connectionString)
                       .map(urlPatternWithPortGroup::matcher)
                       .filter(Matcher::matches)
                       .map(matcher -> matcher.group(1))
                       .map(Integer::valueOf);
    }

    protected Optional resolveStaticPort(Collection connectionStrings,
                                                  Pattern urlPatternWithPortGroup) {
        return connectionStrings.stream()
                                .flatMap(connectionString -> resolveStaticPort(connectionString,
                                                                               urlPatternWithPortGroup).stream())
                                .findFirst();
    }

    protected void bindPort(Container container, Integer hostPort, Integer containerPort) {
        container.setPortBindings(Collections.singletonList(hostPort + ":" + containerPort));
    }

    protected , T extends GenericContainer> T handleReusable(T container) {

        if (TestcontainersConfiguration.getInstance().environmentSupportsReuse()) {
            container.withReuse(true);
        }

        return container;
    }

    protected void registerContainerAsBean(ConfigurableApplicationContext applicationContext) {
        var c = container.get();
        var containerClassName = c.getClass().getSimpleName();
        var beanName = Character.toLowerCase(containerClassName.charAt(0)) + containerClassName.substring(1);
        applicationContext.getBeanFactory()
                          .registerSingleton(beanName, c);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy