All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.l4.vibe.internal.EventsImpl Maven / Gradle / Ivy

There is a newer version: 0.4.0
Show newest version
package se.l4.vibe.internal;

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import se.l4.vibe.event.EventListener;
import se.l4.vibe.event.EventSeverity;
import se.l4.vibe.event.Events;
import se.l4.vibe.probes.AbstractSampledProbe;
import se.l4.vibe.probes.Probe;
import se.l4.vibe.probes.SampledProbe;

/**
 * Implementation of {@link Events}.
 * 
 * @author Andreas Holstenson
 *
 * @param 
 */
public class EventsImpl
	implements Events
{
	private static final EventListener[] EMPTY = new EventListener[0];
	
	private final EventSeverity severity;
	
	private final Lock listenerLock;
	protected volatile EventListener[] listeners;
	
	private final AtomicLong totalEvents;
	
	public EventsImpl(EventSeverity severity)
	{
		this.severity = severity;
		
		listenerLock = new ReentrantLock();
		listeners = EMPTY;
		
		totalEvents = new AtomicLong();
	}
	
	public void register(T event)
	{
		register(severity, event);
	}
	
	public void register(EventSeverity severity, T event)
	{
		EventListener[] listeners = this.listeners;
		for(EventListener listener : listeners)
		{
			listener.eventRegistered(this, severity, event);
		}
		
		totalEvents.incrementAndGet();
	}
	
	@Override
	public EventSeverity getDefaultSeverity()
	{
		return severity;
	}
	
	@Override
	public void addListener(EventListener listener)
	{
		listenerLock.lock();
		try
		{
			EventListener[] listeners = this.listeners;
			EventListener[] newListeners = new EventListener[listeners.length + 1];
			System.arraycopy(listeners, 0, newListeners, 0, listeners.length);
			newListeners[listeners.length] = listener;
			
			this.listeners = newListeners;
		}
		finally
		{
			listenerLock.unlock();
		}
	}
	
	@Override
	public void removeListener(EventListener listener)
	{
		listenerLock.lock();
		try
		{
			EventListener[] listeners = this.listeners;
			
			int index = -1;
			for(int i=0, n=listeners.length; i[] newListeners = new EventListener[listeners.length - 1];
			
			System.arraycopy(listeners, 0, newListeners, 0, index);
			if(index < listeners.length - 1)
	        {
	        	System.arraycopy(listeners, index + 1, newListeners, index, listeners.length- index - 1);
	        }
	        
			this.listeners = newListeners;
		}
		finally
		{
			listenerLock.unlock();
		}
	}
	
	@Override
	public Probe getTotalEventsProbe()
	{
		return new Probe()
		{
			@Override
			public Long read()
			{
				return totalEvents.longValue();
			}
		};
	}

	@Override
	public SampledProbe getEventsProbe()
	{
		return new AbstractSampledProbe()
		{
			private long lastValue;
			
			@Override
			public Long peek()
			{
				return totalEvents.longValue() - lastValue;
			}
			
			@Override
			protected Long sample0()
			{
				long current = totalEvents.longValue();
				long sinceLastSample = current - lastValue;
				lastValue = current;
				
				return sinceLastSample;
			}
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy