/**
 *
 * Copyright 2005 the original author or authors.
 *
 *  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.gbean.kernel.standard;

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

import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList;
import org.gbean.kernel.KernelMonitor;
import org.gbean.kernel.ServiceMonitor;
import org.gbean.kernel.ServiceEvent;
import org.gbean.kernel.KernelErrorsError;

/**
 * The KernelMonitorBroadcaster broadcasts kernel events to registered kernel monitors.
 *
 * @author Dain Sundstrom
 * @version $Id$
 * @since 1.0
 */
public class KernelMonitorBroadcaster implements KernelMonitor {
    /**
     * The monitors of kernel events.
     */
    private final CopyOnWriteArrayList kernelMonitors = new CopyOnWriteArrayList();

    /**
     * Adds a kernel monitor.
     *
     * @param kernelMonitor the kernel monitor to add
     */
    public void addKernelMonitor(KernelMonitor kernelMonitor) {
        kernelMonitors.addIfAbsent(kernelMonitor);
    }

    /**
     * Removes a kernel monitor.
     *
     * @param kernelMonitor the kernel monitor to remove
     */
    public void removeKernelMonitor(KernelMonitor kernelMonitor) {
        kernelMonitors.remove(kernelMonitor);
    }

    /**
     * {@inheritDoc}
     */
    public void serviceNotificationError(ServiceMonitor serviceMonitor, ServiceEvent serviceEvent, Throwable throwable) {
        List errors = new ArrayList();
        for (Iterator iterator = kernelMonitors.iterator(); iterator.hasNext();) {
            KernelMonitor kernelMonitor = (KernelMonitor) iterator.next();
            try {
                kernelMonitor.serviceNotificationError(serviceMonitor, serviceEvent, throwable);
            } catch (RuntimeException ignored) {
                // ignore - we did our best to notify the world
            } catch (Error e) {
                errors.add(e);
            }
        }
        if (!errors.isEmpty()) {
            throw new KernelErrorsError(errors);
        }
    }
}
