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.



47
48
49
50
51
52
53
54
# File 'lib/jiji/agent/agent_registry.rb', line 47

def initialize( agent_dir, shared_lib_dir )
  @agent_dir = agent_dir
  FileUtils.mkdir_p @agent_dir
  @shared_lib_dir = shared_lib_dir
  FileUtils.mkdir_p @shared_lib_dir

  @agents = {}
end

Instance Attribute Details

#confObject

Returns the value of attribute conf.



199
200
201
# File 'lib/jiji/agent/agent_registry.rb', line 199

def conf
  @conf
end

Instance Method Details

#add_file(file_name, body, type = :agent) ⇒ Object

ファイルを追加/更新する。



176
177
178
179
180
181
182
183
184
# File 'lib/jiji/agent/agent_registry.rb', line 176

def add_file( file_name, body, type=:agent )
  lock(type) {
    file = "#{dir(type)}/#{file_name}"
    File.open( file, "w" ) {|f|
      f.puts body
    }
    inner_load( file, type )
  }
end

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

エージェントを生成する



65
66
67
68
69
70
71
72
# File 'lib/jiji/agent/agent_registry.rb', line 65

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

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



57
58
59
60
61
62
# File 'lib/jiji/agent/agent_registry.rb', line 57

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

#files(type = :agent) ⇒ Object

ファイル名の一覧を得る。



130
131
132
133
134
135
136
137
# File 'lib/jiji/agent/agent_registry.rb', line 130

def files( type=:agent )
  lock(type) {
    Dir.glob( "#{dir(type)}/*.rb" ).map {|item|
      { "name"  =>File.basename(item),
        "update"=>File.mtime(item).to_i }
    }.sort_by {|item| item["name"]  }
  }
end

#get(name) ⇒ Object

エージェントを取得する

name

エージェント名( @ )



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/jiji/agent/agent_registry.rb', line 76

def get(name)
  unless name =~ /([^@]+)@([^@]+)/
    raise UserError.new( JIJI::ERROR_NOT_FOUND,
      "agent class not found. name=#{name}")
  end
  m = @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

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



121
122
123
124
125
126
127
# File 'lib/jiji/agent/agent_registry.rb', line 121

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

#get_file(file, type = :agent) ⇒ Object

エージェントファイルの本文を取得する。



140
141
142
143
144
145
146
147
148
149
# File 'lib/jiji/agent/agent_registry.rb', line 140

def get_file(file, type=:agent )
  lock(type) {
    file = "#{dir(type)}/#{file}"
    unless File.exist? file
      raise UserError.new( JIJI::ERROR_NOT_FOUND,
        "#{type} file not found. file_name=#{file}}")
    end
    IO.read(file)
  }
end

#get_property_infos(name) ⇒ Object

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



112
113
114
115
116
117
118
# File 'lib/jiji/agent/agent_registry.rb', line 112

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

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



166
167
168
169
170
171
172
173
# File 'lib/jiji/agent/agent_registry.rb', line 166

def load(file)
  file = "#{@agent_dir}/#{file}"
  unless File.exist? file
    raise UserError.new( JIJI::ERROR_NOT_FOUND,
      "agent file not found. file_name=#{file}}")
  end
  lock(:agent) { inner_load( file ) }
end

#load_allObject

エージェント置き場から、エージェントをロードする。



152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/jiji/agent/agent_registry.rb', line 152

def load_all
  lock(:shared_lib) {
    Dir.glob( "#{@shared_lib_dir}/*.rb" ) {|shared_lib_file|
      inner_load( shared_lib_file, :shared_lib )
    }
  }
  lock(:agent) {
    Dir.glob( "#{@agent_dir}/*.rb" ) {|agent_file|
      inner_load( agent_file, :agent )
    }
  }
end

#remove_file(file_name, type = :agent) ⇒ Object

ファイルを破棄する



187
188
189
190
191
192
193
194
195
196
197
# File 'lib/jiji/agent/agent_registry.rb', line 187

def remove_file( file_name, type=:agent )
  lock(type) {
    file = "#{dir(type)}/#{file_name}"
    unless File.exist? file
      raise UserError.new( JIJI::ERROR_NOT_FOUND,
        "#{type} file not found. file_name=#{file_name}")
    end
    FileUtils.rm_rf file
    @agents.delete file_name if type==:agent
  }
end