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

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

.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

Parameters:

  • uri (String)

    URI that may be canonical or an alias

Returns:

  • (Class, nil)

    The XmlNamespace class whose canonical URI or aliases match



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.

Parameters:

  • uri (String, nil) (defaults to: nil)

    Namespace URI

  • prefix (String, nil) (defaults to: nil)

    Default prefix

  • element_form_default (Symbol) (defaults to: :qualified)

    :qualified or :unqualified

  • attribute_form_default (Symbol) (defaults to: :unqualified)

    :qualified or :unqualified

  • element_form_default_set (Boolean) (defaults to: true)

    whether element_form_default was explicitly set

Returns:

  • (Class)

    XmlNamespace subclass



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.

Parameters:

  • ns_class (Class)

    XmlNamespace subclass

Returns:

  • (Class)

    The registered class

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