/*
 * ConstraintViolationException class.
 *
 * Copyright (C) 2007 SATOH Takayuki All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package ts.util.table;

import ts.util.ReasonedRuntimeException;

/**
 * テーブルの更新において制約違反があった場合にスローされる例外クラス。
 *
 * @author  佐藤隆之.
 * @version $Revision: 1.1.1.1 $, $Date: 2010-10-16 00:03:51 $
 */
public class ConstraintViolationException extends ReasonedRuntimeException
{
  /** シリアル・バージョン番号。*/
  static final long serialVersionUID = -9065975772757871421L;

  /** 処理の種類。 */
  private Trigger.Action action_ ;

  /** 次の制約違反例外オブジェクト。 */
  private ConstraintViolationException next_ = null;

  /**
   * 処理の種類を引数にとるコンストラクタ。
   *
   * @param  action 処理の種類。
   * @throws AssertionError 処理の種類がヌルの場合（デバッグ・モードのみ）。
   */
  public ConstraintViolationException(Trigger.Action action)
  {
    assert (action != null) : "@param:action is null.";
    action_ = action;
  }

  /**
   * 処理の種類と、理由を示す{@link java.lang.Enum Enum}オブジェクトを引数に
   * とるコンストラクタ。
   *
   * @param  action 処理の種類。
   * @param  reason 理由を示す{@link java.lang.Enum Enum}オブジェクト。
   * @throws AssertionError 処理の種類がヌルの場合（デバッグ・モードのみ）。
   */
  public ConstraintViolationException(Trigger.Action action, Enum reason)
  {
    super(reason);
    assert (action != null) : "@param:action is null.";
    action_ = action;
  }

  /**
   * 処理の種類と、理由を示す{@link java.lang.Enum Enum}オブジェクトと、例外
   * メッセージを引数にとるコンストラクタ。
   *
   * @param  action 処理の種類。
   * @param  reason 理由を示す{@link java.lang.Enum Enum}オブジェクト。
   * @param  msg 例外メッセージ。
   * @throws AssertionError 処理の種類がヌルの場合（デバッグ・モードのみ）。
   */
  public ConstraintViolationException(Trigger.Action action, Enum reason,
    String msg)
  {
    super(reason, msg);
    assert (action != null) : "@param:action is null.";
    action_ = action;
  }

  /**
   * 処理の種類と、理由を示す{@link java.lang.Enum Enum}オブジェクトと例外
   * メッセージ、この例外の元となった{@link java.lang.Throwable Throwable}
   * オブジェクトを引数にとるコンストラクタ。
   *
   * @param  action 処理の種類。
   * @param  reason 理由を示す{@link java.lang.Enum Enum}オブジェクト。
   * @param  msg 例外メッセージ。
   * @param  cause この例外の元となった{@link java.lang.Throwable Throwable}
   *           オブジェクト。
   * @throws AssertionError 処理の種類がヌルの場合（デバッグ・モードのみ）。
   */
  public ConstraintViolationException(Trigger.Action action, Enum reason,
    String msg, Throwable cause)
  {
    super(reason, msg, cause);
    assert (action != null) : "@param:action is null.";
    action_ = action;
  }

  /**
   * 処理の種類と、理由を示す{@link java.lang.Enum Enum}オブジェクトと、
   * この例外の元となった{@link java.lang.Throwable Throwable }オブジェクト
   * を引数にとるコンストラクタ。
   *
   * @param  action 処理の種類。
   * @param  reason 理由を示す{@link java.lang.Enum Enum}オブジェクト。
   * @param  cause この例外の元となった{@link java.lang.Throwable Throwable}
   *           オブジェクト。
   * @throws AssertionError 引数がヌルの場合（デバッグ・モードのみ）。
   */
  public ConstraintViolationException(Trigger.Action action, Enum reason,
    Throwable cause)
  {
    super(reason, cause);
    assert (action != null) : "@param:action is null.";
    action_ = action;
  }

  /**
   * この例外がスローされた処理の種類を取得する。
   *
   * @return 処理の種類。
   */
  public Trigger.Action getAction()
  {
    return action_ ;
  }

  /**
   * 例外メッセージを取得する。
   *
   * @return 例外メッセージ。
   */
  public String getMessage()
  {
    StringBuffer buf = new StringBuffer();
    buf.append("[").append(getAction().name()).append("]");

    buf.append("[");
    Enum reason = getReason();
    if (reason != null) {
      buf.append(reason.name());
    }
    buf.append("]");

    String msg = super.getMessage();
    if (msg != null) {
      buf.append(" ").append(msg);
    }
    else {
      Throwable t = getCause();
      if (t != null) {
        buf.append(" ").append(t.toString());
      }
    }
    return buf.toString();
  }

  /**
   * 次の制約違反例外オブジェクトを設定する。
   * <br>
   * 引数にヌルが設定された場合は、そのままヌルを設定する。
   *
   * @param  exc 次の制約違反例外オブジェクト。
   */
  public void setNext(ConstraintViolationException exc)
  {
    next_ = exc;
  }

  /**
   * 次の制約違反例外オブジェクトを取得する。
   * <br>
   * 次の制約違反例外オブジェクトが存在しない場合はヌルを返す。
   *
   * @return 次の制約違反例外オブジェクト。
   */
  public ConstraintViolationException next()
  {
    return next_ ;
  }
}
