#region License

/*
 * Copyright 2002-2004 the original author or authors.
 *
 * 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 Spring.Transaction.Support;

namespace Spring.Transaction.Interceptor
{
	/// <summary> 
	/// Transaction attribute approach to rolling back on all exceptions, no other
	/// exceptions by default.
	/// </summary>
	/// <author>Rod Johnson</author>
	/// <author>Griffin Caprio (.NET)</author>
	public class DefaultTransactionAttribute : DefaultTransactionDefinition, ITransactionAttribute	
	{
		/// <summary>
		/// Prefix for rollback-on-exception rules in description strings.
		/// </summary>
		public static readonly string ROLLBACK_RULE_PREFIX = "-";

		/// <summary>
		/// Prefix for commit-on-exception rules in description strings.
		/// </summary>
		public static readonly string COMMIT_RULE_PREFIX = "+";

		/// <summary>
		/// Creates a new instance of the
		/// <see cref="Spring.Transaction.Interceptor.DefaultTransactionAttribute"/>
		/// class.
		/// </summary>
		public DefaultTransactionAttribute() {}

		/// <summary>
		/// Creates a new instance of the
		/// <see cref="Spring.Transaction.Interceptor.DefaultTransactionAttribute"/>
		/// class, setting the propagation behavior to the supplied value.
		/// </summary>
		/// <param name="propagationBehavior">
		/// The desired transaction propagation behaviour.
		/// </param>
		public DefaultTransactionAttribute( TransactionPropagation propagationBehavior )
			: base (propagationBehavior) {}

		#region ITransactionAttribute Members
		/// <summary>
		/// Decides if rollback is required for the supplied <paramref name="exception"/>.
		/// </summary>
		/// <remarks>
		/// <p>
		/// The default behavior is to rollback on any exception.
		/// Consistent with <see cref="Spring.Transaction.Support.TransactionTemplate"/>'s behavior.
		/// </p>
		/// </remarks>
		/// <param name="exception">The <see cref="System.Exception"/> to evaluate.</param>
		/// <returns>True if the exception causes a rollback, false otherwise.</returns>
		public virtual bool RollbackOn(Exception exception)
		{
			return ( true );
		}
		#endregion

		/// <summary> 
		/// Return a description of this transaction attribute.
		/// </summary>
		/// <remarks>
		/// <p>
		/// The format matches the one used by the
		/// <see cref="Spring.Transaction.Interceptor.TransactionAttributeEditor"/>,
		/// to be able to feed any result into a <see cref="Spring.Transaction.Interceptor.ITransactionAttribute"/>
		/// instance's properties.
		/// </p>
		/// </remarks>
		public override string ToString()
		{
			string result = DefinitionDescription;
			result += "," + ROLLBACK_RULE_PREFIX + "System.Exception";
			return result;
		}
	}
}
