rumx 0.0.8 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/History.md +28 -0
  2. data/README.md +8 -6
  3. data/examples/bean_hash/README +2 -0
  4. data/examples/bean_hash/config.ru +9 -0
  5. data/examples/bean_hash/my_bean.rb +44 -0
  6. data/examples/bean_list/my_bean.rb +3 -3
  7. data/examples/embedded/my_bean.rb +3 -2
  8. data/examples/hash/README +2 -0
  9. data/examples/hash/config.ru +9 -0
  10. data/examples/hash/my_bean.rb +30 -0
  11. data/examples/list/my_bean.rb +5 -2
  12. data/examples/monitor_script/README +8 -0
  13. data/examples/monitor_script/rumx_attributes +67 -0
  14. data/examples/simple/config.ru +3 -1
  15. data/examples/simple/my_other_bean.rb +11 -0
  16. data/examples/timer/README +1 -1
  17. data/examples/timer/my_bean.rb +2 -1
  18. data/examples/timer_hash/README +2 -0
  19. data/examples/timer_hash/config.ru +9 -0
  20. data/examples/timer_hash/my_bean.rb +29 -0
  21. data/lib/rumx.rb +5 -0
  22. data/lib/rumx/attribute.rb +26 -17
  23. data/lib/rumx/attribute_info.rb +12 -0
  24. data/lib/rumx/bean.rb +146 -248
  25. data/lib/rumx/beans.rb +2 -0
  26. data/lib/rumx/beans/error.rb +1 -1
  27. data/lib/rumx/beans/hash.rb +34 -0
  28. data/lib/rumx/beans/timer.rb +2 -2
  29. data/lib/rumx/beans/timer_and_error.rb +1 -1
  30. data/lib/rumx/beans/timer_hash.rb +9 -0
  31. data/lib/rumx/hash_attribute.rb +39 -0
  32. data/lib/rumx/hash_bean.rb +55 -0
  33. data/lib/rumx/list_attribute.rb +65 -0
  34. data/lib/rumx/list_bean.rb +52 -0
  35. data/lib/rumx/server.rb +65 -69
  36. data/lib/rumx/server/views/attribute_value_tag.haml +3 -3
  37. data/lib/rumx/server/views/content_attributes.haml +4 -4
  38. data/lib/rumx/server/views/content_operations.haml +2 -2
  39. data/lib/rumx/server/views/tree_bean_attributes.haml +0 -4
  40. data/lib/rumx/server/views/tree_bean_operations.haml +2 -2
  41. data/lib/rumx/type.rb +15 -7
  42. metadata +21 -3
  43. data/lib/rumx/server/views/content_attribute.haml +0 -35
@@ -0,0 +1,12 @@
1
+ module Rumx
2
+ class AttributeInfo
3
+ attr_reader :attribute, :bean, :ancestry, :value
4
+
5
+ def initialize(attribute, bean, ancestry, value)
6
+ @attribute = attribute
7
+ @bean = bean
8
+ @ancestry = ancestry
9
+ @value = value
10
+ end
11
+ end
12
+ end
data/lib/rumx/bean.rb CHANGED
@@ -1,19 +1,23 @@
1
+ require 'monitor'
2
+
1
3
  module Rumx
2
4
  # Defines a Rumx bean that allows access to the defined attributes and operations.
3
5
  # All public instance methods are prefixed with "bean_" to try to avoid collisions.
4
6
  module Bean
5
7
  module ClassMethods
6
8
 
9
+ # options
10
+ # type => :list
11
+ # list_type - type of each list element
12
+ # max_size - the max size the list can be indexed for setting. Can be an integer or
13
+ # a symbol that represents an attribute or method of the bean. Defaults to the
14
+ # current size of the list.
7
15
  def bean_reader(name, type, description, options={})
8
- bean_add_attribute(Attribute.new(name, type, description, true, false, options))
16
+ bean_add_attribute(name, type, description, true, false, options)
9
17
  end
10
18
 
11
- # options
12
- # max_size - the max size the list can be indexed for setting. Can be an integer or
13
- # a symbol that represents an attribute or method of the bean. Defaults to the
14
- # current size of the list.
15
19
  def bean_list_reader(name, type, description, options={})
16
- bean_add_list_attribute(Attribute.new(name, type, description, true, false, options))
20
+ raise "bean_list_reader no longer used, instead use 'bean_reader :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
17
21
  end
