package org.multiverse.stms.gamma;
import org.multiverse.api.*;
import org.multiverse.api.callables.*;
import org.multiverse.api.exceptions.*;
import static org.multiverse.api.TxnThreadLocal.*;
public class GammaOrElseBlock implements OrElseBlock{
@Override
public <E> E execute(TxnCallable<E> either, TxnCallable<E> orelse){
try{
return executeChecked(either,orelse);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public <E> E executeChecked(TxnCallable<E> either, TxnCallable<E> orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
return either.call(txn);
}catch(RetryError retry){
return orelse.call(txn);
}
}
@Override
public int execute(TxnIntCallable either, TxnIntCallable orelse){
try{
return executeChecked(either,orelse);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public int executeChecked(TxnIntCallable either, TxnIntCallable orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
return either.call(txn);
}catch(RetryError retry){
return orelse.call(txn);
}
}
@Override
public long execute(TxnLongCallable either, TxnLongCallable orelse){
try{
return executeChecked(either,orelse);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public long executeChecked(TxnLongCallable either, TxnLongCallable orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
return either.call(txn);
}catch(RetryError retry){
return orelse.call(txn);
}
}
@Override
public double execute(TxnDoubleCallable either, TxnDoubleCallable orelse){
try{
return executeChecked(either,orelse);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public double executeChecked(TxnDoubleCallable either, TxnDoubleCallable orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
return either.call(txn);
}catch(RetryError retry){
return orelse.call(txn);
}
}
@Override
public boolean execute(TxnBooleanCallable either, TxnBooleanCallable orelse){
try{
return executeChecked(either,orelse);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public boolean executeChecked(TxnBooleanCallable either, TxnBooleanCallable orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
return either.call(txn);
}catch(RetryError retry){
return orelse.call(txn);
}
}
@Override
public void execute(TxnVoidCallable either, TxnVoidCallable orelse){
try{
executeChecked(either,orelse);
return;
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new InvisibleCheckedException(e);
}
}
@Override
public void executeChecked(TxnVoidCallable either, TxnVoidCallable orelse)throws Exception{
if(either == null){
throw new NullPointerException("either callable can't be null");
}
if(orelse == null){
throw new NullPointerException("orelse callable can't be null");
}
Txn txn = getThreadLocalTxn();
if(txn == null){
throw new TxnMandatoryException("No txn is found, but one is required for the orelse");
}
try{
either.call(txn);
return;
}catch(RetryError retry){
orelse.call(txn);
return;
}
}
}