/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.connection.service.internal;

import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import org.eclipse.osee.connection.service.IConnectorListener;
import org.eclipse.osee.connection.service.IServiceConnector;

public class EventNotifier {

   private final ExecutorService executorService = Executors.newCachedThreadPool();

   private final CopyOnWriteArrayList<IConnectorListener> connectorListener =
      new CopyOnWriteArrayList<IConnectorListener>();

   void notifyConnectorsAdded(final Collection<IServiceConnector> connectors) {
      executorService.submit(new Runnable() {
         // copy the collection of new connectors
         final ArrayList<IServiceConnector> newConnectors = new ArrayList<>(connectors);

         @Override
         public void run() {
            for (IConnectorListener listener : connectorListener) {
               try {
                  listener.onConnectorsAdded(newConnectors);
               } catch (Exception e) {
                  Activator.log(Level.SEVERE, "Error processing listeners for connector added event", e);
               }
            }
         }
      });

   }

   void notifyConnectorRemoved(final IServiceConnector connector) {
      executorService.submit(new Runnable() {

         @Override
         public void run() {
            for (IConnectorListener listener : connectorListener) {
               try {
                  listener.onConnectorRemoved(connector);
               } catch (Exception e) {
                  Activator.log(Level.SEVERE, "Error processing listeners for connector remove event", e);
               }
            }
         }

      });

   }

   void notifyServiceStopped() {
      for (IConnectorListener listener : connectorListener) {
         listener.onConnectionServiceStopped();
      }
   }

   void addListener(IConnectorListener listener) {
      connectorListener.add(listener);
   }

   void removeListener(IConnectorListener listener) {
      connectorListener.remove(listener);
   }
}
