Class: Lutaml::Xml::NamespaceClassRegistry

Inherits:
Object
  • Object
show all
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 Method Summary collapse

Constructor Details

#initializeNamespaceClassRegistry



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

.instanceObject

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.

Raises:

  • (ArgumentError)

    if class is invalid



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