18
22
 
19
23
  def bean_attr_reader(name, type, description, options={})
@@ -22,16 +26,15 @@ module Rumx
22
26
  end
23
27
 
24
28
  def bean_list_attr_reader(name, type, description, options={})
25
- attr_reader(name)
26
- bean_list_reader(name, type, description, options)
29
+ raise "bean_list_attr_reader no longer used, instead use 'bean_attr_reader :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
27
30
  end
28
31
 
29
32
  def bean_writer(name, type, description, options={})
30
- bean_add_attribute(Attribute.new(name, type, description, false, true, options))
33
+ bean_add_attribute(name, type, description, false, true, options)
31
34
  end
32
35
 
33
36
  def bean_list_writer(name, type, description, options={})
34
- bean_add_list_attribute(Attribute.new(name, type, description, false, true, options))
37
+ raise "bean_list_writer no longer used, instead use 'bean_writer :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
35
38
  end
36
39
 
37
40
  def bean_attr_writer(name, type, description, options={})
@@ -40,16 +43,15 @@ module Rumx
40
43
  end
41
44
 
42
45
  def bean_list_attr_writer(name, type, description, options={})
43
- attr_writer(name)
44
- bean_list_writer(name, type, description, options)
46
+ raise "bean_list_attr_writer no longer used, instead use 'bean_attr_writer :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
45
47
  end
46
48
 
47
49
  def bean_accessor(name, type, description, options={})
48
- bean_add_attribute(Attribute.new(name, type, description, true, true, options))
50
+ bean_add_attribute(name, type, description, true, true, options)
49
51
  end
50
52
 
51
53
  def bean_list_accessor(name, type, description, options={})
52
- bean_add_list_attribute(Attribute.new(name, type, description, true, true, options))
54
+ raise "bean_list_accessor no longer used, instead use 'bean_accessor :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
53
55
  end
54
56
 
55
57
  def bean_attr_accessor(name, type, description, options={})
@@ -58,28 +60,23 @@ module Rumx
58
60
  end
59
61
 
60
62
  def bean_list_attr_accessor(name, type, description, options={})
61
- attr_accessor(name)
62
- bean_list_accessor(name, type, description, options)
63
+ raise "bean_list_attr_accessor no longer used, instead use 'bean_attr_accessor :#{name}, :list, #{description.inspect}, #{options.merge(:list_type => type).inspect}'"
63
64
  end
64
65
 
65
66
  def bean_embed(name, description)
66
- # We're going to ignore description (for now)
67
- bean_embeds_local << name.to_sym
67
+ raise "bean_embed no longer used, instead use 'bean_reader :#{name}, :bean, #{description.inspect}'"
68
68
  end
69
69
 
70
70
  def bean_attr_embed(name, description)
71
- attr_reader(name)
72
- bean_embed(name, description)
71
+ raise "bean_attr_embed no longer used, instead use 'bean_attr_reader :#{name}, :bean, #{description.inspect}'"
73
72
  end
74
73
 
75
74
  def bean_embed_list(name, description)
76
- # We're going to ignore description (for now)
77
- bean_embed_lists_local << name.to_sym
75
+ raise "bean_embed_list no longer used, instead use 'bean_attr_reader :#{name}, :list, #{description.inspect}, :list_type => :bean'"
78
76
  end
79
77
 
80
78
  def bean_attr_embed_list(name, description)
81
- attr_reader(name)
82
- bean_embed_list(name, description)
79
+ raise "bean_attr_embed_list no longer used, instead use 'bean_attr_reader :#{name}, :list, #{description.inspect}, :list_type => :bean'"
83
80
  end
84
81
 
85
82
  #bean_operation :my_operation, :string, 'My operation', [
@@ -99,12 +96,18 @@ module Rumx
99
96
  # private - TODO: Local helper methods, how should I designate them as private or just nodoc them?
100
97
  #######
101
98
 
102
- def bean_add_attribute(attribute)
103
- bean_attributes_local << attribute
104
- end
105
-
106
- def bean_add_list_attribute(attribute)
107
- bean_list_attributes_local << attribute
99
+ def bean_add_attribute(name, type_name, description, allow_read, allow_write, options)
100
+ # Dummy up the things that are defined like attributes but are really beans
101
+ if type_name == :bean
102
+ bean_embeds_local[name.to_sym] = nil
103
+ elsif type_name == :list && options[:list_type] == :bean
104
+ bean_embeds_local[name.to_sym] = ListBean
105
+ elsif type_name == :hash && options[:hash_type] == :bean
106
+ bean_embeds_local[name.to_sym] = HashBean
107
+ else
108
+ type = Type.find(type_name)
109
+ bean_attributes_local << type.create_attribute(name, description, allow_read, allow_write, options)
110
+ end
108
111
  end
