File: Tasks\MsDeploy\CreateManifestFile.cs
Web Access
Project: ..\..\..\src\WebSdk\Publish\Tasks\Microsoft.NET.Sdk.Publish.Tasks.csproj (Microsoft.NET.Sdk.Publish.Tasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
///--------------------------------------------------------------------------------------------
/// ParametersFile.cs
///
/// Implements using through MSDeploy's API
/// returned from the flavored client project.
///
/// Copyright(c) 2006 Microsoft Corporation
///--------------------------------------------------------------------------------------------
 
using Framework = Microsoft.Build.Framework;
using Utilities = Microsoft.Build.Utilities;
using Xml = System.Xml;
 
namespace Microsoft.NET.Sdk.Publish.Tasks.MsDeploy
{
    public class CreateManifestFile : Task
    {
        private Framework.ITaskItem[]? m_manifests = null;
        private string? m_manifestFile = null;
        private bool m_generateFileEvenIfEmpty = false;
 
        [Framework.Required]
        public Framework.ITaskItem[]? Manifests
        {
            get { return m_manifests; }
            set { m_manifests = value; }
        }
 
        [Framework.Required]
        public string? ManifestFile
        {
            get { return m_manifestFile; }
            set { m_manifestFile = value; }
        }
 
        public bool GenerateFileEvenIfEmpty
        {
            get { return m_generateFileEvenIfEmpty; }
            set { m_generateFileEvenIfEmpty = value; }
        }
 
        /// <summary>
        /// utility function to write the simple setParameter.xml file
        /// </summary>
        /// <param name="loggingHelper"></param>
        /// <param name="parameters"></param>
        /// <param name="outputFileName"></param>
        private static void WriteManifestsToFile(Utilities.TaskLoggingHelper loggingHelper, Framework.ITaskItem[]? items, string outputFileName)
        {
            Xml.XmlDocument document = new();
            Xml.XmlElement manifestElement = document.CreateElement("sitemanifest");
            document.AppendChild(manifestElement);
            if (items != null)
            {
                foreach (Framework.ITaskItem item in items)
                {
                    string name = item.ItemSpec;
                    Xml.XmlElement providerElement = document.CreateElement(name);
                    string path = item.GetMetadata("Path");
                    providerElement.SetAttribute("path", path);
 
                    string additionProviderSetting = item.GetMetadata("AdditionalProviderSettings");
                    if (!string.IsNullOrEmpty(additionProviderSetting))
                    {
                        string[] providerSettings = additionProviderSetting.Split(';');
                        foreach (string ps in providerSettings)
                        {
                            string value = item.GetMetadata(ps);
                            if (!string.IsNullOrEmpty(value))
                            {
                                providerElement.SetAttribute(ps, value);
                            }
                        }
                    }
                    manifestElement.AppendChild(providerElement);
                }
            }
 
            // Save the UTF8 and Indented 
            Utility.SaveDocument(document, outputFileName, Encoding.UTF8);
        }
 
        /// <summary>
        /// The task execute function
        /// </summary>
        /// <returns></returns>
        public override bool Execute()
        {
            bool succeeded = true;
 
            bool fWriteFile = GenerateFileEvenIfEmpty;
            if (m_manifests != null && m_manifests.GetLength(0) > 0)
            {
                fWriteFile = true;
            }
 
            if (fWriteFile)
            {
                try
                {
                    if (ManifestFile is not null && ManifestFile.Length != 0)
                    {
                        if (!File.Exists(ManifestFile))
                        {
                            File.Create(ManifestFile).Close();
                        }
                        WriteManifestsToFile(Log, m_manifests, ManifestFile);
                    }
                }
#if NET472
                catch (Xml.XmlException ex)
                {
                    Uri sourceUri = new(ex.SourceUri);
                    succeeded = false;
                }
#endif
                catch (Exception)
                {
                    succeeded = false;
                }
                finally
                {
                    //logger.EndSection(string.Format(System.Globalization.CultureInfo.CurrentCulture,succeeded ?
                    //    Resources.BUILDTASK_TransformXml_TransformationSucceeded :
                    //    Resources.BUILDTASK_TransformXml_TransformationFailed));
                }
            }
            return succeeded;
        }
    }
}