CatalogReplicaFailureClassifier.java

package com.ecommerce.catalog.infrastructure.datasource;

import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.CannotGetJdbcConnectionException;

import java.sql.SQLException;
import java.sql.SQLNonTransientConnectionException;
import java.sql.SQLRecoverableException;
import java.sql.SQLTransientConnectionException;
import java.util.Locale;

final class CatalogReplicaFailureClassifier {

    private static final int MAX_CAUSE_DEPTH = 16;

    private CatalogReplicaFailureClassifier() {
    }

    static boolean isConnectionFailure(Throwable failure) {
        Throwable current = failure;
        int depth = 0;
        while (current != null && depth++ < MAX_CAUSE_DEPTH) {
            if (current instanceof CannotGetJdbcConnectionException
                    || current instanceof DataAccessResourceFailureException
                    || current instanceof SQLTransientConnectionException
                    || current instanceof SQLNonTransientConnectionException
                    || current instanceof SQLRecoverableException) {
                return true;
            }
            if (current instanceof SQLException sqlException) {
                String sqlState = sqlException.getSQLState();
                if (sqlState != null && sqlState.startsWith("08")) {
                    return true;
                }
                String message = sqlException.getMessage();
                if (sqlState == null && message != null
                        && message.toLowerCase(Locale.ROOT).contains("closed")) {
                    return true;
                }
            }
            current = current.getCause();
        }
        return false;
    }
}