/*
 * Copyright 2016 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>
 * <code>
    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();
    }
 * </code>
 * </pre>
 */
@Beta
@NotThreadSafe
public class ListenerTracker {

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

    /**
     * Adds {@link EventListener} to specified {@link ListenerService}.
     *
     * @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();
    }
}
