XmlBuilderWorker.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AssetBuilderSDK/AssetBuilderSDK.h>
  10. #include <AzCore/XML/rapidxml.h>
  11. #include <AzFramework/Asset/XmlSchemaAsset.h>
  12. #include <AzCore/Dependency/Version.h>
  13. #include <Builders/CopyDependencyBuilder/CopyDependencyBuilderWorker.h>
  14. namespace CopyDependencyBuilder
  15. {
  16. const char SchemaNamePattern[] = "*.xmlschema";
  17. const char VersionContraintRegexStr[] = "(?:(~>|~=|[>=<]{1,2}) *([0-9]+(?:\\.[0-9]+)*))";
  18. const char VersionRegexStr[] = "([0-9]+)(?:\\.(.*)){0,1}";
  19. const size_t MaxVersionPartsCount = 4;
  20. class XmlBuilderWorker
  21. : public CopyDependencyBuilderWorker
  22. {
  23. public:
  24. AZ_RTTI(XmlBuilderWorker, "{7FC5D0F1-25E3-4CD2-8FB9-81CB29D940E3}");
  25. XmlBuilderWorker();
  26. void RegisterBuilderWorker() override;
  27. void UnregisterBuilderWorker() override;
  28. AZ::Outcome<AZStd::vector<AssetBuilderSDK::SourceFileDependency>, AZStd::string> GetSourceDependencies(
  29. const AssetBuilderSDK::CreateJobsRequest& request) const override;
  30. bool ParseProductDependencies(
  31. const AssetBuilderSDK::ProcessJobRequest& request,
  32. AZStd::vector<AssetBuilderSDK::ProductDependency>& productDependencies,
  33. AssetBuilderSDK::ProductPathDependencySet& pathDependencies) override;
  34. void AddSchemaFileDirectory(const AZStd::string& schemaFileLocation);
  35. void SetPrintDebug(bool setDebug) { m_printDebug = setDebug; }
  36. private:
  37. // Traverse the entire source file to create a list of all the XML nodes and mappings from node names to the corresponding nodes
  38. void TraverseSourceFile(
  39. const AZ::rapidxml::xml_node<char>* currentNode,
  40. AZStd::unordered_map<AZStd::string, AZStd::vector<const AZ::rapidxml::xml_node<char>*>>& xmlNodeMappings,
  41. AZStd::vector<const AZ::rapidxml::xml_node<char>*>& xmlNodeList) const;
  42. enum class SchemaMatchResult
  43. {
  44. MatchFound,
  45. NoMatchFound,
  46. Error
  47. };
  48. SchemaMatchResult MatchExistingSchema(
  49. const AZStd::string& sourceFilePath,
  50. AZStd::vector<AZStd::string>& sourceDependencyPaths,
  51. AZStd::vector<AssetBuilderSDK::ProductDependency>& productDependencies,
  52. AssetBuilderSDK::ProductPathDependencySet& pathDependencies,
  53. const AZStd::string& watchFolderPath) const;
  54. SchemaMatchResult MatchLastUsedSchema(
  55. const AZStd::string& sourceFilePath,
  56. AZStd::vector<AssetBuilderSDK::ProductDependency>& productDependencies,
  57. AssetBuilderSDK::ProductPathDependencySet& pathDependencies,
  58. const AZStd::string& watchFolderPath) const;
  59. SchemaMatchResult ParseXmlFile(
  60. const AZStd::string& schemaFilePath,
  61. const AZStd::string& sourceFilePath,
  62. AZStd::vector<AssetBuilderSDK::ProductDependency>& productDependencies,
  63. AssetBuilderSDK::ProductPathDependencySet& pathDependencies,
  64. const AZStd::string& watchFolderPath) const;
  65. AZ::Outcome <void, bool> SearchForMatchingRule(
  66. const AZStd::string& sourceFilePath,
  67. const AZStd::string& schemaFilePath,
  68. const AZ::Version<MaxVersionPartsCount>& version,
  69. const AZStd::vector<AzFramework::MatchingRule>& matchingRules,
  70. const AZStd::string& watchFolderPath) const;
  71. bool SearchForDependencySearchRule(
  72. AZ::rapidxml::xml_node<char>* xmlFileRootNode,
  73. const AZStd::string& schemaFilePath,
  74. const AZ::Version<MaxVersionPartsCount>& version,
  75. const AZStd::vector<AzFramework::DependencySearchRule>& matchingRules,
  76. AZStd::vector<AssetBuilderSDK::ProductDependency>& productDependencies,
  77. AssetBuilderSDK::ProductPathDependencySet& pathDependencies,
  78. const AZStd::string& sourceAssetFolder,
  79. const AZStd::string& watchFolderPath) const;
  80. AZStd::list<AZStd::string> m_schemaFileDirectories;
  81. bool m_printDebug{ false };
  82. };
  83. }