109
112
 
110
113
  def bean_attributes
@@ -115,22 +118,10 @@ module Rumx
115
118
  return attributes
116
119
  end
117
120
 
118
- def bean_list_attributes
119
- attributes = []
120
- self.ancestors.reverse_each do |mod|
121
- attributes += mod.bean_list_attributes_local if mod.include?(Rumx::Bean)
122
- end
123
- return attributes
124
- end
125
-
126
121
  def bean_attributes_local
127
122
  @attributes ||= []
128
123
  end
129
124
 
130
- def bean_list_attributes_local
131
- @list_attributes ||= []
132
- end
133
-
134
125
  def bean_operations
135
126
  operations = []
136
127
  self.ancestors.reverse_each do |mod|
@@ -144,27 +135,16 @@ module Rumx
144
135
  end
145
136
 
146
137
  def bean_embeds
147
- embeds = []
138
+ embeds = {}
139
+ # Merge in all the module embeds that are beans
148
140
  self.ancestors.reverse_each do |mod|
149
- embeds += mod.bean_embeds_local if mod.include?(Rumx::Bean)
141
+ embeds = embeds.merge(mod.bean_embeds_local) if mod.include?(Rumx::Bean)
150
142
  end
151
143
  return embeds
152
144
  end
153
145
 
154
- def bean_embed_lists
155
- embed_lists = []
156
- self.ancestors.reverse_each do |mod|
157
- embed_lists += mod.bean_embed_lists_local if mod.include?(Rumx::Bean)
158
- end
159
- return embed_lists
160
- end
161
-
162
146
  def bean_embeds_local
163
- @embeds ||= []
164
- end
165
-
166
- def bean_embed_lists_local
167
- @embed_lists ||= []
147
+ @embeds ||= {}
168
148
  end
169
149
 
170
150
  end
@@ -178,29 +158,13 @@ module Rumx
178
158
  end
179
159
 
180
160
  def self.find(name_array)
181
- bean = root
182
- until name_array.empty?
183
- name = name_array.shift.to_sym
184
- child_bean = bean.bean_children[name]
185
- if !child_bean && bean.class.bean_embeds.include?(name)
186
- child_bean = bean.send(name)
187
- end
188
- if !child_bean && bean.class.bean_embed_lists.include?(name)
189
- list = bean.send(name)
190
- if list
191
- index = name_array.shift
192
- child_bean = list[index.to_i] if index && index.match(/\d+/)
193
- end
194
- end
195
- return nil unless child_bean
196
- bean = child_bean
197
- end
198
- return bean
161
+ root.bean_find(name_array)
199
162
  end
200
163
 
201
164
  # Return [bean, attribute, param_name, value] list or nil if not found
202
165
  def self.find_attribute(name_array)
203
- name = name_array.pop
166
+ attribute_name = name_array.last
167
+ name_array = name_array[0..-2]
204
168
  # If it's a list attribute
205
169
  if name.match(/^\d+$/)
206
170
  index = name.to_i
@@ -208,15 +172,6 @@ module Rumx
208
172
  bean = Bean.find(name_array)
209
173
  return nil unless bean
210
174
  name = name.to_sym
211
- bean.class.bean_list_attributes.each do |attribute|
212
- if name == attribute.name
213
- obj = bean.send(attribute.name)
214
- if obj
215
- param_name = "#{attribute.name}[#{index}]"
216
- return [bean, attribute, param_name, attribute.get_index_value(obj, index)]
217
- end
218
- end
219
- end
220
175
  # else just a regular attribute
221
176
  else
222
177
  bean = Bean.find(name_array)
@@ -243,53 +198,105 @@ module Rumx
243
198
  return nil
244
199
  end
245
200
 
246
- # Mutex for synchronization of attributes/operations
247
- def bean_mutex
248
- # TBD: How to initialize this in a module and avoid race condition?
249
- @mutex || Mutex.new
201
+ # Monitor for synchronization of attributes/operations
202
+ def bean_monitor
203
+ # TODO: How to initialize this in a module and avoid race condition?
204
+ @monitor ||= Monitor.new
250
205
  end
