blob: d49782335ac50b9bc651c7588046f815f1b457f5 [file] [log] [blame]
# 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 CIMI::Model
class Collection < Resource
class << self
attr_accessor :entry_name, :embedded
def xml_tag_name
'Collection'
end
def generate(model_class, opts = {})
model_name = model_class.name.split("::").last
scope = opts[:scope] || CIMI::Model
coll_class = Class.new(CIMI::Model::Collection)
scope.const_set(:"#{model_name}Collection", coll_class)
coll_class.entry_name = model_name.underscore.pluralize.to_sym
coll_class.embedded = opts[:embedded]
entry_schema = model_class.schema
coll_class.instance_eval do
text :id
scalar :href
text :count
scalar :href if opts[:embedded]
array self.entry_name, :schema => entry_schema, :xml_name => model_name
array :operations do
scalar :rel, :href
end
end
coll_class
end
end
# Make sure the base schema gets cloned
schema
# You can initialize collection by passing the Hash representation of the
# collection or passing another Collection object.
#
def initialize(values = {})
if values.kind_of?(Hash)
if values[:entries]
values[self.class.entry_name] = values.delete(:entries)
end
values[self.class.entry_name] ||= []
super(values)
else
super
end
end
def entries
self[self.class.entry_name]
end
# Prepare to serialize
def prepare
self.count = self.entries.size
if self.class.embedded
["id", "href"].each { |a| self[a] = nil if self[a] == "" }
# Handle href and id, which are really just aliases of one another
unless self.href || self.id
raise "Collection #{self.class.name} must have one of id and href set"
end
self.href ||= self.id
self.id ||= self.href
end
end
def [](a)
a = self.class.entry_name if a == :entries
super(a)
end
def []=(a, v)
a = self.class.entry_name if a == :entries
super(a, v)
end
def select_attributes(attr_list)
self[self.class.entry_name] = entries.map do |e|
e.select_attributes(attr_list)
end
self
end
end
module CollectionMethods
def collection_class=(klass)
@collection_class = klass
end
def collection_class
@collection_class
end
# Return a collection of entities
def list(id, entries, params = {})
params[:id] = id
if params[:system]
entries.each do |sys|
entry_id = sys.model.id
sys.model.attribute_values.each do |k,v|
if v.is_a? CIMI::Model::Collection
v.href ||= "#{entry_id}/#{k.to_s}"
end
end
end
end
params[:entries] = entries
params[:count] = params[:entries].size
if params[:add_url]
params[:operations] ||= []
params[:operations] << { :rel => "add", :href => params.delete(:add_url) }
end
if params[:import_url]
params[:operations] ||= []
params[:operations] << { :rel => "http://schemas.dmtf.org/cimi/1/action/import", :href => params.delete(:import_url) }
end
collection_class.new(params)
end
end
end