Class: Gravitext::HTMap::UniMap

Inherits:
Object
  • Object
show all
Defined in:
lib/gravitext-util/unimap.rb

Overview

Extension to com.gravitext.htmap.UniMap providing convenience methods, including ruby accessors for keys registered in UniMap::KEY_SPACE, and for ruby Hash and JSON compatibility.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.create_key(name, vtype = Java::java.lang.Object) ⇒ Object

Create a new key in UniMap::KEY_SPACE. Useful for ruby-only keys or for keys passed as parameters to Java.

Parameters

:name<~to_s>

New key name (lower_case by convention)

:vtype<~java_class>

Java class value type (default: java.lang.Object)

Returns

com.gravitext.htmap.Key



41
42
43
# File 'lib/gravitext-util/unimap.rb', line 41

def create_key( name, vtype = Java::java.lang.Object )
  KEY_SPACE.create_generic( name, vtype.java_class )
end

.deep_hash(m) ⇒ Object

Recursive UniMap#deep_hash implementation



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/gravitext-util/unimap.rb', line 111

def deep_hash( m )
  case m
  when UniMap
    m.inject( {} ) do |o, (k, v)|
      o[ key_to_symbol( k ) ] = deep_hash( v )
      o
    end
  when Array
    m.map { |v| deep_hash( v ) }
  else
    m
  end
end

.define_accessorsObject

Define class constants and accessors for each key currently in the KEY_SPACE.

To define accessors for keys defined in java, statically reference the containing class before calling this method. As Ruby’s define_method is not likely thread safe, invoke during initialization in advance of starting threaded execution. May be called multiple times.



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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 'lib/gravitext-util/unimap.rb', line 53

