/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.uima.ducc.ws.server;

import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
import org.apache.uima.ducc.ws.IListenerOrchestrator;

public class DuccListeners {

	private static DuccListeners duccListeners = new DuccListeners();
	
	private static ConcurrentHashMap<IListenerOrchestrator,IListenerOrchestrator> mapListenerOrchestrator = new ConcurrentHashMap<IListenerOrchestrator,IListenerOrchestrator>();
	
	public static DuccListeners getInstance() {
		return duccListeners;
	}
	
	public void register(IListenerOrchestrator listenerOrchestrator) {
		mapListenerOrchestrator.put(listenerOrchestrator, listenerOrchestrator);
	}
	
	public void unregister(IListenerOrchestrator listenerOrchestrator) {
		mapListenerOrchestrator.remove(listenerOrchestrator);
	}
	
	public void update(OrchestratorStateDuccEvent duccEvent) {
		Enumeration<IListenerOrchestrator> listeners = mapListenerOrchestrator.keys();
		while(listeners.hasMoreElements()) {
			IListenerOrchestrator listener = listeners.nextElement();
			listener.update(duccEvent);
		}
	}
}
