Class: Logical::Naf::Unpickler

Inherits:
Object
  • Object
show all
Includes:
Af::Application::Component
Defined in:
app/models/logical/naf/unpickler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(preserves, preservables, input_version) ⇒ Unpickler

Returns a new instance of Unpickler.



12
13
14
15
16
17
18
# File 'app/models/logical/naf/unpickler.rb', line 12

def initialize(preserves, preservables, input_version)
  @preserves = preserves
  @preservables = preservables
  @input_version = input_version
  @references = {}
  @context = {}
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



6
7
8
# File 'app/models/logical/naf/unpickler.rb', line 6

def context
  @context
end

#input_versionObject (readonly)

Returns the value of attribute input_version.



6
7
8
# File 'app/models/logical/naf/unpickler.rb', line 6

def input_version
  @input_version
end

#preservablesObject (readonly)

Returns the value of attribute preservables.



6
7
8
# File 'app/models/logical/naf/unpickler.rb', line 6

def preservables
  @preservables
end

#preservesObject (readonly)

Returns the value of attribute preserves.



6
7
8
# File 'app/models/logical/naf/unpickler.rb', line 6

def preserves
  @preserves
end

#referencesObject (readonly)

Returns the value of attribute references.



6
7
8
# File 'app/models/logical/naf/unpickler.rb', line 6

def references
  @references
end

Instance Method Details

#cache_all_models(model) ⇒ Object



20
21
22
23
24
25
26
# File 'app/models/logical/naf/unpickler.rb', line 20

def cache_all_models(model)
  references.merge!(Hash[model.all.map do |m|
                           logger.detail "caching: #{m.inspect}"
                           [{ association_model_name: model.name, association_value: m.id }, m]
                         end
                        ])
end

#generic_unpickle(model, preserve, id_method_name = :id) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/models/logical/naf/unpickler.rb', line 32

def generic_unpickle(model, preserve, id_method_name = :id)
  if references[{ association_model_name: model.name, association_value: preserve[id_method_name.to_s] }]
    return {}
  end

  attributes = {}

  reference_methods = []
  preserve.each do |method_name, value|
    id_method = method_name.to_sym
    unless id_method_name == id_method
      if value.is_a?(Hash)
        # this is a reference
        reference_instance = retrieve_reference(value)
        if reference_instance.nil?
          logger.error value.inspect
          logger.error { references.map{|r| r.inspect}.join("\n") }
          logger.error { references.map{ |r| r.inspect }.join("\n") }
          raise "couldn't find reference for #{value.inspect} in #{preserve.inspect}"
        end
        attributes[method_name.to_sym] = reference_instance.id
      else
        attributes[method_name.to_sym] = value
      end
    end
  end

  instance = model.new
  attributes.each do |method, value|
    instance.send("#{method}=".to_sym, value)
  end
  instance.save!
  logger.info "created #{instance.inspect}"

  return { { association_model_name: model.name,
             association_value: preserve[id_method_name.to_s] } => instance }
end

#reconstituteObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'app/models/logical/naf/unpickler.rb', line 70

def reconstitute
  preservables.each do |model|
    if model.respond_to?(:pre_unpickle)
      model.pre_unpickle(self)
    else
      cache_all_models(model)
    end
  end

  preservables.each do |model|
    model_preserves = preserves[model.name]
    if model_preserves
      model_preserves.each do |model_preserve|
        if model.respond_to?(:unpickle)
          additional_references = model.unpickle(model_preserve, self)
        else
          additional_references = generic_unpickle(model, model_preserve)
        end
        references.merge!(additional_references)
      end
    end
  end

  preservables.each do |model|
    model.post_unpickle(self) if model.respond_to?(:post_unpickle)
  end
end

#retrieve_reference(reference) ⇒ Object



28
29
30
# File 'app/models/logical/naf/unpickler.rb', line 28

def retrieve_reference(reference)
  references[reference.symbolize_keys]
end