registry.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_REGISTRY_H
8 #define PXR_USD_VALIDATION_USD_VALIDATION_REGISTRY_H
9 
10 #include "pxr/pxr.h"
11 #include "pxr/base/tf/singleton.h"
12 #include "pxr/usdValidation/usdValidation/api.h"
14 #include "pxr/usdValidation/usdValidation/fixer.h"
15 
16 #include <memory>
17 #include <shared_mutex>
18 #include <unordered_map>
19 
21 
22 PXR_NAMESPACE_OPEN_SCOPE
23 
169 {
171  UsdValidationRegistry &operator=(const UsdValidationRegistry &) = delete;
172 
173 public:
174  USDVALIDATION_API
175  static UsdValidationRegistry &GetInstance()
176  {
178  }
179 
201  USDVALIDATION_API
202  void RegisterPluginValidator(const TfToken &validatorName,
203  const UsdValidateLayerTaskFn &layerTaskFn,
204  std::vector<UsdValidationFixer> fixers = {});
205 
227  USDVALIDATION_API
228  void RegisterPluginValidator(const TfToken &validatorName,
229  const UsdValidateStageTaskFn &stageTaskFn,
230  std::vector<UsdValidationFixer> fixers = {});
231 
253  USDVALIDATION_API
254  void RegisterPluginValidator(const TfToken &validatorName,
255  const UsdValidatePrimTaskFn &primTaskFn,
256  std::vector<UsdValidationFixer> fixers = {});
257 
290  USDVALIDATION_API
292  const UsdValidateLayerTaskFn &layerTaskFn,
293  std::vector<UsdValidationFixer> fixers = {});
294 
319  USDVALIDATION_API
321  const UsdValidateStageTaskFn &stageTaskFn,
322  std::vector<UsdValidationFixer> fixers = {});
323 
348  USDVALIDATION_API
350  const UsdValidatePrimTaskFn &primTaskFn,
351  std::vector<UsdValidationFixer> fixers = {});
352 
376  USDVALIDATION_API
378  const TfToken &validatorSuiteName,
379  const std::vector<const UsdValidationValidator *> &containedValidators);
380 
416  USDVALIDATION_API
418  const UsdValidationValidatorMetadata &metadata,
419  const std::vector<const UsdValidationValidator *> &containedValidators);
420 
423  USDVALIDATION_API
424  bool HasValidator(const TfToken &validatorName) const;
425 
428  USDVALIDATION_API
429  bool HasValidatorSuite(const TfToken &suiteName) const;
430 
441  USDVALIDATION_API
442  std::vector<const UsdValidationValidator *> GetOrLoadAllValidators();
443 
451  USDVALIDATION_API
452  const UsdValidationValidator *
453  GetOrLoadValidatorByName(const TfToken &validatorName);
454 
463  USDVALIDATION_API
464  std::vector<const UsdValidationValidator *>
465  GetOrLoadValidatorsByName(const TfTokenVector &validatorNames);
466 
478  USDVALIDATION_API
479  std::vector<const UsdValidationValidatorSuite *>
481 
489  USDVALIDATION_API
491  GetOrLoadValidatorSuiteByName(const TfToken &suiteName);
492 
501  USDVALIDATION_API
502  std::vector<const UsdValidationValidatorSuite *>
504 
509  USDVALIDATION_API
510  bool GetValidatorMetadata(const TfToken &name,
511  UsdValidationValidatorMetadata *metadata) const;
512 
515  USDVALIDATION_API
516  UsdValidationValidatorMetadataVector GetAllValidatorMetadata() const;
517 
525  USDVALIDATION_API
526  UsdValidationValidatorMetadataVector
527  GetValidatorMetadataForPlugin(const TfToken &pluginName) const;
528 
536  USDVALIDATION_API
537  UsdValidationValidatorMetadataVector
538  GetValidatorMetadataForKeyword(const TfToken &keyword) const;
539 
547  USDVALIDATION_API
548  UsdValidationValidatorMetadataVector
549  GetValidatorMetadataForSchemaType(const TfToken &schemaType) const;
550 
561  USDVALIDATION_API
562  UsdValidationValidatorMetadataVector
563  GetValidatorMetadataForPlugins(const TfTokenVector &pluginNames) const;
564 
575  USDVALIDATION_API
576  UsdValidationValidatorMetadataVector
577  GetValidatorMetadataForKeywords(const TfTokenVector &keywords) const;
578 
589  USDVALIDATION_API
590  UsdValidationValidatorMetadataVector
591  GetValidatorMetadataForSchemaTypes(const TfTokenVector &schemaTypes) const;
592 
593 private:
594  friend class TfSingleton<UsdValidationRegistry>;
595 
597 
598  // Initialize _validatorNameToMetadata, _keywordToValidatorNames and
599  // _schemaTypeToValidatorNames by parsing all plugInfo.json, find all
600  // Validators.
601  void _PopulateMetadataFromPlugInfo();
602 
603  // Templated method to register validator, called by appropriate
604  // RegisterValidator methods, providing UsdValidateLayerTaskFn,
605  // UsdValidateStageTaskFn or UsdValidatePrimTaskFn.
606  template <typename ValidateTaskFn>
607  void _RegisterPluginValidator(const TfToken &validatorName,
608  const ValidateTaskFn &taskFn,
609  std::vector<UsdValidationFixer> fixers);
610 
611  // Overloaded templated _RegisterValidator, where metadata is explicitly
612  // provided.
613  template <typename ValidateTaskFn>
614  void _RegisterValidator(const UsdValidationValidatorMetadata &metadata,
615  const ValidateTaskFn &taskFn,
616  std::vector<UsdValidationFixer> fixers,
617  bool addMetadata = true);
618 
619  void _RegisterValidatorSuite(
620  const UsdValidationValidatorMetadata &metadata,
621  const std::vector<const UsdValidationValidator *> &containedValidators,
622  bool addMetadata = true);
623 
624  // makes sure metadata provided is legal
625  // checkForPrimTask parameter is used to determine if schemaTypes metadata
626  // is provided and if the task being registered for the validator is
627  // UsdValidatePrimTaskFn.
628  // expectSuite parameter is used to determine if the isSuite metadata is
629  // appropriately set (for UsdValidationValidatorSuite) or not (for
630  // UsdValidationValidator).
631  static bool _CheckMetadata(const UsdValidationValidatorMetadata &metadata,
632  bool checkForPrimTask, bool expectSuite = false);
633 
634  // Add validator metadata to _validatorNameToMetadata, also updates
635  // _schemaTypeToValidatorNames and _keywordToValidatorNames, for easy access
636  // to what validators are linked to specific schemaTypes or keywords.
637  // _mutex must be acquired before calling this method.
638  bool _AddValidatorMetadata(const UsdValidationValidatorMetadata &metadata);
639 
640  using _ValidatorNameToValidatorMap
641  = std::unordered_map<TfToken, std::unique_ptr<UsdValidationValidator>,
643  using _ValidatorSuiteNameToValidatorSuiteMap
644  = std::unordered_map<TfToken,
645  std::unique_ptr<UsdValidationValidatorSuite>,
647  using _ValidatorNameToMetadataMap
648  = std::unordered_map<TfToken, UsdValidationValidatorMetadata,
650  using _TokenToValidatorNamesMap
651  = std::unordered_map<TfToken, TfTokenVector, TfToken::HashFunctor>;
652 
653  // Helper to query
654  UsdValidationValidatorMetadataVector _GetValidatorMetadataForToken(
655  const _TokenToValidatorNamesMap &tokenToValidatorNames,
656  const TfTokenVector &tokens) const;
657 
658  // Helper to populate _keywordToValidatorNames and
659  // _schemaTypeToValidatorNames
660  // _mutex must be acquired before calling this method.
661  static void
662  _UpdateValidatorNamesMappings(_TokenToValidatorNamesMap &tokenMap,
663  const TfToken &validatorName,
664  const TfTokenVector &tokens);
665 
666  // Main datastructure which holds validatorName to
667  // std::unique_ptr<UsdValidationValidator>
668  _ValidatorNameToValidatorMap _validators;
669  // Main datastructure which holds suiteName to
670  // std::unique_ptr<UsdValidationValidatorSuite>
671  _ValidatorSuiteNameToValidatorSuiteMap _validatorSuites;
672 
673  // ValidatorName to ValidatorMetadata map
674  _ValidatorNameToMetadataMap _validatorNameToMetadata;
675 
676  // Following 3 are helper data structures to easy lookup for Validators,
677  // when queried for keywords, schemaType or pluginName.
678 
679  // This map stores the mapping from keyword to validator names. It may get
680  // updated as validators can be registered dynamically outside of the plugin
681  // infrastructure.
682  _TokenToValidatorNamesMap _keywordToValidatorNames;
683 
684  // This map stores the mapping from schemaTypes to validator names. It may
685  // get updated as validators can be registered dynamically outside of the
686  // plugin infrastructure.
687  _TokenToValidatorNamesMap _schemaTypeToValidatorNames;
688 
689  // This map stores the mapping from plugin names to validator names.
690  // It is populated during the initialization of UsdValidationRegistry
691  // and remains constant thereafter.
692  _TokenToValidatorNamesMap _pluginNameToValidatorNames;
693 
694  // Mutex to protect access to all data members.
695  mutable std::shared_mutex _mutex;
696 };
697 
698 // Specialize and delete the DeleteInstance function to prevent destruction.
699 // This will prevent the singleton instance for UsdValidationRegistry from
700 // being destroyed and hence making it immortal.
701 template <> void TfSingleton<UsdValidationRegistry>::DeleteInstance() = delete;
702 
703 USDVALIDATION_API_TEMPLATE_CLASS(TfSingleton<UsdValidationRegistry>);
704 
705 PXR_NAMESPACE_CLOSE_SCOPE
706 
707 #endif // PXR_USD_VALIDATION_USD_VALIDATION_REGISTRY_H
USDVALIDATION_API const UsdValidationValidator * GetOrLoadValidatorByName(const TfToken &validatorName)
Returns a const pointer to UsdValidationValidator if validatorName is found in the registry.
USDVALIDATION_API std::vector< const UsdValidationValidator * > GetOrLoadValidatorsByName(const TfTokenVector &validatorNames)
Returns a vector of const pointer to UsdValidationValidator corresponding to validatorNames found in ...
Manage a single instance of an object.
Manage a single instance of an object (see.
Definition: singleton.h:107
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForPlugins(const TfTokenVector &pluginNames) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which belong to the p...
USDVALIDATION_API std::vector< const UsdValidationValidatorSuite * > GetOrLoadAllValidatorSuites()
Returns a vector of const pointer to UsdValidationValidatorSuite corresponding to all validator suite...
USDVALIDATION_API void RegisterValidator(const UsdValidationValidatorMetadata &metadata, const UsdValidateLayerTaskFn &layerTaskFn, std::vector< UsdValidationFixer > fixers={})
Register UsdValidationValidator using metadata and layerTaskFn with the UsdValidationRegistry.
USDVALIDATION_API void RegisterPluginValidatorSuite(const TfToken &validatorSuiteName, const std::vector< const UsdValidationValidator * > &containedValidators)
Register UsdValidationValidatorSuite defined in a plugin using validatorSuiteName and containedValida...
Functor to use for hash maps from tokens to other things.
Definition: token.h:176
UsdValidationValidator is a class describing a single test.
Definition: validator.h:137
std::function< UsdValidationErrorVector(const UsdStagePtr &, const UsdValidationTimeRange)> UsdValidateStageTaskFn
UsdValidateStageTaskFn: Validation logic operating on a given UsdStage.
Definition: validator.h:108
UsdValidationValidatorSuite acts like a suite for a collection of tests, which clients can use to bun...
Definition: validator.h:317
USDVALIDATION_API void RegisterPluginValidator(const TfToken &validatorName, const UsdValidateLayerTaskFn &layerTaskFn, std::vector< UsdValidationFixer > fixers={})
Register UsdValidationValidator defined in a plugin using validatorName and layerTaskFn with the UsdV...
std::function< UsdValidationErrorVector(const SdfLayerHandle &)> UsdValidateLayerTaskFn
UsdValidateLayerTaskFn: Validation logic operating on a given SdfLayerHandle.
Definition: validator.h:105
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:80
A structure which describes metadata for a UsdValidationValidator.
Definition: validator.h:55
USDVALIDATION_API const UsdValidationValidatorSuite * GetOrLoadValidatorSuiteByName(const TfToken &suiteName)
Returns a const pointer to UsdValidationValidatorSuite if suiteName is found in the registry.
USDVALIDATION_API UsdValidationValidatorMetadataVector GetAllValidatorMetadata() const
Return vector of all UsdValidationValidatorMetadata known to the registry.
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForKeywords(const TfTokenVector &keywords) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which has at least on...
std::vector< TfToken > TfTokenVector
Convenience types.
Definition: token.h:489
USDVALIDATION_API bool HasValidator(const TfToken &validatorName) const
Return true if a UsdValidationValidator is registered with the name validatorName; false otherwise.
UsdValidationRegistry manages and provides access to UsdValidationValidator / UsdValidationValidatorS...
Definition: registry.h:168
static T & GetInstance()
Return a reference to an object of type T, creating it if necessary.
Definition: singleton.h:122
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForPlugin(const TfToken &pluginName) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which belong to the p...
USDVALIDATION_API void RegisterValidatorSuite(const UsdValidationValidatorMetadata &metadata, const std::vector< const UsdValidationValidator * > &containedValidators)
Register UsdValidationValidatorSuite using metadata and containedValidators with the UsdValidationReg...
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForKeyword(const TfToken &keyword) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which has the keyword...
USDVALIDATION_API bool GetValidatorMetadata(const TfToken &name, UsdValidationValidatorMetadata *metadata) const
Returns true if metadata is found in the _validatorNameToMetadata for a validator/suite name,...
static void DeleteInstance()
Destroy the sole instance object of type T, if it exists.
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForSchemaTypes(const TfTokenVector &schemaTypes) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which has at least on...
std::function< UsdValidationErrorVector(const UsdPrim &, const UsdValidationTimeRange)> UsdValidatePrimTaskFn
UsdValidatePrimTaskFn: Validation logic operating on a given UsdPrim.
Definition: validator.h:111
USDVALIDATION_API UsdValidationValidatorMetadataVector GetValidatorMetadataForSchemaType(const TfToken &schemaType) const
Returns vector of UsdValidationValidatorMetadata associated with the Validators which has the schemaT...
USDVALIDATION_API bool HasValidatorSuite(const TfToken &suiteName) const
Return true if a UsdValidationValidatorSuite is registered with the name validatorSuiteName; false ot...
USDVALIDATION_API std::vector< const UsdValidationValidator * > GetOrLoadAllValidators()
Returns a vector of const pointer to UsdValidationValidator corresponding to all validators registere...
USDVALIDATION_API std::vector< const UsdValidationValidatorSuite * > GetOrLoadValidatorSuitesByName(const TfTokenVector &suiteNames)
Returns a vector of const pointer to UsdValidationValidatorSuite corresponding to suiteNames found in...