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

se.l4.vibe.probes.AbstractSampler Maven / Gradle / Ivy

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

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

/**
 * Abstract implementation of {@link Sampler}.
 * 
 * @author Andreas Holstenson
 *
 * @param 
 */
public abstract class AbstractSampler
	implements Sampler
{
	private static final SampleListener[] EMPTY = new SampleListener[0];
	
	private final Lock listenerLock;
	protected volatile SampleListener[] listeners;
	
	public AbstractSampler()
	{
		listenerLock = new ReentrantLock();
		listeners = EMPTY;
	}
	
	@Override
	public void addListener(SampleListener listener)
	{
		listenerLock.lock();
		try
		{
			SampleListener[] listeners = this.listeners;
			SampleListener[] newListeners = new SampleListener[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(SampleListener listener)
	{
		listenerLock.lock();
		try
		{
			SampleListener[] listeners = this.listeners;
			
			int index = -1;
			for(int i=0, n=listeners.length; i[] newListeners = new SampleListener[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();
		}
	}
	
	protected Entry createEntry(long time, T value)
	{
		return new EntryImpl(time, value);
	}

	public static class EntryImpl
		implements Sampler.Entry
	{
		private final long time;
		private final T value;
	
		public EntryImpl(long time, T value)
		{
			this.time = time;
			this.value = value;
		}
		
		@Override
		public long getTime()
		{
			return time;
		}
		
		@Override
		public T getValue()
		{
			return value;
		}
		
		@Override
		public String toString()
		{
			return "Entry{time=" + time + ", value=" + value + "}";
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy