Class: Lutaml::Xml::NamespaceResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/xml/namespace_resolver.rb

Overview

Encapsulates all namespace resolution logic for XML serialization

Responsibilities:

  • Extract strategy from DeclarationPlan

  • Determine prefix usage

  • Determine xmlns=“” requirements

  • Calculate final namespace URI

This module provides a single source of truth for namespace decisions, reducing code duplication across adapters and enabling easier testing.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(register) ⇒ NamespaceResolver

Returns a new instance of NamespaceResolver.



18
19
20
# File 'lib/lutaml/xml/namespace_resolver.rb', line 18

def initialize(register)
  @register = register
end

Instance Attribute Details

#registerObject (readonly)

Returns the value of attribute register.



16
17
18
# File 'lib/lutaml/xml/namespace_resolver.rb', line 16

def register
  @register
end

Instance Method Details

#resolve_for_element(rule, attribute, mapping, plan, options) ⇒ Hash

Resolve namespace for an element

Parameters:

  • rule (MappingRule)

    the mapping rule

  • attribute (Attribute)

    the attribute definition

  • mapping (Mapping)

    the parent mapping

  • plan (DeclarationPlan)

    the namespace plan

  • options (Hash)

    serialization options

Returns:

  • (Hash)

    namespace resolution result with keys:

    • :blank_xmlns - Whether xmlns=“” should be added

    • :use_prefix - Whether to use prefix format

    • :prefix - The prefix to use (if any)

    • :uri - The namespace URI

    • :ns_info - Full namespace info from rule.resolve_namespace



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/lutaml/xml/namespace_resolver.rb', line 35

def resolve_for_element(rule, attribute, mapping, plan, options)
  # Get form_default from parent's schema (namespace class)
  # W3C default is :unqualified, not :qualified
  form_default = mapping&.namespace_class&.element_form_default || :unqualified

  # Resolve element's namespace first to know which namespace we're dealing with
  temp_ns_info = rule.resolve_namespace(
    attr: attribute,
    register: @register,
    parent_ns_uri: mapping&.namespace_uri,
    parent_ns_class: mapping&.namespace_class,
    form_default: form_default,
    use_prefix: false, # Temporary, just to get namespace
    parent_prefix: nil,
  )

  element_ns_uri = temp_ns_info[:uri]

  # Tree structure no longer has element_strategy - use legacy logic directly
  resolve_from_legacy_logic(rule, attribute, mapping, plan, options,
                            element_ns_uri, form_default)
end

#xmlns_blank_required?(ns_result, parent_uses_default_ns) ⇒ Boolean

Check if xmlns=“” should be added to attributes

Parameters:

  • ns_result (Hash)

    result from resolve_for_element

  • parent_uses_default_ns (Boolean)

    parent uses default namespace format

Returns:

  • (Boolean)

    true if xmlns=“” should be added



63
64
65
# File 'lib/lutaml/xml/namespace_resolver.rb', line 63

def xmlns_blank_required?(ns_result, parent_uses_default_ns)
  ns_result[:blank_xmlns] && parent_uses_default_ns
end