active-fedora 3.1.6 → 3.2.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +22 -22
- data/History.txt +9 -3
- data/active-fedora.gemspec +3 -3
- data/config/predicate_mappings.yml +1 -0
- data/config/service_mappings.yml +9 -0
- data/lib/active_fedora.rb +7 -1
- data/lib/active_fedora/base.rb +84 -30
- data/lib/active_fedora/datastream.rb +4 -1
- data/lib/active_fedora/datastream_collections.rb +304 -293
- data/lib/active_fedora/metadata_datastream.rb +2 -24
- data/lib/active_fedora/metadata_datastream_helper.rb +32 -5
- data/lib/active_fedora/named_relationships.rb +95 -0
- data/lib/active_fedora/nested_attributes.rb +1 -1
- data/lib/active_fedora/predicates.rb +76 -0
- data/lib/active_fedora/reflection.rb +9 -1
- data/lib/active_fedora/relationship.rb +1 -0
- data/lib/active_fedora/relationship_graph.rb +152 -0
- data/lib/active_fedora/relationships_helper.rb +32 -41
- data/lib/active_fedora/rels_ext_datastream.rb +3 -10
- data/lib/active_fedora/semantic_node.rb +47 -203
- data/lib/active_fedora/service_definitions.rb +89 -0
- data/lib/active_fedora/unsaved_digital_object.rb +40 -0
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/base_spec.rb +106 -309
- data/spec/integration/datastream_collections_spec.rb +135 -0
- data/spec/integration/rels_ext_datastream_spec.rb +14 -35
- data/spec/integration/semantic_node_spec.rb +6 -10
- data/spec/unit/base_datastream_management_spec.rb +0 -3
- data/spec/unit/base_extra_spec.rb +5 -9
- data/spec/unit/base_spec.rb +103 -57
- data/spec/unit/{base_named_datastream_spec.rb → datastream_collections_spec.rb} +107 -150
- data/spec/unit/metadata_datastream_spec.rb +0 -1
- data/spec/unit/nokogiri_datastream_spec.rb +0 -1
- data/spec/unit/predicates_spec.rb +64 -0
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -7
- data/spec/unit/relationship_graph_spec.rb +95 -0
- data/spec/unit/relationship_spec.rb +4 -4
- data/spec/unit/relationships_helper_spec.rb +43 -104
- data/spec/unit/rels_ext_datastream_spec.rb +6 -6
- data/spec/unit/semantic_node_spec.rb +27 -116
- data/spec/unit/service_definitions_spec.rb +52 -0
- data/spec/unit/solr_config_options_spec.rb +1 -1
- metadata +35 -17
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
active-fedora (3.
|
5
|
-
activeresource (
|
6
|
-
activesupport (
|
4
|
+
active-fedora (3.2.0.pre1)
|
5
|
+
activeresource (>= 3.0.0)
|
6
|
+
activesupport (>= 3.0.0)
|
7
7
|
equivalent-xml
|
8
8
|
facets
|
9
9
|
mediashelf-loggable
|
@@ -13,7 +13,7 @@ PATH
|
|
13
13
|
om (>= 1.4.4)
|
14
14
|
rdf
|
15
15
|
rdf-rdfxml
|
16
|
-
rubydora (~> 0.
|
16
|
+
rubydora (~> 0.3.0)
|
17
17
|
solr-ruby (>= 0.0.6)
|
18
18
|
solrizer (> 1.0.0)
|
19
19
|
xml-simple (>= 1.0.12)
|
@@ -22,23 +22,24 @@ GEM
|
|
22
22
|
remote: http://rubygems.org/
|
23
23
|
specs:
|
24
24
|
RedCloth (4.2.9)
|
25
|
-
activemodel (3.
|
26
|
-
activesupport (= 3.
|
27
|
-
builder (~>
|
28
|
-
i18n (~> 0.
|
29
|
-
activeresource (3.
|
30
|
-
activemodel (= 3.
|
31
|
-
activesupport (= 3.
|
32
|
-
activesupport (3.
|
25
|
+
activemodel (3.1.3)
|
26
|
+
activesupport (= 3.1.3)
|
27
|
+
builder (~> 3.0.0)
|
28
|
+
i18n (~> 0.6)
|
29
|
+
activeresource (3.1.3)
|
30
|
+
activemodel (= 3.1.3)
|
31
|
+
activesupport (= 3.1.3)
|
32
|
+
activesupport (3.1.3)
|
33
|
+
multi_json (~> 1.0)
|
33
34
|
addressable (2.2.6)
|
34
35
|
akami (1.0.0)
|
35
36
|
gyoku (>= 0.4.0)
|
36
37
|
archive-tar-minitar (0.5.2)
|
37
|
-
builder (
|
38
|
+
builder (3.0.0)
|
38
39
|
childprocess (0.2.3)
|
39
40
|
ffi (~> 1.0.6)
|
40
|
-
columnize (0.3.
|
41
|
-
daemons (1.1.
|
41
|
+
columnize (0.3.6)
|
42
|
+
daemons (1.1.5)
|
42
43
|
diff-lcs (1.1.3)
|
43
44
|
equivalent-xml (0.2.8)
|
44
45
|
nokogiri (>= 1.4.3)
|
@@ -49,7 +50,7 @@ GEM
|
|
49
50
|
builder (>= 2.1.2)
|
50
51
|
httpi (0.9.5)
|
51
52
|
rack
|
52
|
-
i18n (0.
|
53
|
+
i18n (0.6.0)
|
53
54
|
jettywrapper (1.2.0)
|
54
55
|
activesupport (>= 3.0.0)
|
55
56
|
childprocess
|
@@ -66,6 +67,7 @@ GEM
|
|
66
67
|
mime-types (1.17.2)
|
67
68
|
mocha (0.10.0)
|
68
69
|
metaclass (~> 0.0.1)
|
70
|
+
multi_json (1.0.4)
|
69
71
|
multipart-post (1.1.2)
|
70
72
|
nokogiri (1.5.0)
|
71
73
|
nori (1.0.2)
|
@@ -108,7 +110,7 @@ GEM
|
|
108
110
|
ruby-debug-base19 (>= 0.11.19)
|
109
111
|
ruby_core_source (0.1.5)
|
110
112
|
archive-tar-minitar (>= 0.5.2)
|
111
|
-
rubydora (0.
|
113
|
+
rubydora (0.3.0)
|
112
114
|
activemodel
|
113
115
|
activesupport
|
114
116
|
fastercsv
|
@@ -132,15 +134,13 @@ GEM
|
|
132
134
|
om (>= 1.4.0)
|
133
135
|
stomp
|
134
136
|
xml-simple
|
135
|
-
solrizer-fedora (1.
|
136
|
-
active-fedora (
|
137
|
-
activesupport
|
137
|
+
solrizer-fedora (1.1.3)
|
138
|
+
active-fedora (>= 2.3.0)
|
138
139
|
fastercsv
|
139
|
-
jettywrapper (>= 1.1.0)
|
140
140
|
rsolr
|
141
141
|
solr-ruby (>= 0.0.6)
|
142
142
|
solrizer (>= 1.0.0)
|
143
|
-
stomp (1.
|
143
|
+
stomp (1.2.0)
|
144
144
|
wasabi (2.0.0)
|
145
145
|
nokogiri (>= 1.4.0)
|
146
146
|
xml-simple (1.1.1)
|
data/History.txt
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
3.
|
2
|
-
|
3
|
-
|
1
|
+
3.2.0
|
2
|
+
|
3
|
+
Don't create pids until save
|
4
|
+
inspect and equality methods
|
5
|
+
Deprecate datastream_collections
|
6
|
+
Rails 3.1 compatibility
|
7
|
+
Disseminators have been added
|
8
|
+
Adapt To
|
9
|
+
ActiveFedora::Relationship is deprecated
|
4
10
|
|
5
11
|
3.1.5
|
6
12
|
HYDRA-722 updating AF::Base#label= and then saving doesn't persist the change
|
data/active-fedora.gemspec
CHANGED
@@ -22,12 +22,12 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency('nokogiri')
|
23
23
|
s.add_dependency('om', '>= 1.4.4')
|
24
24
|
s.add_dependency('solrizer', '>1.0.0')
|
25
|
-
s.add_dependency("activeresource", '
|
26
|
-
s.add_dependency("activesupport", '
|
25
|
+
s.add_dependency("activeresource", '>= 3.0.0')
|
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.
|
30
|
+
s.add_dependency("rubydora", '~>0.3.0')
|
31
31
|
s.add_dependency("rdf")
|
32
32
|
s.add_dependency("rdf-rdfxml")
|
33
33
|
s.add_development_dependency("yard")
|
data/lib/active_fedora.rb
CHANGED
@@ -3,6 +3,7 @@ require 'active_fedora/railtie' if defined? Rails
|
|
3
3
|
require 'active_support'
|
4
4
|
require 'active_fedora/solr_service'
|
5
5
|
require 'active_fedora/rubydora_connection'
|
6
|
+
require 'active_support/core_ext/class/attribute'
|
6
7
|
|
7
8
|
SOLR_DOCUMENT_ID = ActiveFedora::SolrService.id_field unless defined?(SOLR_DOCUMENT_ID)
|
8
9
|
ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
|
@@ -16,11 +17,13 @@ module ActiveFedora #:nodoc:
|
|
16
17
|
autoload :Base
|
17
18
|
autoload :ContentModel
|
18
19
|
autoload :Reflection
|
19
|
-
autoload :Relationship
|
20
|
+
#autoload :Relationship
|
21
|
+
autoload :RelationshipGraph
|
20
22
|
autoload :RelationshipsHelper
|
21
23
|
autoload :Datastream
|
22
24
|
autoload :Delegating
|
23
25
|
autoload :DigitalObject
|
26
|
+
autoload :UnsavedDigitalObject
|
24
27
|
autoload :Model
|
25
28
|
autoload :MetadataDatastream
|
26
29
|
autoload :MetadataDatastreamHelper
|
@@ -29,10 +32,13 @@ module ActiveFedora #:nodoc:
|
|
29
32
|
autoload :QualifiedDublinCoreDatastream
|
30
33
|
autoload :RelsExtDatastream
|
31
34
|
autoload :RelationshipsHelper
|
35
|
+
autoload :ServiceDefinitions
|
32
36
|
autoload :SemanticNode
|
33
37
|
autoload :NestedAttributes
|
34
38
|
autoload :FixtureLoader
|
35
39
|
autoload :DatastreamCollections
|
40
|
+
autoload :NamedRelationships
|
41
|
+
autoload :Predicates
|
36
42
|
|
37
43
|
end
|
38
44
|
|
data/lib/active_fedora/base.rb
CHANGED
@@ -3,7 +3,7 @@ require 'nokogiri'
|
|
3
3
|
require "loggable"
|
4
4
|
require 'active_fedora/datastream_hash'
|
5
5
|
|
6
|
-
|
6
|
+
|
7
7
|
SOLR_DOCUMENT_ID = "id" unless (defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?)
|
8
8
|
ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
|
9
9
|
|
@@ -32,7 +32,14 @@ module ActiveFedora
|
|
32
32
|
class Base
|
33
33
|
include RelationshipsHelper
|
34
34
|
include SemanticNode
|
35
|
-
|
35
|
+
|
36
|
+
class_attribute :ds_specs
|
37
|
+
|
38
|
+
def self.inherited(p)
|
39
|
+
# each subclass should get a copy of the parent's datastream definitions, it should not add to the parent's definition table.
|
40
|
+
p.ds_specs = p.ds_specs.dup
|
41
|
+
super
|
42
|
+
end
|
36
43
|
|
37
44
|
self.ds_specs = {'RELS-EXT'=> {:type=> ActiveFedora::RelsExtDatastream, :label=>"", :block=>nil}}
|
38
45
|
|
@@ -77,22 +84,19 @@ module ActiveFedora
|
|
77
84
|
# we configure any defined datastreams.
|
78
85
|
def initialize(attrs = nil)
|
79
86
|
attrs = {} if attrs.nil?
|
80
|
-
|
81
|
-
|
82
|
-
|
87
|
+
attributes = attrs.dup
|
88
|
+
@inner_object = attributes.delete(:inner_object)
|
89
|
+
unless @inner_object
|
90
|
+
if attributes[:pid]
|
91
|
+
@inner_object = DigitalObject.find(self.class, attributes[:pid])
|
83
92
|
else
|
84
|
-
|
93
|
+
@inner_object = UnsavedDigitalObject.new(self.class, attributes.delete(:namespace))
|
94
|
+
self.relationships_loaded = true
|
85
95
|
end
|
86
|
-
self.relationships_loaded = true
|
87
|
-
@inner_object = DigitalObject.find(self.class, attrs[:pid])
|
88
|
-
else
|
89
|
-
@inner_object = DigitalObject.find(self.class, attrs[:pid])
|
90
|
-
load_datastreams_from_fedora
|
91
96
|
end
|
92
|
-
|
97
|
+
load_datastreams
|
93
98
|
|
94
|
-
|
95
|
-
[:pid, :namespace, :new_object,:create_date, :modified_date].each { |k| attributes.delete(k)}
|
99
|
+
[:pid, :new_object,:create_date, :modified_date].each { |k| attributes.delete(k)}
|
96
100
|
self.attributes=attributes
|
97
101
|
end
|
98
102
|
|
@@ -108,6 +112,16 @@ module ActiveFedora
|
|
108
112
|
ds_specs[args[:name]]= {:type => args[:type], :label => args.fetch(:label,""), :control_group => args.fetch(:control_group,"X"), :disseminator => args.fetch(:disseminator,""), :url => args.fetch(:url,""),:block => block}
|
109
113
|
end
|
110
114
|
|
115
|
+
def self.method_missing (name, args)
|
116
|
+
if name == :has_datastream
|
117
|
+
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")
|
118
|
+
include DatastreamCollections
|
119
|
+
has_datastream(args)
|
120
|
+
else
|
121
|
+
super
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
111
125
|
|
112
126
|
def method_missing(name, *args)
|
113
127
|
dsid = corresponding_datastream_name(name)
|
@@ -142,7 +156,7 @@ module ActiveFedora
|
|
142
156
|
result = update
|
143
157
|
end
|
144
158
|
self.update_index if @metadata_is_dirty == true && ENABLE_SOLR_UPDATES
|
145
|
-
@metadata_is_dirty
|
159
|
+
@metadata_is_dirty = false
|
146
160
|
return result
|
147
161
|
end
|
148
162
|
|
@@ -170,6 +184,7 @@ module ActiveFedora
|
|
170
184
|
end
|
171
185
|
|
172
186
|
#Fedora::Repository.instance.delete(@inner_object)
|
187
|
+
pid = self.pid ## cache so it's still available after delete
|
173
188
|
begin
|
174
189
|
@inner_object.delete
|
175
190
|
rescue RestClient::ResourceNotFound =>e
|
@@ -202,21 +217,38 @@ module ActiveFedora
|
|
202
217
|
datastreams
|
203
218
|
end
|
204
219
|
|
205
|
-
def
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
if ds_spec[:block].class == Proc
|
214
|
-
ds_spec[:block].call(datastreams[dsid])
|
215
|
-
end
|
220
|
+
def configure_datastream(ds, ds_spec=nil)
|
221
|
+
ds_spec ||= self.class.ds_specs[ds.instance_variable_get(:@dsid)]
|
222
|
+
if ds_spec
|
223
|
+
ds.model = self if ds_spec[:type] == RelsExtDatastream
|
224
|
+
# If you called has_metadata with a block, pass the block into the Datastream class
|
225
|
+
if ds_spec[:block].class == Proc
|
226
|
+
ds_spec[:block].call(ds)
|
216
227
|
end
|
217
228
|
end
|
218
229
|
end
|
219
230
|
|
231
|
+
def datastream_from_spec(ds_spec, name)
|
232
|
+
ds = ds_spec[:type].new(inner_object, name)
|
233
|
+
ds.dsLabel = ds_spec[:label] if ds_spec[:label].present?
|
234
|
+
ds.controlGroup = ds_spec[:control_group]
|
235
|
+
additional_attributes_for_external_and_redirect_control_groups(ds, ds_spec)
|
236
|
+
ds
|
237
|
+
end
|
238
|
+
|
239
|
+
def load_datastreams
|
240
|
+
ds_specs = self.class.ds_specs.dup
|
241
|
+
inner_object.datastreams.each do |dsid, ds|
|
242
|
+
self.add_datastream(ds)
|
243
|
+
configure_datastream(datastreams[dsid])
|
244
|
+
ds_specs.delete(dsid)
|
245
|
+
end
|
246
|
+
ds_specs.each do |name,ds_spec|
|
247
|
+
ds = datastream_from_spec(ds_spec, name)
|
248
|
+
self.add_datastream(ds)
|
249
|
+
configure_datastream(ds, ds_spec)
|
250
|
+
end
|
251
|
+
end
|
220
252
|
|
221
253
|
# Adds datastream to the object. Saves the datastream to fedora upon adding.
|
222
254
|
# If datastream does not have a DSID, a unique DSID is generated
|
@@ -241,7 +273,7 @@ module ActiveFedora
|
|
241
273
|
results = []
|
242
274
|
datastreams.each_value do |ds|
|
243
275
|
if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream)
|
244
|
-
results<<ds
|
276
|
+
results << ds
|
245
277
|
end
|
246
278
|
end
|
247
279
|
return results
|
@@ -255,7 +287,7 @@ module ActiveFedora
|
|
255
287
|
if !ds.kind_of?(ActiveFedora::MetadataDatastream)
|
256
288
|
dsid = ds.dsid
|
257
289
|
if dsid != "DC" && dsid != "RELS-EXT"
|
258
|
-
results<<ds
|
290
|
+
results << ds
|
259
291
|
end
|
260
292
|
end
|
261
293
|
end
|
@@ -426,7 +458,7 @@ module ActiveFedora
|
|
426
458
|
# if there is no fedora object (loaded from solr) get the instance var
|
427
459
|
# TODO make inner_object a proxy that can hold the pid
|
428
460
|
def pid
|
429
|
-
|
461
|
+
@inner_object.pid
|
430
462
|
# @inner_object ? @inner_object.pid : @pid
|
431
463
|
end
|
432
464
|
|
@@ -517,6 +549,17 @@ module ActiveFedora
|
|
517
549
|
return xml.to_s
|
518
550
|
end
|
519
551
|
|
552
|
+
def ==(comparison_object)
|
553
|
+
comparison_object.equal?(self) ||
|
554
|
+
(comparison_object.instance_of?(self.class) &&
|
555
|
+
comparison_object.pid == pid &&
|
556
|
+
!comparison_object.new_record?)
|
557
|
+
end
|
558
|
+
|
559
|
+
def inspect
|
560
|
+
"#<#{self.class}:#{self.hash} @pid=\"#{pid}\" >"
|
561
|
+
end
|
562
|
+
|
520
563
|
# Return a Hash representation of this object where keys in the hash are appropriate Solr field names.
|
521
564
|
# @param [Hash] solr_doc (optional) Hash to insert the fields into
|
522
565
|
# @param [Hash] opts (optional)
|
@@ -551,6 +594,15 @@ module ActiveFedora
|
|
551
594
|
end
|
552
595
|
|
553
596
|
|
597
|
+
# ** EXPERIMENTAL **
|
598
|
+
# This method adapts the inner_object to a new ActiveFedora::Base implementation
|
599
|
+
# This is intended to minimize redundant interactions with Fedora
|
600
|
+
def adapt_to(klass)
|
601
|
+
unless klass.ancestors.include? ActiveFedora::Base
|
602
|
+
raise "Cannot adapt #{self.class.name} to #{klass.name}: Not a ActiveFedora::Base subclass"
|
603
|
+
end
|
604
|
+
klass.new({:inner_object=>inner_object})
|
605
|
+
end
|
554
606
|
# ** EXPERIMENTAL **
|
555
607
|
#
|
556
608
|
# This method can be used instead of ActiveFedora::Model::ClassMethods.load_instance.
|
@@ -734,6 +786,7 @@ module ActiveFedora
|
|
734
786
|
|
735
787
|
# Deals with preparing new object to be saved to Fedora, then pushes it and its datastreams into Fedora.
|
736
788
|
def create
|
789
|
+
@inner_object = @inner_object.save #replace the unsaved digital object with a saved digital object
|
737
790
|
assert_content_model
|
738
791
|
@metadata_is_dirty = true
|
739
792
|
update
|
@@ -767,7 +820,8 @@ module ActiveFedora
|
|
767
820
|
include Associations
|
768
821
|
include NestedAttributes
|
769
822
|
include Reflection
|
770
|
-
include
|
823
|
+
include NamedRelationships
|
824
|
+
# include DatastreamCollections
|
771
825
|
end
|
772
826
|
|
773
827
|
end
|
@@ -3,6 +3,7 @@ module ActiveFedora
|
|
3
3
|
#This class represents a Fedora datastream
|
4
4
|
class Datastream < Rubydora::Datastream
|
5
5
|
|
6
|
+
attr_writer :digital_object
|
6
7
|
attr_accessor :dirty, :last_modified, :fields
|
7
8
|
before_create :add_mime_type
|
8
9
|
|
@@ -28,6 +29,7 @@ module ActiveFedora
|
|
28
29
|
end
|
29
30
|
|
30
31
|
# Test whether this datastream been modified since it was last saved?
|
32
|
+
# TODO deprecate this, just use changed?
|
31
33
|
def dirty?
|
32
34
|
@dirty || changed?
|
33
35
|
end
|
@@ -37,7 +39,8 @@ module ActiveFedora
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def save
|
40
|
-
raise "No content #{dsid}" if @content.nil?
|
42
|
+
#raise "No content #{dsid}" if @content.nil?
|
43
|
+
return if @content.nil?
|
41
44
|
run_callbacks :save do
|
42
45
|
return create if new?
|
43
46
|
repository.modify_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
|
@@ -1,326 +1,337 @@
|
|
1
|
-
module
|
2
|
-
|
1
|
+
require 'active_support/core_ext/module/aliasing'
|
2
|
+
module ActiveFedora
|
3
|
+
module DatastreamCollections
|
4
|
+
extend ActiveSupport::Concern
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
included do
|
7
|
+
class_attribute :class_named_datastreams_desc
|
8
|
+
self.class_named_datastreams_desc = {}
|
9
|
+
class << self
|
10
|
+
def inherited_with_datastream_collections(kls) #:nodoc:
|
11
|
+
## Do some inheritance logic that doesn't override Base.inherited
|
12
|
+
inherited_without_datastream_collections kls
|
13
|
+
kls.class_named_datastreams_desc = kls.class_named_datastreams_desc.dup
|
14
|
+
end
|
15
|
+
alias_method_chain :inherited, :datastream_collections
|
16
|
+
end
|
17
|
+
end
|
8
18
|
|
9
|
-
|
19
|
+
module ClassMethods
|
10
20
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
21
|
+
# ** EXPERIMENTAL **
|
22
|
+
#
|
23
|
+
# Allows for a datastream to be treated like any other attribute of a model class
|
24
|
+
# while enforcing mimeType and/or datastream type (ie. external, managed, etc.) if defined.
|
25
|
+
# ====Examples
|
26
|
+
#
|
27
|
+
# has_datastream :name=>"thumbnails",:prefix => "THUMB",:type=>ActiveFedora::Datastream, :mimeType=>"image/jpeg", :controlGroup=>'M'
|
28
|
+
# has_datastream :name=>"EADs", :type=>ActiveFedora::Datastream, :mimeType=>"application/xml", :controlGroup=>'M'
|
29
|
+
# has_datastream :name=>"external_images", :type=>ActiveFedora::Datastream, :controlGroup=>'E'
|
30
|
+
#
|
31
|
+
# Required Keys in args
|
32
|
+
# :name - name to give this datastream (must be unique)
|
33
|
+
#
|
34
|
+
# Optional Keys in args
|
35
|
+
# :prefix - used to create the DSID plus an index ie. THUMB1, THUMB2. If :prefix is not specified, defaults to :name value in all uppercase
|
36
|
+
# :type - defaults to ActiveFedora::Datastream if you would like content specific class to be used supply it here
|
37
|
+
# :mimeType - if supplied it will ensure any datastreams added are of this type, if not supplied any mimeType is acceptabl e
|
38
|
+
# :controlGroup - possible values "X", "M", "R", or "E" (InlineXML, Managed Content, Redirect, or External Referenced) If controlGroup is 'E' or 'R' it expects a dsLocation be defined when adding the datastream.
|
39
|
+
#
|
40
|
+
# You use the datastream attribute using helper methods created for each datastream name:
|
41
|
+
#
|
42
|
+
# ====Helper Method Examples
|
43
|
+
# thumbnails_append - Append a thumbnail datastream
|
44
|
+
# thumbnails - Get array of thumbnail datastreams
|
45
|
+
# thumbnails_ids - Get array of dsid's for thumbnail datastreams
|
46
|
+
#
|
47
|
+
# When loading the list of datastreams for a name from Fedora it uses the DSID prefix to find them in Fedora
|
48
|
+
def has_datastream(args)
|
49
|
+
unless args.has_key?(:name)
|
50
|
+
return false
|
51
|
+
end
|
52
|
+
unless args.has_key?(:prefix)
|
53
|
+
args.merge!({:prefix=>args[:name].to_s.upcase})
|
54
|
+
end
|
55
|
+
unless class_named_datastreams_desc.has_key?(args[:name])
|
56
|
+
class_named_datastreams_desc[args[:name]] = {}
|
57
|
+
end
|
58
|
+
|
59
|
+
args.merge!({:mimeType=>args[:mime_type]}) if args.has_key?(:mime_type)
|
60
|
+
|
61
|
+
unless class_named_datastreams_desc[args[:name]].has_key?(:type)
|
62
|
+
#default to type ActiveFedora::Datastream
|
63
|
+
args.merge!({:type => "ActiveFedora::Datastream"})
|
64
|
+
end
|
65
|
+
class_named_datastreams_desc[args[:name]]= args
|
66
|
+
create_named_datastream_finders(args[:name],args[:prefix])
|
67
|
+
create_named_datastream_update_methods(args[:name])
|
47
68
|
end
|
48
|
-
|
49
|
-
args.merge!({:mimeType=>args[:mime_type]}) if args.has_key?(:mime_type)
|
50
69
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
opts ||= {}
|
75
|
-
add_named_file_datastream(name,file,opts)
|
76
|
-
end
|
70
|
+
# ** EXPERIMENTAL **
|
71
|
+
#
|
72
|
+
# Creates the following helper methods for a datastream name
|
73
|
+
# [datastream_name]_append - Add a named datastream
|
74
|
+
#
|
75
|
+
# ==== Examples for "thumbnails" datastream
|
76
|
+
# thumbnails_append - Append a thumbnail datastream
|
77
|
+
# TODO: Add [datastream_name]_remove
|
78
|
+
def create_named_datastream_update_methods(name)
|
79
|
+
append_file_method_name = "#{name.to_s.downcase}_file_append"
|
80
|
+
append_method_name = "#{name.to_s.downcase}_append"
|
81
|
+
#remove_method_name = "#{name.to_s.downcase}_remove"
|
82
|
+
self.send(:define_method,:"#{append_file_method_name}") do |*args|
|
83
|
+
file,opts = *args
|
84
|
+
opts ||= {}
|
85
|
+
add_named_file_datastream(name,file,opts)
|
86
|
+
end
|
87
|
+
|
88
|
+
self.send(:define_method,:"#{append_method_name}") do |*args|
|
89
|
+
#call add_named_datastream instead of add_file_named_datastream in case not managed datastream
|
90
|
+
add_named_datastream(name,*args)
|
91
|
+
end
|
92
|
+
end
|
77
93
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
else
|
102
|
-
named_ds = []
|
103
|
-
id_array.each do |name|
|
104
|
-
if datastreams.has_key?(name)
|
105
|
-
named_ds.push(datastreams[name])
|
94
|
+
# ** EXPERIMENTAL **
|
95
|
+
#
|
96
|
+
# Creates the following helper methods for a datastream name
|
97
|
+
# [datastream_name] - Returns array of named datastreams
|
98
|
+
# [datastream_name]_ids - Returns array of named datastream dsids
|
99
|
+
#
|
100
|
+
# ==== Examples for "thumbnails" datastream
|
101
|
+
# thumbnails - Get array of thumbnail datastreams
|
102
|
+
# thumbnails_ids - Get array of dsid's for thumbnail datastreams
|
103
|
+
def create_named_datastream_finders(name, prefix)
|
104
|
+
class_eval <<-END, __FILE__, __LINE__
|
105
|
+
def #{name}(opts={})
|
106
|
+
id_array = []
|
107
|
+
keys = datastreams.keys
|
108
|
+
id_array = keys.select {|v| v =~ /#{prefix}\d*/}
|
109
|
+
if opts[:response_format] == :id_array
|
110
|
+
return id_array
|
111
|
+
else
|
112
|
+
named_ds = []
|
113
|
+
id_array.each do |name|
|
114
|
+
if datastreams.has_key?(name)
|
115
|
+
named_ds.push(datastreams[name])
|
116
|
+
end
|
106
117
|
end
|
118
|
+
return named_ds
|
107
119
|
end
|
108
|
-
return named_ds
|
109
120
|
end
|
121
|
+
def #{name}_ids
|
122
|
+
#{name}(:response_format => :id_array)
|
123
|
+
end
|
124
|
+
END
|
110
125
|
end
|
111
|
-
|
112
|
-
#{name}(:response_format => :id_array)
|
113
|
-
end
|
114
|
-
END
|
115
|
-
end
|
116
|
-
|
117
|
-
|
126
|
+
|
118
127
|
|
119
|
-
end
|
120
128
|
|
121
|
-
# ** EXPERIMENTAL **
|
122
|
-
#
|
123
|
-
# Accessor for class variable for hash that stores arguments passed to has_datastream calls within an
|
124
|
-
# ActiveFedora::Base child class.
|
125
|
-
#
|
126
|
-
# has_datastream :name=>"audio_file", :prefix=>"AUDIO", :type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav"
|
127
|
-
# has_datastream :name=>"external_images", :prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'
|
128
|
-
#
|
129
|
-
# The above examples result in the following hash
|
130
|
-
# {"audio_file"=>{:prefix=>"AUDIO",:type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav", :controlGroup=>'M'},
|
131
|
-
# "external_images=>{:prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'}}
|
132
|
-
#
|
133
|
-
# This hash is later used when adding a named datastream such as an "audio_file" as defined above.
|
134
|
-
def named_datastreams_desc
|
135
|
-
self.class_named_datastreams_desc ||= {}
|
136
129
|
end
|
137
130
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
opts.merge!({:blob=>file,:controlGroup=>'M'})
|
154
|
-
add_named_datastream(name,opts)
|
155
|
-
end
|
156
|
-
|
157
|
-
# ** EXPERIMENTAL **
|
158
|
-
#
|
159
|
-
# This object is used by [datastream_name]_append helper to add a named datastream
|
160
|
-
# but can also be called directly.
|
161
|
-
# ====Parameters
|
162
|
-
# name: name of datastream to add
|
163
|
-
# opts: hash defining datastream attributes
|
164
|
-
# The following are expected keys in opts hash:
|
165
|
-
# :label => Defaults to the file name
|
166
|
-
# :blob or :file => Required to point to the datastream file being added if managed content
|
167
|
-
# :controlGroup => defaults to 'M' for managed, can also be 'E' external and 'R' for redirected
|
168
|
-
# :content_type => required if the file does not respond to 'content_type' and should match :mimeType in has_datastream definition if defined
|
169
|
-
# :dsLocation => holds uri location of datastream. Required only if :controlGroup is type 'E' or 'R'.
|
170
|
-
# :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
|
171
|
-
def add_named_datastream(name,opts={})
|
172
|
-
unless named_datastreams_desc.has_key?(name) && named_datastreams_desc[name].has_key?(:type)
|
173
|
-
raise "Failed to add datastream. Named datastream #{name} not defined for object #{pid}."
|
131
|
+
# ** EXPERIMENTAL **
|
132
|
+
#
|
133
|
+
# Accessor for class variable for hash that stores arguments passed to has_datastream calls within an
|
134
|
+
# ActiveFedora::Base child class.
|
135
|
+
#
|
136
|
+
# has_datastream :name=>"audio_file", :prefix=>"AUDIO", :type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav"
|
137
|
+
# has_datastream :name=>"external_images", :prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'
|
138
|
+
#
|
139
|
+
# The above examples result in the following hash
|
140
|
+
# {"audio_file"=>{:prefix=>"AUDIO",:type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav", :controlGroup=>'M'},
|
141
|
+
# "external_images=>{:prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'}}
|
142
|
+
#
|
143
|
+
# This hash is later used when adding a named datastream such as an "audio_file" as defined above.
|
144
|
+
def named_datastreams_desc
|
145
|
+
self.class_named_datastreams_desc ||= {}
|
174
146
|
end
|
175
147
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
148
|
+
# ** EXPERIMENTAL **
|
149
|
+
#
|
150
|
+
# Returns array of datastream names defined for this object
|
151
|
+
def datastream_names
|
152
|
+
named_datastreams_desc.keys
|
180
153
|
end
|
181
|
-
|
182
|
-
|
183
|
-
|
154
|
+
|
155
|
+
# ** EXPERIMENTAL **
|
156
|
+
#
|
157
|
+
# Calls add_named_datastream while assuming it will be managed content and sets :blob and :controlGroup values accordingly
|
158
|
+
# ====Parameters
|
159
|
+
# name: Datastream name
|
160
|
+
# file: The file to add for this datastream
|
161
|
+
# opts: Options hash. See +add_named_datastream+ for expected keys and values
|
162
|
+
def add_named_file_datastream(name, file, opts={})
|
163
|
+
opts.merge!({:blob=>file,:controlGroup=>'M'})
|
164
|
+
add_named_datastream(name,opts)
|
165
|
+
end
|
166
|
+
|
167
|
+
# ** EXPERIMENTAL **
|
168
|
+
#
|
169
|
+
# This object is used by [datastream_name]_append helper to add a named datastream
|
170
|
+
# but can also be called directly.
|
171
|
+
# ====Parameters
|
172
|
+
# name: name of datastream to add
|
173
|
+
# opts: hash defining datastream attributes
|
174
|
+
# The following are expected keys in opts hash:
|
175
|
+
# :label => Defaults to the file name
|
176
|
+
# :blob or :file => Required to point to the datastream file being added if managed content
|
177
|
+
# :controlGroup => defaults to 'M' for managed, can also be 'E' external and 'R' for redirected
|
178
|
+
# :content_type => required if the file does not respond to 'content_type' and should match :mimeType in has_datastream definition if defined
|
179
|
+
# :dsLocation => holds uri location of datastream. Required only if :controlGroup is type 'E' or 'R'.
|
180
|
+
# :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
|
181
|
+
def add_named_datastream(name,opts={})
|
182
|
+
unless named_datastreams_desc.has_key?(name) && named_datastreams_desc[name].has_key?(:type)
|
183
|
+
raise "Failed to add datastream. Named datastream #{name} not defined for object #{pid}."
|
184
|
+
end
|
184
185
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
opts.merge!({:
|
189
|
-
|
186
|
+
if opts.has_key?(:mime_type)
|
187
|
+
opts.merge!({:content_type=>opts[:mime_type]})
|
188
|
+
elsif opts.has_key?(:mimeType)
|
189
|
+
opts.merge!({:content_type=>opts[:mimeType]})
|
190
|
+
end
|
191
|
+
opts.merge!(named_datastreams_desc[name])
|
192
|
+
|
193
|
+
label = opts.has_key?(:label) ? opts[:label] : ""
|
194
|
+
|
195
|
+
#only do these steps for managed datastreams
|
196
|
+
unless (opts.has_key?(:controlGroup)&&opts[:controlGroup]!="M")
|
197
|
+
if opts.has_key?(:file)
|
198
|
+
opts.merge!({:blob => opts[:file]})
|
199
|
+
opts.delete(:file)
|
200
|
+
end
|
201
|
+
|
202
|
+
raise "You must define parameter blob for this managed datastream to load for #{pid}" unless opts.has_key?(:blob)
|
203
|
+
|
204
|
+
#if no explicit label and is a file use original file name for label
|
205
|
+
if !opts.has_key?(:label)&&opts[:blob].respond_to?(:original_filename)
|
206
|
+
label = opts[:blob].original_filename
|
207
|
+
end
|
208
|
+
|
209
|
+
if opts[:blob].respond_to?(:content_type)&&!opts[:blob].content_type.nil? && !opts.has_key?(:content_type)
|
210
|
+
opts.merge!({:content_type=>opts[:blob].content_type})
|
211
|
+
end
|
212
|
+
|
213
|
+
raise "The blob must respond to content_type or the hash must have :content_type or :mime_type property set" unless opts.has_key?(:content_type)
|
214
|
+
|
215
|
+
#throw error for mimeType mismatch
|
216
|
+
if named_datastreams_desc[name].has_key?(:mimeType) && !named_datastreams_desc[name][:mimeType].eql?(opts[:content_type])
|
217
|
+
raise "Content type mismatch for add datastream #{name} to #{pid}. Expected: #{named_datastreams_desc[name][:mimeType]}, Actual: #{opts[:content_type]}"
|
218
|
+
end
|
219
|
+
else
|
220
|
+
label = opts[:dsLocation] if (opts.has_key?(:dsLocation))
|
190
221
|
end
|
191
222
|
|
192
|
-
|
223
|
+
opts.merge!(:dsLabel => label)
|
193
224
|
|
194
|
-
|
195
|
-
|
196
|
-
|
225
|
+
ds = create_datastream(named_datastreams_desc[name][:type], opts[:dsid], opts)
|
226
|
+
#Must be of type datastream
|
227
|
+
assert_kind_of 'datastream', ds, ActiveFedora::Datastream
|
228
|
+
#make sure dsid is nil so that it uses the prefix for mapping purposes
|
229
|
+
#check dsid works for the prefix if it is set
|
230
|
+
if !ds.dsid.nil? && opts.has_key?(:prefix)
|
231
|
+
raise "dsid supplied does not conform to pattern #{opts[:prefix]}[number]" unless ds.dsid =~ /#{opts[:prefix]}[0-9]/
|
197
232
|
end
|
198
233
|
|
199
|
-
|
200
|
-
|
201
|
-
end
|
234
|
+
add_datastream(ds,opts)
|
235
|
+
end
|
202
236
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
237
|
+
# ** EXPERIMENTAL **
|
238
|
+
#
|
239
|
+
# Update an existing named datastream. It has same parameters as add_named_datastream
|
240
|
+
# except the :dsid key is now required.
|
241
|
+
#
|
242
|
+
# ====TODO
|
243
|
+
# Currently requires you to update file if a managed datastream
|
244
|
+
# but could change to allow metadata only updates as well
|
245
|
+
def update_named_datastream(name, opts={})
|
246
|
+
#check that dsid provided matches existing datastream with that name
|
247
|
+
raise "You must define parameter dsid for datastream to update for #{pid}" unless opts.include?(:dsid)
|
248
|
+
raise "Datastream with name #{name} and dsid #{opts[:dsid]} does not exist for #{pid}" unless self.send("#{name}_ids").include?(opts[:dsid])
|
249
|
+
add_named_datastream(name,opts)
|
211
250
|
end
|
212
251
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
#
|
217
|
-
|
218
|
-
#
|
219
|
-
#
|
220
|
-
|
221
|
-
raise "
|
252
|
+
# ** EXPERIMENTAL **
|
253
|
+
#
|
254
|
+
# Throws an assertion failure unless the object 'o' is kind_of? class 't'
|
255
|
+
# ====Parameters
|
256
|
+
# n: Name of object
|
257
|
+
# o: The object to test
|
258
|
+
# t: The class type to check is kind_of?
|
259
|
+
def assert_kind_of(n, o,t)
|
260
|
+
raise "Assertion failure: #{n}: #{o} is not of type #{t}" unless o.kind_of?(t)
|
222
261
|
end
|
223
262
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
# except the :dsid key is now required.
|
231
|
-
#
|
232
|
-
# ====TODO
|
233
|
-
# Currently requires you to update file if a managed datastream
|
234
|
-
# but could change to allow metadata only updates as well
|
235
|
-
def update_named_datastream(name, opts={})
|
236
|
-
#check that dsid provided matches existing datastream with that name
|
237
|
-
raise "You must define parameter dsid for datastream to update for #{pid}" unless opts.include?(:dsid)
|
238
|
-
raise "Datastream with name #{name} and dsid #{opts[:dsid]} does not exist for #{pid}" unless self.send("#{name}_ids").include?(opts[:dsid])
|
239
|
-
add_named_datastream(name,opts)
|
240
|
-
end
|
241
|
-
|
242
|
-
# ** EXPERIMENTAL **
|
243
|
-
#
|
244
|
-
# Throws an assertion failure unless the object 'o' is kind_of? class 't'
|
245
|
-
# ====Parameters
|
246
|
-
# n: Name of object
|
247
|
-
# o: The object to test
|
248
|
-
# t: The class type to check is kind_of?
|
249
|
-
def assert_kind_of(n, o,t)
|
250
|
-
raise "Assertion failure: #{n}: #{o} is not of type #{t}" unless o.kind_of?(t)
|
251
|
-
end
|
252
|
-
|
253
|
-
# ** EXPERIMENTAL **
|
254
|
-
#
|
255
|
-
# Returns true if the name is a defined named datastream
|
256
|
-
def is_named_datastream?(name)
|
257
|
-
named_datastreams_desc.has_key?(name)
|
258
|
-
end
|
263
|
+
# ** EXPERIMENTAL **
|
264
|
+
#
|
265
|
+
# Returns true if the name is a defined named datastream
|
266
|
+
def is_named_datastream?(name)
|
267
|
+
named_datastreams_desc.has_key?(name)
|
268
|
+
end
|
259
269
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
270
|
+
# ** EXPERIMENTAL **
|
271
|
+
#
|
272
|
+
# Returns hash of datastream names defined by has_datastream calls mapped to
|
273
|
+
# array of datastream objects that have been added
|
274
|
+
# ====Example
|
275
|
+
# For the following has_datastream entries and a datastream defined for minivan only would be
|
276
|
+
# has_datastream :name=>"minivan", :prefix => "VAN", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'M'
|
277
|
+
# has_datastream :name=>"external_images", :prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'
|
278
|
+
#
|
279
|
+
# Returns
|
280
|
+
# {"external_images"=>[],"thumbnails"=>{#<ActiveFedora::Datastream:0x7ffd6512daf8 ...}}
|
281
|
+
def named_datastreams
|
282
|
+
ds_values = {}
|
283
|
+
self.class.class_named_datastreams_desc.keys.each do |name|
|
284
|
+
ds_values.merge!({name=>self.send("#{name}")})
|
285
|
+
end
|
286
|
+
return ds_values
|
275
287
|
end
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
dsids
|
288
|
+
|
289
|
+
# ** EXPERIMENTAL **
|
290
|
+
#
|
291
|
+
# Returns hash of datastream names mapped to an array
|
292
|
+
# of dsid's for named datastream objects
|
293
|
+
# === Example
|
294
|
+
# For the following has_datastream call, assume we have added two datastreams.
|
295
|
+
#
|
296
|
+
# has_datastream :name=>"thumbnails",:prefix => "THUMB",:type=>ActiveFedora::Datastream, :mimeType=>"image/jpeg", :controlGroup=>'M'
|
297
|
+
#
|
298
|
+
# It would then return
|
299
|
+
# {"thumbnails=>["THUMB1", "THUMB2"]}
|
300
|
+
def named_datastreams_ids
|
301
|
+
dsids = {}
|
302
|
+
self.class.class_named_datastreams_desc.keys.each do |name|
|
303
|
+
dsid_array = self.send("#{name}_ids")
|
304
|
+
dsids[name] = dsid_array
|
305
|
+
end
|
306
|
+
return dsids
|
307
|
+
end
|
308
|
+
|
309
|
+
# ** EXPERIMENTAL **
|
310
|
+
#
|
311
|
+
# Returns the hash that stores arguments passed to has_datastream calls within an
|
312
|
+
# ActiveFedora::Base child class.
|
313
|
+
#
|
314
|
+
# has_datastream :name=>"audio_file", :prefix=>"AUDIO", :type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav"
|
315
|
+
# has_datastream :name=>"external_images", :prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'
|
316
|
+
#
|
317
|
+
# The above examples result in the following hash
|
318
|
+
# {"audio_file"=>{:prefix=>"AUDIO",:type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav", :controlGroup=>'M'},
|
319
|
+
# "external_images=>{:prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'}}
|
320
|
+
#
|
321
|
+
# This hash is later used when adding a named datastream such as an "audio_file" as defined above.
|
322
|
+
def named_datastreams_desc
|
323
|
+
@named_datastreams_desc ||= self.class.class_named_datastreams_desc
|
324
|
+
end
|
325
|
+
|
326
|
+
# ** EXPERIMENTAL **
|
327
|
+
#
|
328
|
+
# Get class variable hash that stores has_datastream arguments.
|
329
|
+
# It is used to initialize the value returned by public named_datastreams_desc method
|
330
|
+
# Deprecated
|
331
|
+
def named_datastreams_desc_from_class
|
332
|
+
logger.warn "named_datastreams_desc_from_class is deprecated and will be removed in the next version"
|
333
|
+
self.class.class_named_datastreams_desc
|
295
334
|
end
|
296
|
-
return dsids
|
297
|
-
end
|
298
|
-
|
299
|
-
# ** EXPERIMENTAL **
|
300
|
-
#
|
301
|
-
# Returns the hash that stores arguments passed to has_datastream calls within an
|
302
|
-
# ActiveFedora::Base child class.
|
303
|
-
#
|
304
|
-
# has_datastream :name=>"audio_file", :prefix=>"AUDIO", :type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav"
|
305
|
-
# has_datastream :name=>"external_images", :prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'
|
306
|
-
#
|
307
|
-
# The above examples result in the following hash
|
308
|
-
# {"audio_file"=>{:prefix=>"AUDIO",:type=>ActiveFedora::Datastream, :mimeType=>"audio/x-wav", :controlGroup=>'M'},
|
309
|
-
# "external_images=>{:prefix=>"EXTIMG", :type=>ActiveFedora::Datastream,:mimeType=>"image/jpeg", :controlGroup=>'E'}}
|
310
|
-
#
|
311
|
-
# This hash is later used when adding a named datastream such as an "audio_file" as defined above.
|
312
|
-
def named_datastreams_desc
|
313
|
-
@named_datastreams_desc ||= self.class.class_named_datastreams_desc
|
314
|
-
end
|
315
|
-
|
316
|
-
# ** EXPERIMENTAL **
|
317
|
-
#
|
318
|
-
# Get class variable hash that stores has_datastream arguments.
|
319
|
-
# It is used to initialize the value returned by public named_datastreams_desc method
|
320
|
-
# Deprecated
|
321
|
-
def named_datastreams_desc_from_class
|
322
|
-
logger.warn "named_datastreams_desc_from_class is deprecated and will be removed in the next version"
|
323
|
-
self.class.class_named_datastreams_desc
|
324
|
-
end
|
325
335
|
|
336
|
+
end
|
326
337
|
end
|