Module: Xively::Parsers::XML::KeyDefaults

Included in:
Key
Defined in:
lib/xively-rb/parsers/xml/key_defaults.rb

Instance Method Summary collapse

Instance Method Details

#from_xml(xml) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/xively-rb/parsers/xml/key_defaults.rb', line 5

def from_xml(xml)
  begin
    xml = Nokogiri::XML(xml) do |config|
      config.strict.nonet
    end
    hash = {}
    hash["id"] = xml.at_xpath("//id").content if xml.at_xpath("//id")
    hash["expires_at"] = xml.at_xpath("//expires-at").content if xml.at_xpath("//expires-at")
    hash["key"] = xml.at_xpath("//api-key").content if xml.at_xpath("//api-key")
    hash["label"] = xml.at_xpath("//label").content if xml.at_xpath("//label")
    hash["user"] = xml.at_xpath("//user").content if xml.at_xpath("//user")
    hash["private_access"] = xml.at_xpath("//private-access").content if xml.at_xpath("//private-access")

    hash["permissions"] = xml.xpath("//key/permissions/permission").collect { |permission|
      access_methods = permission.xpath("access-methods/access-method").collect { |method|
        method.content.to_s.downcase
      }
      resources = permission.xpath("resources/resource").collect { |resource|
        { "feed_id" => resource.at_xpath("feed-id").content,
          "datastream_id" => resource.at_xpath("datastream-id").content,
          "datastream_trigger_id" => resource.at_xpath("datastream-trigger-id").content
        }.delete_if_nil_value
      }
      {
        "referer" => permission.at_xpath("referer").content,
        "source_ip" => permission.at_xpath("source-ip").content,
        "private_access" => permission.at_xpath("private-access").content,
        "access_methods" => access_methods,
        "resources" => resources
      }.delete_if_nil_value
    }

    hash
  rescue Nokogiri::SyntaxError => e
    raise InvalidXMLError, e.message
  end
end