---
 server/lib/deltacloud/helpers/driver_helper.rb |   16 ++++++++++++++++
 server/lib/deltacloud/models/base_model.rb     |   24 ++++++++++++++++++++++++
 server/server.rb                               |   20 +++++++++++++++++---
 3 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/server/lib/deltacloud/helpers/driver_helper.rb 
b/server/lib/deltacloud/helpers/driver_helper.rb
index 352253f..140f778 100644
--- a/server/lib/deltacloud/helpers/driver_helper.rb
+++ b/server/lib/deltacloud/helpers/driver_helper.rb
@@ -26,4 +26,20 @@ module DriverHelper
       Converters::XMLConverter.new( self, type ).convert(obj)
     end
   end
+
+  def convert_to_json(type, obj)
+    if ( [ :flavor, :account, :image, :realm, :instance, :storage_volume, 
:storage_snapshot ].include?( type ) )
+      if Array.eql?(obj.class)
+        data = obj.collect do |o|
+          o.to_hash.merge({ :href => self.send(:"#{type}_url", o.id ) })
+        end
+        type = type.to_s.pluralize
+      else
+        data = obj.to_hash
+        data.merge!({ :href => self.send(:"#{type}_url", data[:id]) })
+      end
+      return { :"#{type}" => data }.to_json
+    end
+  end
+
 end
diff --git a/server/lib/deltacloud/models/base_model.rb 
b/server/lib/deltacloud/models/base_model.rb
index c6d5251..1f42d7c 100644
--- a/server/lib/deltacloud/models/base_model.rb
+++ b/server/lib/deltacloud/models/base_model.rb
@@ -27,8 +27,32 @@ class BaseModel
     end
   end
 
+  def self.attr_accessor(*vars)
+    @attributes ||= [:id]
+    @attributes.concat vars
+    super
+  end
+
+  def self.attributes
+    @attributes
+  end
+
+  def attributes
+    self.class.attributes
+  end
+
   def id
     @id
   end
 
+  def to_hash
+    out = {}
+    self.attributes.each { |attribute| out.merge!({ attribute => 
self.send(:"#{attribute}") } ) }
+    out
+  end
+
+  def to_json
+    self.to_hash.to_json
+  end
+
 end
diff --git a/server/server.rb b/server/server.rb
index 67590d0..f807a9b 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -1,5 +1,6 @@
 require 'rubygems'
 require 'deltacloud'
+require 'json'
 require 'sinatra'
 require 'sinatra/respond_to'
 require 'erb'
@@ -13,6 +14,8 @@ require 'sinatra/lazy_auth'
 require 'deltacloud/validation'
 require 'deltacloud/helpers'
 
+require 'ap'
+
 configure do
   set :raise_errors => false
 end
@@ -47,7 +50,8 @@ def filter_all(model)
     @elements = driver.send(model.to_sym, credentials, filter)
     instance_variable_set(:"@#{model}", @elements)
     respond_to do |format|
-      format.xml  { return convert_to_xml(singular, @elements) }
+      format.xml  { convert_to_xml(singular, @elements) }
+      format.json { convert_to_json(singular, @elements) }
       format.html { haml :"#{model}/index" }
     end
 end
@@ -56,7 +60,8 @@ def show(model)
   @element = driver.send(model, credentials, { :id => params[:id]} )
   instance_variable_set("@#{model}", @element)
   respond_to do |format|
-    format.xml { return convert_to_xml(model, @element) }
+    format.xml { convert_to_xml(model, @element) }
+    format.json { convert_to_json(model, @element) }
     format.html { haml :"#{model.to_s.pluralize}/show" }
   end
 end
@@ -93,6 +98,14 @@ get '/api\/?' do
     @version = 1.0
     respond_to do |format|
         format.xml { haml :"api/show" }
+        format.json do
+          { :api => {
+            :version => @version,
+            :driver => DRIVER,
+            :links => entry_points.collect { |l| { :rel => l[0], :href => 
l[1]} }
+            }
+          }.to_json
+        end
         format.html { haml :"api/show" }
     end
 end
@@ -212,7 +225,8 @@ end
 def instance_action(name)
   @instance = driver.send(:"#{name}_instance", credentials, params[:id])
   respond_to do |format|
-    format.xml { return convert_to_xml(:instance, @instance) }
+    format.xml { convert_to_xml(:instance, @instance) }
+    format.json {convert_to_json(:instance, @instance) }
     format.html { haml :"instances/show" }
   end
 end
-- 
1.6.6.2

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to