active-fedora 3.3.2 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/Gemfile.lock +21 -22
  2. data/History.txt +9 -0
  3. data/README.textile +1 -1
  4. data/TODO +1 -0
  5. data/active-fedora.gemspec +3 -3
  6. data/config/fedora.yml +9 -3
  7. data/lib/active_fedora.rb +43 -33
  8. data/lib/active_fedora/base.rb +80 -31
  9. data/lib/active_fedora/config.rb +38 -0
  10. data/lib/active_fedora/content_model.rb +0 -6
  11. data/lib/active_fedora/datastream.rb +22 -0
  12. data/lib/active_fedora/delegating.rb +24 -25
  13. data/lib/active_fedora/digital_object.rb +2 -1
  14. data/lib/active_fedora/file_management.rb +1 -0
  15. data/lib/active_fedora/fixture_exporter.rb +1 -1
  16. data/lib/active_fedora/fixture_loader.rb +3 -3
  17. data/lib/active_fedora/metadata_datastream.rb +6 -0
  18. data/lib/active_fedora/model.rb +24 -5
  19. data/lib/active_fedora/nokogiri_datastream.rb +1 -0
  20. data/lib/active_fedora/ntriples_rdf_datastream.rb +0 -1
  21. data/lib/active_fedora/persistence.rb +2 -1
  22. data/lib/active_fedora/predicates.rb +27 -27
  23. data/lib/active_fedora/rdf_datastream.rb +104 -30
  24. data/lib/active_fedora/rels_ext_datastream.rb +14 -10
  25. data/lib/active_fedora/rubydora_connection.rb +4 -27
  26. data/lib/active_fedora/service_definitions.rb +2 -3
  27. data/lib/active_fedora/solr_digital_object.rb +22 -8
  28. data/lib/active_fedora/solr_service.rb +1 -1
  29. data/lib/active_fedora/unsaved_digital_object.rb +1 -4
  30. data/lib/active_fedora/version.rb +1 -1
  31. data/lib/tasks/active_fedora.rake +6 -6
  32. data/lib/tasks/active_fedora_dev.rake +0 -1
  33. data/spec/fixtures/mixed_rdf_descMetadata.nt +6 -0
  34. data/spec/fixtures/rails_root/config/fedora.yml +3 -1
  35. data/spec/fixtures/sharded_fedora.yml +11 -0
  36. data/spec/integration/base_file_management_spec.rb +6 -3
  37. data/spec/integration/base_find_by_fields_spec.rb +15 -16
  38. data/spec/integration/base_spec.rb +11 -178
  39. data/spec/integration/datastream_collections_spec.rb +1 -1
  40. data/spec/integration/full_featured_model_spec.rb +1 -2
  41. data/spec/integration/model_spec.rb +8 -9
  42. data/spec/integration/mods_article_integration_spec.rb +1 -1
  43. data/spec/integration/nokogiri_datastream_spec.rb +1 -1
  44. data/spec/integration/ntriples_datastream_spec.rb +80 -0
  45. data/spec/integration/rels_ext_datastream_spec.rb +0 -1
  46. data/spec/integration/semantic_node_spec.rb +18 -26
  47. data/spec/integration/solr_service_spec.rb +51 -1
  48. data/{lib/active_fedora → spec}/samples/hydra-mods_article_datastream.rb +0 -0
  49. data/{lib/active_fedora → spec}/samples/hydra-rights_metadata_datastream.rb +0 -0
  50. data/{lib/active_fedora → spec}/samples/marpa-dc_datastream.rb +0 -0
  51. data/spec/samples/models/hydrangea_article.rb +2 -2
  52. data/spec/samples/samples.rb +2 -0
  53. data/{lib/active_fedora → spec}/samples/special_thing.rb +3 -3
  54. data/spec/spec_helper.rb +1 -0
  55. data/spec/unit/active_fedora_spec.rb +17 -50
  56. data/spec/unit/base_extra_spec.rb +4 -0
  57. data/spec/unit/base_file_management_spec.rb +5 -2
  58. data/spec/unit/base_spec.rb +692 -628
  59. data/spec/unit/config_spec.rb +19 -0
  60. data/spec/unit/content_model_spec.rb +1 -24
  61. data/spec/unit/datastream_collections_spec.rb +11 -14
  62. data/spec/unit/datastreams_spec.rb +49 -54
  63. data/spec/unit/model_spec.rb +24 -53
  64. data/spec/unit/nokogiri_datastream_spec.rb +6 -1
  65. data/spec/unit/ntriples_datastream_spec.rb +73 -0
  66. data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
  67. data/spec/unit/relationships_spec.rb +6 -3
  68. data/spec/unit/rels_ext_datastream_spec.rb +19 -0
  69. data/spec/unit/rubydora_connection_spec.rb +2 -56
  70. data/spec/unit/solr_service_spec.rb +3 -1
  71. data/spec/unit/unsaved_digital_object_spec.rb +2 -2
  72. metadata +46 -33
  73. data/lib/active_fedora/dcrdf_datastream.rb +0 -11
  74. data/lib/active_fedora/relationship.rb +0 -47
  75. data/lib/active_fedora/samples.rb +0 -3
  76. data/spec/integration/dc_rdf_datastream_spec.rb +0 -24
  77. data/spec/unit/dc_rdf_datastream_spec.rb +0 -50
  78. data/spec/unit/relationship_spec.rb +0 -92
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active-fedora (3.3.2)
4
+ active-fedora (4.0.0.rc1)
5
5
  activeresource (>= 3.0.0)
