Project

General

Profile

« Previous | Next » 

Revision 7bfcd98b

Added by Marc Dequènes about 13 years ago

  • ID 7bfcd98b929705cc5c65b729a60f022827a66bfe

[evol] Librarian API work §3

View differences:

lib/cyborghood/cyborg/botnet/interface.rb
end
end
def attr_search_node
def attr_search_node(list = nil, &block)
list ||= block
lookup_node = self
node '?', :hidden => true do
......
if request.args.empty?
request.reply.results = lookup_node.__send__(:visible_nodes_names)
else
node_names_list = []
lookup_node.__send__(:visible_nodes).each do |match, node|
if match.is_a? String
match_list = [match]
elsif match.is_a? Proc
match_list = match.call
else
next
end
match_list.each do |child_node_name|
node.__send__(:load, child_node_name)
result = node.__send__(:request, request.session)
next unless result.respond_to? :to_hash
if hash_match_criterias(result.to_hash, request.args.first)
node_names_list << child_node_name
end
end
end
request.reply.results = node_names_list
request.reply.results = list.nil? ? search_among_children(request, lookup_node) :
search_in_list(request, lookup_node, list)
end
end
end
......
def _call(session, node_path, args = nil)
args ||= []
raise CyberError.new(:unrecoverable, 'api/cyborghood', "wrong format for arguments") unless args.is_a? Array
raise CyberError.new(:unrecoverable, 'api/cyborghood', "wrong format for arguments when calling node '#{node_path}'") unless args.is_a? Array
node = find_node(session, node_path)
raise CyberError.new(:unrecoverable, 'api/cyborghood', "unknown node") if node.nil?
raise CyberError.new(:unrecoverable, 'api/cyborghood', "unknown node '#{node_path}'") if node.nil?
logger.debug "[Server API] Node '#{node_path}' found"
node.__send__(:request, session, args)
......
rescue
logger.debug "node request error message: " + $!
logger.debug "node request error backtrace: " + $!.backtrace.join("\n")
raise CyberError.new(:unrecoverable, 'api/cyborghood', "method call failed: " + $!)
raise CyberError.new(:unrecoverable, 'api/cyborghood', "call failed on node '#{node_path}': " + $!)
end
else
visible_nodes_names
......
def hash_match_criterias(hash, crit)
crit.each do |key, wanted_value|
value = hash[key]
# force cast to string in case of a composite object
value = hash[key].to_s
if wanted_value.is_a? Array
return false unless wanted_value.include?(value)
......
true
end
def search_among_children(request, lookup_node)
node_names_list = []
lookup_node.__send__(:visible_nodes).each do |match, node|
if match.is_a? String
match_list = [match]
elsif match.is_a? Proc
match_list = match.call
else
next
end
match_list.each do |child_node_name|
node.__send__(:load, child_node_name)
result = node.__send__(:request, request.session)
next unless result.respond_to? :to_hash
if hash_match_criterias(result.to_hash, request.args.first)
node_names_list << child_node_name
end
end
end
node_names_list
end
def search_in_list(request, lookup_node, list)
criterias = request.args.first
return [] unless criterias.is_a? Hash
if list.is_a? Proc
list = list.call(criterias)
# if result is an array, then a final list of names is given, return it
return list if list.is_a? Array
# else it must be a Hash which needs to be filtered
end
node_names_list = []
list.each do |element_name, element|
if hash_match_criterias(element.to_hash, criterias)
node_names_list << element_name
end
end
node_names_list
end
end
end
end # DSL
end

Also available in: Unified diff