class J2119::RoleFinder

This is about figuring out which roles apply to a node and

potentially to its children in object and array valued fields

Attributes

field_value_roles[R]

for debugging

Public Class Methods

new() click to toggle source
# File lib/j2119/role_finder.rb, line 24
def initialize
  # roles of the form: If an object with role X has field Y which
  #  is an object, that object has role R
  @child_roles = {}

  # roles of the form: If an object with role X has field Y which
  #  is an object/array, the object-files/array-elements have role R
  @grandchild_roles = {}

  # roles of the form: If an object with role X has a field Y with
  #  value Z, it has role R
  # map[role][field_name][field_val] => child_role
  @field_value_roles = {}

  # roles of the form: If an object with role X has a field Y, then
  #  it has role R
  # map[role][field_name] => child_role
  @field_presence_roles = {}

  # roles of the form: A Foo is a Bar
  @is_a_roles = {}
end

Public Instance Methods

add_child_role(role, field_name, child_role) click to toggle source
# File lib/j2119/role_finder.rb, line 65
def add_child_role(role, field_name, child_role)
  @child_roles[role] ||= {}
  @child_roles[role][field_name] = child_role
end
add_field_presence_role(role, field_name, new_role) click to toggle source
# File lib/j2119/role_finder.rb, line 60
def add_field_presence_role(role, field_name, new_role)
  @field_presence_roles[role] ||= {}
  @field_presence_roles[role][field_name] = new_role
end
add_field_value_role(role, field_name, field_value, new_role) click to toggle source
# File lib/j2119/role_finder.rb, line 52
def add_field_value_role(role, field_name, field_value, new_role)
  @field_value_roles[role] ||= {}
  @field_value_roles[role][field_name] ||= {}
  field_value = Deduce.value(field_value)
   
  @field_value_roles[role][field_name][field_value] = new_role
end
add_grandchild_role(role, field_name, child_role) click to toggle source
# File lib/j2119/role_finder.rb, line 70
def add_grandchild_role(role, field_name, child_role)
  @grandchild_roles[role] ||= {}
  @grandchild_roles[role][field_name] = child_role
end
add_is_a_role(role, other_role) click to toggle source
# File lib/j2119/role_finder.rb, line 47
def add_is_a_role(role, other_role)
  @is_a_roles[role] ||= []
  @is_a_roles[role] << other_role
end
find_child_roles(roles, field_name) click to toggle source

A node has a role, and one of its fields might be object-valued

and that value is given a role
# File lib/j2119/role_finder.rb, line 118
def find_child_roles(roles, field_name)
  newroles = []
  roles.each do |role|
    if @child_roles[role] && @child_roles[role][field_name]
      newroles << @child_roles[role][field_name]
    end
  end
  newroles
end
find_grandchild_roles(roles, field_name) click to toggle source

A node has a role, and one of its field is an object or an

array whose fields or elements are given a role
# File lib/j2119/role_finder.rb, line 131
def find_grandchild_roles(roles, field_name)
  newroles = []
  roles.each do |role|
    if @grandchild_roles[role] && @grandchild_roles[role][field_name]
      newroles << @grandchild_roles[role][field_name]
    end
  end
  newroles
end
find_more_roles(node, roles) click to toggle source

Consider a node which has one or more roles. It may have more

roles based on the presence or value of child nodes. This method
addes any such roles to the "roles" list
# File lib/j2119/role_finder.rb, line 79
def find_more_roles(node, roles)

  # find roles depending on field values
  roles.each do |role|
    per_field_name = @field_value_roles[role]
    if per_field_name
      per_field_name.each do |field_name, value_roles|
        value_roles.each do |field_value, child_role|
          if field_value == node[field_name]
            roles << child_role
          end
        end
      end
    end
  end

  # find roles depending on field presence
  roles.each do |role|
    per_field_name = @field_presence_roles[role]
    if per_field_name
      per_field_name.each do |field_name, child_role|
        if node.key? field_name
          roles << child_role
        end
      end
    end
  end

  # is_a roles
  roles.each do |role|
    other_roles = @is_a_roles[role]
    if other_roles
      other_roles.each { |o| roles << o }
    end
  end
end