Sha256: e7d02b1beeac5d322f7d509ad6059717528035d17089f711722d8ceb5a3e5cc5

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

module ActiveFedora
  class FedoraSolrMismatchError < ActiveFedora::ObjectNotFoundError
    def initialize(fedora_id, solr_document_id)
      super("Solr ID and Fedora ID do not match; Solr ID=#{solr_document_id}, Fedora ID=#{fedora_id}")
    end
  end

  # Responsible for loading an ActiveFedora::Base proxy from a Solr document.
  class SolrInstanceLoader
    attr_reader :context, :id
    private :context, :id
    def initialize(context, id, solr_doc = nil)
      @context = context
      @id = id
      @solr_doc = solr_doc
      validate_solr_doc_and_id!(@solr_doc)
    end

    def object
      return @object if @object
      @object = allocate_object
      @object.readonly!
      @object.freeze
      @object
    end

    private

    def allocate_object
      active_fedora_class.allocate.init_with_json(profile_json)
    end

    def solr_doc
      @solr_doc ||= begin
        result = context.find_with_conditions(id: id)
        if result.empty?
          raise ActiveFedora::ObjectNotFoundError, "Object #{id} not found in solr"
        end
        @solr_doc = result.first
        validate_solr_doc_and_id!(@solr_doc)
        @solr_doc
      end
    end

    def validate_solr_doc_and_id!(document)
      return true if document.nil?
      solr_id = document[SOLR_DOCUMENT_ID]
      if id != solr_id
        raise ActiveFedora::FedoraSolrMismatchError.new(id, solr_id)
      end
    end

    def active_fedora_class
      @active_fedora_class ||= ActiveFedora::SolrService.class_from_solr_document(solr_doc)
    end

    def profile_json
      @profile_json ||= begin
        profile_json = Array(solr_doc[ActiveFedora::IndexingService.profile_solr_name]).first
        unless profile_json.present?
          raise ActiveFedora::ObjectNotFoundError, "Object #{id} does not contain a solrized profile"
        end
        profile_json
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
active-fedora-9.0.0.beta2 lib/active_fedora/solr_instance_loader.rb
active-fedora-9.0.0.beta1 lib/active_fedora/solr_instance_loader.rb