Module: Occi::Core::Helpers::ParserDereferencer

Included in:
Parsers::Json::Category, Parsers::Text::Category
Defined in:
lib/occi/core/helpers/parser_dereferencer.rb

Overview

Introduces dereferencing capabilities to various parsers. This allowes parsers to convert ‘Occi::Core::Category` sub-types from identifier into proper objects.

Author:

Instance Method Summary collapse

Instance Method Details

#dereference_identifiers!(derefd, parsed) ⇒ Array

Dereferences cross-category references. Takes existing string identifiers for actions, mixins, and kinds and replaces them with actual instances.

Parameters:

  • derefd (Array)

    list of instances needing dereferencing

  • parsed (Array)

    list of raw parsed categories (as hashes)

Returns:

  • (Array)

    dereferenced list of instances



16
17
18
19
20
21
22
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 16

def dereference_identifiers!(derefd, parsed)
  derefd.each do |cat|
    next if cat.is_a?(Occi::Core::Action) # nothing to do here
    lookup_references!(cat, derefd, parsed)
  end
  derefd
end

#first_or_die(where, what) ⇒ Object

Returns desired item from ‘where`.

Parameters:

  • where (Enumerable)

    list of items to look through, items must respond to ‘.identifier`

  • what (String)

    identifier of the desired item

Returns:

  • (Object)

    desired item from ‘where`



87
88
89
90
91
92
93
94
95
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 87

def first_or_die(where, what)
  logger.debug { "Looking for #{what.inspect} in #{where.class}" }
  found = where.detect { |elm| elm.identifier == what }
  unless found
    raise Occi::Core::Errors::ParsingError,
          "Category #{what.to_s.inspect} referenced but not provided"
  end
  found
end

#lookup_action_references!(cat, derefd, parsed_actions) ⇒ Object

Parameters:

  • cat (Occi::Core::Mixin, Occi::Core::Kind)

    category instance needing action dereferencing

  • derefd (Array)

    list of all available category instances

  • parsed_actions (Array)

    textual representation of needed actions



46
47
48
49
50
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 46

def lookup_action_references!(cat, derefd, parsed_actions)
  return if parsed_actions.blank?
  logger.debug { "Dereferencing actions #{parsed_actions.inspect} for #{cat.identifier.inspect}" }
  parsed_actions.each { |action| cat.actions << first_or_die(derefd, action) }
end

#lookup_applies_references!(_mixin, _derefd, _parsed_rel) ⇒ Object

Parameters:

  • mixin (Occi::Core::Mixin)

    mixin instance needing applicability dereferencing

  • derefd (Array)

    list of all available category instances

  • parsed_rel (Array)

    textual representations of needed applicability targets

Raises:



73
74
75
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 73

def lookup_applies_references!(_mixin, _derefd, _parsed_rel)
  raise Occi::Core::Errors::ParserError, 'Must be implemented in the parser class'
end

#lookup_depends_references!(_mixin, _derefd, _parsed_rel) ⇒ Object

Parameters:

  • mixin (Occi::Core::Mixin)

    mixin instance needing dependency dereferencing

  • derefd (Array)

    list of all available category instances

  • parsed_rel (Array)

    textual representations of needed dependencies

Raises:



80
81
82
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 80

def lookup_depends_references!(_mixin, _derefd, _parsed_rel)
  raise Occi::Core::Errors::ParserError, 'Must be implemented in the parser class'
end

#lookup_parent_references!(kind, derefd, parsed_rel) ⇒ Object

Parameters:

  • kind (Occi::Core::Kind)

    kind instance needing parent dereferencing

  • derefd (Array)

    list of all available category instances

  • parsed_rel (Array)

    textual representation of needed parent(s)



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 55

def lookup_parent_references!(kind, derefd, parsed_rel)
  return if parsed_rel.blank? || kind.parent.is_a?(Occi::Core::Kind)
  logger.debug { "Dereferencing parent #{parsed_rel.inspect} for #{kind.identifier.inspect}" }
  if parsed_rel.is_a?(Enumerable)
    if parsed_rel.count > 1
      raise Occi::Core::Errors::ParsingError,
            "Kind #{kind} with multiple parents #{parsed_rel.inspect}"
    end
    parsed_rel = parsed_rel.first
  end

  kind.parent = first_or_die(derefd, parsed_rel)
  kind.send(:load_parent_attributes!) # this is safe because there was no previous parent!
end

#lookup_references!(cat, derefd, parsed) ⇒ Object

Looks up inter-category references and replaces them with existing objects.

Parameters:

  • cat (Occi::Core::Mixin, Occi::Core::Kind)

    category to dereference

  • derefd (Array)

    list of known categories

  • parsed (Array)

    list of original parsed category structures

Raises:



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/occi/core/helpers/parser_dereferencer.rb', line 29

def lookup_references!(cat, derefd, parsed)
  parsed_cat = parsed.detect { |pcat| "#{pcat[:scheme]}#{pcat[:term]}" == cat.identifier }
  raise Occi::Core::Errors::ParsingError, "Category #{cat.identifier} not in the model" unless parsed_cat
  lookup_action_references!(cat, derefd, parsed_cat[:actions])

  if cat.is_a?(Occi::Core::Mixin)
    lookup_depends_references!(cat, derefd, parsed_cat[self::DEPENDS_KEY])
    lookup_applies_references!(cat, derefd, parsed_cat[self::APPLIES_KEY])
  else
    # only Occi::Core::Kind is left here
    lookup_parent_references!(cat, derefd, parsed_cat[self::PARENT_KEY])
  end
end