class Riddl::Utils::Properties::PtcContent

Public Instance Methods

response() click to toggle source
# File lib/ruby/riddl/utils/properties.rb, line 433
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
  content  = content.read if content.respond_to? :read
  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)
    nodes.each do |ele|
      if value.nil?
        newstuff.each do |child|
          cpath = File.basename(child.qname.name)
          subele = ele.find("p:" + cpath).first
          if subele
            subele.replace_by_copy(child)
          else
            ele.add(child)
          end
        end
        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