package org.mobicents.slee.resource; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.slee.Address; import javax.slee.SLEEException; import javax.slee.resource.ActivityHandle; import javax.slee.resource.ActivityIsEndingException; import javax.slee.resource.FireEventException; import javax.slee.resource.FireableEventType; import javax.slee.resource.ReceivableService; 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 SleeEndpointFireEventNotTransactedExecutor { private final SleeContainer sleeContainer; private final SleeEndpointImpl sleeEndpoint; private final ExecutorService executorService = Executors.newSingleThreadExecutor(); public SleeEndpointFireEventNotTransactedExecutor(SleeContainer sleeContainer,SleeEndpointImpl sleeEndpoint) { this.sleeContainer = sleeContainer; this.sleeEndpoint = sleeEndpoint; } void execute(final ActivityHandle handle, final FireableEventType eventType, final Object event, final Address address, final ReceivableService receivableService, final int eventFlags) throws ActivityIsEndingException,FireEventException,SLEEException,UnrecognizedActivityHandleException { final SleeTransactionManager txManager = sleeContainer.getTransactionManager(); final Runnable runnable = new Runnable() { public void run() { boolean rollback = true; try { txManager.begin(); sleeEndpoint._fireEvent(handle,eventType,event,address,receivableService,eventFlags); 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); } } } } }