You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2011/10/27 13:17:23 UTC

[PATCH core 3/8] CIMI: Revamped cmwgapp_helper.rb to cmwg_helper with less code and without XmlSimple

From: Michal Fojtik <mf...@redhat.com>


Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/cimi/helpers/cmwg_helper.rb |  102 ++++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)
 create mode 100644 server/lib/cimi/helpers/cmwg_helper.rb

diff --git a/server/lib/cimi/helpers/cmwg_helper.rb b/server/lib/cimi/helpers/cmwg_helper.rb
new file mode 100644
index 0000000..9dae5a1
--- /dev/null
+++ b/server/lib/cimi/helpers/cmwg_helper.rb
@@ -0,0 +1,102 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module ApplicationHelper
+  include Deltacloud
+
+  def render_resource(object_name, data)
+    respond_to do |format|
+      format.xml do
+        report_error 404 unless data
+        @object = data
+        content_type cimi_content_type_for(object_name.to_s.camelize, :xml)
+        haml :"#{object_name.to_s.pluralize}/show", :layout => false
+      end
+      format.json do
+        report_error 404 unless data
+        content_type cimi_content_type_for(object_name.to_s.camelize, :json)
+        resource_to_json(object_name, data)
+      end
+    end
+  end
+
+  def render_collection(collection_name)
+    name = (collection_name == :cloud_entry_point) ? collection_name : collection_name.to_s.pluralize
+    respond_to do |format|
+      format.html do
+        haml :"#{name}/index"
+      end
+      format.xml do
+        content_type cimi_content_type_for([collection_name.to_s.camelize, 'Collection'].join, :xml)
+        haml :"#{name}/index", :layout => false
+      end
+      format.json do
+        content_type cimi_content_type_for([collection_name.to_s.camelize, 'Collection'].join, :json)
+        collection_to_json collection_name, @resources
+      end
+    end
+  end
+
+  def cimi_content_type_for(coll_type, format="html")
+    case format
+    when :xml
+      "application/CIMI-%s+xml" % coll_type
+    when :json
+      "application/CIMI-%s+json" % coll_type
+    end
+  end
+
+  def collection_to_json(collection_name, resources=[])
+    name = collection_name == :cloud_entry_point ? collection_name.to_s : collection_name.to_s.pluralize
+    engine = Tilt::HamlTemplate.new(File.join(settings.views, name, 'index.xml.haml'))
+    hash_response = XmlSimple.xml_in(engine.render(self, :'@resources' => resources))
+    hash_response.delete('xmlns')
+    hash_response.to_json
+  end
+
+  def resource_to_json(resource_name, object)
+    engine = Tilt::HamlTemplate.new(File.join(settings.views, resource_name.to_s.pluralize, 'show.xml.haml'))
+    hash_response = XmlSimple.xml_in(engine.render(self, :'@object' => object))
+    hash_response.delete('xmlns')
+    rename_key_fields!(hash_response, replacement_keys_for(resource_name))
+    hash_response.to_json
+  end
+
+  private
+
+  def replacement_keys_for(resource)
+    case resource
+    when :machine_image then {"property" => "properties", "operation" => "operations"}
+    when :machine then {"property" => "properties", "disk" => "disks", "operation" => "operations"}
+    when :colume then {"property" => "properties", "operation" => "operations"}
+    end
+  end
+
+  def rename_key_fields!(an_object, key_maps = nil)
+    if an_object.kind_of?(Hash)
+      key_maps.each do |key, value|
+        an_object[value] = an_object.delete(key) if an_object.key?(key)
+      end
+      an_object.each do |key, value|
+        rename_key_fields!(value, key_maps)
+      end
+    elsif an_object.kind_of?(Array)
+      an_object.each do |value|
+        rename_key_fields!(value, key_maps)
+      end
+    end
+  end
+
+end
-- 
1.7.4.4