active-fedora 11.0.0.rc6 → 11.0.0.rc7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/active-fedora.gemspec +0 -3
- data/lib/active_fedora.rb +0 -10
- data/lib/active_fedora/associations/has_many_association.rb +1 -1
- data/lib/active_fedora/attributes.rb +1 -1
- data/lib/active_fedora/base.rb +3 -7
- data/lib/active_fedora/querying.rb +1 -1
- data/lib/active_fedora/rdf.rb +0 -1
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/attached_files_spec.rb +14 -4
- data/spec/integration/file_spec.rb +22 -23
- data/spec/integration/versionable_spec.rb +0 -254
- data/spec/spec_helper.rb +0 -7
- data/spec/unit/attached_files_spec.rb +10 -7
- data/spec/unit/base_spec.rb +3 -1
- data/spec/unit/has_many_association_spec.rb +23 -8
- data/spec/unit/inheritance_spec.rb +11 -7
- data/spec/unit/model_classifier_spec.rb +1 -1
- data/spec/unit/rdf/indexing_service_spec.rb +9 -9
- data/spec/unit/solr_config_options_spec.rb +12 -15
- metadata +2 -67
- data/lib/active_fedora/datastreams.rb +0 -6
- data/lib/active_fedora/datastreams/nokogiri_datastreams.rb +0 -119
- data/lib/active_fedora/nom_datastream.rb +0 -73
- data/lib/active_fedora/om_datastream.rb +0 -118
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +0 -158
- data/lib/active_fedora/rdf/datastream_indexing.rb +0 -49
- data/lib/active_fedora/rdf/ntriples_rdf_datastream.rb +0 -13
- data/lib/active_fedora/rdf/rdf_datastream.rb +0 -173
- data/lib/active_fedora/rdf/rdfxml_datastream.rb +0 -13
- data/spec/integration/complex_rdf_datastream_spec.rb +0 -227
- data/spec/integration/datastream_rdf_nested_attributes_spec.rb +0 -180
- data/spec/integration/ntriples_datastream_spec.rb +0 -215
- data/spec/integration/om_datastream_spec.rb +0 -78
- data/spec/samples/hydra-mods_article_datastream.rb +0 -515
- data/spec/samples/models/mods_article.rb +0 -9
- data/spec/samples/samples.rb +0 -2
- data/spec/unit/nom_datastream_spec.rb +0 -60
- data/spec/unit/ntriples_datastream_spec.rb +0 -167
- data/spec/unit/om_datastream_spec.rb +0 -294
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -119
- data/spec/unit/rdf_datastream_spec.rb +0 -84
- data/spec/unit/rdf_resource_datastream_spec.rb +0 -208
- data/spec/unit/rdfxml_datastream_spec.rb +0 -106
@@ -1,73 +0,0 @@
|
|
1
|
-
require "nom"
|
2
|
-
|
3
|
-
module ActiveFedora
|
4
|
-
class NomDatastream < File
|
5
|
-
include Datastreams::NokogiriDatastreams
|
6
|
-
extend Deprecation
|
7
|
-
|
8
|
-
def self.set_terminology(options = {}, &block)
|
9
|
-
@terminology_options = options || {}
|
10
|
-
@terminology = block
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(*args)
|
14
|
-
super
|
15
|
-
Deprecation.warn(NomDatastream, "NomDatastream is deprecated and will be removed in ActiveFedora 11")
|
16
|
-
end
|
17
|
-
|
18
|
-
class << self
|
19
|
-
attr_reader :terminology_options
|
20
|
-
end
|
21
|
-
|
22
|
-
class << self
|
23
|
-
attr_reader :terminology
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.decorate_ng_xml(xml)
|
27
|
-
xml.set_terminology terminology_options, &terminology
|
28
|
-
xml.nom!
|
29
|
-
xml
|
30
|
-
end
|
31
|
-
|
32
|
-
def serialize!
|
33
|
-
self.content = @ng_xml.to_s if @ng_xml
|
34
|
-
end
|
35
|
-
|
36
|
-
def to_solr
|
37
|
-
solr_doc = {}
|
38
|
-
|
39
|
-
ng_xml.terminology.flatten.select { |x| x.options[:index] }.each do |term|
|
40
|
-
term.values.each do |v|
|
41
|
-
Array(term.options[:index]).each do |index_as|
|
42
|
-
solr_doc[index_as] ||= []
|
43
|
-
solr_doc[index_as] << if v.is_a? Nokogiri::XML::Node
|
44
|
-
v.text
|
45
|
-
else
|
46
|
-
v
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
solr_doc
|
53
|
-
end
|
54
|
-
|
55
|
-
def method_missing(method, *args, &block)
|
56
|
-
if ng_xml.respond_to? method
|
57
|
-
ng_xml.send(method, *args, &block)
|
58
|
-
else
|
59
|
-
super
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def respond_to?(*args)
|
64
|
-
super || self.class.terminology.respond_to?(*args)
|
65
|
-
end
|
66
|
-
|
67
|
-
protected
|
68
|
-
|
69
|
-
def default_mime_type
|
70
|
-
'text/xml'
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require "om"
|
2
|
-
|
3
|
-
module ActiveFedora
|
4
|
-
class OmDatastream < File
|
5
|
-
# before_save do
|
6
|
-
# if content.blank?
|
7
|
-
# ActiveFedora::Base.logger.warn "Cowardly refusing to save a datastream with empty content: #{self.inspect}"
|
8
|
-
# false
|
9
|
-
# end
|
10
|
-
# end
|
11
|
-
|
12
|
-
include OM::XML::Document
|
13
|
-
include OM::XML::TerminologyBasedSolrizer # this adds support for calling .to_solr
|
14
|
-
include Datastreams::NokogiriDatastreams
|
15
|
-
extend Deprecation
|
16
|
-
|
17
|
-
alias om_term_values term_values unless method_defined?(:om_term_values)
|
18
|
-
alias om_update_values update_values unless method_defined?(:om_update_values)
|
19
|
-
|
20
|
-
def initialize(*args)
|
21
|
-
super
|
22
|
-
Deprecation.warn(OmDatastream, "OmDatastream is deprecated and will be removed in ActiveFedora 11")
|
23
|
-
end
|
24
|
-
|
25
|
-
def default_mime_type
|
26
|
-
'text/xml'
|
27
|
-
end
|
28
|
-
|
29
|
-
# Indicates that this datastream has metadata content.
|
30
|
-
# @return true
|
31
|
-
def metadata?
|
32
|
-
true
|
33
|
-
end
|
34
|
-
|
35
|
-
# Return a hash suitable for indexing in solr. Every field name is prefixed with the
|
36
|
-
# value returned by the +prefix+ method.
|
37
|
-
def to_solr(solr_doc = {}, opts = {})
|
38
|
-
prefix = self.prefix(opts[:name])
|
39
|
-
solr_doc.merge super({}).each_with_object({}) { |(key, value), new| new[[prefix, key].join] = value }
|
40
|
-
end
|
41
|
-
|
42
|
-
# Update field values within the current datastream using {#update_values}, which is a wrapper for {http://rdoc.info/gems/om/1.2.4/OM/XML/TermValueOperators#update_values-instance_method OM::TermValueOperators#update_values}
|
43
|
-
# Ignores any fields from params that this datastream's Terminology doesn't recognize
|
44
|
-
#
|
45
|
-
# @param [Hash] params The params specifying which fields to update and their new values. The syntax of the params Hash is the same as that expected by
|
46
|
-
# term_pointers must be a valid OM Term pointers (ie. [:name]). Strings will be ignored.
|
47
|
-
# @param [Hash] _opts This is not currently used by the datastream-level update_indexed_attributes method
|
48
|
-
#
|
49
|
-
# Example:
|
50
|
-
# @mods_ds.update_indexed_attributes( {[{":person"=>"0"}, "role"]=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"} })
|
51
|
-
# => {"person_0_role"=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"}}
|
52
|
-
#
|
53
|
-
# @mods_ds.to_xml # (the following is an approximation)
|
54
|
-
# <mods>
|
55
|
-
# <mods:name type="person">
|
56
|
-
# <mods:role>
|
57
|
-
# <mods:roleTerm>role1</mods:roleTerm>
|
58
|
-
# </mods:role>
|
59
|
-
# <mods:role>
|
60
|
-
# <mods:roleTerm>role2</mods:roleTerm>
|
61
|
-
# </mods:role>
|
62
|
-
# <mods:role>
|
63
|
-
# <mods:roleTerm>role3</mods:roleTerm>
|
64
|
-
# </mods:role>
|
65
|
-
# </mods:name>
|
66
|
-
# </mods>
|
67
|
-
def update_indexed_attributes(params = {}, _opts = {})
|
68
|
-
if self.class.terminology.nil?
|
69
|
-
raise "No terminology is set for this OmDatastream class. Cannot perform update_indexed_attributes"
|
70
|
-
end
|
71
|
-
# remove any fields from params that this datastream doesn't recognize
|
72
|
-
# make sure to make a copy of params so not to modify hash that might be passed to other methods
|
73
|
-
current_params = params.clone
|
74
|
-
current_params.delete_if do |term_pointer, new_values|
|
75
|
-
if term_pointer.is_a?(String)
|
76
|
-
ActiveFedora::Base.logger.warn "WARNING: #{self.class.name} ignoring {#{term_pointer.inspect} => #{new_values.inspect}} because #{term_pointer.inspect} is a String (only valid OM Term Pointers will be used). Make sure your html has the correct field_selector tags in it." if ActiveFedora::Base.logger
|
77
|
-
true
|
78
|
-
else
|
79
|
-
!self.class.terminology.has_term?(*OM.destringify(term_pointer))
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
result = {}
|
84
|
-
result = update_values(current_params) unless current_params.empty?
|
85
|
-
|
86
|
-
result
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_values(field_key, _default = [])
|
90
|
-
term_values(*field_key)
|
91
|
-
end
|
92
|
-
|
93
|
-
def find_by_terms(*termpointer)
|
94
|
-
super
|
95
|
-
end
|
96
|
-
|
97
|
-
# Update values in the datastream's xml
|
98
|
-
# This wraps {http://rdoc.info/gems/om/1.2.4/OM/XML/TermValueOperators#update_values-instance_method OM::TermValueOperators#update_values} so that returns an error if we have loaded from solr since datastreams loaded that way should be read-only
|
99
|
-
#
|
100
|
-
# @example Updating multiple values with a Hash of Term pointers and values
|
101
|
-
# ds.update_values( {[{":person"=>"0"}, "role", "text"]=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"}, [{:person=>1}, :family_name]=>"Andronicus", [{"person"=>"1"},:given_name]=>["Titus"],[{:person=>1},:role,:text]=>["otherrole1","otherrole2"] } )
|
102
|
-
# => {"person_0_role_text"=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"}, "person_1_role_text"=>{"0"=>"otherrole1", "1"=>"otherrole2"}}
|
103
|
-
def update_values(params = {})
|
104
|
-
raise "can't modify frozen #{self.class}" if frozen?
|
105
|
-
ng_xml_will_change!
|
106
|
-
result = om_update_values(params)
|
107
|
-
result
|
108
|
-
end
|
109
|
-
|
110
|
-
protected
|
111
|
-
|
112
|
-
# The string to prefix all solr fields with. Override this method if you want
|
113
|
-
# a prefix other than the default
|
114
|
-
def prefix(path)
|
115
|
-
path ? "#{path.underscore}__" : ''
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
@@ -1,158 +0,0 @@
|
|
1
|
-
module ActiveFedora
|
2
|
-
# This class represents a Qualified Dublin Core Datastream. A special case of ActiveFedora::OmDatastream
|
3
|
-
# The implementation of this class defines the terms from the Qualified Dublin Core specification.
|
4
|
-
# This implementation features customized xml generators and deserialization routines to handle the
|
5
|
-
# Fedora Dublin Core XML datastreams structure.
|
6
|
-
#
|
7
|
-
# Fields can still be overridden if more specificity is desired (see ActiveFedora::File#fields method).
|
8
|
-
class QualifiedDublinCoreDatastream < OmDatastream
|
9
|
-
attr_accessor :fields
|
10
|
-
class_attribute :class_fields
|
11
|
-
self.class_fields = []
|
12
|
-
|
13
|
-
set_terminology do |t|
|
14
|
-
t.root(path: "dc", xmlns: "http://purl.org/dc/terms/")
|
15
|
-
end
|
16
|
-
|
17
|
-
define_template :creator do |xml, name|
|
18
|
-
xml.creator do
|
19
|
-
xml.text(name)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# A frozen array of Dublincore Terms.
|
24
|
-
DCTERMS = [
|
25
|
-
:abstract,
|
26
|
-
:accessRights,
|
27
|
-
:accrualMethod,
|
28
|
-
:accrualPeriodicity,
|
29
|
-
:accrualPolicy,
|
30
|
-
:alternative,
|
31
|
-
:audience,
|
32
|
-
:available,
|
33
|
-
:bibliographicCitation,
|
34
|
-
:conformsTo,
|
35
|
-
:contributor,
|
36
|
-
:coverage,
|
37
|
-
:created,
|
38
|
-
:creator,
|
39
|
-
:date,
|
40
|
-
:dateAccepted,
|
41
|
-
:dateCopyrighted,
|
42
|
-
:dateSubmitted,
|
43
|
-
:description,
|
44
|
-
:educationLevel,
|
45
|
-
:extent,
|
46
|
-
:hasFormat,
|
47
|
-
:hasPart,
|
48
|
-
:hasVersion,
|
49
|
-
:identifier,
|
50
|
-
:instructionalMethod,
|
51
|
-
:isFormatOf,
|
52
|
-
:isPartOf,
|
53
|
-
:isReferencedBy,
|
54
|
-
:isReplacedBy,
|
55
|
-
:isRequiredBy,
|
56
|
-
:isVersionOf,
|
57
|
-
:issued,
|
58
|
-
:language,
|
59
|
-
:license,
|
60
|
-
:mediator,
|
61
|
-
:medium,
|
62
|
-
:modified,
|
63
|
-
:provenance,
|
64
|
-
:publisher,
|
65
|
-
:references,
|
66
|
-
:relation,
|
67
|
-
:replaces,
|
68
|
-
:requires,
|
69
|
-
:rights,
|
70
|
-
:rightsHolder,
|
71
|
-
:source,
|
72
|
-
:spatial,
|
73
|
-
:subject,
|
74
|
-
:tableOfContents,
|
75
|
-
:temporal,
|
76
|
-
:title,
|
77
|
-
:type,
|
78
|
-
:valid
|
79
|
-
].freeze # removed :format
|
80
|
-
DCTERMS.freeze
|
81
|
-
|
82
|
-
# Constructor. this class will call self.field for each DCTERM. In short, all DCTERMS fields will already exist
|
83
|
-
# when this method returns. Each term is marked as a multivalue string.
|
84
|
-
def initialize(string_or_url = nil)
|
85
|
-
super
|
86
|
-
self.fields = {}
|
87
|
-
DCTERMS.each do |el|
|
88
|
-
field el, :string, multiple: true
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# This method generates the various accessor and mutator methods on self for the datastream metadata attributes.
|
93
|
-
# each field will have the 2 magic methods:
|
94
|
-
# name=(arg)
|
95
|
-
# name
|
96
|
-
#
|
97
|
-
#
|
98
|
-
# Calling any of the generated methods marks self as dirty.
|
99
|
-
#
|
100
|
-
# 'tupe' is a datatype, currently :string, :text and :date are supported.
|
101
|
-
#
|
102
|
-
# opts is an options hash, which will affect the generation of the xml representation of this datastream.
|
103
|
-
#
|
104
|
-
# Currently supported modifiers:
|
105
|
-
# For +QualifiedDublinCorDatastreams+:
|
106
|
-
# :element_attrs =>{:foo=>:bar} - hash of xml element attributes
|
107
|
-
# :xml_node => :nodename - The xml node to be used to represent this object (in dcterms namespace)
|
108
|
-
# :encoding=>foo, or encodings_scheme - causes an xsi:type attribute to be set to 'foo'
|
109
|
-
# :multiple=>true - mark this field as a multivalue field (on by default)
|
110
|
-
#
|
111
|
-
#
|
112
|
-
# There is quite a good example of this class in use in spec/examples/oral_history.rb
|
113
|
-
#
|
114
|
-
# !! Careful: If you declare two fields that correspond to the same xml node without any qualifiers to differentiate them,
|
115
|
-
# you will end up replicating the values in the underlying datastream, resulting in mysterious dubling, quadrupling, etc.
|
116
|
-
# whenever you edit the field's values.
|
117
|
-
def field(name, tupe = nil, opts = {})
|
118
|
-
@fields[name.to_s.to_sym] = { type: tupe, values: [] }.merge(opts)
|
119
|
-
# add term to template
|
120
|
-
self.class.class_fields << name.to_s
|
121
|
-
# add term to terminology
|
122
|
-
return if self.class.terminology.has_term?(name.to_sym)
|
123
|
-
om_term_opts = { xmlns: "http://purl.org/dc/terms/", namespace_prefix: "dcterms", path: opts[:path] }
|
124
|
-
term = OM::XML::Term.new(name.to_sym, om_term_opts, self.class.terminology)
|
125
|
-
self.class.terminology.add_term(term)
|
126
|
-
term.generate_xpath_queries!
|
127
|
-
end
|
128
|
-
|
129
|
-
def update_indexed_attributes(params = {}, opts = {})
|
130
|
-
# if the params are just keys, not an array, make then into an array.
|
131
|
-
new_params = {}
|
132
|
-
params.each do |key, val|
|
133
|
-
if key.is_a? Array
|
134
|
-
new_params[key] = val
|
135
|
-
else
|
136
|
-
new_params[[key.to_sym]] = val
|
137
|
-
end
|
138
|
-
end
|
139
|
-
super(new_params, opts)
|
140
|
-
end
|
141
|
-
|
142
|
-
def self.xml_template
|
143
|
-
Nokogiri::XML::Document.parse("<dc xmlns:dcterms='http://purl.org/dc/terms/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'/>")
|
144
|
-
end
|
145
|
-
|
146
|
-
def to_solr(solr_doc = {}, _opts = {}) # :nodoc:
|
147
|
-
@fields.each do |field_key, field_info|
|
148
|
-
things = send(field_key)
|
149
|
-
next unless things
|
150
|
-
field_symbol = ActiveFedora.index_field_mapper.solr_name(field_key, type: field_info[:type])
|
151
|
-
things.val.each do |val|
|
152
|
-
::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
solr_doc
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module ActiveFedora::RDF
|
2
|
-
module DatastreamIndexing
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
def to_solr(solr_doc = {}, opts = {}) # :nodoc:
|
6
|
-
super.tap do |new_doc|
|
7
|
-
solrize_rdf_assertions(opts[:name], new_doc)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module ClassMethods
|
12
|
-
def indexer
|
13
|
-
ActiveFedora::RDF::IndexingService
|
14
|
-
end
|
15
|
-
|
16
|
-
def index_config
|
17
|
-
@index_config ||= ActiveFedora::Indexing::Map.new
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def indexing_service
|
24
|
-
@indexing_service ||= self.class.indexer.new(self)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Serialize the datastream's RDF relationships to solr
|
28
|
-
# @param [String] file_path used to prefix the keys in the solr document
|
29
|
-
# @param [Hash] solr_doc @default an empty Hash
|
30
|
-
def solrize_rdf_assertions(file_path, solr_doc = {})
|
31
|
-
solr_doc.merge! indexing_service.generate_solr_document(prefix_method(file_path))
|
32
|
-
end
|
33
|
-
|
34
|
-
# Returns a function that takes field name and returns a solr document key
|
35
|
-
def prefix_method(file_path)
|
36
|
-
->(field_name) { apply_prefix(field_name, file_path) }
|
37
|
-
end
|
38
|
-
|
39
|
-
def apply_prefix(name, file_path)
|
40
|
-
prefix(file_path) + name.to_s
|
41
|
-
end
|
42
|
-
|
43
|
-
# The string to prefix all solr fields with. Override this method if you want
|
44
|
-
# a prefix other than the default
|
45
|
-
def prefix(path)
|
46
|
-
path ? "#{path.underscore}__" : ''
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'rdf/ntriples'
|
2
|
-
|
3
|
-
module ActiveFedora
|
4
|
-
class NtriplesRDFDatastream < RDFDatastream
|
5
|
-
def serialization_format
|
6
|
-
:ntriples
|
7
|
-
end
|
8
|
-
|
9
|
-
def deprecation_warning
|
10
|
-
Deprecation.warn(NtriplesRDFDatastream, "NtriplesRDFDatastream is deprecated and will be removed in ActiveFedora 11", caller(2))
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,173 +0,0 @@
|
|
1
|
-
module ActiveFedora
|
2
|
-
class RDFDatastream < File
|
3
|
-
include ActiveTriples::NestedAttributes
|
4
|
-
include RDF::DatastreamIndexing
|
5
|
-
include ActiveTriples::Properties
|
6
|
-
include ActiveTriples::Reflection
|
7
|
-
extend Deprecation
|
8
|
-
|
9
|
-
delegate :rdf_subject, :set_value, :get_values, :attributes=, to: :resource
|
10
|
-
def initialize(*args)
|
11
|
-
super
|
12
|
-
deprecation_warning
|
13
|
-
end
|
14
|
-
|
15
|
-
def deprecation_warning
|
16
|
-
Deprecation.warn(RDFDatastream, "RDFDatastream is deprecated and will be removed in ActiveFedora 11", caller(2))
|
17
|
-
end
|
18
|
-
|
19
|
-
class << self
|
20
|
-
def rdf_subject(&block)
|
21
|
-
return @subject_block = block if block_given?
|
22
|
-
|
23
|
-
@subject_block ||= ->(ds) { parent_uri(ds) }
|
24
|
-
end
|
25
|
-
|
26
|
-
# Trim the last segment off the URI to get the parents uri
|
27
|
-
def parent_uri(ds)
|
28
|
-
m = /^(.*)\/[^\/]*$/.match(ds.uri)
|
29
|
-
if m
|
30
|
-
m[1]
|
31
|
-
else
|
32
|
-
::RDF::URI.new(nil)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
##
|
37
|
-
# @param [Class] klass an object to set as the resource class, Must be a descendant of
|
38
|
-
# ActiveTriples::Resource and include ActiveFedora::RDF::Persistence.
|
39
|
-
#
|
40
|
-
# @return [Class] the object resource class
|
41
|
-
def resource_class(klass = nil)
|
42
|
-
if klass
|
43
|
-
raise ArgumentError, "#{self} already has a resource_class #{@resource_class}, cannot redefine it to #{klass}" if @resource_class && klass != @resource_class
|
44
|
-
raise ArgumentError, "#{klass} must be a subclass of ActiveTriples::Resource" unless klass < ActiveTriples::Resource
|
45
|
-
end
|
46
|
-
|
47
|
-
@resource_class ||= begin
|
48
|
-
klass = Class.new(klass || ActiveTriples::Resource)
|
49
|
-
klass.send(:include, RDF::Persistence)
|
50
|
-
klass
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
before_save do
|
56
|
-
if content.blank?
|
57
|
-
ActiveFedora::Base.logger.warn "Cowardly refusing to save a datastream with empty content: #{inspect}" if ActiveFedora::Base.logger
|
58
|
-
if ActiveSupport.respond_to?(:halt_callback_chains_on_return_false)
|
59
|
-
# For Rails 5+
|
60
|
-
throw :abort
|
61
|
-
else
|
62
|
-
# For Rails <= 4
|
63
|
-
false
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def parent_uri
|
69
|
-
self.class.parent_uri(self)
|
70
|
-
end
|
71
|
-
|
72
|
-
def metadata?
|
73
|
-
true
|
74
|
-
end
|
75
|
-
|
76
|
-
def content
|
77
|
-
serialize
|
78
|
-
end
|
79
|
-
|
80
|
-
def content=(new_content)
|
81
|
-
resource.clear!
|
82
|
-
resource << deserialize(new_content)
|
83
|
-
content
|
84
|
-
end
|
85
|
-
|
86
|
-
def uri=(uri)
|
87
|
-
super
|
88
|
-
resource.set_subject!(parent_uri) if empty_or_blank_subject?
|
89
|
-
end
|
90
|
-
|
91
|
-
def content_changed?
|
92
|
-
return false unless instance_variable_defined? :@resource
|
93
|
-
return true if empty_or_blank_subject? # can't be serialized because a subject hasn't been assigned yet.
|
94
|
-
@content = serialize
|
95
|
-
super
|
96
|
-
end
|
97
|
-
|
98
|
-
def empty_or_blank_subject?
|
99
|
-
resource.rdf_subject.node? || resource.rdf_subject.value.blank?
|
100
|
-
end
|
101
|
-
|
102
|
-
def freeze
|
103
|
-
@resource.freeze
|
104
|
-
end
|
105
|
-
|
106
|
-
##
|
107
|
-
# The resource is the RdfResource object that stores the graph for
|
108
|
-
# the datastream and is the central point for its relationship to
|
109
|
-
# other nodes.
|
110
|
-
#
|
111
|
-
# set_value, get_value, and property accessors are delegated to this object.
|
112
|
-
def resource
|
113
|
-
@resource ||= begin
|
114
|
-
klass = self.class.resource_class
|
115
|
-
klass.properties.merge(self.class.properties).each do |_prop, config|
|
116
|
-
klass.property(config.term,
|
117
|
-
predicate: config.predicate,
|
118
|
-
class_name: config.class_name)
|
119
|
-
end
|
120
|
-
klass.accepts_nested_attributes_for(*nested_attributes_options.keys) unless nested_attributes_options.blank?
|
121
|
-
uri_stub = self.class.rdf_subject.call(self)
|
122
|
-
|
123
|
-
r = klass.new(uri_stub)
|
124
|
-
r.datastream = self
|
125
|
-
r << deserialize
|
126
|
-
r
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
alias graph resource
|
131
|
-
|
132
|
-
def refresh_attributes
|
133
|
-
@resource = nil
|
134
|
-
end
|
135
|
-
|
136
|
-
##
|
137
|
-
# This method allows for delegation.
|
138
|
-
# This patches the fact that there's no consistent API for allowing delegation - we're matching the
|
139
|
-
# OmDatastream implementation as our "consistency" point.
|
140
|
-
# @TODO: We may need to enable deep RDF delegation at one point.
|
141
|
-
def term_values(*values)
|
142
|
-
send(values.first)
|
143
|
-
end
|
144
|
-
|
145
|
-
def update_indexed_attributes(hash)
|
146
|
-
hash.each do |fields, value|
|
147
|
-
fields.each do |field|
|
148
|
-
send("#{field}=", value)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def serialize
|
154
|
-
resource.set_subject!(parent_uri) if parent_uri && rdf_subject.node?
|
155
|
-
resource.dump serialization_format
|
156
|
-
end
|
157
|
-
|
158
|
-
def deserialize(data = nil)
|
159
|
-
return ::RDF::Graph.new if new_record? && data.nil?
|
160
|
-
data ||= remote_content
|
161
|
-
|
162
|
-
# Because datastream_content can return nil, we should check that here.
|
163
|
-
return ::RDF::Graph.new if data.nil?
|
164
|
-
|
165
|
-
data.force_encoding('utf-8')
|
166
|
-
::RDF::Graph.new << ::RDF::Reader.for(serialization_format).new(data)
|
167
|
-
end
|
168
|
-
|
169
|
-
def serialization_format
|
170
|
-
raise "you must override the `serialization_format' method in a subclass"
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|