6
6
  activesupport (>= 3.0.0)
7
7
  equivalent-xml
@@ -9,10 +9,10 @@ PATH
9
9
  mime-types (>= 1.16)
10
10
  multipart-post (= 1.1.2)
11
11
  nokogiri
12
- om (>= 1.5.1)
12
+ om (>= 1.5.3)
13
13
  rdf
14
14
  rdf-rdfxml
15
- rubydora (~> 0.5.3)
15
+ rubydora (~> 0.5.4)
16
16
  solr-ruby (>= 0.0.6)
17
17
  solrizer (~> 1.2.0)
18
18
  xml-simple (>= 1.0.12)
@@ -21,22 +21,22 @@ GEM
21
21
  remote: http://rubygems.org/
22
22
  specs:
23
23
  RedCloth (4.2.9)
24
- activemodel (3.2.1)
25
- activesupport (= 3.2.1)
24
+ activemodel (3.2.2)
25
+ activesupport (= 3.2.2)
26
26
  builder (~> 3.0.0)
27
- activeresource (3.2.1)
28
- activemodel (= 3.2.1)
29
- activesupport (= 3.2.1)
30
- activesupport (3.2.1)
27
+ activeresource (3.2.2)
28
+ activemodel (= 3.2.2)
29
+ activesupport (= 3.2.2)
30
+ activesupport (3.2.2)
31
31
  i18n (~> 0.6)
32
32
  multi_json (~> 1.0)
33
33
  addressable (2.2.7)
34
34
  akami (1.0.0)
35
35
  gyoku (>= 0.4.0)
36
36
  builder (3.0.0)
37
- childprocess (0.3.0)
37
+ childprocess (0.3.1)
38
38
  ffi (~> 1.0.6)
39
- daemons (1.1.6)
39
+ daemons (1.1.8)
40
40
  diff-lcs (1.1.3)
41
41
  equivalent-xml (0.2.9)
42
42
  nokogiri (>= 1.4.3)
@@ -57,13 +57,13 @@ GEM
57
57
  mediashelf-loggable (0.4.9)
58
58
  metaclass (0.0.1)
59
59
  mime-types (1.17.2)
60
- mocha (0.10.3)
60
+ mocha (0.10.5)
61
61
  metaclass (~> 0.0.1)
