diff --git a/utilities/load-testing/uploadFileFaker/UploadFileFaker.rb b/utilities/load-testing/uploadFileFaker/UploadFileFaker.rb index a8ec66bb..dcc4d125 100644 --- a/utilities/load-testing/uploadFileFaker/UploadFileFaker.rb +++ b/utilities/load-testing/uploadFileFaker/UploadFileFaker.rb @@ -15,7 +15,109 @@ require 'date' require 'fileutils' require 'property_file_reader' -NAMESPACES_FILENAME = 'file_storage_namespaces.properties' + +# ------------------------------------------------------------------------------------ +# FileInfoFile class +# ------------------------------------------------------------------------------------ + +class FileInfoFile + attr_reader :default_namespace + attr_reader :data + + def parse_info_line(line) + # Lines are in this form: "URI","filename" + match = line.match(/^"([^"]*)","([^"]*)"$/) + raise "Can't parse this line: '#{line}'" if !match + return match.captures[0], match.captures[1] + end + + def parse_default_namespace(uri) + match = /^(.*)individual/.match(uri) + raise "Can't find default namespace: '#{uri}'" if match == nil + "#{match.captures[0]}individual/" + end + + public + + def initialize(filepath) + @data = [] + File.open(filepath) do |f| + f.each() do |line| + @data.push(parse_info_line(line)) + end + end + puts "parsed #{@data.length} lines." + + @default_namespace = parse_default_namespace(@data[0][0]) + puts "default namespace is '#{@default_namespace}'" + end +end + +# ------------------------------------------------------------------------------------ +# NamespacesFile class +# +# Read, query, modify and write the namespace-prefixes file. +# ------------------------------------------------------------------------------------ + +class NamespacesFile + NAMESPACES_FILENAME = 'file_storage_namespaces.properties' + + public + + def initialize(uploads_directory, scan_only) + @uploads_directory = uploads_directory + @scan_only = scan_only + + Dir.chdir(@uploads_directory) do |dir| + @namespaces = {} + if File.file?(NAMESPACES_FILENAME) + @namespaces = PropertyFileReader.read(NAMESPACES_FILENAME) + @namespaces.delete("properties_file_path") + end + end + end + + def add_namespace(namespace) + if @namespaces.has_value?(namespace) + puts "found prefix for #{namespace}" + return + end + + 'abcdefghijklmnopqrstuvwxyz'.split("").each do |this_char| + if (!@namespaces.has_key?(this_char)) + @namespaces[this_char] = namespace + puts "assigned prefix = '#{this_char}'" + return + end + end + raise "all prefixes are used!" + end + + def prefix(namespace) + @namespaces.each() do | key, value | + return key if value == namespace + end + raise "no prefix for '#{namespace}'" + end + + def write() + if @scan_only + puts "Scan-only: not writing namespaces file" + else + Dir.chdir(@uploads_directory) do |dir| + File.open(NAMESPACES_FILENAME, "w") do |f| + @namespaces.each do |prefix, namespace| + f.puts "#{prefix} = #{namespace}" + end + end + end + end + end +end + +# ------------------------------------------------------------------------------------ +# Main class - UploadFileFaker +# ------------------------------------------------------------------------------------ class UploadFileFaker # @@ -38,103 +140,18 @@ class UploadFileFaker end # - # Look in the file_info file and find the default namespace. Lines are in - # this form: - # Uv::http://vivo.scripps.edu/individual/n2938: Lv:0::_main_image_testtubes.jpg: + # Check each location that should contain an image, and if we're not just + # scanning, put one there. # - # The first line may be a header line, so use the second one. - # - def find_default_namespace() - second_line = IO.readlines(@file_info_file)[1] - match = /Uv::(.*)individual/.match(second_line) - raise "Can't find default namespace: '#{second_line}'" if match == nil - @default_namespace = "#{match.captures[0]}individual/" - puts "default namespace is '#{@default_namespace}'" - end - - def adjust_namespaces_file() - namespaces = read_namespaces_file() - namespaces = add_namespace_if_needed(namespaces) - write_namespaces_file(namespaces) - - namespaces.each() do |key, value| - if value == @default_namespace - @prefix = key - puts "prefix is #{@prefix}" - break - end + def create_image_files_where_needed() + @file_info.data.each do |line| + uri, filename = line + process_file_info(uri, filename) end end - def read_namespaces_file() - Dir.chdir(@uploads_directory) do |dir| - namespaces = {} - if File.file?(NAMESPACES_FILENAME) - namespaces = PropertyFileReader.read(NAMESPACES_FILENAME) - namespaces.delete("properties_file_path") - puts "namespaces is already set to '#{namespaces}'" - end - return namespaces - end - end - - def add_namespace_if_needed(namespaces) - if namespaces.has_value?(@default_namespace) - puts "found prefix" - else - @prefix = '' - 'abcdefghijklmnopqrstuvwxyz'.chars() do |this_char| - if (!namespaces.has_key?(this_char)) - namespaces[@prefix] = @default_namespace - puts "assigned prefix = '#{@this_char}'" - break - end - end - end - return namespaces - end - - def write_namespaces_file(namespaces) - if @scan_only - puts "Scan-only: not writing namespaces file" - else - Dir.chdir(@uploads_directory) do |dir| - File.open(NAMESPACES_FILENAME, "w") do |f| - namespaces.each do |prefix, namespace| - f.puts "#{prefix} = #{namespace}" - end - end - end - end - end - - # - # Second pass -- figure out the location for each file. If the file - # doesn't exist, copy the template to that location. - # - def second_pass() - File.open(@file_info_file) do |f| - f.each() do |line| - next if header_line?(line.chomp) - process_file_info_line(line.chomp) - end - end - end - - def header_line?(line) - return false unless line.match("^bytestreamUri") - - puts "Skipping header line: '#{line}'" - return true - end - - def process_file_info_line(line) - uri, filename = parse_info_line(line) - puts "URI is '#{uri}'" - puts "Filename is '#{filename}'" - prefixed_uri = substitute_prefix_for_namespace(uri) - full_path = construct_full_path(prefixed_uri, filename) - puts "Full path is '#{full_path}'" + def process_file_info(uri, filename) + full_path = figure_full_path(uri, filename) if File.file?(full_path) puts "File already exists at: '#{full_path}'" @@ -146,17 +163,15 @@ class UploadFileFaker FileUtils.cp(@template_file, full_path) end end - - def parse_info_line(line) - # Lines are in this form: Uv::URI: Lv:0::FILENAME: - match = line.match(/Uv::(.*):\s+Lv:0::(.*):/) - raise "Can't parse this line: '#{line}'" if !match - return match.captures[0], match.captures[1] + + def figure_full_path(uri, filename) + prefixed_uri = substitute_prefix_for_namespace(uri) + construct_full_path(prefixed_uri, filename) end - + def substitute_prefix_for_namespace(uri) - if uri[0, @default_namespace.length] == @default_namespace - return uri.sub(@default_namespace, "#{@prefix}~") + if uri[0, @namespace.length] == @namespace + uri.sub(@namespace, "#{@prefix}~") else raise "Doesn't start with default namespace: '#{uri}'" end @@ -167,13 +182,10 @@ class UploadFileFaker 0.step(prefixed_uri.size - 1, 3) do |i| path = "#{path}/#{prefixed_uri[i, 3]}" end - puts "path is: '#{path}'" - return "#{@uploads_directory}/file_storage_root#{path}/#{filename}" + "#{@uploads_directory}/file_storage_root#{path}/#{filename}" end - - # ------------------------------------------------------------------------------------ + public - # ------------------------------------------------------------------------------------ # # Setup and get ready to process. @@ -192,12 +204,18 @@ class UploadFileFaker end # - # Start the recursive scanning (and copying). + # Start the scanning (and copying). # def process() - find_default_namespace() - adjust_namespaces_file() - second_pass() + @file_info = FileInfoFile.new(@file_info_file) + @namespace = @file_info.default_namespace + + namespaces_file = NamespacesFile.new(@uploads_directory, @scan_only) + namespaces_file.add_namespace(@namespace) + namespaces_file.write() + @prefix = namespaces_file.prefix(@namespace) + + create_image_files_where_needed() end end