active-fedora 3.0.7 → 3.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.rvmrc +1 -1
  2. data/Gemfile.lock +39 -10
  3. data/History.txt +0 -4
  4. data/active-fedora.gemspec +4 -3
  5. data/lib/active_fedora.rb +9 -9
  6. data/lib/active_fedora/base.rb +92 -163
  7. data/lib/active_fedora/datastream.rb +59 -60
  8. data/lib/active_fedora/datastream_hash.rb +18 -0
  9. data/lib/active_fedora/metadata_datastream.rb +3 -2
  10. data/lib/active_fedora/metadata_datastream_helper.rb +3 -15
  11. data/lib/active_fedora/model.rb +3 -3
  12. data/lib/active_fedora/nokogiri_datastream.rb +305 -302
  13. data/lib/active_fedora/qualified_dublin_core_datastream.rb +24 -19
  14. data/lib/active_fedora/rels_ext_datastream.rb +39 -37
  15. data/lib/active_fedora/rubydora_connection.rb +40 -0
  16. data/lib/active_fedora/semantic_node.rb +1 -1
  17. data/lib/active_fedora/solr_service.rb +1 -1
  18. data/lib/active_fedora/version.rb +1 -1
  19. data/lib/ruby-fedora.rb +0 -8
  20. data/lib/tasks/active_fedora.rake +14 -9
  21. data/lib/tasks/active_fedora_dev.rake +23 -40
  22. data/spec/integration/base_loader_spec.rb +4 -21
  23. data/spec/integration/base_spec.rb +300 -310
  24. data/spec/integration/bug_spec.rb +9 -10
  25. data/spec/integration/datastream_spec.rb +12 -12
  26. data/spec/integration/metadata_datastream_helper_spec.rb +7 -10
  27. data/spec/integration/model_spec.rb +3 -2
  28. data/spec/integration/rels_ext_datastream_spec.rb +9 -15
  29. data/spec/spec_helper.rb +2 -29
  30. data/spec/unit/active_fedora_spec.rb +5 -5
  31. data/spec/unit/base_cma_spec.rb +0 -7
  32. data/spec/unit/base_datastream_management_spec.rb +8 -67
  33. data/spec/unit/base_delegate_spec.rb +26 -9
  34. data/spec/unit/base_extra_spec.rb +5 -3
  35. data/spec/unit/base_file_management_spec.rb +10 -17
  36. data/spec/unit/base_named_datastream_spec.rb +76 -199
  37. data/spec/unit/base_spec.rb +152 -69
  38. data/spec/unit/content_model_spec.rb +1 -1
  39. data/spec/unit/datastream_concurrency_spec.rb +5 -4
  40. data/spec/unit/datastream_spec.rb +28 -48
  41. data/spec/unit/has_many_collection_spec.rb +2 -0
  42. data/spec/unit/inheritance_spec.rb +6 -6
  43. data/spec/unit/metadata_datastream_spec.rb +12 -28
  44. data/spec/unit/model_spec.rb +10 -10
  45. data/spec/unit/nokogiri_datastream_spec.rb +31 -33
  46. data/spec/unit/qualified_dublin_core_datastream_spec.rb +15 -15
  47. data/spec/unit/rels_ext_datastream_spec.rb +35 -29
  48. data/spec/unit/rubydora_connection_spec.rb +26 -0
  49. data/spec/unit/semantic_node_spec.rb +12 -17
  50. data/spec/unit/solr_config_options_spec.rb +13 -14
  51. data/spec/unit/solr_service_spec.rb +14 -17
  52. metadata +59 -55
  53. data/lib/fedora/base.rb +0 -38
  54. data/lib/fedora/connection.rb +0 -218
  55. data/lib/fedora/datastream.rb +0 -67
  56. data/lib/fedora/fedora_object.rb +0 -161
  57. data/lib/fedora/formats.rb +0 -30
  58. data/lib/fedora/generic_search.rb +0 -71
  59. data/lib/fedora/repository.rb +0 -298
  60. data/spec/integration/datastreams_crud_spec.rb +0 -208
  61. data/spec/integration/fedora_object_spec.rb +0 -77
  62. data/spec/integration/repository_spec.rb +0 -301
  63. data/spec/integration/rf_fedora_object_spec.rb +0 -95
  64. data/spec/unit/connection_spec.rb +0 -25
  65. data/spec/unit/fedora_object_spec.rb +0 -74
  66. data/spec/unit/repository_spec.rb +0 -143
  67. data/spec/unit/rf_datastream_spec.rb +0 -63
data/.rvmrc CHANGED
@@ -4,7 +4,7 @@
4
4
  # development environment upon cd'ing into the directory
5
5
 
6
6
  ruby_string="ree-1.8.7"
7
- gemset_name="active_fedora"
7
+ gemset_name="active_fedora_3.1"
8
8
 
