/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.event;

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

import javax.annotation.concurrent.NotThreadSafe;

import org.apache.commons.lang3.tuple.Pair;

import com.google.common.annotations.Beta;
import com.google.common.collect.Lists;

/**
 * Utility to keeps track of registered Listeners.
 * <p>
 * Usage Example:
 * <pre>
    private ListenerTracker listeners;

    {@code @Activate}
    protected void activate() {
        listeners = new ListenerTracker();
        listeners.addListener(mastershipService, new InternalMastershipListener())
                 .addListener(deviceService, new InternalDeviceListener())
                 .addListener(linkService, new InternalLinkListener())
                 .addListener(topologyService, new InternalTopologyListener())
                 .addListener(hostService, new InternalHostListener());
    }

    {@code @Deactivate}
    protected void deactivate() {
        listeners.removeListeners();
    }
 * </pre>
 */
@Beta
@NotThreadSafe
public class ListenerTracker {

    @SuppressWarnings("rawtypes")
    private List<Pair<ListenerService, EventListener>> listeners = new ArrayList<>();

    /**
     * Adds {@link EventListener} to specified {@link ListenerService}.
     *
     * @param <E> event
     * @param <L> listener
     * @param service {@link ListenerService}
     * @param listener {@link EventListener}
     * @return self
     */
    public <E extends Event<?, ?>, L extends EventListener<E>>
    ListenerTracker addListener(ListenerService<E, L> service, L listener) {
        service.addListener(listener);
        listeners.add(Pair.of(service, listener));
        return this;
    }

    /**
     * Removes all listeners in reverse order they have been registered.
     */
    public void removeListeners() {
        Lists.reverse(listeners)
            .forEach(r -> r.getLeft().removeListener(r.getRight()));
        listeners.clear();
    }
}
