/*
 * Copyright (c) 2011, Rickard Öberg.
 * Copyright (c) 2012, Niclas Hedhman.
 *
 * 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.apache.zest.runtime.activation;

import java.util.ArrayList;
import java.util.List;
import org.apache.zest.api.activation.ActivationEvent;
import org.apache.zest.api.activation.ActivationEventListener;
import org.apache.zest.api.activation.ActivationEventListenerRegistration;

/**
 * Internal helper for managing registrations and firing events
 */
/* package */ class ActivationEventListenerSupport
    implements ActivationEventListenerRegistration, ActivationEventListener
{
    protected List<ActivationEventListener> listeners = new ArrayList<>();

    @Override
    public void registerActivationEventListener( ActivationEventListener listener )
    {
        List<ActivationEventListener> newListeners = new ArrayList<>();
        newListeners.addAll( listeners );
        newListeners.add( listener );
        listeners = newListeners;
    }

    @Override
    public void deregisterActivationEventListener( ActivationEventListener listener )
    {
        List<ActivationEventListener> newListeners = new ArrayList<>();
        newListeners.addAll( listeners );
        newListeners.remove( listener );
        listeners = newListeners;
    }

    /* package */ void fireEvent( ActivationEvent event )
        throws Exception
    {
        for( ActivationEventListener listener : listeners )
        {
            listener.onEvent( event );
        }
    }

    @Override
    public void onEvent( ActivationEvent event )
        throws Exception
    {
        fireEvent( event );
    }
}
