def execute()
@resource.target_wiki_main_page =
REXML::Document.new(fetch_uri(@target_wiki_uri + '/').body.gsub(' ', ' ')).get_elements('//h1').first.text
response = fetch_uri(@target_wiki_uri + @config.wiki_path + 'index.php?title=Special:SiteMatrix&action=raw')
site_matrix_file_name = @config.working_directory + '/site-matrix.xml'
file = File.new(site_matrix_file_name, 'w')
file.print(response.body)
file.close
file = File.new(site_matrix_file_name, 'r')
language_elements = REXML::Document.new(file).root.get_elements(
'matrix/language[count(site[' + LanguageOfSiteMatrix::CODE_PREDICATE + ']) = 1][@name != ""]')
@logger.log('現在あるウィキペディアの言語コードの数 (Special:SiteMatrix) : ' + language_elements.size.to_s)
threads = []
lock = Monitor.new
@logger.log('リソースファイルとSpecial:SiteMatrixの照合を開始します。')
languages_of_site_matrix = Hash.new
language_elements.each do |element|
language = LanguageOfSiteMatrix.new(element)
languages_of_site_matrix.store(language.code, language)
if not @resource.languages.has_key?(element.attribute('code').to_s) then
@status = 1
@logger.log('次の言語版の記述がリソースファイルに存在しません: ' +
language.code + ', ' + language.name + ', ' + language.wiki_url)
end
end
@resource.languages.values.each do |language|
if not languages_of_site_matrix.has_key?(language.code) then
@logger.log('次のリソースファイルの記述がSpecial:SiteMatrixに存在しません: ' +
language.code + ', ' + language.description + ', ' + language.english_description)
end
end
@logger.log('リソースファイルとSpecial:SiteMatrixの照合を終了しました。')
@fetch_start_time = Time.now.utc
date_time_format = DateTimeFormat.new
@logger.log('統計情報の取得を開始しました。 ' + date_time_format.format(@fetch_start_time))
languages_of_site_matrix.values.each do |language|
threads << Thread.new(language) do |language_thread_local|
language_code = language_thread_local.code
language_name = language_thread_local.name
wiki_url = language_thread_local.wiki_url
language_file_name = @config.working_directory + '/' + language_code + '.txt'
language_entry = LanguageEntry.new(language_code,
language_name, wiki_url, language_file_name)
lock.synchronize {
@language_entries.store(language_code, language_entry)
}
failed = true
20.times do
begin
response = fetch_uri(wiki_url +
'/w/index.php?title=Special:Statistics&action=raw')
if response.body.length > 0 then
response.body.split(';').each do |attribute|
attribute_splitted = attribute.split('=')
attribute_name = attribute_splitted.first
attribute_value = attribute_splitted[1]
case attribute_name
when 'total'
language_entry.number_of_pages =
string_to_integer(attribute_value)
when 'good'
language_entry.number_of_articles =
string_to_integer(attribute_value)
when 'edits'
language_entry.number_of_edits =
string_to_integer(attribute_value)
when 'users'
language_entry.number_of_users =
string_to_integer(attribute_value)
when 'activeusers'
language_entry.number_of_active_users =
string_to_integer(attribute_value)
when 'admins'
language_entry.number_of_administrators =
string_to_integer(attribute_value)
when 'images'
language_entry.number_of_files =
string_to_integer(attribute_value)
else
end
end
failed = false
break
end
rescue Errno::ETIMEDOUT => exception
rescue Errno::ECONNREFUSED => exception
rescue Net::HTTPFatalError => exception
rescue EOFError => exception
end
end
if failed then
@logger.log(exception.to_s + ', ' + language_url)
@status = 1
end
end
end
threads.each do |thread|
thread.join
end
@number_of_languages_in_site_matrix = language_elements.size
@fetch_end_time = Time.now.utc
@logger.log('統計情報の取得を終了しました。 ' + date_time_format.format(@fetch_end_time))
@logger.log('統計情報の取得に要した時間: ' + (@fetch_end_time - @fetch_start_time).to_s + ' 秒')
file = File.new(@config.working_directory + '/' + STATISTICS_INFO_FILE_NAME, 'w')
file.puts('<?xml version="1.0" encoding="UTF-8"?>')
file.puts('<statisticsInfo>')
file.puts(' <' + STATISTICS_INFO_WORKING_DIRECTORY_ELEMENT_NAME + '>' +
@config.working_directory +
'</' + STATISTICS_INFO_WORKING_DIRECTORY_ELEMENT_NAME + '>')
file.puts(' <' + STATISTICS_INFO_FETCH_START_DATE_TIME_ELEMENT_NAME + '>' +
date_time_format.format(@fetch_start_time) +
'</' + STATISTICS_INFO_FETCH_START_DATE_TIME_ELEMENT_NAME + '>')
file.puts(' <' + STATISTICS_INFO_FETCH_END_DATE_TIME_ELEMENT_NAME + '>' +
date_time_format.format(@fetch_end_time) +
'</' + STATISTICS_INFO_FETCH_END_DATE_TIME_ELEMENT_NAME + '>')
file.puts(' <' + STATISTICS_INFO_NUMBER_OF_LANGUAGES_IN_SITE_MATRIX_ELEMENT_NAME + '>' +
@number_of_languages_in_site_matrix.to_s +
'</' + STATISTICS_INFO_NUMBER_OF_LANGUAGES_IN_SITE_MATRIX_ELEMENT_NAME + '>')
date_time_format.set_date_time(@fetch_end_time)
update_summary = @resource.update_summary.
sub('${year}', date_time_format.year).
sub('${month}', date_time_format.month.to_i.to_s).
sub('${day}', date_time_format.day.to_i.to_s).
sub('${hour}', date_time_format.hour).
sub('${minute}', date_time_format.minute).
sub('${timezone}', date_time_format.timezone)
file.puts(' <' + STATISTICS_INFO_UPDATE_SUMMARY_ELEMENT_NAME + '>' +
update_summary +
'</' + STATISTICS_INFO_UPDATE_SUMMARY_ELEMENT_NAME + '>')
file.puts('</statisticsInfo>')
file.close
end