def define_accessors

  klist = []
  khash = {}
  KEY_SPACE.keys.each do |key|

    klist[ key.id ] = key.name.to_sym

    khash[ key.name ] = key
    khash[ key.name.to_sym ] = key

    const = key.name.upcase
    if const_defined?( const )
      cval = const_get( const )
      if cval != key
        fail "Constant #{key} already set to incompatible value #{cval}"
      end
    else
      const_set( const, key )
    end

    getter = key.name.downcase
    unless method_defined?( getter )
      class_eval <<-RUBY
        def #{getter}
          get_k( #{const} )
        end
      RUBY
    end

    setter = getter + '='
    unless method_defined?( setter )
      class_eval <<-RUBY
        def #{setter}( value )
          set_k( #{const}, value )
        end
      RUBY
    end

  end

  @key_list = klist.freeze # key name symbols array indexed by key.id
  @key_hash = khash.freeze # Hash of symbols,strings to Key
end

.key_to_symbol(key) ⇒ Object

Return cached symbol for the specified key (8bit optimized). Must have define_accessors for the key first.



100
101
102
# File 'lib/gravitext-util/unimap.rb', line 100

def key_to_symbol( key )
  @key_list.at( key.id )
end

.str_to_key(str) ⇒ Object

Return Key for specified string name or symbol (8bit optimized) Must have define_accessors for the key first.



106
107
108
# File 'lib/gravitext-util/unimap.rb', line 106

def str_to_key( str )
  @key_hash[ str ]
end

Instance Method Details

#deep_hashObject

Like to_hash but converts all nested UniMaps to hashes as well.



200
201
202
# File 'lib/gravitext-util/unimap.rb', line 200

def deep_hash
  UniMap.deep_hash( self )
end

#each(&block) ⇒ Object

Calls block with (Key, value) for each non-nil value



181
182
183
# File 'lib/gravitext-util/unimap.rb', line 181

def each( &block )
  HTMapHelper.unimap_each( self, &block )
end

#get(key) ⇒ Object Also known as: []

Get key value or nil, where key may be a Key, String, or Symbol



148
149
150
151
# File 'lib/gravitext-util/unimap.rb', line 148

def get( key )
  key = UniMap.str_to_key( key ) unless key.is_a?( Key )
  key && get_k( key )
end

#get_k(key) ⇒ Object

Get Key value or nil



154
155
156
# File 'lib/gravitext-util/unimap.rb', line 154

def get_k( key )
  HTMapHelper.get_map( self, key )
end

#has_key?(key) ⇒ Boolean Also known as: include?, key?, member?

Is this key set, not nil, where key may be a Key, String, or Symbol.

Returns:

  • (Boolean)


171
172
173
174
# File 'lib/gravitext-util/unimap.rb', line 171

def has_key?( key )
  key = UniMap.str_to_key( key ) unless key.is_a?( Key )
  key && contains_key( key )
end

#inspectObject

Inspect via deep_hash and Hash#inspect



224
225
226
# File 'lib/gravitext-util/unimap.rb', line 224

def inspect
  deep_hash.inspect
end

#is_a?(klass) ⇒ Boolean

Override: this is a Hash as well.

Returns:

  • (Boolean)


240
241
242
# File 'lib/gravitext-util/unimap.rb', line 240

def is_a?( klass )
  ( klass == Hash ) || super
end

#kind_of?(klass) ⇒ Boolean

Override: this is a Hash as well.

Returns:

  • (Boolean)


235
236
237
# File 'lib/gravitext-util/unimap.rb', line 235

def kind_of?( klass )
  ( klass == Hash ) || super
end

#merge(other) ⇒ Object

Merge other (Hash or UniMap) and return new UniMap. Nil values in other Hash are ignored.



206
207
208
# File 'lib/gravitext-util/unimap.rb', line 206

def merge( other )
  clone.merge!( other )
end

#merge!(other) ⇒ Object

Merge other (Hash or UniMap) values to self. Nil values in other Hash are ignored.



212
213
214
215
216
217
218
219
220
221
# File 'lib/gravitext-util/unimap.rb', line 212

def merge!( other )
  if other.is_a?( UniMap )
    put_all( other )
  else
    other.each do |k,v|
      set( k, v ) unless v.nil?
    end
  end
  self
end

#remove(key) ⇒ Object Also known as: delete

Remove the specified key, where key may be a Key, String, or Symbol. Returning old value or nil.



162
163
164
165
# File 'lib/gravitext-util/unimap.rb', line 162

def remove( key )
  key = UniMap.str_to_key( key ) unless key.is_a?( Key )
  key && HTMapHelper.remove_map( self, key )
end

#set(key, value) ⇒ Object Also known as: []=

Set key to value, where key may be a Key, String, or Symbol. Returns prior value or nil.



129
130
131
132
133
134
135
136
137
138
# File 'lib/gravitext-util/unimap.rb', line 129

def set( key, value )
  unless key.is_a?( Key )
    k = UniMap.str_to_key( key )
    unless k
      raise IndexError, "No Key named #{key.inspect} in UniMap.KEY_SPACE"
    end
    key = k
  end
  set_k( key, value )
end

#set_k(key, value) ⇒ Object

Set key<Key> to value, returning prior value or nil.



141
142
143
# File 'lib/gravitext-util/unimap.rb', line 141

def set_k( key, value )
  HTMapHelper.set_map( self, key, value )
end

#to_aObject

Return self as array of [ key.to_sym, value ] arrays



186
187
188
# File 'lib/gravitext-util/unimap.rb', line 186

def to_a
  map { |key,val| [ UniMap.key_to_symbol( key ), val ] }
end

#to_hashObject

Returns self as Hash, with symbols for keys



191
192
193
194
195
196
197
# File 'lib/gravitext-util/unimap.rb', line 191

def to_hash
  h = {}
  each do |key,val|
    h[ UniMap.key_to_symbol( key ) ] = val
  end
  h
end

#to_json(*args) ⇒ Object

To JSON, in form supported by JSON module. Note that this only works if you also require ‘json’ yourself.



230
231
232
# File 'lib/gravitext-util/unimap.rb', line 230

def to_json(*args)
  to_hash.to_json(*args)
end