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

net.yudichev.jiotty.common.lang.Closeable Maven / Gradle / Ivy

package net.yudichev.jiotty.common.lang;

import org.slf4j.Logger;

import java.util.Collection;

import static com.google.common.collect.ImmutableList.copyOf;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static java.util.Arrays.asList;
import static net.yudichev.jiotty.common.lang.CompositeException.runForAll;
import static net.yudichev.jiotty.common.lang.MoreThrowables.asUnchecked;

@SuppressWarnings("OverloadedVarargsMethod")
public interface Closeable extends AutoCloseable {
    @SuppressWarnings("OverloadedMethodsWithSameNumberOfParameters")
    static Closeable forCloseables(Closeable... closeables) {
        return forCloseables(asList(closeables));
    }

    @SuppressWarnings("OverloadedMethodsWithSameNumberOfParameters")
    static Closeable forCloseables(AutoCloseable... closeables) {
        return forCloseables(asList(closeables));
    }

    static Closeable forActions(Runnable... actions) {
        return forActions(copyOf(actions));
    }

    static Closeable forCloseables(Collection closeables) {
        //noinspection Convert2MethodRef getting weird compiler error
        return forActions(closeables.stream()
                .map(closeable -> () -> asUnchecked(() -> closeable.close()))
                .collect(toImmutableList()));
    }

    static Closeable forActions(Collection actions) {
        return idempotent(() -> runForAll(actions, Runnable::run));
    }

    static Closeable idempotent(AutoCloseable closeable) {
        return new BaseIdempotentCloseable() {
            @Override
            protected void doClose() {
                asUnchecked(closeable::close);
            }
        };
    }

    static Closeable noop() {
        return () -> {};
    }

    static void closeIfNotNull(AutoCloseable closeable) {
        if (closeable != null) {
            asUnchecked(closeable::close);
        }
    }

    static void closeIfNotNull(Closeable... closeables) {
        for (Closeable closeable : closeables) {
            closeIfNotNull(closeable);
        }
    }

    static void closeIfNotNull(AutoCloseable... closeable) {
        for (AutoCloseable autoCloseable : closeable) {
            closeIfNotNull(autoCloseable);
        }
    }

    static void closeSafelyIfNotNull(Logger logger, Closeable... closeables) {
        for (Closeable closeable : closeables) {
            closeSafelyIfNotNull(logger, closeable);
        }
    }

    static void closeSafelyIfNotNull(Logger logger, AutoCloseable closeable) {
        if (closeable != null) {
            try {
                asUnchecked(closeable::close);
            } catch (RuntimeException e) {
                logger.warn("Failed to close {}", closeable, e);
            }
        }
    }

    static void closeSafelyIfNotNull(Logger logger, AutoCloseable... closeables) {
        for (AutoCloseable closeable : closeables) {
            closeSafelyIfNotNull(logger, closeable);
        }
    }

    @Override
    void close();

    default void closeSafely(Logger logger) {
        closeSafelyIfNotNull(logger, this);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy