Class: Lutaml::Xml::NamespaceClassRegistry
- Inherits:
-
Object
- Object
- Lutaml::Xml::NamespaceClassRegistry
- Defined in:
- lib/lutaml/xml/namespace_class_registry.rb
Overview
Registry for XmlNamespace classes to ensure identity and prevent configuration loss during planning phase.
Problem: Anonymous XmlNamespace classes were being recreated multiple times, losing their configuration (e.g., element_form_default changes from :qualified to :unqualified).
Solution: Single registry ensures ONE Class object per unique configuration, preserving namespace semantics throughout serialization.
Class Method Summary collapse
-
.instance ⇒ Object
Get singleton instance.
Instance Method Summary collapse
-
#clear! ⇒ Object
private
Clear registry (for testing only).
-
#find_by_uri_or_alias(uri) ⇒ Class?
Find namespace class by URI or alias URI.
-
#get_or_create(uri: nil, prefix: nil, element_form_default: :qualified, attribute_form_default: :unqualified, element_form_default_set: true) ⇒ Class
Get or create anonymous namespace class with specific configuration.
-
#initialize ⇒ NamespaceClassRegistry
constructor
A new instance of NamespaceClassRegistry.
-
#register_named(ns_class) ⇒ Class
Register a named (user-defined) namespace class.
Constructor Details
#initialize ⇒ NamespaceClassRegistry
Returns a new instance of NamespaceClassRegistry.
20 21 22 23 24 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 20 def initialize @classes = {} @named_classes = {} @mutex = Mutex.new end |
Class Method Details
.instance ⇒ Object
Get singleton instance
16 17 18 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 16 def self.instance @instance ||= new end |
Instance Method Details
#clear! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Clear registry (for testing only)
88 89 90 91 92 93 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 88 def clear! @mutex.synchronize do @classes.clear @named_classes.clear end end |
#find_by_uri_or_alias(uri) ⇒ Class?
Find namespace class by URI or alias URI
75 76 77 78 79 80 81 82 83 84 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 75 def find_by_uri_or_alias(uri) @mutex.synchronize do # Check named classes first @named_classes.each_value.find do |ns_class| ns_class.uri == uri || ns_class.is_alias?(uri) end || @classes.each_value.find do |ns_class| ns_class.uri == uri || ns_class.is_alias?(uri) end end end |
#get_or_create(uri: nil, prefix: nil, element_form_default: :qualified, attribute_form_default: :unqualified, element_form_default_set: true) ⇒ Class
Get or create anonymous namespace class with specific configuration. Returns same Class object for identical configurations.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 35 def get_or_create(uri: nil, prefix: nil, element_form_default: :qualified, attribute_form_default: :unqualified, element_form_default_set: true) key = build_key(uri, prefix, element_form_default, attribute_form_default, element_form_default_set: element_form_default_set) @mutex.synchronize do # First check if a named class with this exact configuration exists # This ensures backward compatibility: string and class syntax produce same result return @named_classes[key] if @named_classes.key?(key) # Otherwise get or create anonymous class @classes[key] ||= create_anonymous_class( uri, prefix, element_form_default, attribute_form_default ) end end |
#register_named(ns_class) ⇒ Class
Register a named (user-defined) namespace class. Ensures the class is properly configured and prevents duplicates.
61 62 63 64 65 66 67 68 69 |
# File 'lib/lutaml/xml/namespace_class_registry.rb', line 61 def register_named(ns_class) validate_namespace_class!(ns_class) key = build_key_from_class(ns_class) @mutex.synchronize do @named_classes[key] ||= ns_class end end |