9
9
  # Install rubies when used instead of only displaying a warning and exiting
10
10
  rvm_install_on_use_flag=1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active-fedora (3.0.6)
4
+ active-fedora (3.1.0.pre1)
5
5
  activeresource (~> 3.0.0)
6
6
  activesupport (~> 3.0.0)
7
7
  equivalent-xml
@@ -10,7 +10,8 @@ PATH
10
10
  mime-types (>= 1.16)
11
11
  multipart-post (= 1.1.2)
12
12
  nokogiri
13
- om (>= 1.4.3)
13
+ om (>= 1.0)
14
+ rubydora (~> 0.1.6)
14
15
  solr-ruby (>= 0.0.6)
15
16
  solrizer (> 1.0.0)
16
17
  xml-simple (>= 1.0.12)
@@ -27,6 +28,8 @@ GEM
27
28
  activemodel (= 3.0.10)
28
29
  activesupport (= 3.0.10)
29
30
  activesupport (3.0.10)
31
+ akami (1.0.0)
32
+ gyoku (>= 0.4.0)
30
33
  builder (2.1.2)
31
34
  childprocess (0.2.2)
32
35
  ffi (~> 1.0.6)
@@ -37,8 +40,12 @@ GEM
37
40
  facets (2.9.2)
38
41
  fastercsv (1.5.4)
39
42
  ffi (1.0.9)
43
+ gyoku (0.4.4)
44
+ builder (>= 2.1.2)
45
+ httpi (0.9.5)
46
+ rack
40
47
  i18n (0.5.0)
41
- jettywrapper (1.0.1)
48
+ jettywrapper (1.0.0)
42
49
  activesupport (>= 3.0.0)
43
50
  childprocess
44
51
  i18n
@@ -54,12 +61,16 @@ GEM
54
61
  metaclass (~> 0.0.1)
55
62
  multipart-post (1.1.2)
56
63
  nokogiri (1.5.0)
57
- om (1.4.3)
64
+ nori (1.0.2)
65
+ om (1.4.2)
58
66
  mediashelf-loggable
59
67
  nokogiri (>= 1.4.2)
68
+ rack (1.3.4)
60
69
  rake (0.9.2)
61
70
  rbx-require-relative (0.0.5)
62
- rcov (0.9.11)
71
+ rcov (0.9.10)
72
+ rest-client (1.6.7)
73
+ mime-types (>= 1.16)
63
74
  rsolr (1.0.2)
64
75
  builder (>= 2.1.2)
65
76
  rspec (1.3.2)
@@ -68,6 +79,22 @@ GEM
68
79
  ruby-debug-base (~> 0.10.4.0)
69
80
  ruby-debug-base (0.10.4)
70
81
  linecache (>= 0.3)
82
+ rubydora (0.1.6)
83
+ activemodel
84
+ activesupport
85
+ fastercsv
86
+ mime-types
87
+ nokogiri
88
+ rest-client
89
+ savon
90
+ savon (0.9.7)
91
+ akami (~> 1.0)
92
+ builder (>= 2.1.2)
93
+ gyoku (>= 0.4.0)
94
+ httpi (~> 0.9)
95
+ nokogiri (>= 1.4.0)
96
+ nori (~> 1.0)
97
+ wasabi (~> 2.0)
71
98
  solr-ruby (0.0.8)
72
99
  solrizer (1.1.2)
73
100
  daemons
@@ -76,15 +103,17 @@ GEM
76
103
  om (>= 1.4.0)
77
104
  stomp
78
105
  xml-simple
79
- solrizer-fedora (1.1.3)
106
+ solrizer-fedora (1.1.2)
80
107
  active-fedora (>= 2.3.0)
81
108
  fastercsv
82
109
  rsolr
83
110
  solr-ruby (>= 0.0.6)
84
111
  solrizer (>= 1.0.0)
85
112
  stomp (1.1.9)
86
- xml-simple (1.1.1)
87
- yard (0.7.3)
113
+ wasabi (2.0.0)
114
+ nokogiri (>= 1.4.0)
115
+ xml-simple (1.1.0)
116
+ yard (0.7.2)
88
117
 
89
118
  PLATFORMS
90
119
  ruby
@@ -92,11 +121,11 @@ PLATFORMS
92
121
  DEPENDENCIES
93
122
  RedCloth
94
123
  active-fedora!
95
- jettywrapper
124
+ jettywrapper (>= 1.0.0)
96
125
  mocha (>= 0.9.8)
97
126
  rake
98
127
  rcov
99
128
  rspec (< 2.0.0)
100
129
  ruby-debug
101
- solrizer-fedora
130
+ solrizer-fedora (>= 1.1.2)
102
131
  yard
