active-fedora 2.3.8 → 3.0.0
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.
- data/.rvmrc +1 -1
- data/Gemfile.lock +16 -10
- data/History.txt +4 -5
- data/README.textile +1 -1
- data/active-fedora.gemspec +2 -2
- data/lib/active_fedora.rb +36 -19
- data/lib/active_fedora/associations.rb +157 -0
- data/lib/active_fedora/associations/association_collection.rb +180 -0
- data/lib/active_fedora/associations/association_proxy.rb +177 -0
- data/lib/active_fedora/associations/belongs_to_association.rb +36 -0
- data/lib/active_fedora/associations/has_many_association.rb +52 -0
- data/lib/active_fedora/attribute_methods.rb +8 -0
- data/lib/active_fedora/base.rb +76 -80
- data/lib/active_fedora/datastream.rb +0 -1
- data/lib/active_fedora/delegating.rb +53 -0
- data/lib/active_fedora/model.rb +4 -2
- data/lib/active_fedora/nested_attributes.rb +153 -0
- data/lib/active_fedora/nokogiri_datastream.rb +17 -18
- data/lib/active_fedora/reflection.rb +140 -0
- data/lib/active_fedora/relationships_helper.rb +10 -5
- data/lib/active_fedora/semantic_node.rb +146 -57
- data/lib/active_fedora/solr_service.rb +0 -7
- data/lib/active_fedora/version.rb +1 -1
- data/lib/fedora/connection.rb +75 -111
- data/lib/fedora/repository.rb +14 -28
- data/lib/ruby-fedora.rb +1 -1
- data/spec/integration/associations_spec.rb +139 -0
- data/spec/integration/nested_attribute_spec.rb +40 -0
- data/spec/integration/repository_spec.rb +9 -14
- data/spec/integration/semantic_node_spec.rb +2 -0
- data/spec/spec_helper.rb +1 -3
- data/spec/unit/active_fedora_spec.rb +2 -1
- data/spec/unit/association_proxy_spec.rb +13 -0
- data/spec/unit/base_active_model_spec.rb +61 -0
- data/spec/unit/base_delegate_spec.rb +59 -0
- data/spec/unit/base_spec.rb +45 -58
- data/spec/unit/connection_spec.rb +21 -21
- data/spec/unit/datastream_spec.rb +0 -11
- data/spec/unit/has_many_collection_spec.rb +27 -0
- data/spec/unit/model_spec.rb +1 -1
- data/spec/unit/nokogiri_datastream_spec.rb +3 -29
- data/spec/unit/repository_spec.rb +2 -2
- data/spec/unit/semantic_node_spec.rb +2 -0
- data/spec/unit/solr_service_spec.rb +0 -7
- metadata +36 -15
- data/lib/active_fedora/active_fedora_configuration_exception.rb +0 -2
- data/lib/util/class_level_inheritable_attributes.rb +0 -23
@@ -0,0 +1,177 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
module Associations
|
3
|
+
# This is the root class of all association proxies:
|
4
|
+
#
|
5
|
+
# AssociationProxy
|
6
|
+
# BelongsToAssociation
|
7
|
+
# AssociationCollection
|
8
|
+
# HasManyAssociation
|
9
|
+
#
|
10
|
+
# Association proxies in Active Fedora are middlemen between the object that
|
11
|
+
# holds the association, known as the <tt>@owner</tt>, and the actual associated
|
12
|
+
# object, known as the <tt>@target</tt>. The kind of association any proxy is
|
13
|
+
# about is available in <tt>@reflection</tt>. That's an instance of the class
|
14
|
+
# ActiveFedora::Reflection::AssociationReflection.
|
15
|
+
#
|
16
|
+
# For example, given
|
17
|
+
#
|
18
|
+
# class Blog < ActiveFedora::Base
|
19
|
+
# has_many :posts
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# blog = Blog.find('changeme:123')
|
23
|
+
#
|
24
|
+
# the association proxy in <tt>blog.posts</tt> has the object in +blog+ as
|
25
|
+
# <tt>@owner</tt>, the collection of its posts as <tt>@target</tt>, and
|
26
|
+
# the <tt>@reflection</tt> object represents a <tt>:has_many</tt> macro.
|
27
|
+
#
|
28
|
+
# This class has most of the basic instance methods removed, and delegates
|
29
|
+
# unknown methods to <tt>@target</tt> via <tt>method_missing</tt>. As a
|
30
|
+
# corner case, it even removes the +class+ method and that's why you get
|
31
|
+
#
|
32
|
+
# blog.posts.class # => Array
|
33
|
+
#
|
34
|
+
# though the object behind <tt>blog.posts</tt> is not an Array, but an
|
35
|
+
# ActiveFedora::Associations::HasManyAssociation.
|
36
|
+
|
37
|
+
class AssociationProxy
|
38
|
+
delegate :to_param, :to=>:target
|
39
|
+
|
40
|
+
def initialize(owner, reflection)
|
41
|
+
@owner, @reflection = owner, reflection
|
42
|
+
@updated = false
|
43
|
+
# reflection.check_validity!
|
44
|
+
# Array.wrap(reflection.options[:extend]).each { |ext| proxy_extend(ext) }
|
45
|
+
reset
|
46
|
+
end
|
47
|
+
|
48
|
+
# Resets the \loaded flag to +false+ and sets the \target to +nil+.
|
49
|
+
def reset
|
50
|
+
@loaded = false
|
51
|
+
@target = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
# Reloads the \target and returns +self+ on success.
|
55
|
+
def reload
|
56
|
+
reset
|
57
|
+
load_target
|
58
|
+
self unless @target.nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
# Has the \target been already \loaded?
|
62
|
+
def loaded?
|
63
|
+
@loaded
|
64
|
+
end
|
65
|
+
|
66
|
+
# Asserts the \target has been loaded setting the \loaded flag to +true+.
|
67
|
+
def loaded
|
68
|
+
@loaded = true
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns the target of this proxy, same as +proxy_target+.
|
72
|
+
def target
|
73
|
+
@target
|
74
|
+
end
|
75
|
+
|
76
|
+
# Sets the target of this proxy to <tt>\target</tt>, and the \loaded flag to +true+.
|
77
|
+
def target=(target)
|
78
|
+
@target = target
|
79
|
+
loaded
|
80
|
+
end
|
81
|
+
|
82
|
+
# # Forwards the call to the target. Loads the \target if needed.
|
83
|
+
# def inspect
|
84
|
+
# load_target
|
85
|
+
# @target.inspect
|
86
|
+
# end
|
87
|
+
|
88
|
+
protected
|
89
|
+
|
90
|
+
|
91
|
+
# Assigns the ID of the owner to the corresponding foreign key in +record+.
|
92
|
+
# If the association is polymorphic the type of the owner is also set.
|
93
|
+
def set_belongs_to_association_for(record)
|
94
|
+
unless @owner.new_record?
|
95
|
+
record.add_relationship(@reflection.options[:property], @owner)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
private
|
101
|
+
def method_missing(method, *args)
|
102
|
+
if load_target
|
103
|
+
unless @target.respond_to?(method)
|
104
|
+
message = "undefined method `#{method.to_s}' for \"#{@target}\":#{@target.class.to_s}"
|
105
|
+
raise NoMethodError, message
|
106
|
+
end
|
107
|
+
|
108
|
+
if block_given?
|
109
|
+
@target.send(method, *args) { |*block_args| yield(*block_args) }
|
110
|
+
else
|
111
|
+
@target.send(method, *args)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
# Loads the \target if needed and returns it.
|
118
|
+
#
|
119
|
+
# This method is abstract in the sense that it relies on +find_target+,
|
120
|
+
# which is expected to be provided by descendants.
|
121
|
+
#
|
122
|
+
# If the \target is already \loaded it is just returned. Thus, you can call
|
123
|
+
# +load_target+ unconditionally to get the \target.
|
124
|
+
#
|
125
|
+
# ActiveFedora::RecordNotFound is rescued within the method, and it is
|
126
|
+
# not reraised. The proxy is \reset and +nil+ is the return value.
|
127
|
+
def load_target
|
128
|
+
return nil unless defined?(@loaded)
|
129
|
+
|
130
|
+
if !loaded? and (!@owner.new_record? || foreign_key_present)
|
131
|
+
@target = find_target
|
132
|
+
end
|
133
|
+
|
134
|
+
if @target.nil?
|
135
|
+
reset
|
136
|
+
else
|
137
|
+
@loaded = true
|
138
|
+
@target
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# Can be overwritten by associations that might have the foreign key
|
143
|
+
# available for an association without having the object itself (and
|
144
|
+
# still being a new record). Currently, only +belongs_to+ presents
|
145
|
+
# this scenario.
|
146
|
+
def foreign_key_present
|
147
|
+
false
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
# Raises ActiveFedora::AssociationTypeMismatch unless +record+ is of
|
153
|
+
# the kind of the class of the associated objects. Meant to be used as
|
154
|
+
# a sanity check when you are about to assign an associated record.
|
155
|
+
def raise_on_type_mismatch(record)
|
156
|
+
unless record.is_a?(@reflection.klass) || record.is_a?(@reflection.class_name.constantize)
|
157
|
+
message = "#{@reflection.class_name}(##{@reflection.klass.object_id}) expected, got #{record.class}(##{record.class.object_id})"
|
158
|
+
raise ActiveFedora::AssociationTypeMismatch, message
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
if RUBY_VERSION < '1.9.2'
|
164
|
+
# Array#flatten has problems with recursive arrays before Ruby 1.9.2.
|
165
|
+
# Going one level deeper solves the majority of the problems.
|
166
|
+
def flatten_deeper(array)
|
167
|
+
array.collect { |element| (element.respond_to?(:flatten) && !element.is_a?(Hash)) ? element.flatten : element }.flatten
|
168
|
+
end
|
169
|
+
else
|
170
|
+
def flatten_deeper(array)
|
171
|
+
array.flatten
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
module Associations
|
3
|
+
class BelongsToAssociation < AssociationProxy #:nodoc:
|
4
|
+
def replace(record)
|
5
|
+
if record.nil?
|
6
|
+
### TODO a more efficient way of doing this would be to write a clear_relationship method
|
7
|
+
old_record = find_target
|
8
|
+
@owner.remove_relationship(@reflection.options[:property], old_record) unless old_record.nil?
|
9
|
+
else
|
10
|
+
raise_on_type_mismatch(record)
|
11
|
+
|
12
|
+
### TODO a more efficient way of doing this would be to write a clear_relationship method
|
13
|
+
old_record = find_target
|
14
|
+
@owner.remove_relationship(@reflection.options[:property], old_record) unless old_record.nil?
|
15
|
+
|
16
|
+
@target = (AssociationProxy === record ? record.target : record)
|
17
|
+
@owner.add_relationship(@reflection.options[:property], record) unless record.new_record?
|
18
|
+
@updated = true
|
19
|
+
end
|
20
|
+
|
21
|
+
loaded
|
22
|
+
record
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def find_target
|
27
|
+
@owner.load_outbound_relationship(@reflection.name.to_s, @reflection.options[:property]).first
|
28
|
+
end
|
29
|
+
|
30
|
+
def foreign_key_present
|
31
|
+
!@owner.send(@reflection.primary_key_name).nil?
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
module Associations
|
3
|
+
class HasManyAssociation < AssociationCollection #:nodoc:
|
4
|
+
def initialize(owner, reflection)
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
# Returns the number of records in this collection.
|
9
|
+
#
|
10
|
+
# That does not depend on whether the collection has already been loaded
|
11
|
+
# or not. The +size+ method is the one that takes the loaded flag into
|
12
|
+
# account and delegates to +count_records+ if needed.
|
13
|
+
#
|
14
|
+
# If the collection is empty the target is set to an empty array and
|
15
|
+
# the loaded flag is set to true as well.
|
16
|
+
def count_records
|
17
|
+
count = if @target
|
18
|
+
@target.size
|
19
|
+
else
|
20
|
+
0
|
21
|
+
end
|
22
|
+
|
23
|
+
# If there's nothing in the database and @target has no new records
|
24
|
+
# we are certain the current target is an empty array. This is a
|
25
|
+
# documented side-effect of the method that may avoid an extra SELECT.
|
26
|
+
@target ||= [] and loaded if count == 0
|
27
|
+
|
28
|
+
return count
|
29
|
+
end
|
30
|
+
|
31
|
+
def insert_record(record, force = false, validate = true)
|
32
|
+
set_belongs_to_association_for(record)
|
33
|
+
#force ? record.save! : record.save(:validate => validate)
|
34
|
+
record.save
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
# Deletes the records according to the <tt>:dependent</tt> option.
|
40
|
+
def delete_records(records)
|
41
|
+
records.each do |r|
|
42
|
+
r.remove_relationship(@reflection.options[:property], @owner)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/active_fedora/base.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'util/class_level_inheritable_attributes'
|
2
|
-
require 'active_fedora/model'
|
3
|
-
require 'active_fedora/semantic_node'
|
4
1
|
require "solrizer"
|
5
2
|
require 'nokogiri'
|
6
3
|
require "loggable"
|
7
|
-
|
4
|
+
|
5
|
+
#require 'active_support/core_ext/kernel/singleton_class'
|
6
|
+
#require 'active_support/core_ext/class/attribute'
|
7
|
+
require 'active_support/core_ext/class/inheritable_attributes'
|
8
|
+
#require 'active_support/inflector'
|
8
9
|
|
9
10
|
SOLR_DOCUMENT_ID = "id" unless (defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?)
|
10
11
|
ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
|
@@ -32,13 +33,11 @@ module ActiveFedora
|
|
32
33
|
# =Implementation
|
33
34
|
# This class is really a facade for a basic Fedora::FedoraObject, which is stored internally.
|
34
35
|
class Base
|
35
|
-
include
|
36
|
-
ms_inheritable_attributes :ds_specs, :class_named_datastreams_desc
|
37
|
-
include Model
|
36
|
+
include RelationshipsHelper
|
38
37
|
include SemanticNode
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
class_inheritable_accessor :ds_specs, :class_named_datastreams_desc
|
39
|
+
self.class_named_datastreams_desc = {}
|
40
|
+
self.ds_specs = {}
|
42
41
|
attr_accessor :named_datastreams_desc
|
43
42
|
|
44
43
|
|
@@ -56,7 +55,22 @@ module ActiveFedora
|
|
56
55
|
@new_object = bool
|
57
56
|
inner_object.new_object = bool
|
58
57
|
end
|
59
|
-
|
58
|
+
|
59
|
+
## Required by associations
|
60
|
+
def new_record?
|
61
|
+
self.new_object?
|
62
|
+
end
|
63
|
+
|
64
|
+
def persisted?
|
65
|
+
!new_object?
|
66
|
+
end
|
67
|
+
|
68
|
+
def attributes=(properties)
|
69
|
+
properties.each do |k, v|
|
70
|
+
respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "unknown attribute: #{k}")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
60
74
|
# Constructor. If +attrs+ does not comtain +:pid+, we assume we're making a new one,
|
61
75
|
# and call off to the Fedora Rest API for the next available Fedora pid, and mark as new object.
|
62
76
|
# Also, if +attrs+ does not contain +:pid+ but does contain +:namespace+ it will pass the
|
@@ -65,7 +79,8 @@ module ActiveFedora
|
|
65
79
|
#
|
66
80
|
# If there is a pid, we're re-hydrating an existing object, and new object is false. Once the @inner_object is stored,
|
67
81
|
# we configure any defined datastreams.
|
68
|
-
def initialize(attrs =
|
82
|
+
def initialize(attrs = nil)
|
83
|
+
attrs = {} if attrs.nil?
|
69
84
|
unless attrs[:pid]
|
70
85
|
if attrs[:namespace]
|
71
86
|
attrs = attrs.merge!({:pid=>Fedora::Repository.instance.nextid({:namespace=>attrs[:namespace]})})
|
@@ -79,6 +94,10 @@ module ActiveFedora
|
|
79
94
|
@inner_object = Fedora::FedoraObject.new(attrs)
|
80
95
|
@datastreams = {}
|
81
96
|
configure_defined_datastreams
|
97
|
+
|
98
|
+
attributes = attrs.dup
|
99
|
+
[:pid, :namespace, :new_object,:create_date, :modified_date].each { |k| attributes.delete(k)}
|
100
|
+
self.attributes=attributes
|
82
101
|
end
|
83
102
|
|
84
103
|
#This method is used to specify the details of a datastream.
|
@@ -86,18 +105,19 @@ module ActiveFedora
|
|
86
105
|
#execute the block, but stores it at the class level, to be executed
|
87
106
|
#by any future instantiations.
|
88
107
|
def self.has_metadata(args, &block)
|
89
|
-
|
90
|
-
|
108
|
+
#@ds_specs ||= Hash.new
|
109
|
+
ds_specs[args[:name]]= [args[:type], args.fetch(:label,""), block]
|
91
110
|
end
|
92
111
|
|
93
112
|
def method_missing(name, *args)
|
94
113
|
if datastreams.has_key? name.to_s
|
95
114
|
### Create and invoke a proxy method
|
96
115
|
self.class.class_eval <<-end_eval
|
97
|
-
def #{name}()
|
116
|
+
def #{name.to_s}()
|
98
117
|
datastreams["#{name.to_s}"]
|
99
118
|
end
|
100
119
|
end_eval
|
120
|
+
|
101
121
|
self.send(name)
|
102
122
|
else
|
103
123
|
super
|
@@ -123,12 +143,8 @@ module ActiveFedora
|
|
123
143
|
# Refreshes the object's info from Fedora
|
124
144
|
# Note: Currently just registers any new datastreams that have appeared in fedora
|
125
145
|
def refresh
|
126
|
-
|
127
|
-
|
128
|
-
@datastreams = datastreams_in_fedora.merge(datastreams_in_memory)
|
129
|
-
end
|
130
|
-
logger.debug "refreshing #{pid} took #{ms} ms"
|
131
|
-
@datastreams
|
146
|
+
inner_object.load_attributes_from_fedora
|
147
|
+
@datastreams = datastreams_in_fedora.merge(datastreams_in_memory)
|
132
148
|
end
|
133
149
|
|
134
150
|
#Deletes a Base object, also deletes the info indexed in Solr, and
|
@@ -713,7 +729,7 @@ module ActiveFedora
|
|
713
729
|
#
|
714
730
|
# This hash is later used when adding a named datastream such as an "audio_file" as defined above.
|
715
731
|
def self.named_datastreams_desc
|
716
|
-
|
732
|
+
self.class_named_datastreams_desc ||= {}
|
717
733
|
end
|
718
734
|
|
719
735
|
#
|
@@ -762,11 +778,16 @@ module ActiveFedora
|
|
762
778
|
def pid
|
763
779
|
@inner_object.pid
|
764
780
|
end
|
765
|
-
|
766
|
-
|
767
|
-
def
|
781
|
+
|
782
|
+
|
783
|
+
def id ### Needed for the nested form helper
|
768
784
|
self.pid
|
769
785
|
end
|
786
|
+
|
787
|
+
def to_key
|
788
|
+
persisted? ? [pid] : nil
|
789
|
+
end
|
790
|
+
|
770
791
|
#return the internal fedora URI
|
771
792
|
def internal_uri
|
772
793
|
"info:fedora/#{pid}"
|
@@ -950,50 +971,18 @@ module ActiveFedora
|
|
950
971
|
def update_index
|
951
972
|
if defined?( Solrizer::Fedora::Solrizer )
|
952
973
|
#logger.info("Trying to solrize pid: #{pid}")
|
953
|
-
|
954
|
-
|
955
|
-
solrizer.solrize( self )
|
956
|
-
end
|
957
|
-
logger.debug "solrize for #{pid} took #{ms} ms"
|
974
|
+
solrizer = Solrizer::Fedora::Solrizer.new
|
975
|
+
solrizer.solrize( self )
|
958
976
|
else
|
959
977
|
#logger.info("Trying to update solr for pid: #{pid}")
|
960
|
-
|
961
|
-
SolrService.instance.conn.update(self.to_solr)
|
962
|
-
end
|
963
|
-
logger.debug "solr update for #{pid} took #{ms} ms"
|
978
|
+
SolrService.instance.conn.update(self.to_solr)
|
964
979
|
end
|
965
980
|
end
|
966
981
|
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
# m.update_attributes(:fubar=>'baz')
|
972
|
-
#
|
973
|
-
# This will attempt to set the values for any fields named fubar in any of
|
974
|
-
# the object's datastreams. This means DS1.fubar_values and DS2.fubar_values
|
975
|
-
# are _both_ overwritten.
|
976
|
-
#
|
977
|
-
# If you want to specify which datastream(s) to update,
|
978
|
-
# use the :datastreams argument like so:
|
979
|
-
# m.update_attributes({:fubar=>'baz'}, :datastreams=>"my_ds")
|
980
|
-
# or
|
981
|
-
# m.update_attributes({:fubar=>'baz'}, :datastreams=>["my_ds", "my_other_ds"])
|
982
|
-
def update_attributes(params={}, opts={})
|
983
|
-
result = {}
|
984
|
-
if opts[:datastreams]
|
985
|
-
ds_array = []
|
986
|
-
opts[:datastreams].each do |dsname|
|
987
|
-
ds_array << datastreams[dsname]
|
988
|
-
end
|
989
|
-
else
|
990
|
-
ds_array = metadata_streams
|
991
|
-
end
|
992
|
-
ds_array.each do |d|
|
993
|
-
ds_result = d.update_attributes(params,opts)
|
994
|
-
result[d.dsid] = ds_result
|
995
|
-
end
|
996
|
-
return result
|
982
|
+
|
983
|
+
def update_attributes(properties)
|
984
|
+
self.attributes=properties
|
985
|
+
save
|
997
986
|
end
|
998
987
|
|
999
988
|
# A convenience method for updating indexed attributes. The passed in hash
|
@@ -1101,25 +1090,32 @@ module ActiveFedora
|
|
1101
1090
|
|
1102
1091
|
# Pushes the object and all of its new or dirty datastreams into Fedora
|
1103
1092
|
def update
|
1104
|
-
result =
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
@metadata_is_dirty = true
|
1114
|
-
end
|
1115
|
-
result = ds.save
|
1116
|
-
end
|
1117
|
-
end
|
1118
|
-
refresh
|
1093
|
+
result = Fedora::Repository.instance.save(@inner_object)
|
1094
|
+
datastreams_in_memory.each do |k,ds|
|
1095
|
+
if ds.dirty? || ds.new_object?
|
1096
|
+
if ds.class.included_modules.include?(ActiveFedora::MetadataDatastreamHelper) || ds.instance_of?(ActiveFedora::RelsExtDatastream)
|
1097
|
+
# if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream) || ds.instance_of?(ActiveFedora::RelsExtDatastream)
|
1098
|
+
@metadata_is_dirty = true
|
1099
|
+
end
|
1100
|
+
result = ds.save
|
1101
|
+
end
|
1119
1102
|
end
|
1120
|
-
|
1103
|
+
refresh
|
1121
1104
|
return result
|
1122
1105
|
end
|
1123
1106
|
|
1124
1107
|
end
|
1108
|
+
|
1109
|
+
Base.class_eval do
|
1110
|
+
include Model
|
1111
|
+
include Solrizer::FieldNameMapper
|
1112
|
+
include Loggable
|
1113
|
+
include ActiveModel::Conversion
|
1114
|
+
extend ActiveModel::Naming
|
1115
|
+
include Delegating
|
1116
|
+
include Associations
|
1117
|
+
include NestedAttributes
|
1118
|
+
include Reflection
|
1119
|
+
end
|
1120
|
+
|
1125
1121
|
end
|