62
- multi_json (1.0.4)
62
+ multi_json (1.1.0)
63
63
  multipart-post (1.1.2)
64
64
  nokogiri (1.5.0)
65
65
  nori (1.1.0)
66
- om (1.5.1)
66
+ om (1.5.3)
67
67
  mediashelf-loggable
68
68
  nokogiri (>= 1.4.2)
69
69
  rack (1.4.1)
@@ -85,7 +85,7 @@ GEM
85
85
  rspec-expectations (2.8.0)
86
86
  diff-lcs (~> 1.1.2)
87
87
  rspec-mocks (2.8.0)
88
- rubydora (0.5.3)
88
+ rubydora (0.5.4)
89
89
  activemodel
90
90
  activesupport
91
91
  fastercsv
@@ -109,19 +109,18 @@ GEM
109
109
  om (>= 1.5.0)
110
110
  stomp
111
111
  xml-simple
112
- solrizer-fedora (1.2.3)
113
- active-fedora (>= 3.1.0)
114
- activesupport
112
+ solrizer-fedora (1.2.5)
113
+ active-fedora (>= 3.2.0)
114
+ activesupport (>= 3.0.11)
115
115
  fastercsv
116
- jettywrapper (>= 1.1.0)
117
- rsolr
116
+ rsolr (= 1.0.6)
118
117
  solr-ruby (>= 0.0.6)
119
118
  solrizer (>= 1.0.0)
120
119
  stomp (1.2.0)
121
120
  wasabi (2.1.0)
122
121
  nokogiri (>= 1.4.0)
123
122
  xml-simple (1.1.1)
124
- yard (0.7.4)
123
+ yard (0.7.5)
125
124
 
126
125
  PLATFORMS
127
126
  ruby
@@ -133,5 +132,5 @@ DEPENDENCIES
133
132
  mocha (>= 0.9.8)
134
133
  rake
135
134
  rspec (~> 2.0)
136
- solrizer-fedora (~> 1.2.3)
135
+ solrizer-fedora (~> 1.2.5)
137
136
  yard
@@ -1,3 +1,12 @@
1
+ 4.0.0.rc1
2
+ Removed deprecations
3
+ * allowing :fedora level in fedora.yml
4
+ * automatic includes of Relationships and FileMethods is removed
5
+ Added sharding TODO add documentation
6
+ Added find_document which determines the correct model and then casts the object to that.
7
+ Improved loading from solr
8
+ RDF datastreams
9
+
1
10
  3.3.2
2
11
  HYDRA-745 No need to require :url be present on external datastreams
3
12
  Initialize relationships graph to empty array
@@ -34,7 +34,7 @@ h3. Testing with Hudson Rake Task
34
34
  The hudson rake task will spin up jetty, import the fixtures, and run the tests for you.
35
35
 
36
36
  <pre>
37
- rake hudson
37
+ rake active_fedora:hudson
38
38
  </pre>
39
39
 
40
40
  h3. Testing Manually
data/TODO ADDED
@@ -0,0 +1 @@
1
+ Get rid of ActiveFedora::Relationships methods in specs (except in relationships_spec.rb of course)
@@ -20,20 +20,20 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency('mime-types', '>= 1.16')
21
21
  s.add_dependency('multipart-post', "= 1.1.2")
22
22
  s.add_dependency('nokogiri')
23
- s.add_dependency('om', '>= 1.5.1')
23
+ s.add_dependency('om', '>= 1.5.3')
24
24
  s.add_dependency('solrizer', '~>1.2.0')
25
25
  s.add_dependency("activeresource", '>= 3.0.0')
26
26
  s.add_dependency("activesupport", '>= 3.0.0')
27
27
  s.add_dependency("mediashelf-loggable")
28
28
  s.add_dependency("equivalent-xml")
