#region Copyright
/*
 * Copyright 2005-2015 the Seasar Foundation and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
#endregion

using System;
using System.Transactions;

namespace Seasar.Tests.Extension.Tx.Impl
{
    public interface ITxTest
    {
        bool IsInTransaction();
        string TxId { get;}
        void throwException();
    }

    [Serializable]
    public class TxException : Exception
    {
        private bool wasInTx;

        public bool WasInTx
        {
            get { return wasInTx; }
            set { wasInTx = value; }
        }

        private string txId;
        public string TxId
        {
            get { return txId; }
            set { txId = value; }
        }

        public TxException() { }
        public TxException(string message) : base(message) { }
        public TxException(string message, Exception inner) : base(message, inner) { }
        protected TxException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
    }

    public class TxTest : ITxTest
    {
        #region ITxTest メンバ

        public bool IsInTransaction()
        {
            Transaction tx = Transaction.Current;
            if (tx != null)
            {
                return tx.TransactionInformation.Status == TransactionStatus.Active;
            }
            return false;
        }

        public string TxId
        {
            get
            {
                Transaction tx = Transaction.Current;
                if (tx != null)
                {
                    return tx.TransactionInformation.LocalIdentifier;
                }
                return null;
            }
        }

        public void throwException()
        {
            TxException ex = new TxException();
            ex.WasInTx = IsInTransaction();
            ex.TxId = TxId;
            throw ex;
        }

        #endregion
    }
}