/// <summary>
        /// Create data sources from given definition file using serverName.
        /// </summary>
        /// <param name="datasourceFile">File containing data source definition</param>
        /// <param name="targetFolder">RS Target Folder</param>
        /// <param name="fileExtension">File extension</param>
        public void CreateDataSources(string datasourceFile, string targetFolder, string fileExtension)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(datasourceFile);

            XmlNodeList datasourceNodes = doc.SelectNodes("//DataSource");
            string      extension = string.Empty;
            string      name = string.Empty;
            string      connectString, server, database = string.Empty;
            bool        enabled         = true;
            string      prompt          = string.Empty;
            bool        useWinCred      = false;
            string      userid          = string.Empty;
            string      password        = string.Empty;
            bool        impersonateUser = false;

            foreach (XmlNode node in datasourceNodes)
            {
                extension     = node.Attributes["Extension"].Value;
                name          = node.Attributes["Name"].Value + fileExtension;
                server        = ReportServerInformation.DefaultInformation.DatasourceDatabaseServer;
                database      = node.Attributes["Database"].Value;
                connectString = string.Format("Server={0};Database={1}", server, database);
                enabled       = Convert.ToBoolean(node.Attributes["Enabled"].Value);
                prompt        = node.Attributes["Prompt"].Value;
                useWinCred    = Convert.ToBoolean(node.Attributes["UseWindowsCredential"].Value);
                userid        = ReportServerInformation.DefaultInformation.DatasourceSQLUser;
                password      = ReportServerInformation.DefaultInformation.DatasourceSQLPassword;
                useWinCred    = Convert.ToBoolean(node.Attributes["ImpersonateUser"].Value);

                RSDataSourceDefinition dsDef = CreateDatasourceDefinition(extension, connectString, enabled, prompt, impersonateUser, useWinCred, userid, password);
                CreateDataSource(name, dsDef, targetFolder);
            }
        }
        public override string CreateDataSource(string name, RSDataSourceDefinition dsDef, string parent)
        {
            var dataSource = new DataSource
            {
                ConnectionString             = dsDef.ConnectString,
                IsConnectionStringOverridden = true,
                CredentialRetrieval          = dsDef.CredentialRetrieval == RSCredentialRetrievalEnum.Integrated ? CredentialRetrievalType.Integrated :
                                               dsDef.CredentialRetrieval == RSCredentialRetrievalEnum.Prompt ? CredentialRetrievalType.Prompt :
                                               dsDef.CredentialRetrieval == RSCredentialRetrievalEnum.Store ? CredentialRetrievalType.Store :
                                               CredentialRetrievalType.None,
                CredentialsByUser = dsDef.CredentialRetrieval == RSCredentialRetrievalEnum.Prompt ? new CredentialsSuppliedByUser
                {
                    UseAsWindowsCredentials = dsDef.WindowsCredentials,
                    DisplayText             = dsDef.Prompt
                } : null,
                CredentialsInServer = dsDef.CredentialRetrieval == RSCredentialRetrievalEnum.Store ? new CredentialsStoredInServer
                {
                    ImpersonateAuthenticatedUser = dsDef.ImpersonateUserSpecified,
                    UserName = dsDef.UserName,
                    Password = dsDef.Password,
                    UseAsWindowsCredentials = dsDef.WindowsCredentials
                } : null,
                DataSourceType = dsDef.Extension,
                IsOriginalConnectionStringExpressionBased = dsDef.OriginalConnectStringExpressionBased,
                IsEnabled = dsDef.Enabled,
                Path      = parent,
                Name      = name
            };

            try
            {
                PortalAccessorV1.AddToCatalogItems(dataSource);
            }
            catch (Exception ex)
            {
                Logging.Log("Folder create failed: {0}", ex.Message);
                throw;
            }

            return(RSPortalAccessorV1.CreateFullPath(parent, name));
        }
        /// <summary>
        /// Creates data source definition object with given values
        /// </summary>
        /// <param name="extension">Extension To User for Data Source</param>
        /// <param name="connectString">Connection String - different format for different extension</param>
        /// <param name="enabled">Whether data source is enabled</param>
        /// <param name="prompt">Whether to prompt for credential</param>
        /// <param name="imperseronateUser">Is using impersonation</param>
        /// <param name="windowsCred">Is using Windows Credential</param>
        /// <param name="user">user name (name or domain\name)</param>
        /// <param name="password">password for above</param>
        /// <returns>RS Data Source Definition</returns>
        public RSDataSourceDefinition CreateDatasourceDefinition(string extension, string connectString, bool enabled, string prompt, bool imperseronateUser, bool windowsCred, string user, string password)
        {
            RSDataSourceDefinition definition = new RSDataSourceDefinition();

            definition.CredentialRetrieval = RSCredentialRetrievalEnum.Store;
            definition.Extension           = extension;
            definition.ConnectString       = connectString;

            // connectString would look like below for SQL related extension for example
            // string.Format("Server={0};Database={1}", DSServer, Database);
            // if (TrustServerCertificate)
            //    definition.ConnectString = string.Format("{0};TrustServerCertificate={1}", definition.ConnectString, TrustServerCertificate);

            definition.Enabled                  = enabled;
            definition.EnabledSpecified         = enabled;
            definition.ImpersonateUserSpecified = imperseronateUser;
            definition.Prompt             = prompt;
            definition.WindowsCredentials = windowsCred;
            definition.UserName           = user;
            definition.Password           = password;

            return(definition);
        }
        /// <summary>
        /// Create Data Source On RS Server (NOTE: probably return catalog item instead of path only)
        /// </summary>
        /// <param name="name">Data Source Name</param>
        /// <param name="dsDef">Data Source Definition</param>
        /// <param name="parent">Parent Folder to Crate Data Source</param>
        /// <returns>Path to newly created datasource</returns>
        public virtual string CreateDataSource(string name, RSDataSourceDefinition dsDef, string parent)
        {
            RSCatalogItem dsItem = SoapAccessor.Management.CreateDataSource(name, parent, true, dsDef, null);

            return(dsItem.Path);
        }