active-fedora 5.0.0 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -1
- data/README.textile +6 -0
- data/active-fedora.gemspec +1 -1
- data/lib/active_fedora.rb +2 -0
- data/lib/active_fedora/associations.rb +22 -2
- data/lib/active_fedora/associations/association_collection.rb +37 -0
- data/lib/active_fedora/associations/belongs_to_association.rb +8 -0
- data/lib/active_fedora/associations/has_many_association.rb +2 -0
- data/lib/active_fedora/base.rb +43 -6
- data/lib/active_fedora/datastream.rb +13 -37
- data/lib/active_fedora/datastreams.rb +2 -6
- data/lib/active_fedora/digital_object.rb +8 -1
- data/lib/active_fedora/metadata_datastream_helper.rb +2 -2
- data/lib/active_fedora/nokogiri_datastream.rb +55 -16
- data/lib/active_fedora/persistence.rb +14 -9
- data/lib/active_fedora/railtie.rb +15 -0
- data/lib/active_fedora/rdf_datastream.rb +4 -0
- data/lib/active_fedora/rdfxml_rdf_datastream.rb +2 -6
- data/lib/active_fedora/reflection.rb +11 -0
- data/lib/active_fedora/relationships.rb +4 -4
- data/lib/active_fedora/rels_ext_datastream.rb +21 -6
- data/lib/active_fedora/semantic_node.rb +3 -3
- data/lib/active_fedora/test_support.rb +38 -0
- data/lib/active_fedora/version.rb +1 -1
- data/lib/generators/active_fedora/config/USAGE +9 -0
- data/lib/generators/active_fedora/config/config_generator.rb +10 -0
- data/lib/generators/active_fedora/config/fedora/fedora_generator.rb +12 -0
- data/lib/generators/active_fedora/config/fedora/templates/fedora.yml +14 -0
- data/lib/generators/active_fedora/config/fedora/templates/fedora_conf/conf/development/fedora.fcfg +953 -0
- data/lib/generators/active_fedora/config/fedora/templates/fedora_conf/conf/test/fedora.fcfg +953 -0
- data/lib/generators/active_fedora/config/solr/solr_generator.rb +12 -0
- data/lib/generators/active_fedora/config/solr/templates/solr.yml +10 -0
- data/lib/generators/active_fedora/config/solr/templates/solr_conf/conf/schema.xml +692 -0
- data/lib/generators/active_fedora/config/solr/templates/solr_conf/conf/solrconfig.xml +299 -0
- data/lib/generators/active_fedora/config/solr/templates/solr_conf/solr.xml +35 -0
- data/lib/generators/active_fedora/model/USAGE +9 -0
- data/lib/generators/active_fedora/model/model_generator.rb +21 -0
- data/lib/generators/active_fedora/model/templates/model.rb.erb +6 -0
- data/lib/generators/active_fedora/model/templates/model_spec.rb.erb +21 -0
- data/lib/tasks/active_fedora_dev.rake +8 -0
- data/spec/fixtures/hydrangea_fixture_mods_article2.foxml.xml +234 -0
- data/spec/integration/associations_spec.rb +76 -15
- data/spec/integration/base_spec.rb +38 -10
- data/spec/integration/datastreams_spec.rb +24 -2
- data/spec/integration/nokogiri_datastream_spec.rb +23 -5
- data/spec/unit/base_extra_spec.rb +0 -1
- data/spec/unit/base_spec.rb +7 -47
- data/spec/unit/datastream_collections_spec.rb +0 -7
- data/spec/unit/datastream_spec.rb +7 -16
- data/spec/unit/datastreams_spec.rb +2 -2
- data/spec/unit/nokogiri_datastream_spec.rb +31 -20
- data/spec/unit/ntriples_datastream_spec.rb +7 -10
- data/spec/unit/persistence_spec.rb +0 -11
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -2
- data/spec/unit/relationships_spec.rb +5 -5
- data/spec/unit/rels_ext_datastream_spec.rb +14 -9
- data/spec/unit/semantic_node_spec.rb +4 -4
- metadata +25 -6
data/History.txt
CHANGED
@@ -1,7 +1,20 @@
|
|
1
1
|
5.0.0
|
2
2
|
Depend on solrizer 2.0.0 (for HYDRA-827 DO NOT index terms by default)
|
3
3
|
Lazily initialize solr, so that the message goes into the log, not the console
|
4
|
-
|
4
|
+
Depend on om 1.8.0
|
5
|
+
Require Ruby >= 1.9.3
|
6
|
+
Support for ISO 8601 date formats
|
7
|
+
New before_delete callback available on ActiveFedora objects
|
8
|
+
HYDRA-883: RDFDatastreams should handle Literals as object values
|
9
|
+
Zero argument constructors for datastreams
|
10
|
+
Deprecated in this version:
|
11
|
+
* FileManagment
|
12
|
+
* named relationships
|
13
|
+
Removed in this version:
|
14
|
+
* ruby-fedora
|
15
|
+
* MetadataDatastream
|
16
|
+
* methods: .field, .add, .to_xml, .file_streams, .new_object=
|
17
|
+
# rcov dependency
|
5
18
|
|
6
19
|
4.5.1
|
7
20
|
Removes .rvmrc and Gemfile.lock from version control (devs should deal with these themselves)
|
data/README.textile
CHANGED
@@ -17,6 +17,12 @@ h2. Getting Started
|
|
17
17
|
|
18
18
|
The "ActiveFedora Console Tour":https://github.com/projecthydra/active_fedora/wiki/Getting-Started:-Console-Tour gives you a brief tour through ActiveFedora's features on the command line.
|
19
19
|
|
20
|
+
h2. Generators
|
21
|
+
|
22
|
+
You can generate a model inheriting from ActiveFedora::Base.
|
23
|
+
|
24
|
+
<pre>rails generate active_fedora:model Book</pre>
|
25
|
+
|
20
26
|
h2. Testing (this Gem)
|
21
27
|
|
22
28
|
In order to run the RSpec tests, you need to have a copy of the ActiveFedora source code, and then run bundle install in the source directory.
|
data/active-fedora.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency("activesupport", '>= 3.0.0')
|
23
23
|
s.add_dependency("builder", '~> 3.0.0')
|
24
24
|
s.add_dependency("mediashelf-loggable")
|
25
|
-
s.add_dependency("rubydora", '~>0.
|
25
|
+
s.add_dependency("rubydora", '~>0.8.0')
|
26
26
|
s.add_dependency("rdf")
|
27
27
|
s.add_dependency("rdf-rdfxml", '~>0.3.8')
|
28
28
|
s.add_dependency("deprecation")
|
data/lib/active_fedora.rb
CHANGED
@@ -19,6 +19,7 @@ module ActiveFedora #:nodoc:
|
|
19
19
|
class ConfigurationError < RuntimeError; end # :nodoc:
|
20
20
|
class AssociationTypeMismatch < RuntimeError; end # :nodoc:
|
21
21
|
class UnregisteredPredicateError < RuntimeError; end # :nodoc:
|
22
|
+
class RecordNotSaved < RuntimeError; end # :nodoc:
|
22
23
|
|
23
24
|
|
24
25
|
eager_autoload do
|
@@ -153,3 +154,4 @@ end
|
|
153
154
|
load File.join(File.dirname(__FILE__),"tasks/active_fedora.rake") if defined?(Rake)
|
154
155
|
I18n.load_path << File.dirname(__FILE__) + '/active_fedora/locale/en.yml'
|
155
156
|
|
157
|
+
require 'active_fedora/railtie' if defined?(Rails)
|
@@ -77,8 +77,8 @@ module ActiveFedora
|
|
77
77
|
reflection = create_belongs_to_reflection(association_id, options)
|
78
78
|
|
79
79
|
association_accessor_methods(reflection, BelongsToAssociation)
|
80
|
-
|
81
|
-
|
80
|
+
association_constructor_method(:build, reflection, BelongsToAssociation)
|
81
|
+
association_constructor_method(:create, reflection, BelongsToAssociation)
|
82
82
|
#configure_dependency_for_belongs_to(reflection)
|
83
83
|
end
|
84
84
|
|
@@ -157,6 +157,7 @@ module ActiveFedora
|
|
157
157
|
|
158
158
|
def create_has_many_reflection(association_id, options)
|
159
159
|
create_reflection(:has_many, association_id, options, self)
|
160
|
+
#collection_accessor_methods(reflection, HasManyAssociation)
|
160
161
|
end
|
161
162
|
|
162
163
|
def create_belongs_to_reflection(association_id, options)
|
@@ -266,6 +267,25 @@ module ActiveFedora
|
|
266
267
|
end
|
267
268
|
end
|
268
269
|
end
|
270
|
+
|
271
|
+
def association_constructor_method(constructor, reflection, association_proxy_class)
|
272
|
+
redefine_method("#{constructor}_#{reflection.name}") do |*params|
|
273
|
+
attributees = params.first unless params.empty?
|
274
|
+
replace_existing = params[1].nil? ? true : params[1]
|
275
|
+
association = association_instance_get(reflection.name)
|
276
|
+
|
277
|
+
unless association
|
278
|
+
association = association_proxy_class.new(self, reflection)
|
279
|
+
association_instance_set(reflection.name, association)
|
280
|
+
end
|
281
|
+
|
282
|
+
# if association_proxy_class == HasOneAssociation
|
283
|
+
# association.send(constructor, attributees, replace_existing)
|
284
|
+
# else
|
285
|
+
association.send(constructor, attributees)
|
286
|
+
#end
|
287
|
+
end
|
288
|
+
end
|
269
289
|
end
|
270
290
|
end
|
271
291
|
end
|
@@ -97,6 +97,24 @@ module ActiveFedora
|
|
97
97
|
_records.each { |record| @target.delete(record) }
|
98
98
|
end
|
99
99
|
end
|
100
|
+
|
101
|
+
def create(attrs = {})
|
102
|
+
if attrs.is_a?(Array)
|
103
|
+
attrs.collect { |attr| create(attr) }
|
104
|
+
else
|
105
|
+
create_record(attrs) do |record|
|
106
|
+
yield(record) if block_given?
|
107
|
+
record.save
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def create!(attrs = {})
|
113
|
+
create_record(attrs) do |record|
|
114
|
+
yield(record) if block_given?
|
115
|
+
record.save!
|
116
|
+
end
|
117
|
+
end
|
100
118
|
|
101
119
|
|
102
120
|
def load_target
|
@@ -167,6 +185,19 @@ module ActiveFedora
|
|
167
185
|
|
168
186
|
|
169
187
|
private
|
188
|
+
def create_record(attrs)
|
189
|
+
attrs.update(@reflection.options[:conditions]) if @reflection.options[:conditions].is_a?(Hash)
|
190
|
+
ensure_owner_is_not_new
|
191
|
+
record = @reflection.klass.create do
|
192
|
+
@reflection.build_association(attrs)
|
193
|
+
end
|
194
|
+
set_belongs_to_association_for(record)
|
195
|
+
if block_given?
|
196
|
+
add_record_to_target_with_callbacks(record) { |*block_args| yield(*block_args) }
|
197
|
+
else
|
198
|
+
add_record_to_target_with_callbacks(record)
|
199
|
+
end
|
200
|
+
end
|
170
201
|
|
171
202
|
def build_record(attrs)
|
172
203
|
#attrs.update(@reflection.options[:conditions]) if @reflection.options[:conditions].is_a?(Hash)
|
@@ -187,6 +218,12 @@ module ActiveFedora
|
|
187
218
|
yield(records, old_records)
|
188
219
|
#records.each { |record| callback(:after_remove, record) }
|
189
220
|
end
|
221
|
+
|
222
|
+
def ensure_owner_is_not_new
|
223
|
+
if @owner.new_record?
|
224
|
+
raise ActiveFedora::RecordNotSaved, "You cannot call create unless the parent is saved"
|
225
|
+
end
|
226
|
+
end
|
190
227
|
|
191
228
|
end
|
192
229
|
end
|
@@ -2,6 +2,14 @@ module ActiveFedora
|
|
2
2
|
module Associations
|
3
3
|
class BelongsToAssociation < AssociationProxy #:nodoc:
|
4
4
|
|
5
|
+
def create(attributes = {})
|
6
|
+
replace(@reflection.create_association(attributes))
|
7
|
+
end
|
8
|
+
|
9
|
+
def build(attributes = {})
|
10
|
+
replace(@reflection.build_association(attributes))
|
11
|
+
end
|
12
|
+
|
5
13
|
def replace(record)
|
6
14
|
if record.nil?
|
7
15
|
@owner.clear_relationship(@reflection.options[:property])
|
data/lib/active_fedora/base.rb
CHANGED
@@ -42,6 +42,10 @@ module ActiveFedora
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
def new?
|
46
|
+
new_object?
|
47
|
+
end
|
48
|
+
|
45
49
|
# Has this object been saved?
|
46
50
|
def new_object?
|
47
51
|
inner_object.new?
|
@@ -73,6 +77,10 @@ module ActiveFedora
|
|
73
77
|
run_callbacks :initialize
|
74
78
|
end
|
75
79
|
|
80
|
+
# Reloads the object from Fedora.
|
81
|
+
def reload
|
82
|
+
init_with(self.class.find(self.pid).inner_object)
|
83
|
+
end
|
76
84
|
|
77
85
|
# Initialize an empty model object and set the +inner_obj+
|
78
86
|
# example:
|
@@ -91,7 +99,7 @@ module ActiveFedora
|
|
91
99
|
## Replace existing unchanged datastreams with the definitions found in this class if they have a different type.
|
92
100
|
## Any datastream that is deleted here will cause a reload from fedora, so avoid it whenever possible
|
93
101
|
ds_specs.keys.each do |key|
|
94
|
-
if !@inner_object.datastreams[key].
|
102
|
+
if !@inner_object.datastreams[key].content_changed? && @inner_object.datastreams[key].class != self.class.ds_specs[key][:type]
|
95
103
|
@inner_object.datastreams.delete(key)
|
96
104
|
end
|
97
105
|
end
|
@@ -137,10 +145,37 @@ module ActiveFedora
|
|
137
145
|
ds_specs[dsid] ? ds_specs[dsid].fetch(:type, ActiveFedora::Datastream) : ActiveFedora::Datastream
|
138
146
|
end
|
139
147
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
148
|
+
# Creates an object (or multiple objects) and saves it to the repository, if validations pass.
|
149
|
+
# The resulting object is returned whether the object was saved successfully to the repository or not.
|
150
|
+
#
|
151
|
+
# The +attributes+ parameter can be either be a Hash or an Array of Hashes. These Hashes describe the
|
152
|
+
# attributes on the objects that are to be created.
|
153
|
+
#
|
154
|
+
# ==== Examples
|
155
|
+
# # Create a single new object
|
156
|
+
# User.create(:first_name => 'Jamie')
|
157
|
+
#
|
158
|
+
# # Create an Array of new objects
|
159
|
+
# User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }])
|
160
|
+
#
|
161
|
+
# # Create a single object and pass it into a block to set other attributes.
|
162
|
+
# User.create(:first_name => 'Jamie') do |u|
|
163
|
+
# u.is_admin = false
|
164
|
+
# end
|
165
|
+
#
|
166
|
+
# # Creating an Array of new objects using a block, where the block is executed for each object:
|
167
|
+
# User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u|
|
168
|
+
# u.is_admin = false
|
169
|
+
# end
|
170
|
+
def self.create(attributes = nil, &block)
|
171
|
+
if attributes.is_a?(Array)
|
172
|
+
attributes.collect { |attr| create(attr, &block) }
|
173
|
+
else
|
174
|
+
object = new(attributes)
|
175
|
+
yield(object) if block_given?
|
176
|
+
object.save
|
177
|
+
object
|
178
|
+
end
|
144
179
|
end
|
145
180
|
|
146
181
|
def clone
|
@@ -248,7 +283,9 @@ module ActiveFedora
|
|
248
283
|
comparison_object.pid == pid &&
|
249
284
|
!comparison_object.new_record?)
|
250
285
|
end
|
251
|
-
|
286
|
+
|
287
|
+
|
288
|
+
|
252
289
|
def inspect
|
253
290
|
"#<#{self.class}:#{self.hash} @pid=\"#{pid}\" >"
|
254
291
|
end
|
@@ -2,32 +2,18 @@ module ActiveFedora
|
|
2
2
|
|
3
3
|
#This class represents a Fedora datastream
|
4
4
|
class Datastream < Rubydora::Datastream
|
5
|
-
|
5
|
+
extend Deprecation
|
6
6
|
attr_writer :digital_object
|
7
7
|
attr_accessor :last_modified, :fields
|
8
|
-
before_create :add_mime_type, :add_ds_location, :validate_content_present
|
9
8
|
|
10
9
|
def initialize(digital_object=nil, dsid=nil, options={})
|
11
10
|
## When you use the versions feature of rubydora (0.5.x), you need to have a 3 argument constructor
|
12
11
|
self.fields={}
|
13
12
|
super
|
14
13
|
end
|
15
|
-
|
16
|
-
def size
|
17
|
-
self.profile['dsSize']
|
18
|
-
end
|
19
|
-
|
20
|
-
def add_mime_type
|
21
|
-
self.mimeType = 'text/xml' unless self.mimeType
|
22
|
-
end
|
23
|
-
|
24
|
-
def add_ds_location
|
25
|
-
if self.controlGroup == 'E'
|
26
|
-
end
|
27
|
-
end
|
28
14
|
|
29
15
|
def inspect
|
30
|
-
"#<#{self.class}:#{self.hash} @pid=\"#{digital_object ? pid : nil}\" @dsid=\"#{dsid}\" @controlGroup=\"#{controlGroup}\"
|
16
|
+
"#<#{self.class}:#{self.hash} @pid=\"#{digital_object ? pid : nil}\" @dsid=\"#{dsid}\" @controlGroup=\"#{controlGroup}\" changed=\"#{changed?}\" @mimeType=\"#{mimeType}\" >"
|
31
17
|
end
|
32
18
|
|
33
19
|
#compatibility method for rails' url generators. This method will
|
@@ -42,6 +28,7 @@ module ActiveFedora
|
|
42
28
|
def dirty?
|
43
29
|
changed?
|
44
30
|
end
|
31
|
+
deprecation_deprecate :dirty?
|
45
32
|
|
46
33
|
# @abstract Override this in your concrete datastream class.
|
47
34
|
# @return [boolean] does this datastream contain metadata (not file data)
|
@@ -53,49 +40,37 @@ module ActiveFedora
|
|
53
40
|
def dirty
|
54
41
|
changed?
|
55
42
|
end
|
43
|
+
deprecation_deprecate :dirty
|
56
44
|
|
57
45
|
# Deprecated
|
58
46
|
def dirty=(value)
|
59
47
|
if value
|
60
|
-
|
48
|
+
content_will_change! # an innocent hack to pretend something has changed
|
61
49
|
else
|
62
50
|
changed_attributes.clear
|
63
51
|
end
|
64
52
|
end
|
53
|
+
deprecation_deprecate :dirty=
|
65
54
|
|
66
55
|
def new_object?
|
67
56
|
new?
|
68
57
|
end
|
58
|
+
deprecation_deprecate :new_object?
|
69
59
|
|
70
60
|
def validate_content_present
|
71
|
-
|
72
|
-
when 'X','M'
|
73
|
-
@content.present?
|
74
|
-
when 'E','R'
|
75
|
-
dsLocation.present?
|
76
|
-
else
|
77
|
-
raise "Invalid control group: #{controlGroup.inspect}"
|
78
|
-
end
|
61
|
+
has_content?
|
79
62
|
end
|
80
63
|
|
81
64
|
def save
|
82
|
-
|
83
|
-
|
84
|
-
repository.modify_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
|
85
|
-
reset_profile_attributes
|
86
|
-
self
|
87
|
-
end
|
65
|
+
super
|
66
|
+
self
|
88
67
|
end
|
89
68
|
|
90
69
|
def create
|
91
|
-
|
92
|
-
|
93
|
-
reset_profile_attributes
|
94
|
-
self
|
95
|
-
end
|
70
|
+
super
|
71
|
+
self
|
96
72
|
end
|
97
73
|
|
98
|
-
|
99
74
|
# serializes any changed data into the content field
|
100
75
|
def serialize!
|
101
76
|
end
|
@@ -103,6 +78,7 @@ module ActiveFedora
|
|
103
78
|
# @param [ActiveFedora::Datastream] tmpl the Datastream object that you are building
|
104
79
|
# @param [Nokogiri::XML::Node] node the "foxml:datastream" node from a FOXML file
|
105
80
|
def self.from_xml(tmpl, node)
|
81
|
+
Deprecation.deprecated_method_warning(self, :from_xml)
|
106
82
|
tmpl.controlGroup= node['CONTROL_GROUP']
|
107
83
|
tmpl
|
108
84
|
end
|
@@ -21,10 +21,6 @@ module ActiveFedora
|
|
21
21
|
|
22
22
|
def serialize_datastreams
|
23
23
|
datastreams.each {|k, ds| ds.serialize! }
|
24
|
-
self.metadata_is_dirty = datastreams.any? do |k,ds|
|
25
|
-
ds.changed? && ds.metadata?
|
26
|
-
end
|
27
|
-
true
|
28
24
|
end
|
29
25
|
|
30
26
|
# Adds the disseminator location to the datastream after the pid has been established
|
@@ -225,7 +221,7 @@ module ActiveFedora
|
|
225
221
|
# @option args [Boolean] :versionable Should versioned datastreams be stored
|
226
222
|
# @yield block executed by some kinds of datastreams
|
227
223
|
def has_metadata(args, &block)
|
228
|
-
spec = {:autocreate => args.fetch(:autocreate,
|
224
|
+
spec = {:autocreate => args.fetch(:autocreate, false), :type => args[:type], :label => args.fetch(:label,""), :control_group => args[:control_group], :disseminator => args.fetch(:disseminator,""), :url => args.fetch(:url,""),:block => block}
|
229
225
|
spec[:versionable] = args[:versionable] if args.has_key? :versionable
|
230
226
|
ds_specs[args[:name]]= spec
|
231
227
|
end
|
@@ -240,7 +236,7 @@ module ActiveFedora
|
|
240
236
|
# @option args [Boolean] :autocreate Always create this datastream on new objects
|
241
237
|
# @option args [Boolean] :versionable Should versioned datastreams be stored
|
242
238
|
def has_file_datastream(args = {})
|
243
|
-
spec = {:autocreate => args.fetch(:autocreate,
|
239
|
+
spec = {:autocreate => args.fetch(:autocreate, false), :type => args.fetch(:type,ActiveFedora::Datastream),
|
244
240
|
:label => args.fetch(:label,"File Datastream"), :control_group => args.fetch(:control_group,"M")}
|
245
241
|
spec[:versionable] = args[:versionable] if args.has_key? :versionable
|
246
242
|
ds_specs[args.fetch(:name, "content")]= spec
|
@@ -33,9 +33,16 @@ module ActiveFedora
|
|
33
33
|
def self.find(original_class, pid)
|
34
34
|
conn = original_class.connection_for_pid(pid)
|
35
35
|
obj = Deprecation.silence(Rubydora::DigitalObject) do
|
36
|
-
|
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
|
37
42
|
end
|
38
43
|
obj.original_class = original_class
|
44
|
+
# PID is not found, but was "well-formed" for its Fedora request. So
|
45
|
+
# an object is instantiated with that PID.
|
39
46
|
raise ActiveFedora::ObjectNotFoundError, "Unable to find '#{pid}' in fedora" if obj.new?
|
40
47
|
obj
|
41
48
|
end
|
@@ -6,14 +6,18 @@ require "solrizer/xml"
|
|
6
6
|
module ActiveFedora
|
7
7
|
class NokogiriDatastream < Datastream
|
8
8
|
|
9
|
-
|
9
|
+
before_save do
|
10
|
+
return unless xml_loaded
|
11
|
+
content_will_change! if ng_xml_changed?
|
12
|
+
end
|
13
|
+
|
10
14
|
include OM::XML::Document
|
11
15
|
include Solrizer::XML::TerminologyBasedSolrizer # this adds support for calling .to_solr
|
12
16
|
|
13
17
|
alias_method(:om_term_values, :term_values) unless method_defined?(:om_term_values)
|
14
18
|
alias_method(:om_update_values, :update_values) unless method_defined?(:om_update_values)
|
15
19
|
|
16
|
-
attr_accessor :internal_solr_doc
|
20
|
+
attr_accessor :internal_solr_doc, :xml_loaded
|
17
21
|
|
18
22
|
def self.default_attributes
|
19
23
|
super.merge(:controlGroup => 'X', :mimeType => 'text/xml')
|
@@ -32,8 +36,10 @@ module ActiveFedora
|
|
32
36
|
tmpl.ng_xml = xml
|
33
37
|
else
|
34
38
|
tmpl.ng_xml = Nokogiri::XML::Document.parse(xml)
|
35
|
-
end
|
36
|
-
|
39
|
+
end
|
40
|
+
|
41
|
+
tmpl.ng_xml_doesnt_change!
|
42
|
+
|
37
43
|
return tmpl
|
38
44
|
end
|
39
45
|
|
@@ -49,34 +55,59 @@ module ActiveFedora
|
|
49
55
|
## Load up the template
|
50
56
|
self.class.xml_template
|
51
57
|
else
|
52
|
-
Nokogiri::XML::Document.parse(
|
58
|
+
Nokogiri::XML::Document.parse(datastream_content)
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
56
62
|
|
57
63
|
def ng_xml=(new_xml)
|
58
|
-
|
59
|
-
|
60
|
-
case new_xml
|
64
|
+
|
65
|
+
nokogiri_document = case new_xml
|
61
66
|
when Nokogiri::XML::Document
|
62
|
-
|
67
|
+
new_xml
|
63
68
|
when Nokogiri::XML::Node
|
64
|
-
|
69
|
+
Nokogiri::XML(new_xml.to_s) ## Cast a fragment to a document
|
65
70
|
when String
|
66
|
-
|
71
|
+
Nokogiri::XML::Document.parse(new_xml)
|
67
72
|
else
|
68
73
|
raise TypeError, "You passed a #{new_xml.class} into the ng_xml of the #{self.dsid} datastream. NokogiriDatastream.ng_xml= only accepts Nokogiri::XML::Document, Nokogiri::XML::Element, Nokogiri::XML::Node, or raw XML (String) as inputs."
|
69
74
|
end
|
75
|
+
|
76
|
+
|
77
|
+
new_xml_string = nokogiri_document.to_xml {|config| config.no_declaration}
|
78
|
+
|
79
|
+
ng_xml_will_change! unless (xml_loaded && (new_xml_string.to_s.strip == datastream_content.strip))
|
80
|
+
self.xml_loaded=true
|
81
|
+
|
82
|
+
@ng_xml = nokogiri_document
|
83
|
+
|
70
84
|
end
|
71
85
|
|
72
86
|
# don't want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
|
73
87
|
def ng_xml_will_change!
|
74
88
|
changed_attributes['ng_xml'] = nil
|
75
89
|
end
|
90
|
+
|
91
|
+
def ng_xml_doesnt_change!
|
92
|
+
changed_attributes.delete('ng_xml')
|
93
|
+
end
|
76
94
|
|
77
95
|
# don't want content eagerly loaded by proxy, so implementing methods that would be implemented by define_attribute_methods
|
78
96
|
def ng_xml_changed?
|
79
|
-
changed_attributes.has_key? 'ng_xml'
|
97
|
+
changed_attributes.has_key? 'ng_xml' ||
|
98
|
+
(xml_loaded && (to_xml != datastream_content) )
|
99
|
+
end
|
100
|
+
|
101
|
+
def changed?
|
102
|
+
ng_xml_changed? || super
|
103
|
+
end
|
104
|
+
|
105
|
+
def content_changed?
|
106
|
+
ng_xml_changed? || super
|
107
|
+
end
|
108
|
+
|
109
|
+
def has_content?
|
110
|
+
xml_loaded || super
|
80
111
|
end
|
81
112
|
|
82
113
|
# Indicates that this datastream has metadata content.
|
@@ -84,13 +115,21 @@ module ActiveFedora
|
|
84
115
|
def metadata?
|
85
116
|
true
|
86
117
|
end
|
87
|
-
|
118
|
+
|
88
119
|
def content=(content)
|
89
|
-
|
120
|
+
content_will_change! unless (xml_loaded && (content == datastream_content))
|
121
|
+
@content = content
|
90
122
|
self.xml_loaded=true
|
91
|
-
|
123
|
+
self.ng_xml = Nokogiri::XML::Document.parse(datastream_content)
|
124
|
+
end
|
125
|
+
|
126
|
+
alias :datastream_content :content
|
127
|
+
|
128
|
+
def content
|
129
|
+
return to_xml if xml_loaded or new?
|
130
|
+
|
131
|
+
datastream_content
|
92
132
|
end
|
93
|
-
|
94
133
|
|
95
134
|
def to_xml(xml = nil)
|
96
135
|
xml = self.ng_xml if xml.nil?
|