active-fedora 6.0.0.rc6 → 6.0.0.rc7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9409f2deb359a4478e64508db0a9e1efeddd3ede
4
- data.tar.gz: 24abcbc60267a4dc7d119ea21e02bdf792f12b39
3
+ metadata.gz: 443c8f93ef41704da2c34752bb28a811ac9684ac
4
+ data.tar.gz: 925b1f309a57f0584e0fae33cb7a2785dde7166f
5
5
  SHA512:
6
- metadata.gz: c3447788f7c5fbe82a19d97bee6f6c4b8fbef4811738e3555f9c853d18e0e77f8b3acc1114d342f27177d9b65ecfde8e45818568337d82cd4856bb145b42f029
7
- data.tar.gz: 0e0471d596cd79f882e9face2f5f70c6a93ff72ce19e6759e081c79d7db2575354f1b74aa044ea7f807857c8af6455b1a05fa2c4f204ea8af9b76a30236fac5e
6
+ metadata.gz: 573ea265ed95d54c703227de1622f6e037e5a42aa95bbedf253f703cdc927dca0efe888000c951c5aaf714dea9985e0adcaabc6477d3adb61bc0998ec5c03969
7
+ data.tar.gz: cd0df254f2b44148e9d9bf5656fb9e941c7c5d142b3f00ebcdd9f42ad3629af980907d83ccde2b7a9a6ccfb8e4942b805f860cd7d7713c097fc73222cfdc5f54
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency("activesupport", '>= 3.0.0')
24
24
  s.add_dependency("builder", '~> 3.0.0')
25
25
  s.add_dependency("mediashelf-loggable")
26
- s.add_dependency("rubydora", '~>1.4')
26
+ s.add_dependency("rubydora", '~>1.5')
27
27
  s.add_dependency("rdf")
28
28
  s.add_dependency("rdf-rdfxml", '~>1.0.0')
29
29
  s.add_dependency("deprecation")
@@ -67,6 +67,7 @@ module ActiveFedora #:nodoc:
67
67
  autoload :DatastreamCollections
68
68
  autoload :Predicates
69
69
  autoload :Validations
70
+ autoload :SolrInstanceLoader
70
71
  end
71
72
 
72
73
 
@@ -32,13 +32,10 @@ module ActiveFedora
32
32
 
33
33
  def self.find(original_class, pid)
34
34
  conn = original_class.connection_for_pid(pid)
35
- obj = Deprecation.silence(Rubydora::DigitalObject) do
36
- begin
37
- super(pid, conn)
38
- rescue Rubydora::FedoraInvalidRequest => e
39
- # PID is nil
40
- raise ActiveFedora::ObjectNotFoundError, "Unable to find '#{pid}' in fedora. See logger for details."
41
- end
35
+ obj = begin
36
+ super(pid, conn)
37
+ rescue Rubydora::RecordNotFound
38
+ raise ActiveFedora::ObjectNotFoundError, "Unable to find '#{pid}' in fedora. See logger for details."
42
39
  end
43
40
  obj.original_class = original_class
44
41
  # PID is not found, but was "well-formed" for its Fedora request. So
@@ -4,8 +4,8 @@ module ActiveFedora
4
4
 
5
5
  # Return a Hash representation of this object where keys in the hash are appropriate Solr field names.
6
6
  # @param [Hash] solr_doc (optional) Hash to insert the fields into
7
- # @param [Hash] opts (optional)
8
- # If opts[:model_only] == true, the base object metadata and the RELS-EXT datastream will be omitted. This is mainly to support shelver, which calls .to_solr for each model an object subscribes to.
7
+ # @param [Hash] opts (optional)
8
+ # If opts[:model_only] == true, the base object metadata and the RELS-EXT datastream will be omitted. This is mainly to support shelver, which calls .to_solr for each model an object subscribes to.
9
9
  def to_solr(solr_doc = Hash.new, opts={})
10
10
  unless opts[:model_only]
11
11
  c_time = create_date
@@ -43,7 +43,7 @@ module ActiveFedora
43
43
  self.datastreams.each_pair { |dsid,ds| profile_hash['datastreams'][dsid] = ds.solrize_profile }
44
44
  solr_doc[self.class.profile_solr_name] = profile_hash.to_json
45
45
  end
46
-
46
+
47
47
  # Serialize the datastream's RDF relationships to solr
48
48
  # @param [Hash] solr_doc @deafult an empty Hash