@@ -1,7 +1,3 @@
1
- 3.0.7
2
-
3
- Require railtie if Rails is defined
4
-
5
1
  3.0.4
6
2
 
7
3
  HYDRA-663 -- Passing an empty string to a id setter should clear the belongs to association
@@ -20,19 +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.4.3')
23
+ s.add_dependency('om', '>= 1.0')
24
24
  s.add_dependency('solrizer', '>1.0.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
29
  s.add_dependency("facets")
30
+ s.add_dependency("rubydora", '~>0.1.6')
30
31
  s.add_development_dependency("yard")
31
32
  s.add_development_dependency("RedCloth") # for RDoc formatting
32
33
  s.add_development_dependency("rake")
33
34
  s.add_development_dependency("rcov")
34
- s.add_development_dependency("solrizer-fedora") # used by the fixtures rake tasks
35
- s.add_development_dependency("jettywrapper")
35
+ s.add_development_dependency("solrizer-fedora", ">=1.1.2") # used by the fixtures rake tasks
36
+ s.add_development_dependency("jettywrapper", ">=1.0.0")
36
37
  s.add_development_dependency("rspec", "<2.0.0")
37
38
  s.add_development_dependency("mocha", ">= 0.9.8")
38
39
  s.add_development_dependency("ruby-debug")
@@ -7,12 +7,11 @@ $: << 'lib'
7
7
  require 'active_support'
8
8
  require 'active_model'
9
9
 
10
-
11
- require 'active_fedora/solr_service.rb'
10
+ require 'active_fedora/solr_service'
11
+ require 'active_fedora/rubydora_connection'
12
12
  require "solrizer"
13
13
 
14
14
  require 'ruby-fedora'
15
- require 'active_fedora/railtie' if defined? Rails
16
15
 
17
16
  SOLR_DOCUMENT_ID = ActiveFedora::SolrService.id_field unless defined?(SOLR_DOCUMENT_ID)
18
17
  ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
@@ -27,6 +26,7 @@ module ActiveFedora #:nodoc:
27
26
  autoload :ContentModel
28
27
  autoload :Reflection
29
28
  autoload :Relationship
29
+ autoload :RelationshipsHelper
30
30
  autoload :Datastream
31
31
  autoload :Delegating
32
32
  autoload :Model
@@ -79,6 +79,7 @@ module ActiveFedora #:nodoc:
79
79
  # 2. If it does not find a solr.yml and the fedora.yml contains a solr url, it will raise an configuration error
80
80
  # 3. If it does not find a solr.yml and the fedora.yml does not contain a solr url, it will look in: +Rails.root+/config, +current working directory+/config, then the solr.yml shipped with gem
81
81
  def self.init( options={} )
82
+ logger.level = Logger::ERROR if logger.respond_to? :level ###MediaShelf StubLogger doesn't have a level= method
82
83
  # Make config_options into a Hash if nil is passed in as the value
83
84
  options = {} if options.nil?
84
85
 
@@ -164,8 +165,8 @@ module ActiveFedora #:nodoc:
164
165
  logger.info("FEDORA: initialized Solr with ActiveFedora.solr_config: #{ActiveFedora::SolrService.instance.inspect}")
165
166
 
166
167
  logger.info("FEDORA: initializing Fedora with fedora_config: #{ActiveFedora.fedora_config.inspect}")
167
- Fedora::Repository.register(ActiveFedora.fedora_config[:url])
168
- logger.info("FEDORA: initialized Fedora as: #{Fedora::Repository.instance.inspect}")
168
+ ActiveFedora::RubydoraConnection.connect(ActiveFedora.fedora_config[:url])
169
+ logger.info("FEDORA: initialized Fedora as: #{ActiveFedora::RubydoraConnection.instance.inspect}")
169
170
 
170
171
  end
171
172
 
@@ -174,7 +175,7 @@ module ActiveFedora #:nodoc:
174
175
  # 2. Rails.env
175
176
  # 3. ENV['environment']
176
177
  # 4. ENV['RAILS_ENV']
177
- # 5. raises an exception if none of these is set
178
+ # 5. development
178
179
  # @return [String]
179
180
  # @example
180
181
  # ActiveFedora.init(:environment=>"test")
@@ -191,7 +192,7 @@ module ActiveFedora #:nodoc:
191
192
  ENV['environment'] = ENV['RAILS_ENV']
192
193
  return ENV['environment']
193
194
  else
194
- raise "Can't determine what environment to run in!"
195
+ ENV['environment'] = 'development' #raise "Can't determine what environment to run in!"
195
196
  end
196
197
  end
197
198
 
@@ -248,7 +249,7 @@ module ActiveFedora #:nodoc:
248
249
  end
249
250
 
250
251
  def self.fedora
251
- Fedora::Repository.instance
252
+ ActiveFedora::RubydoraConnection.instance
252
253
  end
253
254
 
254
255
  def self.predicate_config
@@ -284,7 +285,6 @@ module ActiveFedora #:nodoc:
284
285
  end
285
286
 
286
287
  module ActiveFedora
287
- class ServerError < Fedora::ServerError; end # :nodoc:
288
288
  class ObjectNotFoundError < RuntimeError; end # :nodoc:
289
289
  class PredicateMappingsNotFoundError < RuntimeError; end # :nodoc:
290
290
  class UnknownAttributeError < NoMethodError; end; # :nodoc:
@@ -1,12 +1,9 @@
1
1
  require "solrizer"
2
2
  require 'nokogiri'
3
3
  require "loggable"
4
+ require 'active_fedora/datastream_hash'
4
5
 
5
- #require 'active_support/core_ext/kernel/singleton_class'
6
- #require 'active_support/core_ext/class/attribute'
7
6
  require 'active_support/core_ext/class/inheritable_attributes'
8
- #require 'active_support/inflector'
9
-
10
7
  SOLR_DOCUMENT_ID = "id" unless (defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?)
11
8
  ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
12
9
 
@@ -37,7 +34,7 @@ module ActiveFedora
37
34
  include SemanticNode
38
35
  class_inheritable_accessor :ds_specs, :class_named_datastreams_desc
39
36
  self.class_named_datastreams_desc = {}
40
- self.ds_specs = {}
37
+ self.ds_specs = {'RELS-EXT'=> [ActiveFedora::RelsExtDatastream, "", nil]}#, 'DC'=> [ActiveFedora::Datastream, "", nil]}
41
38
  attr_accessor :named_datastreams_desc
42
39
 
43
40
 
@@ -48,12 +45,12 @@ module ActiveFedora
48
45
 
49
46
  # Has this object been saved?
50
47
  def new_object?
51
- @new_object
48
+ inner_object.new?
52
49
  end
53
50
 
54
51
  def new_object=(bool)
55
52
  @new_object = bool
56
- inner_object.new_object = bool
53
+ #inner_object.new_object = bool
57
54
  end
58
55
 
59
56
  ## Required by associations
@@ -83,16 +80,17 @@ module ActiveFedora
83
80
  attrs = {} if attrs.nil?
84
81
  unless attrs[:pid]
85
82
  if attrs[:namespace]
86
- attrs = attrs.merge!({:pid=>Fedora::Repository.instance.nextid({:namespace=>attrs[:namespace]})})
83
+ attrs = attrs.merge!({:pid=>RubydoraConnection.instance.nextid({:namespace=>attrs[:namespace]})})
87
84
  else
88
- attrs = attrs.merge!({:pid=>Fedora::Repository.instance.nextid})
85
+ attrs = attrs.merge!({:pid=>RubydoraConnection.instance.nextid})
89
86
  end
90
87
  @new_object=true
88
+ @inner_object = RubydoraConnection.instance.connection.find(attrs[:pid])
91
89
  else
92
90
  @new_object = attrs[:new_object] == false ? false : true
91
+ @inner_object = RubydoraConnection.instance.connection.find(attrs[:pid])
92
+ load_datastreams_from_fedora
93
93
  end
94
- @inner_object = Fedora::FedoraObject.new(attrs)
95
- @datastreams = {}
96
94
  configure_defined_datastreams
97
95
 
98
96
  attributes = attrs.dup
@@ -127,7 +125,6 @@ module ActiveFedora
127
125
  #Saves a Base object, and any dirty datastreams, then updates
128
126
  #the Solr index for this object.
129
127
  def save
130
- #@metadata_is_dirty = false
131
128
  # If it's a new object, set the conformsTo relationship for Fedora CMA
132
129
  if new_object?
133
130
  result = create
@@ -147,8 +144,7 @@ module ActiveFedora
147
144
  # Refreshes the object's info from Fedora
148
145
  # Note: Currently just registers any new datastreams that have appeared in fedora
149
146
  def refresh
150
- inner_object.load_attributes_from_fedora
151
- @datastreams = datastreams_in_fedora.merge(datastreams_in_memory)
147
+ # inner_object.load_attributes_from_fedora
152
148
  end
153
149
 
154
150
  #Deletes a Base object, also deletes the info indexed in Solr, and
@@ -164,7 +160,12 @@ module ActiveFedora
164
160
  end
165
161
  end
166
162
 
167
- Fedora::Repository.instance.delete(@inner_object)
163
+ #Fedora::Repository.instance.delete(@inner_object)
164
+ begin
165
+ @inner_object.delete
166
+ rescue RestClient::ResourceNotFound =>e
167
+ raise ObjectNotFoundError, "Unable to find #{pid} in the repository"
168
+ end
168
169
  if ENABLE_SOLR_UPDATES
169
170
  ActiveFedora::SolrService.instance.conn.delete(pid)
170
171
  # if defined?( Solrizer::Solrizer )
@@ -184,35 +185,31 @@ module ActiveFedora
184
185
  # Datastreams that have been modified in memory are given preference over
185
186
  # the copy in Fedora.
186
187
  def datastreams
187
- if @new_object
188
- @datastreams = datastreams_in_memory
189
- else
190
- @datastreams = (@datastreams == {}) ? datastreams_in_fedora : datastreams_in_memory
191
- end
192
-
188
+ @datastreams ||= DatastreamHash.new(self)
189
+ end
190
+
191
+ def datastreams_in_memory
192
+ ActiveSupport::Deprecation.warn("ActiveFedora::Base.datastreams_in_memory has been deprecated. Use #datastreams instead")
193
+ datastreams
193
194
  end
194
195
 
195
- def datastreams_in_fedora #:nodoc:
196
- mds = {}
197
- self.datastreams_xml['datastream'].each do |ds|
198
- ds.merge!({:pid => self.pid, :dsID => ds["dsid"], :dsLabel => ds["label"]})
199
- if ds["dsid"] == "RELS-EXT"
200
- mds.merge!({ds["dsid"] => ActiveFedora::RelsExtDatastream.new(ds)})
196
+ def load_datastreams_from_fedora
197
+ inner_object.datastreams.each do |dsid, datastream|
198
+ ds_spec = self.class.ds_specs[dsid]
199
+ if (ds_spec)
200
+ klass = ds_spec.first
201
+ datastreams[dsid] = klass.new(inner_object, dsid, true)
202
+ #datastreams[dsid].dsLabel = ds_spec[1] #this shouldn't cause it to be dirty
203
+ if ds_spec.last.class == Proc
204
+ ds_spec.last.call(datastreams[dsid])
205
+ end
206
+ klass.from_xml(datastreams[dsid].content, datastreams[dsid]) ### TODO, this is loading eagerly, we could load it as needed
207
+ ### TODO, if rubydora could know which klass to use, we could probably skip this step.
201
208
  else
202
- mds.merge!({ds["dsid"] => ActiveFedora::Datastream.new(ds)})
209
+ #TODO, this may be a perfomance hit and we may not need it.
210
+ datastreams[dsid] =Datastream.new(inner_object, dsid)#, true)
203
211
  end
204
- mds[ds["dsid"]].new_object = false
205
212
  end
206
- mds
207
- end
208
-
209
- def datastreams_in_memory #:ndoc:
210
- @datastreams ||= Hash.new
211
- end
212
-
213
- #return the datastream xml representation direclty from Fedora
214
- def datastreams_xml
215
- datastreams_xml = XmlSimple.xml_in(Fedora::Repository.instance.fetch_custom(self.pid, :datastreams))
216
213
  end
217
214
 
218
215
  # Adds datastream to the object. Saves the datastream to fedora upon adding.
@@ -220,10 +217,9 @@ module ActiveFedora
220
217
  # :prefix option will set the prefix on auto-generated DSID
221
218
  # @return [String] dsid of the added datastream
222
219
  def add_datastream(datastream, opts={})
223
- datastream.pid = self.pid
224
220
  if datastream.dsid == nil || datastream.dsid.empty?
225
221
  prefix = opts.has_key?(:prefix) ? opts[:prefix] : "DS"
226
- datastream.dsid = generate_dsid(prefix)
222
+ datastream.instance_variable_set :@dsid, generate_dsid(prefix)
227
223
  end
228
224
  datastreams[datastream.dsid] = datastream
229
225
  return datastream.dsid
@@ -290,7 +286,7 @@ module ActiveFedora
290
286
  # Failing that, creates a new RelsExtDatastream and adds it to the object
291
287
  def rels_ext
292
288
  if !datastreams.has_key?("RELS-EXT")
293
- add_datastream(ActiveFedora::RelsExtDatastream.new)
289
+ add_datastream(ActiveFedora::RelsExtDatastream.new(@inner_object,'RELS-EXT'))
294
290
  end
295
291
  return datastreams["RELS-EXT"]
296
292
  end
@@ -313,8 +309,7 @@ module ActiveFedora
313
309
  elsif opts.has_key?(:content_type)
314
310
  attrs.merge!({:mimeType=>opts[:content_type]})
315
311
  end
316
-
317
- ds = ActiveFedora::Datastream.new(attrs)
312
+ ds = create_datastream(ActiveFedora::Datastream, nil, attrs)
318
313
  opts.has_key?(:dsid) ? ds.dsid=(opts[:dsid]) : nil
319
314
  add_datastream(ds)
320
315
  end
@@ -413,7 +408,6 @@ module ActiveFedora
413
408
  # :dsLocation => holds uri location of datastream. Required only if :controlGroup is type 'E' or 'R'.
414
409
  # :dsid or :dsId => Optional, and used to update an existing datastream with dsid supplied. Will throw an error if dsid does not exist and does not match prefix pattern for datastream name
415
410
  def add_named_datastream(name,opts={})
416
-
417
411
  unless named_datastreams_desc.has_key?(name) && named_datastreams_desc[name].has_key?(:type)
418
412
  raise "Failed to add datastream. Named datastream #{name} not defined for object #{pid}."
419
413
  end
@@ -457,11 +451,7 @@ module ActiveFedora
457
451
 
458
452
  opts.merge!(:dsLabel => label)
459
453
 
460
- #make sure both dsid and dsID populated if a dsid is supplied
461
- opts.merge!(:dsid=>opts[:dsID]) if opts.has_key?(:dsID)
462
- opts.merge!(:dsID=>opts[:dsid]) if opts.has_key?(:dsid)
463
-
464
- ds = create_datastream(named_datastreams_desc[name][:type],opts)
454
+ ds = create_datastream(named_datastreams_desc[name][:type], opts[:dsid], opts)
465
455
  #Must be of type datastream
466
456
  assert_kind_of 'datastream', ds, ActiveFedora::Datastream
467
457
  #make sure dsid is nil so that it uses the prefix for mapping purposes
@@ -525,30 +515,6 @@ module ActiveFedora
525
515
  return ds_values
526
516
  end
527
517
 
528
- # ** EXPERIMENTAL **
529
- #
530
- # Returns hash of datastream names mapped to another hash
531
- # of dsid to attributes for corresponding datastream objects
532
- # === Example
533
- # For the following has_datastream call, assume we have added one datastream.
534
- #
535
- # has_datastream :name=>"thumbnails",:prefix => "THUMB",:type=>ActiveFedora::Datastream, :mimeType=>"image/jpeg", :controlGroup=>'M'
536
- #
537
- # It would then return
538
- # {"thumbnails"=>{"THUMB1"=>{:prefix=>"VAN", :type=>"ActiveFedora::Datastream", :dsid=>"THUMB1", :dsID=>"THUMB1", :pid=>"changme:33", :mimeType=>"image/jpeg", :dsLabel=>"", :name=>"thumbnails", :content_type=>"image/jpeg", :controlGroup=>"M"}}}
539
- def named_datastreams_attributes
540
- ds_values = {}
541
- self.class.named_datastreams_desc.keys.each do |name|
542
- ds_array = self.send("#{name}")
543
- result_hash = {}
544
- ds_array.each do |ds|
545
- result_hash[ds.dsid]=ds.attributes
546
- end
547
- ds_values.merge!({name=>result_hash})
548
- end
549
- return ds_values
550
- end
551
-
552
518
  # ** EXPERIMENTAL **
553
519
  #
554
520
  # Returns hash of datastream names mapped to an array
@@ -569,18 +535,6 @@ module ActiveFedora
569
535
  return dsids
570
536
  end
571
537
 
572
- # ** EXPERIMENTAL **
573
- #
574
- # For all datastream objects, this returns hash of dsid mapped to attribute hash within the corresponding
575
- # datastream object.
576
- def datastreams_attributes
577
- ds_values = {}
578
- self.datastreams.each_pair do |dsid,ds|
579
- ds_values.merge!({dsid=>ds.attributes})
580
- end
581
- return ds_values
582
- end
583
-
584
538
  # ** EXPERIMENTAL **
585
539
  #
586
540
  # Returns the hash that stores arguments passed to has_datastream calls within an
@@ -606,9 +560,30 @@ module ActiveFedora
606
560
  self.class.named_datastreams_desc
607
561
  end
608
562
 
609
- def create_datastream(type,opts={})
610
- type.to_s.split('::').inject(Kernel) {|scope, const_name|
611
- scope.const_get(const_name)}.new(opts)
563
+ def create_datastream(type, dsid, opts={})
564
+ dsid = generate_dsid(opts[:prefix] || "DS") if dsid == nil
565
+ klass = type.kind_of?(Class) ? type : type.constantize
566
+ raise ArgumentError, "Argument dsid must be of type string" unless dsid.kind_of?(String) || dsid.kind_of?(NilClass)
567
+ ds = klass.new(inner_object, dsid)
568
+ ds.mimeType = opts[:mimeType]
569
+ ds.controlGroup = opts[:controlGroup]
570
+ ds.dsLabel = opts[:dsLabel]
571
+ ds.dsLocation = opts[:dsLocation]
572
+ blob = opts[:blob]
573
+ if blob
574
+ if !ds.mimeType.present?
575
+ ##TODO, this is all done by rubydora -- remove
576
+ ds.mimeType = blob.respond_to?(:content_type) ? blob.content_type : "application/octet-stream"
577
+ end
578
+ if !ds.dsLabel.present?
579
+ ds.dsLabel = File.basename(blob.path)
580
+ # ds.dsLabel = blob.original_filename
581
+ end
582
+ end
583
+
584
+ # blob = blob.read if blob.respond_to? :read
585
+ ds.content = blob || ""
586
+ ds
612
587
  end
613
588
 
614
589
  # ** EXPERIMENTAL **
@@ -779,8 +754,10 @@ module ActiveFedora
779
754
  end
780
755
 
781
756
  #return the pid of the Fedora Object
757
+ # if there is no fedora object (loaded from solr) get the instance var
758
+ # TODO make inner_object a proxy that can hold the pid
782
759
  def pid
783
- @inner_object.pid
760
+ @inner_object ? @inner_object.pid : @pid
784
761
  end
785
762
 
786
763
 
@@ -813,17 +790,18 @@ module ActiveFedora
813
790
 
814
791
  #return the create_date of the inner object (unless it's a new object)
815
792
  def create_date
816
- @inner_object.create_date unless new_object?
793
+ @inner_object.profile["objCreateDate"] unless @inner_object.new?
817
794
  end
818
795
 
819
796
  #return the modification date of the inner object (unless it's a new object)
820
797
  def modified_date
821
- @inner_object.modified_date unless new_object?
798
+ @inner_object.profile["objLastModDate"] unless @inner_object.new?
822
799
  end
823
800
 
824
801
  #return the error list of the inner object (unless it's a new object)
825
802
  def errors
826
- @inner_object.errors
803
+ #@inner_object.errors
804
+ []
827
805
  end
828
806
 
829
807
  #return the label of the inner object (unless it's a new object)
@@ -832,48 +810,7 @@ module ActiveFedora
832
810
  end
833
811
 
834
812
  def label=(new_label)
835
- @inner_object.label = new_label
836
- end
837
-
838
- # Create an instance of the current Model from the given FOXML
839
- # This method is used when you call load_instance on a Model
840
- # @param [Nokogiri::XML::Document] doc the FOXML of the object
841
- def self.deserialize(doc) #:nodoc:
842
- if doc.instance_of?(REXML::Document)
843
- pid = doc.elements['/foxml:digitalObject'].attributes['PID']
844
-
845
- proto = self.new(:pid=>pid, :new_object=>false)
846
- proto.datastreams.each do |name,ds|
847
- doc.elements.each("//foxml:datastream[@ID='#{name}']") do |el|
848
- # datastreams remain marked as new if the foxml doesn't have an entry for that datastream
849
- ds.new_object = false
850
- proto.datastreams[name]=ds.class.from_xml(ds, el)
851
- end
852
- end
853
- proto.inner_object.new_object = false
854
- return proto
855
- elsif doc.instance_of?(Nokogiri::XML::Document)
856
- pid = doc.xpath('/foxml:digitalObject').first["PID"]
857
-
858
- proto = self.new(:pid=>pid, :new_object=>false)
859
- proto.datastreams.each do |name,ds|
860
- doc.xpath("//foxml:datastream[@ID='#{name}']").each do |node|
861
- # datastreams remain marked as new if the foxml doesn't have an entry for that datastream
862
- ds.new_object = false
863
- # Nokogiri Datstreams use a new syntax for .from_xml (tmpl is optional!) and expects the actual xml content rather than the foxml datstream xml
864
- # NB: Base.deserialize, or a separately named method, should set any other info from the foxml if necessary though by this point it's all been grabbed elsewhere...
865
- if ds.kind_of?(ActiveFedora::NokogiriDatastream)
866
- xml_content = Fedora::Repository.instance.fetch_custom(pid, "datastreams/#{name}/content")
867
- # node = node.search('./foxml:datastreamVersion[last()]/foxml:xmlContent/*').first
868
- proto.datastreams[name]=ds.class.from_xml(xml_content, ds)
869
- else
870
- proto.datastreams[name]=ds.class.from_xml(ds, node)
871
- end
872
- end
873
- end
874
- proto.inner_object.new_object = false
875
- return proto
876
- end
813
+ @inner_object.profile["objLabel"] = new_label
877
814
  end
878
815
 
879
816
  #Return a hash of all available metadata fields for all
@@ -919,7 +856,6 @@ module ActiveFedora
919
856
  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)
