alibaba/transmittable-thread-local

View on GitHub
ttl-core/src/main/java/com/alibaba/crr/composite/CompositeCrrTransmitCallback.java

Summary

Maintainability
B
5 hrs
Test Coverage
package com.alibaba.crr.composite;

import com.alibaba.crr.CrrTransmitCallback;
import edu.umd.cs.findbugs.annotations.NonNull;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.logging.Level;
import java.util.logging.Logger;

import static com.alibaba.ttl3.internal.util.Utils.propagateIfFatal;

/**
 * Composite CrrTransmitCallback.
 *
 * @author Jerry Lee (oldratlee at gmail dot com)
 * @see CrrTransmitCallback
 */
public final class CompositeCrrTransmitCallback {
    private static final Logger logger = Logger.getLogger(CompositeCrrTransmitCallback.class.getName());

    private final Set<CrrTransmitCallback> registeredCrrTransmitCallbackSet = new CopyOnWriteArraySet<>();

    Object beforeReplay() {
        Set<CrrTransmitCallback> callbacks = new HashSet<>(registeredCrrTransmitCallbackSet);
        for (CrrTransmitCallback cb : callbacks) {
            try {
                cb.beforeReplay();
            } catch (Throwable t) {
                propagateIfFatal(t);
                if (logger.isLoggable(Level.WARNING)) {
                    logger.log(Level.WARNING, "exception when beforeReplay for crrTransmitCallback " + cb +
                            "(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
                }
            }
        }
        return callbacks;
    }

    Object afterReplay(Object data) {
        @SuppressWarnings("unchecked")
        Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
        for (CrrTransmitCallback cb : callbacks) {
            try {
                cb.afterReplay();
            } catch (Throwable t) {
                propagateIfFatal(t);
                if (logger.isLoggable(Level.WARNING)) {
                    logger.log(Level.WARNING, "exception when afterReplay for crrTransmitCallback " + cb +
                            "(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
                }
            }
        }
        return data;
    }

    Object beforeRestore(Object data) {
        @SuppressWarnings("unchecked")
        Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
        for (CrrTransmitCallback cb : callbacks) {
            try {
                cb.beforeRestore();
            } catch (Throwable t) {
                propagateIfFatal(t);
                if (logger.isLoggable(Level.WARNING)) {
                    logger.log(Level.WARNING, "exception when beforeRestore for crrTransmitCallback " + cb +
                            "(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
                }
            }
        }
        return data;
    }

    void afterRestore(Object data) {
        @SuppressWarnings("unchecked")
        Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
        for (CrrTransmitCallback cb : callbacks) {
            try {
                cb.afterRestore();
            } catch (Throwable t) {
                propagateIfFatal(t);
                if (logger.isLoggable(Level.WARNING)) {
                    logger.log(Level.WARNING, "exception when afterRestore for crrTransmitCallback " + cb +
                            "(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
                }
            }
        }
    }


    /**
     * Register the {@link CrrTransmitCallback}.
     *
     * @return true if the input callback is not registered
     * @see #unregisterCallback(CrrTransmitCallback)
     */
    public boolean registerCallback(@NonNull CrrTransmitCallback callback) {
        return registeredCrrTransmitCallbackSet.add(callback);
    }

    /**
     * Unregister the {@link CrrTransmitCallback}.
     *
     * @return true if the input callback is registered
     * @see #registerCallback(CrrTransmitCallback)
     */
    public boolean unregisterCallback(@NonNull CrrTransmitCallback callback) {
        return registeredCrrTransmitCallbackSet.remove(callback);
    }
}