251
206
 
252
207
  # Synchronize access to attributes and operations
253
208
  def bean_synchronize
254
- bean_mutex.synchronize do
209
+ bean_monitor.synchronize do
255
210
  yield
256
211
  end
257
212
  end
258
213
 
259
214
  def bean_children
215
+ # TODO: How to initialize this in a module and avoid race condition?
260
216
  @bean_children ||= {}
261
217
  end
262
218
 
263
219
  def bean_add_child(name, child_bean)
264
- # TBD - Should I mutex protect this? All beans would normally be registered during the code initialization process
265
- raise "Error trying to add #{name} to embedded bean" if @bean_is_embedded
266
- bean_children[name.to_sym] = child_bean
220
+ bean_synchronize do
221
+ bean_children[name.to_sym] = child_bean
222
+ end
267
223
  end
268
224
 
269
225
  def bean_remove_child(name)
270
- bean_children.delete(name.to_sym)
226
+ bean_synchronize do
227
+ bean_children.delete(name.to_sym)
228
+ end
271
229
  end
272
230
 
273
- def bean_has_attributes?
274
- return true unless self.class.bean_attributes.empty? && self.class.bean_list_attributes.empty?
275
- self.class.bean_embeds.each do |name|
276
- bean = send(name)
277
- return true if bean && bean.bean_has_attributes?
231
+ # Find the bean
232
+ def bean_find(name_array, index = 0)
233
+ return self if index == name_array.size
234
+ name = name_array[index].to_sym
235
+ child_bean = bean_children[name] || bean_embedded(name)
236
+ return nil unless child_bean
237
+ return child_bean.bean_find(name_array, index+1)
238
+ end
239
+
240
+ def bean_each(ancestry=[], &block)
241
+ yield self, ancestry
242
+ bean_each_child_recursive(ancestry) do |child_bean, child_ancestry|
243
+ yield child_bean, child_ancestry
278
244
  end
279
- self.class.bean_embed_lists.each do |list_name|
280
- list = send(list_name)
281
- if list
282
- list.each do |bean|
283
- return true if bean.bean_has_attributes?
284
- end
245
+ end
246
+
247
+ def bean_each_child_recursive(ancestry, &block)
248
+ child_ancestry = ancestry.dup
249
+ # Save some object creation
250
+ child_index = child_ancestry.size
251
+ bean_each_child do |name, bean|
252
+ child_ancestry[child_index] = name
253
+ bean.bean_each(child_ancestry, &block)
254
+ end
255
+ end
256
+
257
+ # Call the block for each direct child of this bean (includes the bean_children and the embedded beans)
258
+ def bean_each_child(&block)
259
+ bean_children.each do |name, bean|
260
+ yield name, bean
261
+ end
262
+ bean_each_embedded_child do |name, bean|
263
+ yield name, bean
264
+ end
265
+ end
266
+
267
+ # Call the block for all the embedded beans
268
+ def bean_each_embedded_child(&block)
269
+ self.class.bean_embeds.each do |name, bean_klass|
270
+ bean = send(name)
271
+ if bean
272
+ # bean_klass is either ListBean or HashBean, otherwise we already have our bean
273
+ bean = bean_klass.new(bean) if bean_klass
274
+ yield name, bean
285
275
  end
286
276
  end
277
+ end
278
+
279
+ def bean_embedded(name)
280
+ return nil unless self.class.bean_embeds.key?(name)
281
+ bean = send(name)
282
+ if bean
283
+ bean_klass = self.class.bean_embeds[name]
284
+ bean = bean_klass.new(bean) if bean_klass
285
+ end
286
+ return bean
287
+ end
288
+
289
+ def bean_has_attributes?
290
+ return true unless self.class.bean_attributes.empty?
291
+ bean_each_embedded_child do |name, bean|
292
+ return true if bean.bean_has_attributes?
293
+ end
287
294
  return false
288
295
  end
289
296
 
290
- def bean_get_attributes(rel_path=nil, param_name=nil, &block)
297
+ def bean_get_attributes(ancestry=[], &block)
291
298
  bean_synchronize do
292
- do_bean_get_attributes(rel_path, param_name, &block)
299
+ do_bean_get_attributes(ancestry, &block)
293
300
  end
294
301
  end
295
302
 
@@ -299,53 +306,38 @@ module Rumx
299
306
  end
