From 875918dedaddfe19a1edc8acc31cc698f490df7d Mon Sep 17 00:00:00 2001 From: Mikhail Naumov Date: Fri, 20 Aug 2021 18:10:30 -0700 Subject: [PATCH 1/3] Allowing prebas with missing components to load, and clarifying error message Signed-off-by: Mikhail Naumov --- .../AzCore/Component/EntitySerializer.cpp | 7 ++++++- .../Serialization/Json/JsonDeserializer.cpp | 20 ++++++++++++++++--- .../Prefab/PrefabDomUtils.cpp | 9 +++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp index 16452be76d..64ba9b2c2c 100644 --- a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp @@ -81,9 +81,14 @@ namespace AZ azrtti_typeid(), inputValue, "Components", context); + static TypeId genericComponentWrapperTypeId("{68D358CA-89B9-4730-8BA6-E181DEA28FDE}"); for (auto& [componentKey, component] : componentMap) { - entityInstance->m_components.emplace_back(component); + // if underlying type is genericComponentWrapperTypeId, the template is null and the component should not be addded + if (component->GetUnderlyingComponentType() != genericComponentWrapperTypeId) + { + entityInstance->m_components.emplace_back(component); + } } result.Combine(componentLoadResult); diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp index 840034e52f..c1ffb774e8 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp @@ -571,9 +571,23 @@ namespace AZ if (loadedTypeId.m_determination == TypeIdDetermination::FailedToDetermine || loadedTypeId.m_determination == TypeIdDetermination::FailedDueToMultipleTypeIds) { - AZStd::string_view message = loadedTypeId.m_determination == TypeIdDetermination::FailedDueToMultipleTypeIds ? - "Unable to resolve provided type because the same name points to multiple types." : - "Unable to resolve provided type."; + AZStd::string message; + if (loadedTypeId.m_determination == TypeIdDetermination::FailedDueToMultipleTypeIds) + { + message = "Unable to resolve provided type because the same name points to multiple types."; + } + else + { + auto typeField = pointerData.FindMember(JsonSerialization::TypeIdFieldIdentifier); + if (typeField != pointerData.MemberEnd() && typeField->value.IsString()) + { + message = AZStd::string::format("Unable to resolve provided type: %s.", typeField->value.GetString()); + } + else + { + message = "Unable to resolve provided type."; + } + } status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, message); return ResolvePointerResult::FullyProcessed; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp index dcc14d3b91..f60759f77e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp @@ -253,6 +253,15 @@ namespace AzToolsFramework settings.m_metadata.Add(&entityIdMapper); settings.m_metadata.Create(newlyAddedEntities); + AZStd::string scratchBuffer; + auto issueReportingCallback = [&scratchBuffer]( + AZStd::string_view message, AZ::JsonSerializationResult::ResultCode result, + AZStd::string_view path) -> AZ::JsonSerializationResult::ResultCode + { + return Internal::JsonIssueReporter(scratchBuffer, message, result, path); + }; + settings.m_reporting = AZStd::move(issueReportingCallback); + AZ::JsonSerializationResult::ResultCode result = AZ::JsonSerialization::Load(instance, prefabDom, settings); AZ::Data::AssetManager::Instance().ResumeAssetRelease(); From f224d657be4380bffe41c249c537f3f6b6e94415 Mon Sep 17 00:00:00 2001 From: Mikhail Naumov <82239319+AMZN-mnaumov@users.noreply.github.com> Date: Mon, 23 Aug 2021 13:01:37 -0700 Subject: [PATCH 2/3] Ronald's feedback Co-authored-by: AMZN-koppersr <82230785+AMZN-koppersr@users.noreply.github.com> Signed-off-by: Mikhail Naumov --- .../Serialization/Json/JsonDeserializer.cpp | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp index c1ffb774e8..5f90744607 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp @@ -571,25 +571,23 @@ namespace AZ if (loadedTypeId.m_determination == TypeIdDetermination::FailedToDetermine || loadedTypeId.m_determination == TypeIdDetermination::FailedDueToMultipleTypeIds) { - AZStd::string message; - if (loadedTypeId.m_determination == TypeIdDetermination::FailedDueToMultipleTypeIds) - { - message = "Unable to resolve provided type because the same name points to multiple types."; - } - else - { auto typeField = pointerData.FindMember(JsonSerialization::TypeIdFieldIdentifier); if (typeField != pointerData.MemberEnd() && typeField->value.IsString()) { - message = AZStd::string::format("Unable to resolve provided type: %s.", typeField->value.GetString()); + const char* format = loadedTypeId.m_determination == TypeIdDetermination::FailedToDetermine ? + "Unable to resolve provided type: %.*s." : + "Unable to resolve provided type %.*s because the same name points to multiple types."; + status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, + AZStd::string::format("Unable to resolve provided type: %.*s.", typeField->value.GetStringLength(), typeField->value.GetString())); } else { - message = "Unable to resolve provided type."; + const char* message = loadedTypeId.m_determination == TypeIdDetermination::FailedToDetermine ? + "Unable to resolve provided type." : + "Unable to resolve provided type because the same name points to multiple types." + status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, "Unable to resolve provided type."); } - } - status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, message); - return ResolvePointerResult::FullyProcessed; + return ResolvePointerResult::FullyProcessed; } if (loadedTypeId.m_typeId != objectType) From f7eaa4490fd4dbcfe47d00ccd5101c5b092f6785 Mon Sep 17 00:00:00 2001 From: Mikhail Naumov Date: Mon, 23 Aug 2021 13:40:01 -0700 Subject: [PATCH 3/3] fixing syntax errors Signed-off-by: Mikhail Naumov --- .../AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp index 5f90744607..56c2b1666d 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp @@ -578,14 +578,14 @@ namespace AZ "Unable to resolve provided type: %.*s." : "Unable to resolve provided type %.*s because the same name points to multiple types."; status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, - AZStd::string::format("Unable to resolve provided type: %.*s.", typeField->value.GetStringLength(), typeField->value.GetString())); + AZStd::string::format(format, typeField->value.GetStringLength(), typeField->value.GetString())); } else { const char* message = loadedTypeId.m_determination == TypeIdDetermination::FailedToDetermine ? "Unable to resolve provided type." : - "Unable to resolve provided type because the same name points to multiple types." - status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, "Unable to resolve provided type."); + "Unable to resolve provided type because the same name points to multiple types."; + status = context.Report(Tasks::RetrieveInfo, Outcomes::Unknown, message); } return ResolvePointerResult::FullyProcessed; }