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,
  Integer => :putInt,
  Float => :putDouble,
  Hash => proc { |o, k, v| o.putSFSObject(k, to_sfs(v)) },
  Java::SFSObject => :putSFSObject,
  [String] => :putUtfStringArray,
  [TrueClass] => :putBoolArray,
  [FalseClass] => :putBoolArray,
  [Integer] => 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,
  "FLOAT" => :getFloat,
  "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,
  "FLOAT_ARRAY" => :getFloatArray,
  "SFS_OBJECT" => proc { |k, v| to_hash(v.object) },
  "SFS_ARRAY" => proc { |k, v| to_array(v.object) },
}

Instance Method Summary collapse

Instance Method Details

#_unwrap(object, key, value) ⇒ Object

Raises:

  • (ArgumentError)


114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rubyfox/sfsobject/bulk.rb', line 114

def _unwrap(object, key, value)
  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

#_unwrapper(value) ⇒ Object



129
130
131
# File 'lib/rubyfox/sfsobject/bulk.rb', line 129

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

#_wrapper(value) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/rubyfox/sfsobject/bulk.rb', line 78

def _wrapper(value)
  case value
  when Array
    case value = value.first
    when Integer # This is necessary to support ruby < 2.4.
      TO_SFS[[Integer]]
    else
      TO_SFS[[value.class]]
    end
  when Integer # See above.
    TO_SFS[Integer]
  else
    TO_SFS[value.class]
  end
end

#to_array(object) ⇒ Object



103
104
105
106
107
# File 'lib/rubyfox/sfsobject/bulk.rb', line 103

def to_array(object)
  object.iterator.each_with_index.map do |value, index|
    _unwrap(object, index, value)
  end
end

#to_hash(object) ⇒ Object

object -> hash



95
96
97
98
99
100
101
# File 'lib/rubyfox/sfsobject/bulk.rb', line 95

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



109
110
111
112
# File 'lib/rubyfox/sfsobject/bulk.rb', line 109

def unwrap_value!(object, key)
  value = object.get(key)
  _unwrap(object, key, value)
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