49
49
  def solrize_relationships(solr_doc = Hash.new)
@@ -58,7 +58,7 @@ module ActiveFedora
58
58
 
59
59
  # Updates Solr index with self.
60
60
  def update_index
61
- if defined?( Solrizer::Fedora::Solrizer )
61
+ if defined?( Solrizer::Fedora::Solrizer )
62
62
  #logger.info("Trying to solrize pid: #{pid}")
63
63
  solrizer = Solrizer::Fedora::Solrizer.new
64
64
  solrizer.solrize( self )
@@ -70,63 +70,32 @@ module ActiveFedora
70
70
 
71
71
 
72
72
  module ClassMethods
73
- # This method can be used instead of ActiveFedora::Model::ClassMethods.find.
73
+ # This method can be used instead of ActiveFedora::Model::ClassMethods.find.
74
74
  # It works similarly except it populates an object from Solr instead of Fedora.
75
75
  # It is most useful for objects used in read-only displays in order to speed up loading time. If only
76
76
  # a pid is passed in it will query solr for a corresponding solr document and then use it
77
77
  # to populate this object.
78
- #
78
+ #
79
79
  # If a value is passed in for optional parameter solr_doc it will not query solr again and just use the
80
80
  # one passed to populate the object.
81
81
  #
82
82
  # It will anything stored within solr such as metadata and relationships. Non-metadata datastreams will not
83
83
  # be loaded and if needed you should use find instead.
84
84
  def load_instance_from_solr(pid,solr_doc=nil)
85
- if solr_doc.nil?
86
- result = find_with_conditions(:id=>pid)
87
- raise ActiveFedora::ObjectNotFoundError, "Object #{pid} not found in solr" if result.empty?
88
- solr_doc = result.first
89
- #double check pid and id in record match
90
- raise ActiveFedora::ObjectNotFoundError, "Object #{pid} not found in Solr" unless !result.nil? && !solr_doc.nil? && pid == solr_doc[SOLR_DOCUMENT_ID]
91
- else
92
- raise "Solr document record id and pid do not match" unless pid == solr_doc[SOLR_DOCUMENT_ID]
93
- end
94
- klass = if class_str = solr_doc[ActiveFedora::SolrService.solr_name('has_model', :symbol)]
95
- ActiveFedora::SolrService.class_from_solr_document(solr_doc)
96
- else
97
- ActiveFedora::Base
98
- end
99
-
100
- profile_json = Array(solr_doc[ActiveFedora::Base.profile_solr_name]).first
101
- unless profile_json.present?
102
- raise ActiveFedora::ObjectNotFoundError, "Object #{pid} does not contain a solrized profile"
103
- end
104
- profile_hash = ActiveSupport::JSON.decode(profile_json)
105
- obj = klass.allocate.init_with(SolrDigitalObject.new(solr_doc, profile_hash, klass))
106
- #set by default to load any dependent relationship objects from solr as well
107
- #need to call rels_ext once so it exists when iterating over datastreams
108
- obj.rels_ext
109
- obj.datastreams.each_value do |ds|
110
- if ds.respond_to?(:profile_from_hash) and (ds_prof = profile_hash['datastreams'][ds.dsid])
111
- ds.profile_from_hash(ds_prof)
112
- end
113
- ds.from_solr(solr_doc) if ds.respond_to?(:from_solr)
114
- end
115
- obj.inner_object.freeze
116
- obj
85
+ SolrInstanceLoader.new(self, pid, solr_doc).object
117
86
  end
118
-
119
- # Using the fedora search (not solr), get every object and reindex it.
87
+
88
+ # Using the fedora search (not solr), get every object and reindex it.
120
89
  def reindex_everything
121
90
  connections.each do |conn|
122
91
  conn.search(nil) do |object|
123
92
  ActiveFedora::Base.find(object.pid, :cast=>true).update_index
124
93
  end
125
94
  end
126
- end
95
+ end
127
96
 
128
97
  private
129
-
98
+
130
99
  def connections
131
100
  if ActiveFedora.config.sharded?
132
101
  return ActiveFedora.config.credentials.map { |cred| ActiveFedora::RubydoraConnection.new(cred).connection}