29
- s.add_dependency("rubydora", '~>0.5.3')
29
+ s.add_dependency("rubydora", '~>0.5.4')
30
30
  s.add_dependency("rdf")
31
31
  s.add_dependency("rdf-rdfxml")
32
32
  s.add_development_dependency("yard")
33
33
  s.add_development_dependency("RedCloth") # for RDoc formatting
34
34
  s.add_development_dependency("rake")
35
35
  # s.add_development_dependency("rcov") # not ruby 1.9 compatible
36
- s.add_development_dependency("solrizer-fedora", "~>1.2.3") # used by the fixtures rake tasks
36
+ s.add_development_dependency("solrizer-fedora", "~>1.2.5") # used by the fixtures rake tasks
37
37
  s.add_development_dependency("jettywrapper", ">=1.2.0")
38
38
  s.add_development_dependency("rspec", "~> 2.0")
39
39
  s.add_development_dependency("mocha", ">= 0.9.8")
@@ -1,7 +1,13 @@
1
1
  development:
2
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora
2
+ user: fedoraAdmin
3
+ password: fedoraAdmin
4
+ url: http://127.0.0.1:8983/fedora
3
5
  test:
4
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora-test
6
+ user: fedoraAdmin
7
+ password: fedoraAdmin
8
+ url: http://127.0.0.1:8983/fedora-test
5
9
  production:
6
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8080/fedora
10
+ user: fedoraAdmin
11
+ password: fedoraAdmin
12
+ url: http://127.0.0.1:8080/fedora
7
13
 
@@ -12,18 +12,26 @@ ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
12
12
  module ActiveFedora #:nodoc:
13
13
  extend ActiveSupport::Autoload
14
14
 
15
+ class ObjectNotFoundError < RuntimeError; end # :nodoc:
16
+ class PredicateMappingsNotFoundError < RuntimeError; end # :nodoc:
17
+ class UnknownAttributeError < NoMethodError; end; # :nodoc:
18
+ class ConfigurationError < RuntimeError; end # :nodoc:
19
+ class AssociationTypeMismatch < RuntimeError; end # :nodoc:
20
+ class UnregisteredPredicateError < RuntimeError; end
21
+
22
+
15
23
  eager_autoload do
16
24
  autoload :Associations
17
25
  autoload :AttributeMethods
18
26
  autoload :Base
19
27
  autoload :ContentModel
20
28
  autoload :Callbacks
29
+ autoload :Config
21
30
  autoload :Reflection
22
31
  autoload :Relationships
23
32
  autoload :FileManagement
24
33
  autoload :RelationshipGraph
25
34
  autoload :Datastream
26
- autoload :DCRDFDatastream
27
35
  autoload :Datastreams
28
36
  autoload :Delegating
29
37
  autoload :DigitalObject
@@ -55,7 +63,7 @@ module ActiveFedora #:nodoc:
55
63
  include Loggable
56
64
 
57
65
  class << self
58
- attr_accessor :solr_config, :fedora_config, :config_env, :fedora_config_path, :solr_config_path
66
+ attr_accessor :solr_config, :fedora_config, :config_env, :solr_config_path
59
67
  attr_reader :config_options
60
68
  end
61
69
 
@@ -92,9 +100,20 @@ module ActiveFedora #:nodoc:
92
100
  # Options allowed in fedora.yml
93
101
  # first level is the environment (e.g. development, test, production and any custom environments you may have)
94
102
  # the second level has these keys:
95
- # 1. url: url including protocol, user/pass, host, port and path (e.g. http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora)
96
- # 2. validateChecksum: indicates to the fedora server whether you want to validate checksums when the datastreams are queried.
97
-
103
+ # 1. url: url including protocol, host, port and path (e.g. http://127.0.0.1:8983/fedora)
104
+ # 2. user: username
105
+ # 3. password: password
106
+ # 4. validateChecksum: indicates to the fedora server whether you want to validate checksums when the datastreams are queried.
107
+ #
108
+ # @example If you want to shard the fedora instance, you can specify an array of credentials.
109
+ # production:
110
+ # - user: user1
111
+ # password: password1
112
+ # url: http://127.0.0.1:8983/fedora1
113
+ # - user: user2
114
+ # password: password2
115
+ # url: http://127.0.0.1:8983/fedora2
116
+ #
98
117
 