920
857
  end
921
858
  datastreams.each_value do |ds|
922
- # solr_doc = ds.to_solr(solr_doc) if ds.class.included_modules.include?(ActiveFedora::MetadataDatastreamHelper) ||( ds.kind_of?(ActiveFedora::RelsExtDatastream) || ( ds.kind_of?(ActiveFedora::QualifiedDublinCoreDatastream) && !opts[:model_only] )
923
859
  solr_doc = ds.to_solr(solr_doc) if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream) || ( ds.kind_of?(ActiveFedora::RelsExtDatastream) && !opts[:model_only] )
924
860
  end
925
861
  begin
@@ -958,9 +894,8 @@ module ActiveFedora
958
894
  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)]
959
895
  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)]
960
896
  obj = self.new({:pid=>solr_doc[SOLR_DOCUMENT_ID],:create_date=>create_date,:modified_date=>modified_date})
961
- obj.new_object = false
897
+ #obj.new_object = false
962
898
  #set by default to load any dependent relationship objects from solr as well
963
- obj.load_from_solr = true
964
899
  #need to call rels_ext once so it exists when iterating over datastreams
965
900
  obj.rels_ext
966
901
  obj.datastreams.each_value do |ds|
@@ -1035,8 +970,8 @@ module ActiveFedora
1035
970
  def update_datastream_attributes(params={}, opts={})
