/// <summary>
        /// Gets the data source for the specified mapping.
        /// </summary>
        /// <param name="mapping">The requested mapping.</param>
        /// <param name="container">The container.</param>
        /// <returns>The data source.</returns>
        public static IDataSource GetMappedDataSource(IMapping mapping, IContainer container)
        {
            mapping = Enforce.NotNull(mapping, () => mapping);

            // Depending on the protocol of the mapping, create the appropriate data source. If the
            // protocol is not supported, throw an exception.
            IDataSource dataSource;

            switch (mapping.Protocol)
            {
            case Protocol.File:
                dataSource = new FileDataSource(container, mapping);
                break;

            case Protocol.Http:
                dataSource = new HttpDataSource(container, mapping);
                break;

            case Protocol.Https:
                dataSource = new HttpsDataSource(container, mapping);
                break;

            case Protocol.Ftp:
                dataSource = new FtpDataSource(container, mapping);
                break;

            default:
                throw new ProtocolNotSupportedException(
                          String.Format(CultureInfo.CurrentCulture,
                                        "The protocol '{0}' is not supported.", mapping.Protocol));
            }

            // Attach the constraints to the data source.
            foreach (ConstraintBase constraint in mapping.Constraints)
            {
                dataSource.DownloadStarting += constraint.Validate;
            }

            // Attach the add-ins to the data source.
            foreach (var addin in container.ResolveAll <IAddIn>())
            {
                // Wire up simple events.
                dataSource.DownloadStarting += addin.OnDownloadStarting;
                dataSource.DownloadFinished += addin.OnDownloadFinished;

                // Some events require heavy data load. Wire them only if the event is implemented
                // within the add-in.
                if (addin.ImplementsOnDownloadVerifying)
                {
                    dataSource.DownloadVerifying += addin.OnDownloadVerifying;
                }
            }

            // Return the data source to the caller.
            return(dataSource);
        }
        /// <summary>
        /// Gets the data source for the specified mapping.
        /// </summary>
        /// <param name="mapping">The requested mapping.</param>
        /// <param name="container">The container.</param>
        /// <returns>The data source.</returns>
        public static IDataSource GetMappedDataSource(IMapping mapping, IContainer container)
        {
            mapping = Enforce.NotNull(mapping, () => mapping);

            // Depending on the protocol of the mapping, create the appropriate data source. If the
            // protocol is not supported, throw an exception.
            IDataSource dataSource;
            switch (mapping.Protocol)
            {
                case Protocol.File:
                    dataSource = new FileDataSource(container, mapping);
                    break;
                case Protocol.Http:
                    dataSource = new HttpDataSource(container, mapping);
                    break;
                case Protocol.Https:
                    dataSource = new HttpsDataSource(container, mapping);
                    break;
                case Protocol.Ftp:
                    dataSource = new FtpDataSource(container, mapping);
                    break;
                default:
                    throw new ProtocolNotSupportedException(
                        String.Format(CultureInfo.CurrentCulture,
                            "The protocol '{0}' is not supported.", mapping.Protocol));
            }

            // Attach the constraints to the data source.
            foreach (ConstraintBase constraint in mapping.Constraints)
            {
                dataSource.DownloadStarting += constraint.Validate;
            }

            // Attach the add-ins to the data source.
            foreach (var addin in container.ResolveAll<IAddIn>())
            {
                // Wire up simple events.
                dataSource.DownloadStarting += addin.OnDownloadStarting;
                dataSource.DownloadFinished += addin.OnDownloadFinished;

                // Some events require heavy data load. Wire them only if the event is implemented
                // within the add-in.
                if(addin.ImplementsOnDownloadVerifying)
                {
                    dataSource.DownloadVerifying += addin.OnDownloadVerifying;
                }
            }

            // Return the data source to the caller.
            return dataSource;
        }