99
118
  def self.init( options={} )
100
119
  # Make config_options into a Hash if nil is passed in as the value
@@ -115,6 +134,11 @@ module ActiveFedora #:nodoc:
115
134
  load_configs
116
135
  end
117
136
 
137
+ def self.config
138
+ load_configs
139
+ @fedora_config
140
+ end
141
+
118
142
  def self.reset!
119
143
  @config_loaded = false #Force reload of configs
120
144
  @predicate_config_path = nil
@@ -127,7 +151,7 @@ module ActiveFedora #:nodoc:
127
151
  def self.load_configs
128
152
  return if config_loaded?
129
153
  @config_env = environment
130
- load_config(:fedora)
154
+ @fedora_config = Config.new(get_config_path(:fedora), @config_env)
131
155
  load_config(:solr)
132
156
  @config_loaded = true
133
157
 
@@ -150,7 +174,8 @@ module ActiveFedora #:nodoc:
150
174
  end
151
175
 
152
176
  def self.config_for_environment
153
- fedora_config[@config_env.to_sym].symbolize_keys
177
+ ActiveSupport::Deprecation.warn("config_for_environment has been deprecated use `config' instead")
178
+ config
154
179
  end
155
180
 
156
181
  # Determines and sets the fedora_config[:url] or solr_config[:url]
@@ -161,13 +186,7 @@ module ActiveFedora #:nodoc:
161
186
  c = config[environment.to_sym]
162
187
  c.symbolize_keys!
163
188
  if config_type == "fedora"
164
- # support old-style config
165
- url = if c.fetch(:fedora,nil)
166
- ActiveSupport::Deprecation.warn("Using \"fedora\" in the fedora.yml file is no longer supported")
167
- c[:fedora]["url"] if config[environment.to_sym].fetch(:fedora,nil)
168
- else
169
- c[:url]
170
- end
189
+ url = c[:url]
171
190
  if url && !c[:user]
172
191
  u = URI.parse url
173
192
  c[:user] = u.user
@@ -233,16 +252,13 @@ module ActiveFedora #:nodoc:
233
252
  def self.get_config_path(config_type)
234
253
  config_type = config_type.to_s
235
254
  if (config_path = config_options.fetch("#{config_type}_config_path".to_sym,nil) )
236
- raise ActiveFedoraConfigurationException, "file does not exist #{config_path}" unless File.file? config_path
237
- return config_path
255
+ raise ConfigurationError, "file does not exist #{config_path}" unless File.file? config_path
256
+ return File.expand_path(config_path)
238
257
  end
239
258
 
240
259
  # if solr, attempt to use path where fedora.yml is first
241
260
  if config_type == "solr" && (config_path = check_fedora_path_for_solr)
242
261
  return config_path
243
- elsif config_type == "solr" && fedora_config[environment].fetch("solr",nil)
244
- ActiveSupport::Deprecation.warn("You appear to be using a deprecated format for your fedora.yml file. The solr url should be stored in a separate solr.yml file in the same directory as the fedora.yml")
245
- raise ActiveFedoraConfigurationException
246
262
  end
247
263
 
248
264
  if defined?(Rails.root)
@@ -258,12 +274,12 @@ module ActiveFedora #:nodoc:
258
274
  config_path = File.expand_path(File.join(File.dirname(__FILE__), "..", "config", "#{config_type}.yml"))
259
275
  logger.warn "Using the default #{config_type}.yml that comes with active-fedora. If you want to override this, pass the path to #{config_type}.yml to ActiveFedora - ie. ActiveFedora.init(:#{config_type}_config_path => '/path/to/#{config_type}.yml) - or set Rails.root and put #{config_type}.yml into \#{Rails.root}/config."