1036
971
  result = params.dup
1037
972
  params.each_pair do |dsid, ds_params|
1038
- if datastreams_in_memory.include?(dsid)
1039
- result[dsid] = datastreams_in_memory[dsid].update_indexed_attributes(ds_params)
973
+ if datastreams.include?(dsid)
974
+ result[dsid] = datastreams[dsid].update_indexed_attributes(ds_params)
1040
975
  else
1041
976
  result.delete(dsid)
1042
977
  end
@@ -1045,8 +980,8 @@ module ActiveFedora
1045
980
  end
1046
981
 
1047
982
  def get_values_from_datastream(dsid,field_key,default=[])
1048
- if datastreams_in_memory.include?(dsid)
1049
- return datastreams_in_memory[dsid].get_values(field_key,default)
983
+ if datastreams.include?(dsid)
984
+ return datastreams[dsid].get_values(field_key,default)
1050
985
  else
1051
986
  return nil
1052
987
  end
@@ -1069,17 +1004,17 @@ module ActiveFedora
1069
1004
  if self.class.ds_specs
1070
1005
  self.class.ds_specs.each do |name,ar|
1071
1006
  if self.datastreams.has_key?(name)
1072
- attributes = self.datastreams[name].attributes
1007
+ #attributes = self.datastreams[name].attributes
1073
1008
  else