@@ -0,0 +1,93 @@
1
+ module ActiveFedora
2
+ class FedoraSolrMismatchError < ActiveFedora::ObjectNotFoundError
3
+ def initialize(pid, solr_document_id)
4
+ super("Solr record id and pid do not match; Solr ID=#{solr_document_id}, PID=#{pid}")
5
+ end
6
+ end
7
+
8
+ # Responsible for loading an ActiveFedora::Base proxy from a Solr document.
9
+ class SolrInstanceLoader
10
+ attr_reader :context, :pid
11
+ private :context, :pid
12
+ def initialize(context, pid, solr_doc = nil)
13
+ @context = context
14
+ @pid = pid
15
+ @solr_doc = solr_doc
16
+ validate_solr_doc_and_pid!(@solr_doc)
17
+ end
18
+
19
+ def object
20
+ return @object if @object
21
+ @object = allocate_object
22
+ @object.rels_ext
23
+ load_object_datastreams(@object)
24
+ @object.inner_object.freeze
25
+ @object
26
+ end
27
+
28
+ private
29
+
30
+ def allocate_object
31
+ active_fedora_class.allocate.init_with(solr_digital_object)
32
+ end
33
+
34
+ def solr_digital_object
35
+ SolrDigitalObject.new(solr_doc, profile_hash, active_fedora_class)
36
+ end
37
+
38
+
39
+ def load_object_datastreams(obj)
40
+ obj.datastreams.each_value do |ds|
41
+ if ds.respond_to?(:profile_from_hash) and (ds_prof = profile_hash['datastreams'][ds.dsid])
42
+ ds.profile_from_hash(ds_prof)
43
+ end
44
+ ds.from_solr(solr_doc) if ds.respond_to?(:from_solr)
45
+ end
46
+ end
47
+
48
+ def solr_doc
49
+ @solr_doc ||= begin
50
+ result = context.find_with_conditions(:id=>pid)
51
+ if result.empty?
52
+ raise ActiveFedora::ObjectNotFoundError, "Object #{pid} not found in solr"
53
+ end
54
+ @solr_doc = result.first
55
+ validate_solr_doc_and_pid!(@solr_doc)
56
+ @solr_doc
57
+ end
58
+ end
59
+
60
+ def validate_solr_doc_and_pid!(document)
61
+ return true if document.nil?
62
+ solr_id = document[SOLR_DOCUMENT_ID]
63
+ if pid != solr_id
64
+ raise ActiveFedora::FedoraSolrMismatchError.new(pid, solr_id)
65
+ end
66
+ end
67
+
68
+ def active_fedora_class
69
+ @active_fedora_class ||= begin
70
+ if solr_doc[ActiveFedora::SolrService.solr_name('has_model', :symbol)]
71
+ ActiveFedora::SolrService.class_from_solr_document(solr_doc)
72
+ else
73
+ ActiveFedora::Base
74
+ end
75
+ end
76
+ end
77
+
78
+ def profile_json
79
+ @profile_json ||= begin
80
+ profile_json = Array(solr_doc[ActiveFedora::Base.profile_solr_name]).first
81
+ unless profile_json.present?
82
+ raise ActiveFedora::ObjectNotFoundError, "Object #{pid} does not contain a solrized profile"
83
+ end
84
+ profile_json
85
+ end
86
+ end
87
+
88
+ def profile_hash
89
+ @profile_hash ||= ActiveSupport::JSON.decode(profile_json)
90
+ end
91
+
92
+ end
93
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "6.0.0.rc6"
2
+ VERSION = "6.0.0.rc7"
3
3
  end
@@ -74,7 +74,9 @@ describe ActiveFedora::RelsExtDatastream do
74
74
  # make sure that _something_ was actually added to the object's relationships hash
75
75
  @test_object.ids_for_outbound(:is_member_of).size.should == 1
76
76
  new_rels = ActiveFedora::Base.find(@test_object.pid).relationships
77
- new_rels.should == @test_object.relationships
77
+ # This stopped working, need to push an issue into the rdf library. (when dumping ntriples, the order of assertions changed)
78
+ #new_rels.should == @test_object.relationships
79
+ new_rels.dump(:rdfxml).should == @test_object.relationships.dump(:rdfxml)
78
80
  end
79
81
 
80
82
  end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ require 'active_fedora'
