package org.mobicents.slee.resource;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.slee.SLEEException;
import javax.slee.resource.ActivityHandle;
import javax.slee.resource.UnrecognizedActivityHandleException;
import javax.transaction.NotSupportedException;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import org.mobicents.slee.container.SleeContainer;
import org.mobicents.slee.runtime.transaction.SleeTransactionManager;
public class SleeEndpointEndActivityNotTransactedExecutor {
private final SleeContainer sleeContainer;
private final SleeEndpointImpl sleeEndpoint;
private final ExecutorService executorService = Executors.newSingleThreadExecutor();
public SleeEndpointEndActivityNotTransactedExecutor(SleeContainer sleeContainer,SleeEndpointImpl sleeEndpoint) {
this.sleeContainer = sleeContainer;
this.sleeEndpoint = sleeEndpoint;
}
void execute(final ActivityHandle handle) throws UnrecognizedActivityHandleException {
final SleeTransactionManager txManager = sleeContainer.getTransactionManager();
final Runnable runnable = new Runnable() {
public void run() {
boolean rollback = true;
try {
txManager.begin();
sleeEndpoint._endActivity(handle);
rollback = false;
} catch (NotSupportedException e) {
throw new SLEEException(e.getMessage(),e);
} catch (SystemException e) {
throw new SLEEException(e.getMessage(),e);
}
finally {
try {
if (rollback) {
txManager.rollback();
}
else {
txManager.commit();
}
} catch (Throwable e) {
throw new SLEEException(e.getMessage(),e);
}
}
}
};
Transaction tx = null;
try {
tx = txManager.getTransaction();
if (tx != null) {
txManager.suspend();
}
runnable.run();
} catch (SystemException e) {
throw new SLEEException(e.getMessage(),e);
}
finally {
if (tx != null) {
try {
txManager.resume(tx);
}
catch (Throwable e) {
throw new SLEEException(e.getMessage(),e);
}
}
}
/*
if (runInThisThread) {
runnable.run();
}
else {
try {
executorService.submit(runnable).get();
} catch (ExecutionException e) {
final Throwable realException = e.getCause();
if (realException instanceof UnrecognizedActivityHandleException) {
throw (UnrecognizedActivityHandleException) realException;
}
else if (realException instanceof SLEEException) {
throw (SLEEException) realException;
}
else {
throw new SLEEException(e.getMessage(),e);
}
} catch (Throwable e) {
throw new SLEEException(e.getMessage(),e);
}
}*/
}
}