TransactionHandler.java

package eu.javaexperience.datastorage;

import java.io.IOException;

import eu.javaexperience.reflect.Mirror;

public abstract class TransactionHandler<T>
{
	protected int retry;
	protected DataStorage storage;
	protected String key;
	
	public TransactionHandler(DataStorage storage, String key, int retry)
	{
		this.storage = storage;
		this.key = key;
		this.retry = retry;
	}
	
	protected abstract T doExecute(DataTransaction tr) throws Exception;
	
	public T execute()
	{
		int retryCount = 0;
		do
		{
			DataTransaction tr = storage.startTransaction(key);
			try
			{
				T ret = doExecute(tr);
				tr.commit();
				return ret;
			}
			catch(TransactionException ex)
			{
				if(null != tr)
				{
					tr.rollback();
				}
				if(retryCount++ == retry)
				{
					Mirror.propagateAnyway(ex);
				}
			}
			catch(Exception e)
			{
				Mirror.propagateAnyway(e);
			}
			finally
			{
				if(null != tr)
				{
					try
					{
						tr.close();
					}
					catch (IOException e)
					{
						e.printStackTrace();
					}
				}
			}
		}
		while(true);
	}
}