1074
- attributes = {:dsLabel=>ar[1]}
1075
- end
1076
- ds = ar.first.new(:dsid=>name)
1077
- # If you called has_metadata with a block, pass the block into the Datastream class
1078
- if ar.last.class == Proc
1079
- ar.last.call(ds)
1009
+ ds = ar.first.new(inner_object, name)
1010
+ ds.dsLabel = ar[1]
1011
+ # If you called has_metadata with a block, pass the block into the Datastream class
1012
+ if ar.last.class == Proc
1013
+ ar.last.call(ds)
1014
+ end
1015
+ #ds.attributes = attributes.merge(ds.attributes)
1016
+ self.add_datastream(ds)
1080
1017
  end
1081
- ds.attributes = attributes.merge(ds.attributes)
1082
- self.add_datastream(ds)
1083
1018
  end
1084
1019
  end
1085
1020
  end
@@ -1089,23 +1024,17 @@ module ActiveFedora
1089
1024
  add_relationship(:has_model, ActiveFedora::ContentModel.pid_from_ruby_class(self.class))
1090
1025
  @metadata_is_dirty = true
1091
1026
  update
1092
- #@datastreams = datastreams_in_fedora
1093
1027
  end
1094
1028
 
1095
1029
  # Pushes the object and all of its new or dirty datastreams into Fedora
1096
1030
  def update
1097
- result = Fedora::Repository.instance.save(@inner_object)
1098
- datastreams_in_memory.each do |k,ds|
1099
- if ds.dirty? || ds.new_object?
1100
- if ds.class.included_modules.include?(ActiveFedora::MetadataDatastreamHelper) || ds.instance_of?(ActiveFedora::RelsExtDatastream)
1101
- # if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream) || ds.instance_of?(ActiveFedora::RelsExtDatastream)
1102
- @metadata_is_dirty = true
1103
- end
1104
- result = ds.save
1105
- end
1106
- end
1031
+ result = @inner_object.save
1032
+ datastreams.each {|k, ds| ds.serialize! }
1033
+ @metadata_is_dirty = datastreams.any? {|k,ds| ds.changed? && (ds.class.included_modules.include?(ActiveFedora::MetadataDatastreamHelper) || ds.instance_of?(ActiveFedora::RelsExtDatastream))}
1034
+ ## TODO rubydora is saving datastreams, but not of our subclasses
1035
+ datastreams.select {|k, ds| ds.changed? }.each do |k, ds| ds.save end
1107
1036
  refresh
1108
- return result
1037
+ return !!result
1109
1038
  end
1110
1039
 
1111
1040
  end