260
276
  return config_path if File.file? config_path
261
- raise ActiveFedoraConfigurationException "Couldn't load #{config_type} config file!"
277
+ raise ConfigurationError "Couldn't load #{config_type} config file!"
262
278
  end
263
279
 
264
- # Checks the existing fedora_config_path to see if there is a solr.yml there
280
+ # Checks the existing fedora_config.path to see if there is a solr.yml there
265
281
  def self.check_fedora_path_for_solr
266
- path = fedora_config_path.split('/')[0..-2].join('/') + "/solr.yml"
282
+ path = @fedora_config.path.split('/')[0..-2].join('/') + "/solr.yml"
267
283
  if File.file? path
268
284
  return path
269
285
  else
@@ -275,12 +291,15 @@ module ActiveFedora #:nodoc:
275
291
  ActiveFedora::SolrService.instance
276
292
  end
277
293
 
294
+
278
295
  def self.fedora
279
- ActiveFedora::RubydoraConnection.instance
296
+ ActiveSupport::Deprecation.warn("ActiveFedora.fedora() is deprecated and will be removed in the next release use ActiveFedora::Base.connection_for_pid(pid) instead")
297
+
298
+ ActiveFedora::Base.connection_for_pid('0')
280
299
  end
281
300
 
282
301
  def self.predicate_config
283
- @predicate_config_path ||= build_predicate_config_path(File.dirname(@fedora_config_path))
302
+ @predicate_config_path ||= build_predicate_config_path(File.dirname(@fedora_config.path))
284
303
  end
285
304
 
286
305
  def self.version
@@ -311,15 +330,6 @@ module ActiveFedora #:nodoc:
311
330
 
312
331
  end
313
332
 
314
- module ActiveFedora
315
- class ObjectNotFoundError < RuntimeError; end # :nodoc:
316
- class PredicateMappingsNotFoundError < RuntimeError; end # :nodoc:
317
- class UnknownAttributeError < NoMethodError; end; # :nodoc:
318
- class ActiveFedoraConfigurationException < Exception; end # :nodoc:
319
- class AssociationTypeMismatch < RuntimeError; end # :nodoc:
320
- class UnregisteredPredicateError < RuntimeError; end
321
-
322
- end
323
333
 
324
334
  load File.join(File.dirname(__FILE__),"tasks/active_fedora.rake") if defined?(Rake)
325
335
 
@@ -30,28 +30,15 @@ module ActiveFedora
30
30
  class Base
31
31
  include SemanticNode
32
32
 
33
-
34
- def self.method_missing (name, *args)
35
- if [:has_relationship, :has_bidirectional_relationship, :register_relationship_desc].include? name
36
- ActiveSupport::Deprecation.warn("Deprecation: Relationships will not be included by default in the next version. To use #{name} add 'include ActiveFedora::Relationships' to your model")
37
- include Relationships
38
- send name, *args
39
- elsif name == :has_datastream
40
- ActiveSupport::Deprecation.warn("Deprecation: DatastreamCollections will not be included by default in the next version. To use has_datastream add 'include ActiveFedora::DatastreamCollections' to your model")
41
- include DatastreamCollections
42
- has_datastream(*args)
43
- else
44
- super
45
- end
46
- end
47
-
33
+ class_attribute :fedora_connection
34
+ self.fedora_connection = {}
48
35
 
49
36
  def method_missing(name, *args)
