Module: Rubyfox::SFSObject::Bulk

Extended by:
Bulk
Included in:
Bulk
Defined in:
lib/rubyfox/sfsobject/bulk.rb

Constant Summary collapse

TO_SFS =
{
  NilClass      =>  proc { |o, k, _| o.putNull(k) },
  String        =>  :putUtfString,
  TrueClass     =>  :putBool,
  FalseClass    =>  :putBool,
  Fixnum        =>  :putInt,
  Float         =>  :putDouble,
  Hash          =>  proc { |o, k, v| o.putSFSObject(k, to_sfs(v)) },
  Java::SFSObject => :putSFSObject,
  [String]      =>  :putUtfStringArray,
  [TrueClass]   =>  :putBoolArray,
  [FalseClass]  =>  :putBoolArray,
  [Fixnum]      =>  proc do |o, k, v|
    collection = Java::ArrayList.new
    v.each { |e| collection.add(e.to_java(:int)) }
    o.putIntArray(k, collection)
  end,
  [Float]       =>  :putDoubleArray,
  [Hash]        =>  proc do |o, k, v|
    ary = Java::SFSArray.new
    v.each { |e| ary.addSFSObject(to_sfs(e)) }
    o.putSFSArray(k, ary)
  end,
  [Java::SFSObject] => proc do |o, k, v|
    ary = Java::SFSArray.new
    v.each { |e| ary.addSFSObject(e) }
    o.putSFSArray(k, ary)
  end
}
TO_HASH =
{
  "NULL"              =>  proc { |k, v| nil },
  "UTF_STRING"        =>  :getUtfString,
  "BOOL"              =>  :getBool,
  "INT"               =>  :getInt,
  "DOUBLE"            =>  :getDouble,
  "UTF_STRING_ARRAY"  =>  :getUtfStringArray,
  "BOOL_ARRAY"        =>  :getBoolArray,
  #"INT_ARRAY"         =>  :getIntArray,
  "INT_ARRAY"         =>  proc { |k, v| v.object.to_a },
  "LONG_ARRAY"        =>  :getLongArray,
  "DOUBLE_ARRAY"      =>  :getDoubleArray,
  "SFS_OBJECT"        =>  proc { |k, v| to_hash(v.object) },
  "SFS_ARRAY"         =>  proc do |k, v|
    v.object.iterator.map { |e| to_hash(e.object) }
  end
}

Instance Method Summary collapse

Instance Method Details

#_unwrapper(value) ⇒ Object



112
113
114
# File 'lib/rubyfox/sfsobject/bulk.rb', line 112

def _unwrapper(value)
  TO_HASH[value.type_id.to_s]
end

#_wrapper(value) ⇒ Object



78
79
80
81
82
83
84
85
# File 'lib/rubyfox/sfsobject/bulk.rb', line 78

def _wrapper(value)
  case value
  when Array
    TO_SFS[[value.first.class]]
  else
    TO_SFS[value.class]
  end
end

#to_hash(object) ⇒ Object

object -> hash



88
89
90
91
92
93
94
# File 'lib/rubyfox/sfsobject/bulk.rb', line 88

def to_hash(object)
  hash = {}
  object.keys.each do |key|
    hash[key.to_sym] = unwrap_value!(object, key)
  end
  hash
end

#to_sfs(hash = {}) ⇒ Object

hash -> object



57
58
59
60
61
62
63
# File 'lib/rubyfox/sfsobject/bulk.rb', line 57

def to_sfs(hash={})
  object = Java::SFSObject.new
  hash.each do |key, value|
    wrap_value!(object, key, value)
  end
  object
end

#unwrap_value!(object, key) ⇒ Object

Raises:

  • (ArgumentError)


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/rubyfox/sfsobject/bulk.rb', line 96

def unwrap_value!(object, key)
  value = object.get(key)
  raise ArgumentError, "nil value for #{key.inspect}" unless value

  if wrapper_method = _unwrapper(value)
    case wrapper_method
    when Symbol
      object.send(wrapper_method, key)
    else
      wrapper_method.call(key, value)
    end
  else
    raise ArgumentError, "unwrapper for #{key}=#{value.object.inspect} (#{value.type_id}) not found"
  end
end

#wrap_value!(object, key, value) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/rubyfox/sfsobject/bulk.rb', line 65

def wrap_value!(object, key, value)
  if wrapper_method = _wrapper(value)
    case wrapper_method
    when Symbol
      object.send(wrapper_method, key, value)
    else
      wrapper_method.call(object, key, value)
    end
  else
    raise ArgumentError, "wrapper for #{key}=#{value} (#{value.class}) not found"
  end
end