Class: Riddl::Utils::Properties::UpdContent

Inherits:
Implementation show all
Defined in:
lib/ruby/riddl/utils/properties.rb

Overview

}}}

Instance Method Summary collapse

Methods inherited from Implementation

#headers, #initialize, #status

Constructor Details

This class inherits a constructor from Riddl::Implementation

Instance Method Details

#responseObject

{{{



428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/ruby/riddl/utils/properties.rb', line 428

def response
  backend = @a[0]
  handler = @a[1]

  property = @r[1]
  value    = @p.detect{|p| p.name == 'value'}; value = value.nil? ? value : value.value
  content  = @p.detect{|p| p.name == 'content'}; content = content.nil? ? content : content.value
  minor    = @r[2]

  unless backend.modifiable?(property)
    @status = 500
    return # change properties.schema
  end

  path = "/p:properties/*[name()=\"#{property}\"]#{minor.nil? ? '' : "/p:#{minor}"}"
  nodes = backend.data.find(path)
  if nodes.empty?
    @status = 404
    return # this property does not exist
  end

  if backend.is_state?(property)
    unless backend.valid_state?(property,nodes.first.to_s,value)
      @status = 404
      return # not a valid state from here on
    end
  end  

  newstuff = value.nil? ? XML::Smart.string(content).root.children : value
  backend.modify do |doc|
    nodes = doc.root.find(path)
    nods = nodes.map{|ele| ele.children.delete_all!; ele}
    nods.each do |ele| 
      if value.nil?
        ele.add newstuff
      else
        ele.text = newstuff
      end
    end  
  end || begin
    @status = 400
    return # bad request
  end
  
  EM.defer{handler.property(property).update} unless handler.nil?
  return
end