300
307
  end
301
308
 
302
- def bean_get_and_set_attributes(params, rel_path=nil, param_name=nil, &block)
309
+ def bean_get_and_set_attributes(params, ancestry=[], &block)
303
310
  bean_synchronize do
304
- val = do_bean_get_attributes(rel_path, param_name, &block)
311
+ val = do_bean_get_attributes(ancestry, &block)
305
312
  do_bean_set_attributes(params)
306
313
  val
307
314
  end
308
315
  end
309
316
 
310
- def bean_set_and_get_attributes(params, rel_path=nil, param_name=nil, &block)
317
+ def bean_set_and_get_attributes(params, ancestry=[], &block)
311
318
  bean_synchronize do
312
319
  do_bean_set_attributes(params)
313
- do_bean_get_attributes(rel_path, param_name, &block)
320
+ do_bean_get_attributes(ancestry, &block)
314
321
  end
315
322
  end
316
323
 
317
324
  def bean_has_operations?
318
- return true unless self.class.bean_operations.empty?
319
- self.class.bean_embeds.each do |name|
320
- bean = send(name)
321
- return true if bean && bean.bean_has_operations?
322
- end
323
- self.class.bean_embed_lists.each do |list_name|
324
- list = send(list_name)
325
- if list
326
- list.each do |bean|
327
- return true if bean.bean_has_operations?
328
- end
329
- end
330
- end
331
- return false
325
+ !self.class.bean_operations.empty?
332
326
  end
333
327
 
334
- def bean_each_operation(rel_path=nil, &block)
328
+ def bean_each_operation(&block)
335
329
  self.class.bean_operations.each do |operation|
336
- yield operation, bean_join_rel_path(rel_path, operation.name.to_s)
330
+ yield operation
337
331
  end
338
- self.class.bean_embeds.each do |name|
339
- bean = send(name)
340
- bean.bean_each_operation(bean_join_rel_path(rel_path, name), &block) if bean
341
- end
342
- self.class.bean_embed_lists.each do |name|
343
- list = send(name)
344
- if list
345
- list_rel_path = bean_join_rel_path(rel_path, name)
346
- list.each_with_index do |bean, i|
347
- bean.bean_each_operation(bean_join_rel_path(list_rel_path, i.to_s), &block)
348
- end
332
+ end
333
+
334
+ def bean_each_operation_recursive(&block)
335
+ bean_each do |bean, ancestry|
336
+ operation_ancestry = ancestry.dup
337
+ index = operation_ancestry.size
338
+ bean.class.bean_operations.each do |operation|
339
+ operation_ancestry[index] = operation.name
340
+ yield operation, operation_ancestry
349
341
  end
350
342
  end
351
343
  end
@@ -358,39 +350,18 @@ module Rumx
358
350
  def bean_attributes_changed
359
351
  end
360
352
 
361
- #######
362
- private
363
- #######
364
-
365
- # Separate call in case we're already mutex locked
366
- def do_bean_get_attributes(rel_path, param_name, &block)
353
+ # Separate call in case we're already monitor locked
354
+ def do_bean_get_attributes(ancestry, &block)
367
355
  return do_bean_get_attributes_json unless block_given?
368
356
  self.class.bean_attributes.each do |attribute|
369
- yield attribute, attribute.get_value(self), bean_join_rel_path(rel_path, attribute.name.to_s), bean_join_param_name(param_name, attribute.name.to_s)
370
- end
371
- self.class.bean_list_attributes.each do |attribute|
372
- obj = send(attribute.name)
373
- if obj
374
- new_rel_path = bean_join_rel_path(rel_path, attribute.name.to_s)
375
- new_param_name = bean_join_param_name(param_name, attribute.name.to_s)
376
- obj.each_index do |i|
377
- yield attribute, attribute.get_index_value(obj, i), "#{new_rel_path}/#{i}", "#{new_param_name}[#{i}]"
378
- end
379
- end
357
+ attribute.each_attribute_info(self, ancestry) {|attribute_info| yield attribute_info}
380
358
  end
