1 // 2 // Copyright 2020 Pixar 3 // 4 // Licensed under the Apache License, Version 2.0 (the "Apache License") 5 // with the following modification; you may not use this file except in 6 // compliance with the Apache License and the following modification to it: 7 // Section 6. Trademarks. is deleted and replaced with: 8 // 9 // 6. Trademarks. This License does not grant permission to use the trade 10 // names, trademarks, service marks, or product names of the Licensor 11 // and its affiliates, except as required to comply with Section 4(c) of 12 // the License and to reproduce the content of the NOTICE file. 13 // 14 // You may obtain a copy of the Apache License at 15 // 16 // http://www.apache.org/licenses/LICENSE-2.0 17 // 18 // Unless required by applicable law or agreed to in writing, software 19 // distributed under the Apache License with the above modification is 20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 21 // KIND, either express or implied. See the Apache License for the specific 22 // language governing permissions and limitations under the Apache License. 23 // 24 #ifndef PXR_USD_USD_UTILS_CONDITIONAL_ABORT_DIAGNOSTIC_DELEGATE_H 25 #define PXR_USD_USD_UTILS_CONDITIONAL_ABORT_DIAGNOSTIC_DELEGATE_H 26 27 #include "pxr/pxr.h" 28 #include "pxr/usd/usdUtils/api.h" 29 #include "pxr/base/tf/diagnosticMgr.h" 30 31 #include <string> 32 #include <vector> 33 34 PXR_NAMESPACE_OPEN_SCOPE 35 36 class TfPatternMatcher; 37 38 /// A class which represents the inclusion exclusion filters on which errors 39 /// will be matched 40 /// stringFilters: matching and filtering will be done on explicit string 41 /// of the error/warning 42 /// codePathFilters: matching and filtering will be done on errors/warnings 43 /// coming from a specific usd code path 44 class UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters 45 { 46 public: UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters()47 UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters() {} 48 USDUTILS_API 49 UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters( 50 const std::vector<std::string>& stringFilters, 51 const std::vector<std::string>& codePathFilters); 52 GetStringFilters()53 const std::vector<std::string>& GetStringFilters() const { 54 return _stringFilters; 55 }; 56 GetCodePathFilters()57 const std::vector<std::string>& GetCodePathFilters() const { 58 return _codePathFilters; 59 } 60 61 USDUTILS_API 62 void SetStringFilters(const std::vector<std::string>& stringFilters); 63 USDUTILS_API 64 void SetCodePathFilters(const std::vector<std::string>& codePathFilters); 65 private: 66 std::vector<std::string> _stringFilters; 67 std::vector<std::string> _codePathFilters; 68 }; 69 70 /// A class that allows client application to instantiate a diagnostic delegate 71 /// that can be used to abort operations for a non fatal USD error or warning 72 /// based on immutable include exclude rules defined for this instance. 73 /// 74 /// These rules are regex strings where case sensitive matching is done on 75 /// error/warning text or the location of the code path where the error/warning 76 /// occured. 77 /// Note that these rules will be respected only during the lifetime of the 78 /// delegate. 79 /// Include Rules determine what errors or warnings will cause a fatal abort. 80 /// Exclude Rules determine what errors or warnings matched from the Include 81 /// Rules should not cause the fatal abort. 82 /// Example: to abort on all errors and warnings coming from "*pxr*" codepath 83 /// but not from "*ConditionalAbortDiagnosticDelegate*", a client can create the 84 /// following delegate: 85 /// 86 /// \code 87 /// UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters includeFilters; 88 /// UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters excludeFilters; 89 /// includeFilters.SetCodePathFilters({"*pxr*"}); 90 /// excludeFilters.SetCodePathFilters({"*ConditionalAbortDiagnosticDelegate*"}); 91 /// UsdUtilsConditionalAbortDiagnosticDelegate delegate = 92 /// UsdUtilsConditionalAbortDiagnosticDelegate(includeFilters, 93 /// excludeFilters); 94 /// \endcode 95 /// 96 class UsdUtilsConditionalAbortDiagnosticDelegate : 97 public TfDiagnosticMgr::Delegate 98 { 99 public: 100 101 /// Constructor to initialize conditionalAbortDiagnosticDelegate. 102 /// Responsible for adding this delegate instance to TfDiagnosticMgr and 103 /// also sets the \p includeFilters and \p excludeFilters 104 /// \note The _includeFilters and _excludeFilters are immutable 105 USDUTILS_API 106 UsdUtilsConditionalAbortDiagnosticDelegate( 107 const UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters& 108 includeFilters, 109 const UsdUtilsConditionalAbortDiagnosticDelegateErrorFilters& 110 excludeFilters); 111 112 /// Handles the removal of this delegate from TfDiagnosticMgr. 113 USDUTILS_API 114 virtual ~UsdUtilsConditionalAbortDiagnosticDelegate(); 115 116 UsdUtilsConditionalAbortDiagnosticDelegate() = delete; 117 UsdUtilsConditionalAbortDiagnosticDelegate( 118 const UsdUtilsConditionalAbortDiagnosticDelegate& delegate) = delete; 119 UsdUtilsConditionalAbortDiagnosticDelegate& operator=( 120 const UsdUtilsConditionalAbortDiagnosticDelegate& delegate) = delete; 121 122 // Interface overrides 123 void IssueError(const TfError& err) override; 124 void IssueWarning(const TfWarning& warning) override; 125 void IssueFatalError(const TfCallContext &ctx, 126 const std::string &msg) override; 127 // Following will be no-ops for our purposes - prints same message as 128 // DiagnosticMgr 129 void IssueStatus(const TfStatus& status) override; 130 131 private: 132 133 const std::vector<TfPatternMatcher> _includePatternStringFilters; 134 const std::vector<TfPatternMatcher> _includePatternCodePathFilters; 135 const std::vector<TfPatternMatcher> _excludePatternStringFilters; 136 const std::vector<TfPatternMatcher> _excludePatternCodePathFilters; 137 138 protected: 139 /// Helper to match \p err against a given set of \p errorFilters 140 /// A client can override this to affect the behavior of the rule matcher. 141 virtual bool _RuleMatcher(const TfDiagnosticBase& err, 142 const std::vector<TfPatternMatcher>& stringPatternFilters, 143 const std::vector<TfPatternMatcher>& codePathPatternFilters); 144 }; 145 146 147 PXR_NAMESPACE_CLOSE_SCOPE 148 149 #endif 150