HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
validator.h
Go to the documentation of this file.
1 //
2 // Copyright 2024 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 #ifndef PXR_USD_VALIDATION_USD_VALIDATION_VALIDATOR_H
8 #define PXR_USD_VALIDATION_USD_VALIDATION_VALIDATOR_H
9 
10 /// \file
11 
12 #include "pxr/pxr.h"
13 #include "pxr/base/gf/interval.h"
14 #include "pxr/base/tf/token.h"
15 #include "pxr/usd/usd/stage.h"
16 #include "pxr/usd/usd/timeCode.h"
19 
20 #include <functional>
21 #include <string>
22 #include <variant>
23 #include <vector>
24 
26 
27 class UsdValidationError;
28 using UsdValidationErrorVector = std::vector<UsdValidationError>;
29 class UsdPrim;
30 
31 /// \class UsdValidationValidatorMetadata
32 ///
33 /// A structure which describes metadata for a UsdValidationValidator.
34 ///
35 /// The metadata values are populated from the plugInfo.json associated with a
36 /// validator's plugin. PlugInfo can provide the following validator metadata:
37 ///
38 /// - name: A required field. This metadatum stores the validator name. For
39 /// validators defined in a plugin, the name must be a fully qualified name
40 /// which includes the pluginName as well, separated by ":". This ensures,
41 /// plugin provided validator names are guaranteed to be unique.
42 /// - pluginPtr: Pointer to the plugin where a plugin based validator is
43 /// defined. nullptr for a non-plugin based validator.
44 /// - keywords: Keywords associated with this validator.
45 /// - doc: Doc string explaining the purpose of the validator.
46 /// - schemaTypes: If the validator is associated with specific schemaTypes.
47 /// - isTimeDependent: If the validator is testing rules which are time
48 /// dependent. Note that only PrimValidators and StageValidators can be time
49 /// dependent, as these are the ones which can evaluate time dependent
50 /// properties. Note that its still recommended to use PrimValidators for
51 /// time dependent properties. Default is false.
52 /// - isSuite: If the validator represents a suite of validators.
53 ///
55 {
56  /// Name of the validator.
57  ///
58  /// For plugin provided validators, this is prefixed with the pluginName,
59  /// like "pluginName:testName" in order to uniquely identify these plugin
60  /// provided validators.
61  ///
62  /// This is a mandatory field for a ValidatorMetadata.
64 
65  /// Pointer to the plugin to which a plugin based validator belongs.
66  ///
67  /// For non-plugin based validator, pluginPtr is nullptr.
68  PlugPluginPtr pluginPtr;
69 
70  /// list of keywords extracted for this test from the plugInfo.json
72 
73  /// doc string extracted from plugInfo.json
74  /// This is a mandatory field for a ValidatorMetadata.
75  std::string doc;
76 
77  /// list of schemaTypes names this test applies to, extracted from
78  /// plugInfo.json
80 
81  /// whether this test is time dependent or not.
82  /// Only PrimValidators and StageValidators can be time dependent.
83  /// By default this is false.
85 
86  /// whether this test represents a test suite or not
87  bool isSuite;
88 }; // UsdValidationValidatorMetadata
89 
91  = std::vector<UsdValidationValidatorMetadata>;
92 
93 /// \defgroup UsdValidateTaskFn_group Validating Task Functions
94 ///
95 /// UsdValidateLayerTaskFn, UsdValidateStageTaskFn and UsdValidatePrimTaskFn
96 /// represent the callbacks associated with each validator's validation logic.
97 ///
98 /// Clients must provide implementation for these in their respective plugin
99 /// registration code.
100 /// @{
101 
102 /// UsdValidateLayerTaskFn: Validation logic operating on a given SdfLayerHandle
104  const SdfLayerHandle &)>;
105 /// UsdValidateStageTaskFn: Validation logic operating on a given UsdStage
107  const UsdStagePtr &, const UsdValidationTimeRange)>;
108 /// UsdValidatePrimTaskFn: Validation logic operating on a given UsdPrim
109 using UsdValidatePrimTaskFn = std::function<UsdValidationErrorVector(
110  const UsdPrim &, const UsdValidationTimeRange)>;
111 
112 /// @}
113 
114 /// \class UsdValidationValidator
115 ///
116 /// UsdValidationValidator is a class describing a single test.
117 ///
118 /// An instance of UsdValidationValidator is created when plugins are loaded and
119 /// tests are registered and cached in the UsdValidationRegistry.
120 /// UsdValidationValidator can consist of any one of the 3 testing tasks:
121 /// LayerTestingTask, StageTestingTask or PrimTestingTask, which correspond to
122 /// testing the given SdfLayer, an entire UsdStage or a UsdPrim respectively.
123 ///
124 /// UsdValidationValidator instances are immutable and non-copyable. Note that
125 /// all validators which are registered with the UsdValidationRegistry are
126 /// immortal.
127 ///
128 /// \sa UsdValidationRegistry
130 {
131 public:
132  /// Instantiate a UsdValidationValidator which has no validation logic
133  /// implementation.
134  ///
135  /// This is primarily used by UsdValidationValidatorSuite.
137  explicit UsdValidationValidator(
138  const UsdValidationValidatorMetadata &metadata);
139 
140  UsdValidationValidator(const UsdValidationValidator &other) = delete;
141  UsdValidationValidator &operator=(const UsdValidationValidator &) = delete;
142 
143  UsdValidationValidator(UsdValidationValidator &&other) noexcept = default;
144  UsdValidationValidator &operator=(UsdValidationValidator &&) noexcept
145  = default;
146 
147  /// Instantiate a UsdValidationValidator which has its validation logic
148  /// implemented by a UsdValidateLayerTaskFn.
151  const UsdValidateLayerTaskFn &validateLayerTaskFn);
152 
153  /// Instantiate a UsdValidationValidator which has its validation logic
154  /// implemented by a UsdValidateStageTaskFn.
157  const UsdValidateStageTaskFn &validateStageTaskFn);
158 
159  /// Instantiate a UsdValidationValidator which has its validation logic
160  /// implemented by a UsdValidatePrimTaskFn.
163  const UsdValidatePrimTaskFn &validatePrimTaskFn);
164 
165  /// Return metadata associated with this Validator.
167  {
168  return _metadata;
169  }
170 
171  /// Return metadata associated with this validator by-value.
173  {
174  return std::move(_metadata);
175  }
176 
177  /// Run validation on the given \p layer by executing the contained
178  /// validateTaskFn and returns UsdValidationErrorVector.
179  ///
180  /// If this Validator doesn't provide a UsdValidateLayerTaskFn, then an
181  /// empty vector is returned, which signifies no error.
183  UsdValidationErrorVector Validate(const SdfLayerHandle &layer) const;
184 
185  /// Run validation on the given \p usdStage by executing the contained
186  /// validateTaskFn and returns UsdValidationErrorVector.
187  ///
188  /// \p timeRange is used to evaluate the prims and their properties in
189  /// the stage at a specific time or interval. If no \p timeRange is
190  /// provided, then full time interval is used by validation callback's
191  /// implementation.
192  ///
193  /// If this Validator doesn't provide a UsdValidateStageTaskFn, then an
194  /// empty vector is returned, which signifies no error.
197  const UsdStagePtr &usdStage,
198  const UsdValidationTimeRange &timeRange = {}) const;
199 
200  /// Run validation on the given \p usdPrim by executing the contained
201  /// validateTaskFn and returns UsdValidationErrorVector.
202  ///
203  /// \p timeRange is used to evaluate the prims and their properties in
204  /// the stage at a specific time or interval. If no \p timeRange is
205  /// provided, then full time interval is used by validation callback's
206  /// implementation.
207  ///
208  /// If this Validator doesn't provide a UsdValidatePrimTaskFn, then an
209  /// empty vector is returned, which signifies no error.
212  const UsdPrim &usdPrim,
213  const UsdValidationTimeRange &timeRange = {}) const;
214 
215 private:
216  // To make sure registry can query task types on a validator.
217  // Registry needs access to _GetValidatorPrimTasks, in order to determine if
218  // the contained validators in a suite, which provides schemaTypes metadata
219  // are compliant.
220  friend class UsdValidationRegistry;
221  // In order to distribute validators into different sets based on the type
222  // of validation to be performed, ValidationContext needs to access
223  // _GetValidateLayerTask, _GetValidateStageTask and _GetValidatePrimTask.
224  friend class UsdValidationContext;
225 
229  _validateTaskFn;
230 
231  // Return UsdValidateLayerTaskFn if provided by the validator, else a
232  // nullptr.
233  const UsdValidateLayerTaskFn *_GetValidateLayerTask() const;
234 
235  // Return UsdValidateStageTaskFn if provided by the validator, else a
236  // nullptr.
237  const UsdValidateStageTaskFn *_GetValidateStageTask() const;
238 
239  // Return UsdValidatePrimTaskFn if provided by the validator, else a
240  // nullptr.
241  const UsdValidatePrimTaskFn *_GetValidatePrimTask() const;
242 
243 }; // UsdValidationValidator
244 
245 /// \class UsdValidationValidatorSuite
246 ///
247 /// UsdValidationValidatorSuite acts like a suite for a collection of tests,
248 /// which clients can use to bundle all tests relevant to test their concepts.
249 ///
250 /// If client failed to provide isSuite metadata for a
251 /// UsdValidationValidatorSuite instance then the validatorSuite will not be
252 /// registered, and client will appropriately be warned.
253 ///
254 /// UsdValidationValidatorSuite instances are immutable and non-copyable. Note
255 /// that all validator suites which are registered with the
256 /// UsdValidationRegistry are immortal.
257 ///
258 /// isTimeDependent metadata is a no-op for a UsdValidationValidatorSuite.
259 ///
260 /// \sa UsdValidationRegistry
262 {
263 public:
264  /// Instantiate UsdValidationValidatorSuite using \p metadata and a vector
265  /// of \p validators.
268  const UsdValidationValidatorMetadata &metadata,
269  const std::vector<const UsdValidationValidator *> &validators);
270 
271  UsdValidationValidatorSuite(UsdValidationValidatorSuite &&other) noexcept
272  = default;
273 
274  UsdValidationValidatorSuite &
275  operator=(UsdValidationValidatorSuite &&) noexcept
276  = default;
277 
278  /// Returns a vector of const UsdValidationValidator pointers, which make
279  /// this UsdValidationValidatorSuite. Note that the validators are
280  /// guaranteed to be valid, since their lifetime is managed by the
281  /// UsdValidationRegistry, which has a higher scope than individual
282  /// validators.
283  const std::vector<const UsdValidationValidator *> &
285  {
286  return _containedValidators;
287  }
288 
289  /// Returns a vector of const UsdValidationValidator pointers, which make
290  /// this UsdValidationValidatorSuite. Note that the validators are
291  /// guaranteed to be valid, since their lifetime is managed by the
292  /// UsdValidationRegistry, which has a higher scope than individual
293  /// validators.
294  std::vector<const UsdValidationValidator *> GetContainedValidators() &&
295  {
296  return std::move(_containedValidators);
297  }
298 
299  /// Return metadata associated with this validator.
301  {
302  return _metadata;
303  }
304 
305  /// Return metadata associated with this validator.
307  {
308  return std::move(_metadata);
309  }
310 
311 private:
313  std::vector<const UsdValidationValidator *> _containedValidators;
314 }; // UsdValidationValidatorSuite
315 
317 
318 #endif // PXR_USD_VALIDATION_USD_VALIDATION_VALIDATOR_H
USDVALIDATION_API UsdValidationValidatorSuite(const UsdValidationValidatorMetadata &metadata, const std::vector< const UsdValidationValidator * > &validators)
USDVALIDATION_API UsdValidationValidator(const UsdValidationValidatorMetadata &metadata)
std::vector< UsdValidationValidatorMetadata > UsdValidationValidatorMetadataVector
Definition: validator.h:91
const UsdValidationValidatorMetadata & GetMetadata() const &
Return metadata associated with this Validator.
Definition: validator.h:166
TfTokenVector keywords
list of keywords extracted for this test from the plugInfo.json
Definition: validator.h:71
std::function< UsdValidationErrorVector(const UsdStagePtr &, const UsdValidationTimeRange)> UsdValidateStageTaskFn
UsdValidateStageTaskFn: Validation logic operating on a given UsdStage.
Definition: validator.h:107
GLenum GLuint GLint GLint layer
Definition: glcorearb.h:1299
#define USDVALIDATION_API
Definition: api.h:25
USDVALIDATION_API UsdValidationErrorVector Validate(const SdfLayerHandle &layer) const
UsdValidationValidatorMetadata GetMetadata()&&
Return metadata associated with this validator.
Definition: validator.h:306
std::function< UsdValidationErrorVector(const SdfLayerHandle &)> UsdValidateLayerTaskFn
UsdValidateLayerTaskFn: Validation logic operating on a given SdfLayerHandle.
Definition: validator.h:104
Definition: token.h:70
std::vector< const UsdValidationValidator * > GetContainedValidators()&&
Definition: validator.h:294
Definition: prim.h:116
std::vector< TfToken > TfTokenVector
Convenience types.
Definition: token.h:440
UsdValidationValidatorMetadata GetMetadata()&&
Return metadata associated with this validator by-value.
Definition: validator.h:172
const std::vector< const UsdValidationValidator * > & GetContainedValidators() const &
Definition: validator.h:284
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1425
std::function< UsdValidationErrorVector(const UsdPrim &, const UsdValidationTimeRange)> UsdValidatePrimTaskFn
UsdValidatePrimTaskFn: Validation logic operating on a given UsdPrim.
Definition: validator.h:110
UsdValidationValidatorSuite & operator=(UsdValidationValidatorSuite &&) noexcept=default
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
std::vector< UsdValidationError > UsdValidationErrorVector
Definition: validator.h:28
bool isSuite
whether this test represents a test suite or not
Definition: validator.h:87
const UsdValidationValidatorMetadata & GetMetadata() const &
Return metadata associated with this validator.
Definition: validator.h:300
UsdValidationValidator & operator=(const UsdValidationValidator &)=delete