Class: JIJI::AgentRegistry

Inherits:
Object
  • Object
show all
Includes:
Enumerable, AgentUtil
Defined in:
lib/jiji/agent/agent_registry.rb

Overview

エージェントレジストリ

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from AgentUtil

#safe

Constructor Details

#initialize(agent_dir, shared_lib_dir) ⇒ AgentRegistry

Returns a new instance of AgentRegistry.



17
18
19
20
21
# File 'lib/jiji/agent/agent_registry.rb', line 17

def initialize( agent_dir, shared_lib_dir )
  @agent_dir = agent_dir
  @shared_lib_dir = shared_lib_dir
  @agents = {}
end

Instance Attribute Details

#confObject

Returns the value of attribute conf.



126
127
128
# File 'lib/jiji/agent/agent_registry.rb', line 126

def conf
  @conf
end

#file_daoObject

Returns the value of attribute file_dao.



127
128
129
# File 'lib/jiji/agent/agent_registry.rb', line 127

def file_dao
  @file_dao
end

#server_loggerObject

Returns the value of attribute server_logger.



128
129
130
# File 'lib/jiji/agent/agent_registry.rb', line 128

def server_logger
  @server_logger
end

Instance Method Details

#create(name, properties = {}) ⇒ Object

エージェントを生成する



32
33
34
35
36
37
38
39
# File 'lib/jiji/agent/agent_registry.rb', line 32

def create(name, properties={})
  cl = get(name)
  safe( conf.get( [:agent,:safe_level], 4) ){
   agent = cl.new
   agent.properties = properties
   agent
  }
end

#each(&block) ⇒ Object

エージェント名を列挙する



24
25
26
27
28
29
# File 'lib/jiji/agent/agent_registry.rb', line 24

def each( &block )
  checked = Set.new
  @agents.each() { |k,m|
    find_agent( k, m, checked ) {|name| block.call(name) }
  }
end

#get(name) ⇒ Object

エージェントを取得する

name

エージェント名( @ )



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/jiji/agent/agent_registry.rb', line 43

def get(name)
  unless name =~ /([^@]+)@([^@]+)/
    raise UserError.new( JIJI::ERROR_NOT_FOUND,
      "agent class not found. name=#{name}")
  end
  m = @agents["agents/#{$2}"]
  unless m
    raise UserError.new( JIJI::ERROR_NOT_FOUND,
      "agent class not found. name=#{name}")
  end

  path = $1.split("::")
  path.each {|step|
    unless m.const_defined? step
      raise UserError.new( JIJI::ERROR_NOT_FOUND,
        "agent class not found. name=#{name}")
    end
    m = m.const_get step
    unless m
      raise UserError.new( JIJI::ERROR_NOT_FOUND,
        "agent class not found. name=#{name}")
    end
    unless m.kind_of?(Module)
      raise UserError.new( JIJI::ERROR_NOT_FOUND,
        "agent class not found. name=#{name}")
    end
  }
  if m.kind_of?(Class) && m < JIJI::Agent
    m
  else
    raise UserError.new( JIJI::ERROR_NOT_FOUND,
      "agent class not found. name=#{name}")
  end
end

#get_description(name) ⇒ Object

エージェントの説明を取得する



88
89
90
91
92
93
94
# File 'lib/jiji/agent/agent_registry.rb', line 88

def get_description(name)
  cl = get(name)
  return [] unless cl
  safe( conf.get( [:agent,:safe_level], 4) ){
    cl.new.description
  }
end

#get_property_infos(name) ⇒ Object

エージェントのプロパティ一覧を取得する



79
80
81
82
83
84
85
# File 'lib/jiji/agent/agent_registry.rb', line 79

def get_property_infos(name)
  cl = get(name)
  return [] unless cl
  safe( conf.get( [:agent,:safe_level], 4) ){
    cl.new.property_infos
  }
end

#load(file) ⇒ Object

特定のファイルをロードする。



113
114
115
# File 'lib/jiji/agent/agent_registry.rb', line 113

def load(file)
  inner_load( file )
end

#load_allObject

エージェント置き場から、エージェントをロードする。 起動時に一度だけ呼ばれる。



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/jiji/agent/agent_registry.rb', line 98

def load_all
  [@agent_dir,@shared_lib_dir].each {|d|
    @file_dao.list( d, true ).each {|item|
      next if item[:type] == :directory
      begin
        inner_load( item[:path] )
      rescue Exception
        # ログ出力のみ行い、例外は握る。
        server_logger.error( $! )
      end
    }
  }
end

#unload(file) ⇒ Object

特定のファイルをアンロードする。



118
119
120
121
122
123
124
# File 'lib/jiji/agent/agent_registry.rb', line 118

def unload(file)
  if file =~ /^#{@agent_dir}\/.*/
    @agents.delete file
  else
    JIJI::Agent::Shared._delegates.delete file
  end
end