50
- if [:collection_members, :part_of, :parts, :part_of_append, :file_objects].include? name
51
- ActiveSupport::Deprecation.warn("Deprecation: FileManagement will not be included by default in the next version. To use #{name} add 'include ActiveFedora::FileManagement' to your model")
52
- self.class.send :include, FileManagement
53
- send name, *args
54
- else
37
+ # if [:collection_members, :part_of, :parts, :part_of_append, :file_objects].include? name
38
+ # ActiveSupport::Deprecation.warn("Deprecation: FileManagement will not be included by default in the next version. To use #{name} add 'include ActiveFedora::FileManagement' to your model")
39
+ # self.class.send :include, FileManagement
40
+ # send name, *args
41
+ # else
55
42
  dsid = corresponding_datastream_name(name)
56
43
  if dsid
57
44
  ### Create and invoke a proxy method
@@ -62,7 +49,6 @@ module ActiveFedora
62
49
  else
63
50
  super
64
51
  end
65
- end
66
52
  end
67
53
 
68
54
 
@@ -133,6 +119,28 @@ module ActiveFedora
133
119
  self
134
120
  end
135
121
 
122
+ # Uses {shard_index} to find or create the rubydora connection for this pid
123
+ # @param [String] pid the identifier of the object to get the connection for
124
+ # @return [Rubydora::Repository] The repository that the identifier exists in.
125
+ def self.connection_for_pid(pid)
126
+ idx = shard_index(pid)
127
+ unless fedora_connection.has_key? idx
128
+ if ActiveFedora.config.sharded?
129
+ fedora_connection[idx] = RubydoraConnection.new(ActiveFedora.config.credentials[idx])
130
+ else
131
+ fedora_connection[idx] = RubydoraConnection.new(ActiveFedora.config.credentials)
132
+ end
133
+ end
134
+ fedora_connection[idx].connection
135
+ end
136
+
137
+ #If you want to use sharding override this method with your strategy
138
+ #@return [Integer] the index of the shard this object is stored in
139
+ def self.shard_index(pid)
140
+ 0
141
+ end
142
+
143
+
136
144
  def self.datastream_class_for_name(dsid)
137
145
  ds_specs[dsid] ? ds_specs[dsid][:type] : ActiveFedora::Datastream
138
146
  end
@@ -143,6 +151,17 @@ module ActiveFedora
143
151
  obj
144
152
  end
145
153
 
154
+
155
+ ### if you are doing sharding, override this method to do something other than use a sequence
156
+ # @return [String] the unique pid for a new object
157
+ def self.assign_pid(obj)
158
+ args = {}
159
+ args[:namespace] = obj.namespace if obj.namespace
160
+ raise RuntimeError, "When using shards, you must override #{self}.assign_pid()" if ActiveFedora.config.sharded?
161
+ d = REXML::Document.new(connection_for_pid('0').next_pid(args))
162
+ d.elements['//pid'].text
163
+ end
164
+
146
165
  def inner_object # :nodoc
147
166
  @inner_object
148
167
  end
@@ -167,7 +186,7 @@ module ActiveFedora
167
186
  def internal_uri
168
187
  "info:fedora/#{pid}"
169
188
  end
170
-
189
+
171
190
  #return the state of the inner object
172
191
  def state
173
192
  @inner_object.state
@@ -253,20 +272,30 @@ module ActiveFedora
253
272
  def to_solr(solr_doc = Hash.new, opts={})
254
273
  unless opts[:model_only]
255
274
  solr_doc.merge!(SOLR_DOCUMENT_ID.to_sym => pid, ActiveFedora::SolrService.solr_name(:system_create, :date) => self.create_date, ActiveFedora::SolrService.solr_name(:system_modified, :date) => self.modified_date, ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol) => self.class.inspect)
275
+ solrize_profile(solr_doc)
256
276
  end
257
277
  datastreams.each_value do |ds|
278
+ solr_doc = ds.solrize_profile(solr_doc)
258
279
  ds.ensure_xml_loaded if ds.respond_to? :ensure_xml_loaded ### Can't put this in the model because it's often implemented in Solrizer::XML::TerminologyBasedSolrizer
259
280
  solr_doc = ds.to_solr(solr_doc) if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream)
260
281
  end