4
+
5
+ describe ActiveFedora::SolrInstanceLoader do
6
+ let(:context) { ActiveFedora::Base }
7
+ let(:pid) { nil }
8
+ let(:solr_doc) { nil }
9
+ let(:active_fedora_object) { ActiveFedora::Base.find(pid, :cast => true) }
10
+ subject { ActiveFedora::SolrInstanceLoader.new(context, pid, solr_doc) }
11
+
12
+ describe 'existing pid' do
13
+ let(:pid) { 'hydrangea:fixture_mods_article1' }
14
+ describe 'without a solr document' do
15
+ it 'it finds the SOLR document and casts into an AF::Base object' do
16
+ expect(subject.object).to eq(active_fedora_object)
17
+ end
18
+ end
19
+ describe 'with matching solr document' do
20
+ let(:solr_doc) { ActiveFedora::Base.find_with_conditions(:id=>pid).first }
21
+ it 'it casts the SOLR document and casts into an AF::Base object' do
22
+ expect(subject.object).to eq(active_fedora_object)
23
+ end
24
+ end
25
+ describe 'with a mismatching solr document' do
26
+ let(:mismatching_pid) { 'hydrangea:fixture_mods_article2' }
27
+ let(:solr_doc) { ActiveFedora::Base.find_with_conditions(:id=>mismatching_pid).first }
28
+ it 'it raise ObjectNotFoundError' do
29
+ expect {
30
+ subject
31
+ }.to raise_error(ActiveFedora::ObjectNotFoundError)
32
+ end
33
+ end
34
+ end
35
+ describe 'missing pid' do
36
+ let(:pid) { 'hydrangea:fixture_mods_article8675309' }
37
+ describe 'without a solr document' do
38
+ it 'it raise ObjectNotFoundError' do
39
+ expect {
40
+ subject.object
41
+ }.to raise_error(ActiveFedora::ObjectNotFoundError)
42
+ end
43
+ end
44
+ describe 'with matching solr document' do
45
+ let(:solr_doc) { ActiveFedora::Base.find_with_conditions(:id=>pid).first }
46
+ it 'it raise ObjectNotFoundError' do
47
+ expect {
48
+ subject.object
49
+ }.to raise_error(ActiveFedora::ObjectNotFoundError)
50
+ end
51
+ end
52
+ describe 'with a mismatching solr document' do
53
+ let(:mismatching_pid) { 'hydrangea:fixture_mods_article2' }
54
+ let(:solr_doc) { ActiveFedora::Base.find_with_conditions(:id=>mismatching_pid).first }
55
+ it 'it raise ObjectNotFoundError' do
56
+ expect {
57
+ subject
58
+ }.to raise_error(ActiveFedora::ObjectNotFoundError)
59
+ end
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-fedora
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.rc6
4
+ version: 6.0.0.rc7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zumwalt
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-03-12 00:00:00.000000000 Z
13
+ date: 2013-03-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rsolr
@@ -130,14 +130,14 @@ dependencies:
130
130
  requirements:
131
131
  - - ~>
132
132
  - !ruby/object:Gem::Version
133
- version: '1.4'
133
+ version: '1.5'
134
134
  type: :runtime
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
138
  - - ~>
139
139
  - !ruby/object:Gem::Version
140
- version: '1.4'
140
+ version: '1.5'
141
141
  - !ruby/object:Gem::Dependency
142
142
  name: rdf
143
143
  requirement: !ruby/object:Gem::Requirement
@@ -392,6 +392,7 @@ files:
392
392
  - lib/active_fedora/service_definitions.rb
393
393
  - lib/active_fedora/simple_datastream.rb
394
394
  - lib/active_fedora/solr_digital_object.rb
395
+ - lib/active_fedora/solr_instance_loader.rb
395
396
  - lib/active_fedora/solr_service.rb
396
397
  - lib/active_fedora/test_support.rb
397
398
  - lib/active_fedora/unsaved_digital_object.rb
@@ -459,6 +460,7 @@ files:
459
460
  - spec/integration/persistence_spec.rb
460
461
  - spec/integration/rels_ext_datastream_spec.rb
461
462
  - spec/integration/scoped_query_spec.rb
463
+ - spec/integration/solr_instance_loader_spec.rb
462
464
  - spec/integration/solr_service_spec.rb
463
465
  - spec/rails3_test_app/.gitignore
464
466
  - spec/rails3_test_app/.rspec
@@ -619,6 +621,7 @@ test_files:
619
621
  - spec/integration/persistence_spec.rb
620
622
  - spec/integration/rels_ext_datastream_spec.rb
621
623
  - spec/integration/scoped_query_spec.rb
624
+ - spec/integration/solr_instance_loader_spec.rb
622
625
  - spec/integration/solr_service_spec.rb
623
626
  - spec/rails3_test_app/.gitignore
624
627
  - spec/rails3_test_app/.rspec