#region License

/*
 * Copyright © 2002-2005 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

#region Imports

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.Reflection;
using System.Web;
using System.Web.UI;
using Common.Logging;
using Spring.Context;
using Spring.Objects.Factory;

#endregion

namespace Spring.Util
{
    /// <summary>
    /// Abstracts the underlying infrastructure of a HttpRequest
    /// </summary>
    public interface IVirtualEnvironment
    {
        /// <summary>
        /// The virtual (rooted) path of the current Application with trailing slash
        /// </summary>
        /// <remarks>
        /// For the site rooted applications, "/" will be returned, for all others "/..someappdir../"
        /// </remarks>
        string ApplicationVirtualPath { get; }
        /// <summary>
        /// The virtual (rooted) path of the current Request including <see cref="HttpRequest.PathInfo"/>
        /// </summary>
        string CurrentVirtualPath { get; }
        /// <summary>
        /// The virtual (rooted) path of the current Request without trailing <see cref="HttpRequest.PathInfo"/>
        /// </summary>
        string CurrentVirtualFilePath { get; }
        /// <summary>
        /// The virtual (rooted) path of the currently executing script
        /// </summary>
        /// <remarks>
        /// Normally this property is the same as <see cref="CurrentVirtualPath"/>. 
        /// In case of <see cref="HttpServerUtility.Transfer(string,bool)"/>, this property returns the current script 
        /// whereas CurrentVirtualPath returns the original script path.
        /// </remarks>
        string CurrentExecutionFilePath { get; }
        /// <summary>
        /// The query parameters
        /// </summary>
        NameValueCollection QueryString { get; }
        /// <summary>
        /// Maps a virtual path to it's physical location
        /// </summary>
        string MapPath( string virtualPath );
        /// <summary>
        /// Rewrites the <see cref="CurrentVirtualPath"/>, thus also affecting <see cref="MapPath"/>
        /// </summary>
        IDisposable RewritePath(string newVirtualPath, bool rebaseClientPath);
        /// <summary>
        /// Returns the current Session's variable dictionary
        /// </summary>
        ISessionState Session { get; }
        /// <summary>
        /// Returns the current Request's variable dictionary <see cref="HttpContext.Items"/>
        /// </summary>
        IDictionary RequestVariables { get; }
        /// <summary>
        /// Returns the current Request's parameter dictionary <see cref="HttpRequest.Params"/>
        /// </summary>
        NameValueCollection RequestParams { get; }
        /// <summary>
        /// Get the compiled type for the given virtual path
        /// </summary>
        /// <param name="absoluteVirtualPath">the absolute (=rooted) virtual path</param>
        /// <returns></returns>
        Type GetCompiledType(string absoluteVirtualPath);
        /// <summary>
        /// Creates an instance from the given virtual path
        /// </summary>
        /// <param name="absoluteVirtualPath">the absolute (=rooted) virtual path</param>
        /// <param name="requiredBaseType">the required base type </param>
        object CreateInstanceFromVirtualPath(string absoluteVirtualPath, Type requiredBaseType);
    }
}