261
282
  solr_doc = solrize_relationships(solr_doc) unless opts[:model_only]
262
- begin
263
- #logger.info("PID: '#{pid}' solr_doc put into solr: #{solr_doc.inspect}")
264
- rescue
265
- logger.info("Error encountered trying to output solr_doc details for pid: #{pid}")
266
- end
267
- return solr_doc
283
+ solr_doc
268
284
  end
269
285
 
286
+ def solrize_profile(solr_doc = Hash.new) # :nodoc:
287
+ if inner_object.respond_to? :profile
288
+ inner_object.profile.each_pair do |property,value|
289
+ if property =~ /Date/
290
+ value = Time.parse(value) unless value.is_a?(Time)
291
+ value = value.xmlschema
292
+ end
293
+ solr_doc[ActiveFedora::SolrService.solr_name("objProfile_#{property}", property =~ /Date/ ? :date : :symbol)] = value
294
+ end
295
+ end
296
+ solr_doc
297
+ end
298
+
270
299
  # Serialize the datastream's RDF relationships to solr
271
300
  # @param [Hash] solr_doc @deafult an empty Hash
272
301
  def solrize_relationships(solr_doc = Hash.new)
@@ -289,6 +318,27 @@ module ActiveFedora
289
318
  end
290
319
  klass.allocate.init_with(inner_object)
291
320
  end
321
+
322
+ # ** EXPERIMENTAL **
323
+ # This method returns a new object of the same class, with the internal SolrDigitalObject
324
+ # replaced with an actual DigitalObject.
325
+ def reify
326
+ if self.inner_object.is_a? DigitalObject
327
+ raise "#{self.inspect} is already a full digital object"
328
+ end
329
+ self.class.load_instance self.pid
330
+ end
331
+
332
+ # ** EXPERIMENTAL **
333
+ # This method reinitializes a lightweight, loaded-from-solr object with an actual
334
+ # DigitalObject inside.
335
+ def reify!
336
+ if self.inner_object.is_a? DigitalObject
337
+ raise "#{self.inspect} is already a full digital object"
338
+ end
339
+ self.init_with DigitalObject.find(self.class,self.pid)
340
+ end
341
+
292
342
  # ** EXPERIMENTAL **
293
343
  #
294
344
  # This method can be used instead of ActiveFedora::Model::ClassMethods.load_instance.
@@ -313,9 +363,7 @@ module ActiveFedora
313
363
  raise "Solr document record id and pid do not match" unless pid == solr_doc[SOLR_DOCUMENT_ID]
314
364
  end
315
365
 
316
- create_date = solr_doc[ActiveFedora::SolrService.solr_name(:system_create, :date)].nil? ? solr_doc[ActiveFedora::SolrService.solr_name(:system_create, :date).to_s] : solr_doc[ActiveFedora::SolrService.solr_name(:system_create, :date)]
317
- modified_date = solr_doc[ActiveFedora::SolrService.solr_name(:system_create, :date)].nil? ? solr_doc[ActiveFedora::SolrService.solr_name(:system_modified, :date).to_s] : solr_doc[ActiveFedora::SolrService.solr_name(:system_modified, :date)]
318
- obj = self.allocate.init_with(SolrDigitalObject.new(:pid=>solr_doc[SOLR_DOCUMENT_ID],:create_date=>create_date,:modified_date=>modified_date))
366
+ obj = self.allocate.init_with(SolrDigitalObject.new(solr_doc))
319
367
  #set by default to load any dependent relationship objects from solr as well
320
368
  #need to call rels_ext once so it exists when iterating over datastreams
321
369
  obj.rels_ext
@@ -324,6 +372,7 @@ module ActiveFedora
324
372
  ds.from_solr(solr_doc) if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream) || ( ds.kind_of?(ActiveFedora::RelsExtDatastream))
325
373
  end
326
374
  end
375
+ obj.inner_object.freeze
327
376
  obj
328
377
  end
329
378