Class: Longleaf::ServiceCandidateIndexIterator

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/longleaf/candidates/service_candidate_index_iterator.rb

Overview

Iterator for getting file candidates which have services which need to be run. Implementation uses an index of file metadata to determine if the file needs any services run.

Instance Method Summary collapse

Methods included from Logging

#initialize_logger, initialize_logger, logger, #logger

Constructor Details

#initialize(file_selector, event, app_config, force = false) ⇒ ServiceCandidateIndexIterator



13
14
15
16
17
18
19
20
21
# File 'lib/longleaf/candidates/service_candidate_index_iterator.rb', line 13

def initialize(file_selector, event, app_config, force = false)
  @file_selector = file_selector
  @event = event
  @app_config = app_config
  @force = force
  @index_manager = @app_config.index_manager
  @stale_datetime = Time.now.utc
  @result_set = nil
end

Instance Method Details

#eachObject

Iterate through the candidates in this object and execute the provided block with each candidate. A block is required.



60
61
62
63
64
65
66
67
# File 'lib/longleaf/candidates/service_candidate_index_iterator.rb', line 60

def each
  file_rec = next_candidate
  until file_rec.nil?
    yield file_rec

    file_rec = next_candidate
  end
end

#next_candidateFileRecord

Get the file record for the next candidate which needs services run which match the provided file_selector



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/longleaf/candidates/service_candidate_index_iterator.rb', line 27

def next_candidate
  file_rec = nil
  # loop until a candidate with metadata is retrieved
  loop do
    # Get the next page of results if the previous page has been processed
    fetch_next_page if @result_set.nil? || @result_set.empty?

    # Retrieve the next possible candidate path from the page
    next_path = @result_set.shift
    # given that the page was just retrieved, getting a nil path indicates that the retrieved page of
    # candidates is empty and there are no more candidates to iterate at this time.
    return nil if next_path.nil?

    logger.debug("Retrieved candidate #{next_path}")
    storage_loc = @app_config.location_manager.get_location_by_path(next_path)
    file_rec = FileRecord.new(next_path, storage_loc)

    # Keep seeking until a registered candidate is found, according to the file system.
    if file_rec.
      break
    else
      logger.warn("Encountered #{next_path} in index, but path is not registered. Clearing out of synch entry.")
      @index_manager.remove(file_rec)
    end
  end

  @app_config.md_manager.load(file_rec)

  file_rec
end