/*
* Copyright 2011 LMAX Ltd.
*
* 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 com.lmax.disruptor.dsl;
import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.EventProcessor;
import com.lmax.disruptor.SequenceBarrier;
import java.util.*;
class EventProcessorRepository<T> implements Iterable<EventProcessorInfo<T>>
{
private final Map<EventHandler<?>, EventProcessorInfo<T>> eventProcessorInfoByHandler = new IdentityHashMap<EventHandler<?>, EventProcessorInfo<T>>();
private final Map<EventProcessor, EventProcessorInfo<T>> eventProcessorInfoByEventProcessor = new IdentityHashMap<EventProcessor, EventProcessorInfo<T>>();
public void add(final EventProcessor eventprocessor,
final EventHandler<T> handler,
final SequenceBarrier barrier)
{
final EventProcessorInfo<T> eventProcessorInfo = new EventProcessorInfo<T>(eventprocessor, handler, barrier);
eventProcessorInfoByHandler.put(handler, eventProcessorInfo);
eventProcessorInfoByEventProcessor.put(eventprocessor, eventProcessorInfo);
}
public void add(final EventProcessor processor)
{
final EventProcessorInfo<T> eventProcessorInfo = new EventProcessorInfo<T>(processor, null, null);
eventProcessorInfoByEventProcessor.put(processor, eventProcessorInfo);
}
public EventProcessor[] getLastEventProcessorsInChain()
{
List<EventProcessor> lastEventProcessors = new ArrayList<EventProcessor>();
for (EventProcessorInfo<T> eventProcessorInfo : eventProcessorInfoByEventProcessor.values())
{
if (eventProcessorInfo.isEndOfChain())
{
lastEventProcessors.add(eventProcessorInfo.getEventProcessor());
}
}
return lastEventProcessors.toArray(new EventProcessor[lastEventProcessors.size()]);
}
public EventProcessor getEventProcessorFor(final EventHandler<T> handler)
{
final EventProcessorInfo<?> eventprocessorInfo = getEventProcessorInfo(handler);
if (eventprocessorInfo == null)
{
throw new IllegalArgumentException("The event handler " + handler + " is not processing events.");
}
return eventprocessorInfo.getEventProcessor();
}
public void unMarkEventProcessorsAsEndOfChain(final EventProcessor... barrierEventProcessors)
{
for (EventProcessor barrierEventProcessor : barrierEventProcessors)
{
getEventProcessorInfo(barrierEventProcessor).markAsUsedInBarrier();
}
}
public Iterator<EventProcessorInfo<T>> iterator()
{
return eventProcessorInfoByEventProcessor.values().iterator();
}
public SequenceBarrier getBarrierFor(final EventHandler<T> handler)
{
final EventProcessorInfo<T> eventProcessorInfo = getEventProcessorInfo(handler);
return eventProcessorInfo != null ? eventProcessorInfo.getBarrier() : null;
}
private EventProcessorInfo<T> getEventProcessorInfo(final EventHandler<T> handler)
{
return eventProcessorInfoByHandler.get(handler);
}
private EventProcessorInfo<T> getEventProcessorInfo(final EventProcessor barrierEventProcessor)
{
return eventProcessorInfoByEventProcessor.get(barrierEventProcessor);
}
}