lib/medea/jasonlistproperty.rb in medea-0.2.3 vs lib/medea/jasonlistproperty.rb in medea-0.2.4

- old
+ new

@@ -1,102 +1,102 @@ -module Medea - require 'uri' - require 'rest_client' - class JasonListProperty < JasonDeferredQuery - - attr_accessor :list_name, :parent, :list_type - - def initialize parent, list_name, list_class, list_type - @type = list_class - @list_name = list_name - @list_type = list_type - @parent = parent - @result_format = :json - @time_limit = 0 - @state = :prefetch - @contents = [] - end - - def method_missing name, *args, &block - #is this a list property on the base class? - if (@type.class_variable_defined? :@@lists) && (@type.class_variable_get(:@@lists).has_key? name) - #if so, we'll just return a new ListProperty with my query as the parent - new_list_class, new_list_type = @type.class_variable_get(:@@lists)[name] - base_query = self.clone - base_query.result_format = :keylist - JasonListProperty.new base_query, name.to_sym, new_list_class, new_list_type - else - #no method, let JasonDeferredQuery handle it - super - end - end - - def add! member, save=true - raise RuntimeError, "You can only add an item if you are accessing this list from an object." unless @parent.is_a? JasonObject - raise ArgumentError, "You can only add #{@type.name} items to this collection!" unless member.is_a? @type - - if @list_type == :value - member.jason_parent = @parent - member.jason_parent_list = @list_name - elsif @list_type == :reference - - #post to JasonDB::db_auth_url/a_class.name/ - url = "#{JasonDB::db_auth_url}#{@type.name}/#{@parent.jason_key}/#{@list_name}/#{member.jason_key}" - post_headers = { - :content_type => 'application/json', - "X-CLASS" => @type.name, - "X-KEY" => member.jason_key, - "X-PARENT" => @parent.jason_key, - "X-LIST" => @list_name.to_s - } - content = { - "_id" => member.jason_key, - "_parent" => @parent.jason_key - } - #puts " = " + url - #puts " = #{post_headers}" - response = RestClient.post url, content.to_json, post_headers - - if response.code == 201 - #save successful! - #store the new eTag for this object - #puts response.raw_headers - #@__jason_etag = response.headers[:location] + ":" + response.headers[:content_md5] - else - raise "POST failed! Could not save membership" - end - else - #parent is a JasonObject, but this list is something other than :value or :reference?? - raise "Invalid list type or trying to add an item to a subquery list!" - end - - if member.jason_state == :new - #we want to save it? probably... - member.save! if save - end - - @state = :prefetch - end - - def to_url - url = "#{JasonDB::db_auth_url}@#{@time_limit}.#{@result_format}?" - params = ["VERSION0"] - - params << "FILTER=HTTP_X_CLASS:#{@type.name}" - - if @parent.is_a? JasonObject - params << "FILTER=HTTP_X_PARENT:#{@parent.jason_key}" - else # @parent.is_a? JasonListProperty ##(or DeferredQuery?) - #we can get the insecure url here, because it will be resolved and executed at JasonDB - on a secure subnet. - - #subquery = "<%@LANGUAGE=\"URL\" #{@parent.to_url}%>" - #puts " = Fetching subquery stupidly. (#{@parent.to_url})" - - subquery = (RestClient.get @parent.to_url).strip - #puts " = Result: #{subquery}" - params << URI.escape("FILTER={HTTP_X_PARENT:#{subquery}}", Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) - end - - url << params.join("&") - end - end +module Medea + require 'uri' + require 'rest_client' + class JasonListProperty < JasonDeferredQuery + + attr_accessor :list_name, :parent, :list_type + + def initialize parent, list_name, list_class, list_type + @type = list_class + @list_name = list_name + @list_type = list_type + @parent = parent + @result_format = :json + @time_limit = 0 + @state = :prefetch + @contents = [] + end + + def method_missing name, *args, &block + #is this a list property on the base class? + if (@type.class_variable_defined? :@@lists) && (@type.class_variable_get(:@@lists).has_key? name) + #if so, we'll just return a new ListProperty with my query as the parent + new_list_class, new_list_type = @type.class_variable_get(:@@lists)[name] + base_query = self.clone + base_query.result_format = :keylist + JasonListProperty.new base_query, name.to_sym, new_list_class, new_list_type + else + #no method, let JasonDeferredQuery handle it + super + end + end + + def add! member, save=true + raise RuntimeError, "You can only add an item if you are accessing this list from an object." unless @parent.is_a? JasonObject + raise ArgumentError, "You can only add #{@type.name} items to this collection!" unless member.is_a? @type + + if @list_type == :value + member.jason_parent = @parent + member.jason_parent_list = @list_name + elsif @list_type == :reference + + #post to JasonDB::db_auth_url/a_class.name/ + url = "#{JasonDB::db_auth_url}#{@type.name}/#{@parent.jason_key}/#{@list_name}/#{member.jason_key}" + post_headers = { + :content_type => 'application/json', + "X-CLASS" => @type.name, + "X-KEY" => member.jason_key, + "X-PARENT" => @parent.jason_key, + "X-LIST" => @list_name.to_s + } + content = { + "_id" => member.jason_key, + "_parent" => @parent.jason_key + } + #puts " = " + url + #puts " = #{post_headers}" + response = RestClient.post url, content.to_json, post_headers + + if response.code == 201 + #save successful! + #store the new eTag for this object + #puts response.raw_headers + #@__jason_etag = response.headers[:location] + ":" + response.headers[:content_md5] + else + raise "POST failed! Could not save membership" + end + else + #parent is a JasonObject, but this list is something other than :value or :reference?? + raise "Invalid list type or trying to add an item to a subquery list!" + end + + if member.jason_state == :new + #we want to save it? probably... + member.save! if save + end + + @state = :prefetch + end + + def to_url + url = "#{JasonDB::db_auth_url}@#{@time_limit}.#{@result_format}?" + params = ["VERSION0"] + + params << "FILTER=HTTP_X_CLASS:#{@type.name}" + + if @parent.is_a? JasonObject + params << "FILTER=HTTP_X_PARENT:#{@parent.jason_key}" + else # @parent.is_a? JasonListProperty ##(or DeferredQuery?) + #we can get the insecure url here, because it will be resolved and executed at JasonDB - on a secure subnet. + + #subquery = "<%@LANGUAGE=\"URL\" #{@parent.to_url}%>" + #puts " = Fetching subquery stupidly. (#{@parent.to_url})" + + subquery = (RestClient.get @parent.to_url).strip + #puts " = Result: #{subquery}" + params << URI.escape("FILTER={HTTP_X_PARENT:#{subquery}}", Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) + end + + url << params.join("&") + end + end end \ No newline at end of file