// Copyright (c) 2008, NTT DATA Corporation.
//
// 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.

using System;
using System.Data;

namespace TERASOLUNA.Fw.Web.Controller
{
    /// <summary>
    /// クライアントからのビジネスロジック実行要求を受け付ける
    /// リクエストコントローラの属性を定義します。
    /// </summary>
    /// <remarks>
    /// この属性を <see cref="Common.BLogic.IBLogic"/> 実装クラスに適用することにより、
    /// 要求されたビジネスロジックに対応するリクエストコントローラを解決します。
    /// </remarks>
    public class ControllerInfoAttribute : Attribute
    {
        /// <summary>
        /// ビジネスロジッククラスに対応するリクエストコントローラの識別子。
        /// </summary>
        /// <remarks>
        /// デフォルトの値は <seealso cref="RequestTypeNames.NORMAL"/> です。
        /// </remarks>
        private string _requestType = RequestTypeNames.NORMAL;

        /// <summary>
        /// ビジネスロジッククラスの入力パラメータとなる<see cref="DataSet"/> の <see cref="Type"/> 。
        /// </summary>
        /// <remarks>
        /// デフォルトの値は null です。
        /// </remarks>
        private Type _inputDataSetType;

        /// <summary>
        /// ビジネスロジックの実行要求を解決するためのリクエストコントローラの
        /// 識別子を取得、設定します。
        /// </summary>
        /// <remarks>
        /// <para>
        /// このプロパティはクライアントから要求されたビジネスロジックに対応する
        /// リクエストコントローラを解決するために利用されます。
        /// </para>
        /// <para>
        /// <see cref="RequestType"/> とリクエストコントローラクラスは、
        /// 既定で、以下のように対応づけられています。
        /// </para>
        /// <list type="table">
        /// <item>
        /// <term><see cref="RequestTypeNames.NORMAL"/></term>
        /// <description>(既定値)通常（ファイルのアップロード、ダウンロード
        /// を伴わないビジネスロジックの実行要求を解決します。</description>
        /// </item>
        /// <item>
        /// <term><see cref="RequestTypeNames.DOWNLOAD"/></term>
        /// <description>ダウンロードファイルを返却するビジネスロジックの
        /// 実行要求を解決します。</description>
        /// </item>
        /// <item>
        /// <term><see cref="RequestTypeNames.UPLOAD"/></term>
        /// <description>ファイルアップロードを伴う
        /// ビジネスロジックの実行要求を解決します。</description>
        /// </item>
        /// </list>
        /// </remarks>
        public string RequestType
        {
            get
            {
                return _requestType;
            }
            set
            {
                _requestType = value;
            }
        }

        /// <summary>
        /// ビジネスロジッククラスの入力引数となる
        /// <see cref="DataSet"/> の <see cref="Type"/>を取得、設定します。
        /// </summary>
        /// <remarks>
        /// <para>
        /// 対象となるリクエストコントローラにおいて
        /// リクエスト情報を元にこのプロパティで指定された型のインスタンスが生成され、
        /// ビジネスロジッククラスの入力引数として渡されます。
        /// </para>
        /// <para>
        /// <see cref="RequestType"/> に <seealso cref="RequestTypeNames.NORMAL"/> または、 
        /// <seealso cref="RequestTypeNames.DOWNLOAD"/> を指定した場合は、このプロパティを
        /// 指定する必要があります。
        /// </para>
        /// </remarks>
        public Type InputDataSetType
        {
            get
            {
                return _inputDataSetType;
            }
            set
            {
                _inputDataSetType = value;
            }
        }
    }
}
