--- /dev/null
+require 'csv'
+
+require 'bookclass'
+
+class ClassSet
+ @@class_csv_file = 'class.csv'
+
+ def initialize
+ @entries = {}
+ load!(@@class_csv_file)
+ end
+
+ def add!(info)
+ key = construct_key(info.grouping, info.title)
+ @entries[key] = info
+ end
+
+ def construct_key(author_grouping, title)
+ author_grouping.to_s + '|' + title.to_s
+ end
+
+ def get(author_grouping, title)
+ key = construct_key(author_grouping, title)
+ if @entries.has_key?(key)
+ return @entries[key]
+ else
+ return nil
+ end
+ end
+
+ def has_key?(author_grouping, title)
+ @entries.has_key?(construct_key(author_grouping, title))
+ end
+
+ def ensure_contains!(info)
+ if ! has_key?(info.grouping, info.title)
+ add!(info)
+ end
+ end
+
+ def inspect
+ data = []
+
+ if nil != @entries
+ data.push('entries=' + @entries.inspect + '')
+ end
+
+ return '(ClassSet:' + data.join(',') + ')'
+ end
+
+ def load!(file_name)
+ first = true
+ @entries = {}
+
+ if ! File.exist?(file_name)
+ puts 'WARNING: file "' + file_name + '" not found.'
+ return
+ end
+
+ File.open(file_name, 'r:UTF-8') do |fd|
+ csv = CSV.new(fd)
+ csv.to_a.each do |row|
+ if first
+ first = false
+ elsif row.length >= 6
+ ddc = row[0]
+ lcc = row[1]
+ grouping = row[2]
+ author = row[3]
+ title = row[4]
+ fast = []
+ if nil != row[5]
+ fast = row[5].split(';')
+ end
+
+ bookclass = BookClass.new(grouping, title)
+ bookclass.ddc = ddc
+ bookclass.lcc = lcc
+ bookclass.author = author
+
+ fast.each do |id|
+ bookclass.add_fast(id)
+ end
+
+ key = construct_key(grouping, title)
+ @entries[key] = bookclass
+ end
+ end
+ end
+ end
+
+ def save(file_name)
+ CSV.open(file_name, 'w:UTF-8') do |csv|
+ csv << ['Dewey', 'LCC', 'Grouping', 'Author', 'Title', 'FAST']
+
+ @entries.keys.sort.each do |key|
+ info = @entries[key]
+
+ ddc = info.ddc
+ lcc = info.lcc
+ grouping = info.grouping
+ author = info.author
+ title = info.title
+ fast_list = info.fast
+ fast_ids = []
+ fast_list.each do |tuple|
+ fast_ids.push(tuple[0])
+ end
+ fast = fast_ids.join(';')
+
+ csv << [ ddc, lcc, grouping, author, title, fast ]
+ end
+ end
+ end
+
+ def save_state
+ save(@@class_csv_file)
+ end
+end
+