From: Jan Provaznik <jprov...@redhat.com>

Various chunks of XML response were parsed by Nokogiri multiple times.
Now responses is parsed only once and parsed object is passed to methods
instead of converting to string and then reparsing the string again.
---
 client/lib/base_object.rb           |  7 +++----
 client/lib/client_bucket_methods.rb |  4 ++--
 client/lib/deltacloud.rb            | 21 +++++++++++----------
 3 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/client/lib/base_object.rb b/client/lib/base_object.rb
index 6a28d5a..d5d17fa 100644
--- a/client/lib/base_object.rb
+++ b/client/lib/base_object.rb
@@ -371,10 +371,9 @@ module DeltaCloud
       DeltaCloud::API.const_get(parent.classify).const_get(name.classify)
     end
 
-    def self.guess_model_type(response)
-      response = Nokogiri::XML(response.to_s)
-      return :action if ((response/'//actions').length >= 1) and 
((response/'//state').length == 0)
-      return :stateful if ((response/'//actions').length >= 1) and 
((response/'//state').length >= 1)
+    def self.guess_model_type(xml)
+      return :action if ((xml/'//actions').length >= 1) and 
((xml/'//state').length == 0)
+      return :stateful if ((xml/'//actions').length >= 1) and 
((xml/'//state').length >= 1)
       return :base
     end
 
diff --git a/client/lib/client_bucket_methods.rb 
b/client/lib/client_bucket_methods.rb
index a3dfda0..49035a9 100644
--- a/client/lib/client_bucket_methods.rb
+++ b/client/lib/client_bucket_methods.rb
@@ -19,7 +19,7 @@ module ClientBucketMethods
     obj = nil
     request(:post, "#{api_uri.to_s}/buckets", {:name => 
params['id'],:location=>params['bucket_location'] }) do |response|
       handle_backend_error(response) if response.code!=201
-      obj = base_object(:bucket, response)
+      obj = base_object(:bucket, Nokogiri::XML(response))
     end
   end
 
@@ -44,7 +44,7 @@ module ClientBucketMethods
     end
     resource.send(:post, {:blob_data => File.new(params['file_path'], 'rb'), 
:blob_id => params[:id]}, headers) do |response, request, block|
       handle_backend_error(response) if response.code.eql?(500)
-      blob = base_object(:blob, response)
+      blob = base_object(:blob, Nokogiri::XML(response))
       yield blob if block_given?
     end
     return blob
diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index c3efcde..d3ee9d4 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -136,13 +136,13 @@ module DeltaCloud
 
           define_method model do |*args|
             request(:get, entry_points[model], args.first) do |response|
-              base_object_collection(model, response)
+              base_object_collection(model, Nokogiri::XML(response))
             end
           end
 
           define_method :"#{model.to_s.singularize}" do |*args|
             request(:get, "#{entry_points[model]}/#{args[0]}") do |response|
-              base_object(model, response)
+              base_object(model, Nokogiri::XML(response))
             end
           end
 
@@ -159,7 +159,7 @@ module DeltaCloud
             bucket = args[0]["bucket"]
             blob = args[0][:id]
             request(:get, "#{entry_points[:buckets]}/#{bucket}/#{blob}") do 
|response|
-              base_object("blob", response)
+              base_object("blob", Nokogiri::XML(response))
             end
         end
       end
@@ -167,16 +167,17 @@ module DeltaCloud
       end
     end
 
-    def base_object_collection(model, response)
-      
Nokogiri::XML(response).xpath("#{model}/#{model.to_s.singularize}").collect do 
|item|
-        base_object(model, item.to_s)
+    def base_object_collection(model, xml)
+      xml.xpath("#{model}/#{model.to_s.singularize}").collect do |item|
+        base_object(model, item, false)
       end
     end
 
     # Add default attributes [id and href] to class
-    def base_object(model, response)
-      c = DeltaCloud.add_class("#{model}", 
DeltaCloud::guess_model_type(response))
-      xml_to_class(c, 
Nokogiri::XML(response).xpath("#{model.to_s.singularize}").first)
+    def base_object(model, xml, nested = true)
+      c = DeltaCloud.add_class("#{model}", DeltaCloud::guess_model_type(xml))
+      obj = nested ? xml.xpath("#{model.to_s.singularize}").first : xml
+      xml_to_class(c, obj)
     end
 
     # Convert XML response to defined Ruby Class
@@ -319,7 +320,7 @@ module DeltaCloud
         obj = nil
 
         request(:post, entry_points[:"#{$1}s"], {}, params) do |response|
-          obj = base_object(:"#{$1}", response)
+          obj = base_object(:"#{$1}", Nokogiri::XML(response))
           response_error(response) unless response_successful?(response.code)
           yield obj if block_given?
         end
-- 
1.7.11.7

Reply via email to