# File languages-statistics.rb, line 215
        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
                                                #puts 'Fetched SiteMatrix from ' + language_url
                                        rescue Errno::ETIMEDOUT => exception
                                                #puts 'Connection timed out (to be retried): ' + language_url
                                        rescue Errno::ECONNREFUSED => exception
                                                #puts 'Connection refused (to be retried): ' + language_url
                                        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