package com.smartitengineering.cms.repo.dao.impl.tx; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.smartitengineering.cms.repo.dao.tx.Transaction; import com.smartitengineering.cms.repo.dao.tx.TransactionCompletionEvent; import com.smartitengineering.cms.repo.dao.tx.TransactionCompletionEvent.CompletionEvent; import com.smartitengineering.cms.repo.dao.tx.TransactionCompletionListener; import com.smartitengineering.cms.repo.dao.tx.TransactionException; import java.util.LinkedHashSet; import java.util.Set; import org.apache.commons.lang.mutable.MutableBoolean; /** * * @author imyousuf */ class TransactionImpl implements Transaction { private final String id; private final MutableBoolean completed; private final TransactionService service; private final Set<TransactionCompletionListener> listeners; private final boolean isolatedTransaction; @Inject public TransactionImpl(TransactionService service, @Assisted boolean isolatedTransaction) { this.service = service; this.id = this.service.getNextTransactionId(); this.completed = new MutableBoolean(false); this.listeners = new LinkedHashSet<TransactionCompletionListener>(); this.isolatedTransaction = isolatedTransaction; } public String getId() { return this.id; } public void commit() throws TransactionException { boolean successful = false; try { this.service.commit(id); successful = true; } catch (RuntimeException ex) { throw ex; } finally { completeTransaction(TransactionCompletionEvent.CompletionEvent.COMMIT, successful); } } public void rollback() throws TransactionException { boolean successful = false; try { this.service.rollback(id); successful = true; } catch (RuntimeException re) { throw re; } finally { completeTransaction(TransactionCompletionEvent.CompletionEvent.ROLLBACK, successful); } } private void completeTransaction(final CompletionEvent event, boolean successful) { this.completed.setValue(true); TransactionCompletionEvent cEvent = new TransactionCompletionEvent(event, successful, this); for (TransactionCompletionListener listener : this.listeners) { listener.transactionComplete(cEvent); } } public boolean isCompleted() { return this.completed.booleanValue(); } public void addTransactionCompletionListener(TransactionCompletionListener completionListener) { this.listeners.add(completionListener); } public void removeTransactionCompletionListener(TransactionCompletionListener completionListener) { this.listeners.remove(completionListener); } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof Transaction)) { return false; } final Transaction other = (Transaction) obj; if ((this.id == null) ? (other.getId() != null) : !this.id.equals(other.getId())) { return false; } return true; } @Override public int hashCode() { int hash = 7; hash = 47 * hash + (this.id != null ? this.id.hashCode() : 0); return hash; } public boolean isIsolatedTransaction() { return isolatedTransaction; } }