class HrrRbNetconf::Server::Capability

Attributes

dependencies[RW]
if_features[RW]
queries[RW]

Public Class Methods

[](key) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 19
def [] key
  __subclass_list__(__method__).find{ |klass| klass::ID == key }
end
inherited(klass) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 15
def inherited klass
  @subclass_list.push klass if @subclass_list
end
list() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 23
def list
  __subclass_list__(__method__).map{ |klass| klass::ID }
end
new(id=nil, logger: nil) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 37
def initialize id=nil, logger: nil
  self.logger = logger
  @id           = id || self.class::ID
  @queries      = (self.class::QUERIES rescue {})
  @if_features  = (self.class::IF_FEATURES rescue [])
  @dependencies = (self.class::DEPENDENCIES rescue [])
  @uri_proc     = Proc.new { |id| id.split('?').first }
  @keyword_proc = Proc.new { |id| id.split('?').first.match(/^((?:.+(?:\/|:))+.+)(?:\/|:)(.+)$/)[1] }
  @version_proc = Proc.new { |id| id.split('?').first.match(/^((?:.+(?:\/|:))+.+)(?:\/|:)(.+)$/)[2] }
  @decode_queries_proc = Proc.new { |qs_s| URI.decode_www_form(qs_s).inject({}){|a,(k,v)| a.merge({k=>(v.split(','))})} }
  @encode_queries_proc = Proc.new { |qs_h| URI.encode_www_form(qs_h.map{|k,v| [k, v.join(',')]}) }
  define_capability
end

Private Class Methods

__subclass_list__(method_name) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 27
def __subclass_list__ method_name
  send(:method_missing, method_name) unless @subclass_list
  @subclass_list
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 171
def <=> other
  unless keyword == other.keyword
    nil
  else
    version <=> other.version
  end
end
decode_queries_proc(&blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 120
def decode_queries_proc &blk
  if blk
    @decode_queries_proc = blk
  else
    raise ArgumentError, "block not given"
  end
end
define_capability() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 51
def define_capability
  # to be overridden
end
encode_queries_proc(&blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 128
def encode_queries_proc &blk
  if blk
    @encode_queries_proc = blk
  else
    raise ArgumentError, "block not given"
  end
end
id() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 76
def id
  if @queries.empty?
    @id
  else
    [@id, @encode_queries_proc.call(@queries)].join('?')
  end
end
keyword() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 88
def keyword
  @keyword_proc.call id
end
keyword_proc(&blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 104
def keyword_proc &blk
  if blk
    @keyword_proc = blk
  else
    raise ArgumentError, "block not given"
  end
end
models() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 67
def models
  @models || []
end
negotiate(other_id) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 136
def negotiate other_id
  other_keyword = @keyword_proc.call(other_id)
  unless keyword == other_keyword
    nil
  else
    other_version = @version_proc.call(other_id)
    case version <=> other_version
    when 0
      c = self.dup
      c.queries = negotiate_queries(other_id)
      c
    else
      nil
    end
  end
end
negotiate_queries(other_id) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 153
def negotiate_queries other_id
  other_queries = @decode_queries_proc.call((other_id.split('?') + [''])[1])
  queries.inject({}){ |a, (k, v)|
    if other_queries.has_key?(k)
      values = v & other_queries[k]
      if values.empty?
        a
      else
        a.merge({k => values})
      end
    else
      a
    end
  }
end
oper_procs() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 55
def oper_procs
  @oper_procs || {}
end
uri() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 84
def uri
  @uri_proc.call id
end
uri_proc(&blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 96
def uri_proc &blk
  if blk
    @uri_proc = blk
  else
    raise ArgumentError, "block not given"
  end
end
version() click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 92
def version
  @version_proc.call id
end
version_proc(&blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 112
def version_proc &blk
  if blk
    @version_proc = blk
  else
    raise ArgumentError, "block not given"
  end
end

Private Instance Methods

model(oper_name, path, stmt=nil, attrs={}) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 71
def model oper_name, path, stmt=nil, attrs={}
  @models ||= Array.new
  @models.push [oper_name, path, stmt, attrs]
end
oper_proc(oper_name, &blk) click to toggle source
# File lib/hrr_rb_netconf/server/capability.rb, line 59
def oper_proc oper_name, &blk
  @oper_procs ||= Hash.new
  if blk
    @oper_procs[oper_name] = blk
  end
  @oper_procs[oper_name]
end