/*
 * Copyright (c) 2009, 2011, 2012, 2014 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.transaction;

import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
import org.eclipse.emf.cdo.view.CDOView;

/**
 * Asynchronously executes a delegate handler's pre-event methods. The delegate handler's code may access the
 * {@link CDOView view} without causing deadlocks.
 *
 * @author Simon McDuff
 * @since 2.0
 */
public class CDOAsyncTransactionHandler implements CDOTransactionHandler
{
  private CDOTransactionHandler delegate;

  public CDOAsyncTransactionHandler(CDOTransactionHandler delegate)
  {
    this.delegate = delegate;
  }

  /**
   * Asynchronously executes the delegate handler's {@link #attachingObject(CDOTransaction, CDOObject)
   * attachingObject()} method.
   */
  public final void attachingObject(final CDOTransaction transaction, final CDOObject object)
  {
    runAsync(new Runnable()
    {
      public void run()
      {
        delegate.attachingObject(transaction, object);
      }
    });
  }

  /**
   * Asynchronously executes the delegate handler's {@link #detachingObject(CDOTransaction, CDOObject)
   * detachingObject()} method.
   */
  public final void detachingObject(final CDOTransaction transaction, final CDOObject object)
  {
    runAsync(new Runnable()
    {
      public void run()
      {
        delegate.detachingObject(transaction, object);
      }
    });
  }

  /**
   * Asynchronously executes the delegate handler's {@link #modifyingObject(CDOTransaction, CDOObject, CDOFeatureDelta)
   * modifyingObject()} method.
   */
  public final void modifyingObject(final CDOTransaction transaction, final CDOObject object,
      final CDOFeatureDelta featureChange)
  {
    runAsync(new Runnable()
    {
      public void run()
      {
        delegate.modifyingObject(transaction, object, featureChange);
      }
    });
  }

  /**
   * Asynchronously executes the delegate handler's {@link #committingTransaction(CDOTransaction, CDOCommitContext)
   * committingTransaction()} method.
   */
  public void committingTransaction(CDOTransaction transaction, CDOCommitContext commitContext)
  {
    delegate.committingTransaction(transaction, commitContext);
  }

  /**
   * Synchronously executes the delegate handler's {@link #committedTransaction(CDOTransaction, CDOCommitContext)
   * committedTransaction()} method.
   */
  public void committedTransaction(CDOTransaction transaction, CDOCommitContext commitContext)
  {
    delegate.committedTransaction(transaction, commitContext);
  }

  /**
   * Synchronously executes the delegate handler's {@link #rolledBackTransaction(CDOTransaction)
   * rolledBackTransaction()} method.
   */
  public void rolledBackTransaction(CDOTransaction transaction)
  {
    delegate.rolledBackTransaction(transaction);
  }

  /**
   * Should be overridden if you want to use different threading mechanism.
   */
  protected void runAsync(Runnable runnable)
  {
    new Thread(runnable).start();
  }
}
