class ActiveFedora::Crosswalks::Crosswalker

Attributes

datastream[RW]
field[RW]
parent[RW]
reverse_transform[RW]
target_datastream[RW]
to[RW]
transform[RW]

Public Class Methods

new(args) click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 8
def initialize(args)
  @transform = args.delete(:transform)
  @reverse_transform = args.delete(:reverse_transform)
  unless transform && reverse_transform || (!transform && !reverse_transform)
    raise "If a transform is provided, then a reverse transform must be as well."
  end
  @datastream = args.delete(:datastream)
  @parent = @datastream.digital_object if @datastream
  @field = args.delete(:field)
  @to = args.delete(:to)
  @target_datastream_key = args.delete(:in).to_s
  @target_datastream = parent.datastreams[@target_datastream_key] if parent.datastreams.has_key?(@target_datastream_key)
end

Public Instance Methods

perform_crosswalk!() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 30
def perform_crosswalk!
  datastream.crosswalk_fields << field
  create_reader
  create_writer
  sync_values unless parent.kind_of?(ActiveFedora::SolrDigitalObject)
end
source_accessor() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 37
def source_accessor
  @source_accessor ||= Accessors::GenericAccessor.new(datastream, field)
end
sync_values(opts={}) click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 45
def sync_values(opts={})
  current_source_values = Array.wrap(source_accessor.original_get_value)
  current_target_values = perform_transform(Array.wrap(target_accessor.original_get_value))
  combined = current_source_values | current_target_values
  combined = current_source_values if opts[:force_target]
  source_accessor.original_set_value(combined)
  target_accessor.original_set_value(perform_reverse_transform(combined))
end
target_accessor() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 41
def target_accessor
  @target_accessor ||= Accessors::GenericAccessor.new(target_datastream, to)
end
validate!() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 22
def validate!
  unless self.valid?
    errors.full_messages.each do |error|
      raise error
    end
  end
end

Protected Instance Methods

create_reader() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 66
def create_reader
  object, method, expected_args = source_accessor.get_reader
  crosswalker = self
  return if object.respond_to?("unstubbed_#{method}".to_sym)
  object.singleton_class.class_eval do
    alias_method "unstubbed_#{method}".to_sym, method.to_sym
  end
  object.define_singleton_method(method) do |*args|
    crosswalker.sync_values
    FieldProxy.new(crosswalker.source_accessor.original_get_value, crosswalker.source_accessor, crosswalker.source_accessor.field)
  end
end
create_writer() click to toggle source
Calls superclass method
# File lib/active_fedora/crosswalks/crosswalker.rb, line 79
def create_writer
  object, method, expected_args = source_accessor.get_writer
  crosswalker = self
  return if object.respond_to?("unstubbed_#{method}".to_sym)
  object.singleton_class.class_eval do
    alias_method "unstubbed_#{method}".to_sym, method.to_sym
  end
  object.define_singleton_method(method) do |*args|
    super(*args)
    crosswalker.sync_values(:force_target => true)
    FieldProxy.new(crosswalker.source_accessor.get_value, crosswalker.source_accessor, crosswalker.source_accessor.field)
  end
end
parent_has_datastream() click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 93
def parent_has_datastream
  errors.add(:parent, "does not have a datastream #{@target_datastream_key}") unless target_datastream
end
perform_reverse_transform(values) click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 61
def perform_reverse_transform(values)
  values.map!{|x| reverse_transform.call(x)} if reverse_transform
  return values
end
perform_transform(values) click to toggle source
# File lib/active_fedora/crosswalks/crosswalker.rb, line 56
def perform_transform(values)
  values.map!{|x| transform.call(x)} if transform
  return values
end