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

{{{



494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
# File 'lib/ruby/riddl/utils/properties.rb', line 494

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
        ele.children.first.attributes['changed'] = Time.now.xmlschema if backend.is_state?(property)
      else
        ele.text = newstuff
        ele.attributes['changed'] = Time.now.xmlschema if backend.is_state?(property)
      end
    end
  end || begin
    @status = 400
    return # bad request
  end

  EM.defer{handler.property(property).update} unless handler.nil?
  return
end