#region BSD License
/*
Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com)
Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions
and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
* The name of the author may not be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
using Prebuild.Core.Attributes;
using Prebuild.Core.Interfaces;
using Prebuild.Core.Utilities;
namespace Prebuild.Core.Nodes;
///
///
[DataNode("Solution")]
[DataNode("EmbeddedSolution")]
[DebuggerDisplay("{Name}")]
public class SolutionNode : DataNode
{
#region Public Methods
///
/// Parses the specified node.
///
/// The node.
public override void Parse(XmlNode node)
{
Name = Helper.AttributeValue(node, "name", Name);
ActiveConfig = Helper.AttributeValue(node, "activeConfig", ActiveConfig);
Path = Helper.AttributeValue(node, "path", Path);
Version = Helper.AttributeValue(node, "version", Version);
var tmp = Helper.AttributeValue(node, "forceFrameworkVersion", "");
if (tmp.Length > 0)
if (!Enum.TryParse(tmp, true, out ForceFramework))
ForceFramework = FrameworkVersion.none;
if (ForceFramework == FrameworkVersion.none)
{
tmp = Helper.AttributeValue(node, "frameworkVersion", "");
if (tmp.Length > 0)
if (!Enum.TryParse(tmp, true, out DefaultFramework))
DefaultFramework = FrameworkVersion.none;
}
FullPath = Path;
try
{
FullPath = Helper.ResolvePath(FullPath);
}
catch
{
throw new WarningException("Could not resolve solution path: {0}", Path);
}
Kernel.Instance.CurrentWorkingDirectory.Push();
try
{
Helper.SetCurrentDir(FullPath);
if (node == null) throw new ArgumentNullException("node");
foreach (XmlNode child in node.ChildNodes)
{
var dataNode = Kernel.Instance.ParseNode(child, this);
if (dataNode is OptionsNode)
{
Options = (OptionsNode)dataNode;
}
else if (dataNode is FilesNode)
{
Files = (FilesNode)dataNode;
}
else if (dataNode is ConfigurationNode)
{
var configurationNode = (ConfigurationNode)dataNode;
ConfigurationsTable[configurationNode.NameAndPlatform] = configurationNode;
// If the active configuration is null, then we populate it.
if (ActiveConfig == null) ActiveConfig = configurationNode.Name;
}
else if (dataNode is ProjectNode)
{
ProjectsTable[((ProjectNode)dataNode).Name] = (ProjectNode)dataNode;
ProjectsTableOrder.Add((ProjectNode)dataNode);
}
else if (dataNode is SolutionNode)
{
SolutionsTable[((SolutionNode)dataNode).Name] = (SolutionNode)dataNode;
}
else if (dataNode is ProcessNode)
{
var p = (ProcessNode)dataNode;
Kernel.Instance.ProcessFile(p, this);
}
else if (dataNode is DatabaseProjectNode)
{
m_DatabaseProjects[((DatabaseProjectNode)dataNode).Name] = (DatabaseProjectNode)dataNode;
}
else if (dataNode is CleanupNode)
{
if (Cleanup != null)
throw new WarningException("There can only be one Cleanup node.");
Cleanup = (CleanupNode)dataNode;
}
}
}
finally
{
Kernel.Instance.CurrentWorkingDirectory.Pop();
}
}
#endregion
#region Fields
public FrameworkVersion DefaultFramework = FrameworkVersion.none;
public FrameworkVersion ForceFramework = FrameworkVersion.none;
private readonly Dictionary m_DatabaseProjects = new();
#endregion
#region Properties
public override IDataNode Parent
{
get => base.Parent;
set
{
if (value is SolutionNode)
{
var solution = (SolutionNode)value;
foreach (var conf in solution.Configurations)
ConfigurationsTable[conf.Name] = (ConfigurationNode)conf.Clone();
}
base.Parent = value;
}
}
public CleanupNode Cleanup { get; set; }
public Guid Guid { get; set; } = Guid.NewGuid();
///
/// Gets or sets the active config.
///
/// The active config.
public string ActiveConfig { get; set; }
///
/// Gets the name.
///
/// The name.
public string Name { get; private set; } = "unknown";
///
/// Gets the path.
///
/// The path.
public string Path { get; private set; } = "";
///
/// Gets the full path.
///
/// The full path.
public string FullPath { get; private set; } = "";
///
/// Gets the version.
///
/// The version.
public string Version { get; private set; } = "1.0.0";
///
/// Gets the options.
///
/// The options.
public OptionsNode Options { get; private set; }
///
/// Gets the files.
///
/// The files.
public FilesNode Files { get; private set; }
///
/// Gets the configurations.
///
/// The configurations.
public ConfigurationNodeCollection Configurations
{
get
{
var tmp = new ConfigurationNodeCollection();
tmp.AddRange(ConfigurationsTable);
return tmp;
}
}
///
/// Gets the configurations table.
///
/// The configurations table.
public ConfigurationNodeCollection ConfigurationsTable { get; } = new();
///
/// Gets the database projects.
///
public ICollection DatabaseProjects => m_DatabaseProjects.Values;
///
/// Gets the nested solutions.
///
public ICollection Solutions => SolutionsTable.Values;
///
/// Gets the nested solutions hash table.
///
public Dictionary SolutionsTable { get; } = new();
///
/// Gets the projects.
///
/// The projects.
public ICollection Projects
{
get
{
var tmp = new List(ProjectsTable.Values);
tmp.Sort();
return tmp;
}
}
///
/// Gets the projects table.
///
/// The projects table.
public Dictionary ProjectsTable { get; } = new();
///
/// Gets the projects table.
///
/// The projects table.
public List ProjectsTableOrder { get; } = new();
#endregion
}