381
- self.class.bean_embeds.each do |name|
382
- bean = send(name)
383
- bean.bean_get_attributes(bean_join_rel_path(rel_path, name), bean_join_param_name(param_name, name), &block) if bean
384
- end
385
- self.class.bean_embed_lists.each do |name|
386
- list = send(name)
387
- if list
388
- list_rel_path = bean_join_rel_path(rel_path, name)
389
- list_param_name = bean_join_param_name(param_name, name)
390
- list.each_with_index do |bean, i|
391
- bean.bean_get_attributes(bean_join_rel_path(list_rel_path, i.to_s), bean_join_param_name(list_param_name, i.to_s), &block)
392
- end
393
- end
359
+ child_ancestry = ancestry.dup
360
+ # Save some object creation
361
+ child_index = child_ancestry.size
362
+ bean_each_child do |name, bean|
363
+ child_ancestry[child_index] = name
364
+ bean.bean_get_attributes(child_ancestry, &block)
394
365
  end
395
366
  end
396
367
 
@@ -399,100 +370,27 @@ module Rumx
399
370
  self.class.bean_attributes.each do |attribute|
400
371
  hash[attribute.name] = attribute.get_value(self)
401
372
  end
402
- self.class.bean_list_attributes.each do |attribute|
403
- hash[attribute.name] = attribute.get_value(self)
404
- end
405
- self.class.bean_embeds.each do |name|
406
- bean = send(name)
407
- hash[name] = bean.bean_get_attributes if bean
408
- end
409
- self.class.bean_embed_lists.each do |name|
410
- list = send(name)
411
- if list
412
- hash[name] = list.map {|bean| bean.bean_get_attributes}
413
- end
373
+ bean_each_child do |name, bean|
374
+ hash[name] = bean.bean_get_attributes
414
375
  end
415
376
  return hash
416
377
  end
417
378
 
418
- # Separate call in case we're already mutex locked
379
+ # Separate call in case we're already monitor locked
419
380
  def do_bean_set_attributes(params)
420
381
  return if !params || params.empty?
421
382
  changed = false
422
383
  self.class.bean_attributes.each do |attribute|
423
- if attribute.allow_write
424
- if params.has_key?(attribute.name)
425
- attribute.set_value(self, params[attribute.name])
426
- changed = true
427
- elsif params.has_key?(attribute.name.to_s)
428
- attribute.set_value(self, params[attribute.name.to_s])
429
- changed = true
430
- end
431
- end
432
- end
433
- self.class.bean_list_attributes.each do |attribute|
434
- if attribute.allow_write
435
- obj = send(attribute.name)
436
- sub_params = params[attribute.name] || params[attribute.name.to_s]
437
- raise "Can't assign value for nil list attribute" if !obj && sub_params
438
- if sub_params
439
- # TODO: Allow array?
440
- raise "Invalid param for #{attribute.name}" unless sub_params.kind_of?(Hash)
441
- max_size = attribute[:max_size]
442
- if max_size
443
- if max_size.kind_of?(Symbol)
444
- max_size = send(max_size)
445
- end
446
- else
447
- # Default to current size of the list if unset
448
- max_size = obj.size
449
- end
450
- sub_params.each do |index, value|
451
- if index.to_i < max_size
452
- attribute.set_index_value(obj, index.to_i, value)
453
- changed = true
454
- end
455
- end
456
- end
457
- end
384
+ changed = true if attribute.write?(self, params)
458
385
  end
459
- self.class.bean_embeds.each do |name|
460
- bean = send(name)
461
- if bean
462
- embedded_params = params[name]
386
+ bean_each_child do |name, bean|
387
+ embedded_params = params[name] || params[name.to_s]
388
+ if embedded_params && !embedded_params.empty?
463
389
  bean.bean_set_attributes(embedded_params)
464
390
  changed = true
465
391
  end
466
392
  end
467
- self.class.bean_embed_lists.each do |name|
468
- list = send(name)
469
- if list
470
- list_params = params[name]
471
- if list_params
472
- list.each_with_index do |bean, i|
473
- bean.bean_set_attributes(list_params[i] || list_params[i.to_s])
474
- end
475
- changed = true
476
- end
477
- end
478
- end
479
393
  bean_attributes_changed if changed
480
394
  end
481
-
482
- def bean_join_rel_path(parent_rel_path, name)
483
- if parent_rel_path
484
- "#{parent_rel_path}/#{name}"
485
- else
486
- name.to_s
487
- end
488
- end
489
-
490
- def bean_join_param_name(parent_param_name, name)
491
- if parent_param_name
492
- "#{parent_param_name}[#{name}]"
493
- else
494
- name.to_s
495
- end
496
- end
497
395
  end
498
396
  end