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

io.split.integrations.IntegrationsConfig Maven / Gradle / Ivy

package io.split.integrations;

import io.split.client.impressions.ImpressionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

public class IntegrationsConfig {

    private static final Logger _log = LoggerFactory.getLogger(IntegrationsConfig.class);

    private List _impressionListeners;

    private IntegrationsConfig(List impressionListeners) {
        _impressionListeners = impressionListeners;
    }

    public List getImpressionsListeners(Execution execution) {
        List filtered = new ArrayList<>();
        for (ImpressionListenerWithMeta listener: _impressionListeners) {
            if (listener.execution().equals(execution)) {
                filtered.add(listener);
            }
        }
        return filtered;
    }

    // This method is used to avoid introducing breaking changes, since the impressions listener
    // is a root-level config option (that method will be deprecated soon).
    public void addStandardImpressionListener(ImpressionListener listener, int queueSize) {
        if (queueSize <= 0) {
            throw new IllegalArgumentException("An ImpressionListener was provided, but its capacity was non-positive: " + queueSize);
        }
        _impressionListeners.add(new ImpressionListenerWithMeta(listener, Execution.ASYNC, queueSize));
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {

        private List _listeners;
        private boolean _newRelicEnabled;

        public Builder() {
            _newRelicEnabled = false;
            _listeners = new ArrayList<>();
        }

        public Builder impressionsListener(ImpressionListener listener, int queueSize) {
            return impressionsListener(listener, queueSize, Execution.ASYNC);
        }

        public Builder impressionsListener(ImpressionListener listener, int queueSize, Execution executionType) {
            if (queueSize <= 0) {
                throw new IllegalArgumentException("An ImpressionListener was provided, but its capacity was non-positive: " + queueSize);
            }
            _listeners.add(new ImpressionListenerWithMeta(listener, executionType, queueSize));
            return this;
        }

        public Builder newRelicImpressionListener() {
            if (_newRelicEnabled) {
                _log.warn("You can only add one new relic integration instance. Ignoring");
                return this;
            }

            try {
                _listeners.add(new ImpressionListenerWithMeta(new NewRelicListener(), Execution.SYNC, 0));
                _log.info("Added New Relic Impression Listener");
                _newRelicEnabled = true;
            } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) {
                _log.warn("New Relic agent not found. Continuing without it", e);
            } catch (Exception e) {
                _log.warn("Failed to check if the New Relic Agent is running", e);
            }
            return this;
        }

        public IntegrationsConfig build() {
            return new IntegrationsConfig(_listeners);
        }
    }

    public enum Execution {
        SYNC,
        ASYNC
    }

    public static class ImpressionListenerWithMeta {
        private final ImpressionListener _listener;
        private final Execution _execution;
        private final int _queueSize;

        ImpressionListenerWithMeta(ImpressionListener listener, Execution execution, int queueSize) {
            _listener = listener;
            _execution = execution;
            _queueSize = queueSize;
        }

        public ImpressionListener listener() {
            return _listener;
        }

        Execution execution() {
            return _execution;
        }

        public int queueSize() {
            return _queueSize;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy