active-fedora 9.1.2 → 9.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +1 -0
- data/History.txt +90 -0
- data/active-fedora.gemspec +2 -2
- data/lib/active_fedora.rb +17 -3
- data/lib/active_fedora/associations.rb +77 -0
- data/lib/active_fedora/associations/association.rb +2 -2
- data/lib/active_fedora/associations/basic_contains_association.rb +52 -0
- data/lib/active_fedora/associations/builder/directly_contains.rb +23 -0
- data/lib/active_fedora/associations/builder/directly_contains_one.rb +44 -0
- data/lib/active_fedora/associations/builder/has_and_belongs_to_many.rb +2 -23
- data/lib/active_fedora/associations/builder/indirectly_contains.rb +26 -0
- data/lib/active_fedora/associations/builder/property.rb +10 -0
- data/lib/active_fedora/associations/collection_association.rb +42 -45
- data/lib/active_fedora/associations/collection_proxy.rb +6 -0
- data/lib/active_fedora/associations/contained_finder.rb +41 -0
- data/lib/active_fedora/associations/container_proxy.rb +9 -0
- data/lib/active_fedora/associations/contains_association.rb +20 -38
- data/lib/active_fedora/associations/delete_proxy.rb +28 -0
- data/lib/active_fedora/associations/directly_contains_association.rb +56 -0
- data/lib/active_fedora/associations/directly_contains_one_association.rb +113 -0
- data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +6 -14
- data/lib/active_fedora/associations/has_many_association.rb +0 -3
- data/lib/active_fedora/associations/id_composite.rb +30 -0
- data/lib/active_fedora/associations/indirectly_contains_association.rb +90 -0
- data/lib/active_fedora/associations/rdf.rb +8 -4
- data/lib/active_fedora/associations/record_composite.rb +39 -0
- data/lib/active_fedora/attached_files.rb +1 -1
- data/lib/active_fedora/attributes.rb +28 -10
- data/lib/active_fedora/attributes/active_triple_attribute.rb +17 -0
- data/lib/active_fedora/attributes/om_attribute.rb +29 -0
- data/lib/active_fedora/attributes/rdf_datastream_attribute.rb +47 -0
- data/lib/active_fedora/attributes/stream_attribute.rb +46 -0
- data/lib/active_fedora/autosave_association.rb +2 -2
- data/lib/active_fedora/base.rb +3 -0
- data/lib/active_fedora/containers/container.rb +38 -0
- data/lib/active_fedora/containers/direct_container.rb +5 -0
- data/lib/active_fedora/containers/indirect_container.rb +7 -0
- data/lib/active_fedora/core.rb +4 -48
- data/lib/active_fedora/delegated_attribute.rb +5 -98
- data/lib/active_fedora/fedora.rb +1 -1
- data/lib/active_fedora/fedora_attributes.rb +4 -26
- data/lib/active_fedora/file.rb +87 -159
- data/lib/active_fedora/file/attributes.rb +63 -0
- data/lib/active_fedora/file/streaming.rb +46 -0
- data/lib/active_fedora/file_relation.rb +7 -0
- data/lib/active_fedora/identifiable.rb +87 -0
- data/lib/active_fedora/inbound_relation_connection.rb +21 -0
- data/lib/active_fedora/indexers.rb +10 -0
- data/lib/active_fedora/indexers/global_indexer.rb +30 -0
- data/lib/active_fedora/indexers/null_indexer.rb +12 -0
- data/lib/active_fedora/indexing/map.rb +4 -5
- data/lib/active_fedora/indexing_service.rb +3 -22
- data/lib/active_fedora/loadable_from_json.rb +8 -0
- data/lib/active_fedora/pathing.rb +24 -0
- data/lib/active_fedora/persistence.rb +15 -8
- data/lib/active_fedora/rdf.rb +2 -0
- data/lib/active_fedora/rdf/fcrepo4.rb +1 -0
- data/lib/active_fedora/rdf/field_map.rb +90 -0
- data/lib/active_fedora/rdf/field_map_entry.rb +28 -0
- data/lib/active_fedora/rdf/indexing_service.rb +9 -23
- data/lib/active_fedora/rdf/rdf_datastream.rb +1 -2
- data/lib/active_fedora/reflection.rb +16 -15
- data/lib/active_fedora/relation/delegation.rb +15 -4
- data/lib/active_fedora/relation/finder_methods.rb +4 -4
- data/lib/active_fedora/schema.rb +26 -0
- data/lib/active_fedora/schema_indexing_strategy.rb +25 -0
- data/lib/active_fedora/simple_datastream.rb +2 -2
- data/lib/active_fedora/solr_query_builder.rb +3 -2
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/with_metadata.rb +1 -1
- data/spec/integration/associations/rdf_spec.rb +49 -0
- data/spec/integration/base_spec.rb +19 -0
- data/spec/integration/belongs_to_association_spec.rb +6 -6
- data/spec/integration/collection_association_spec.rb +4 -4
- data/spec/integration/complex_rdf_datastream_spec.rb +12 -12
- data/spec/integration/datastream_rdf_nested_attributes_spec.rb +1 -1
- data/spec/integration/direct_container_spec.rb +254 -0
- data/spec/integration/directly_contains_one_association_spec.rb +102 -0
- data/spec/integration/file_spec.rb +16 -5
- data/spec/integration/has_many_associations_spec.rb +93 -58
- data/spec/integration/indirect_container_spec.rb +251 -0
- data/spec/integration/rdf_nested_attributes_spec.rb +1 -1
- data/spec/integration/relation_spec.rb +43 -27
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/attributes_spec.rb +6 -6
- data/spec/unit/collection_proxy_spec.rb +28 -0
- data/spec/unit/file_spec.rb +1 -1
- data/spec/unit/files_hash_spec.rb +4 -4
- data/spec/unit/has_and_belongs_to_many_association_spec.rb +11 -9
- data/spec/unit/indexers/global_indexer_spec.rb +41 -0
- data/spec/unit/indexing_service_spec.rb +0 -21
- data/spec/unit/loadable_from_json_spec.rb +31 -0
- data/spec/unit/pathing_spec.rb +37 -0
- data/spec/unit/rdf/indexing_service_spec.rb +3 -3
- data/spec/unit/rdf_resource_datastream_spec.rb +26 -7
- data/spec/unit/schema_indexing_strategy_spec.rb +68 -0
- data/spec/unit/solr_query_builder_spec.rb +1 -1
- data/spec/unit/solr_service_spec.rb +1 -1
- metadata +49 -8
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
|
3
|
+
# Attributes delegated to ActiveTriples. Allows ActiveFedora to track all attributes consistently.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# class Book < ActiveFedora::Base
|
7
|
+
# property :title, predicate: ::RDF::DC.title
|
8
|
+
# property :author, predicate: ::RDF::DC.creator
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# Book.attribute_names
|
12
|
+
# => ["title", "author"]
|
13
|
+
|
14
|
+
class ActiveTripleAttribute < DelegatedAttribute
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
|
3
|
+
# Class for attributes that are delegated to an OmDatastream
|
4
|
+
|
5
|
+
class OmAttribute < StreamAttribute
|
6
|
+
|
7
|
+
# @param [ActiveFedora::Base] obj the object that has the attribute
|
8
|
+
# @param [Object] v value to write to the attribute
|
9
|
+
def writer(obj, v)
|
10
|
+
ds = file_for_attribute(obj, delegate_target)
|
11
|
+
obj.mark_as_changed(field) if obj.value_has_changed?(field, v)
|
12
|
+
terminology = at || [field]
|
13
|
+
ds.send(:update_indexed_attributes, {terminology => v})
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [ActiveFedora::Base] obj the object that has the attribute
|
17
|
+
# @param [Object] opts extra options that are passed to the target reader
|
18
|
+
def reader(obj, *opts)
|
19
|
+
ds = file_for_attribute(obj, delegate_target)
|
20
|
+
terminology = at || [field]
|
21
|
+
if terminology.length == 1 && opts.present?
|
22
|
+
ds.send(terminology.first, *opts)
|
23
|
+
else
|
24
|
+
ds.send(:term_values, *terminology)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
|
3
|
+
# Class for attributes that are delegated to a RDFDatastream
|
4
|
+
|
5
|
+
class RdfDatastreamAttribute < StreamAttribute
|
6
|
+
|
7
|
+
# @param [ActiveFedora::Base] obj the object that has the attribute
|
8
|
+
# @param [Object] v value to write to the attribute
|
9
|
+
def writer(obj, v)
|
10
|
+
node = file_for_attribute(obj, delegate_target)
|
11
|
+
obj.mark_as_changed(field) if obj.value_has_changed?(field, v)
|
12
|
+
term = if at
|
13
|
+
vals = at.dup
|
14
|
+
while vals.length > 1
|
15
|
+
node = node.send(vals.shift)
|
16
|
+
node = node.build if node.empty?
|
17
|
+
node = node.first
|
18
|
+
end
|
19
|
+
vals.first
|
20
|
+
else
|
21
|
+
field
|
22
|
+
end
|
23
|
+
node.send("#{term}=", v)
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param [ActiveFedora::Base] obj the object that has the attribute
|
27
|
+
def reader(obj)
|
28
|
+
node = file_for_attribute(obj, delegate_target)
|
29
|
+
term = if at
|
30
|
+
vals = at.dup
|
31
|
+
while vals.length > 1
|
32
|
+
node = node.send(vals.shift)
|
33
|
+
node = if node.empty?
|
34
|
+
node.build
|
35
|
+
else
|
36
|
+
node.first
|
37
|
+
end
|
38
|
+
end
|
39
|
+
vals.first
|
40
|
+
else
|
41
|
+
field
|
42
|
+
end
|
43
|
+
node.send(term)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
|
3
|
+
# Abstract class for attributes that are delegated to a serialized representation such as a NonRDFSource
|
4
|
+
#
|
5
|
+
# @abstract
|
6
|
+
# @attr [String] delegate_target
|
7
|
+
# @attr [String] at
|
8
|
+
# @attr [String] target_class
|
9
|
+
|
10
|
+
class StreamAttribute < DelegatedAttribute
|
11
|
+
|
12
|
+
attr_accessor :delegate_target, :at, :target_class
|
13
|
+
|
14
|
+
# @param [Symbol] field the field to find or create
|
15
|
+
# @param [Hash] args
|
16
|
+
# @option args [String] :delegate_target the path to the delegate
|
17
|
+
# @option args [Class] :klass the class to create
|
18
|
+
# @option args [true,false] :multiple (false) true for multi-value fields
|
19
|
+
# @option args [Array<Symbol>] :at path to a deep node
|
20
|
+
def initialize(field, args={})
|
21
|
+
super
|
22
|
+
self.delegate_target = args.fetch(:delegate_target)
|
23
|
+
self.target_class = args.fetch(:klass)
|
24
|
+
self.at = args.fetch(:at, nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Gives the primary solr name for a column. If there is more than one indexer on the field definition, it gives the first
|
28
|
+
def primary_solr_name
|
29
|
+
@datastream ||= target_class.new
|
30
|
+
raise NoMethodError, "the file '#{target_class}' doesn't respond to 'primary_solr_name'" unless @datastream.respond_to?(:primary_solr_name)
|
31
|
+
@datastream.primary_solr_name(field, delegate_target)
|
32
|
+
end
|
33
|
+
|
34
|
+
def type
|
35
|
+
raise NoMethodError, "the file '#{target_class}' doesn't respond to 'type'" unless target_class.respond_to?(:type)
|
36
|
+
target_class.type(field)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def file_for_attribute(obj, delegate_target)
|
42
|
+
obj.attached_files[delegate_target] || raise(ArgumentError, "Undefined file: `#{delegate_target}' in property #{field}")
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -75,7 +75,7 @@ module ActiveFedora
|
|
75
75
|
module AutosaveAssociation
|
76
76
|
extend ActiveSupport::Concern
|
77
77
|
|
78
|
-
ASSOCIATION_TYPES = %w{ HasMany BelongsTo HasAndBelongsToMany }
|
78
|
+
ASSOCIATION_TYPES = %w{ HasMany BelongsTo HasAndBelongsToMany DirectlyContains IndirectlyContains}
|
79
79
|
|
80
80
|
module AssociationBuilderExtension #:nodoc:
|
81
81
|
def self.included(base)
|
@@ -305,7 +305,7 @@ module ActiveFedora
|
|
305
305
|
saved = record.save(:validate => !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
|
306
306
|
|
307
307
|
if association.updated?
|
308
|
-
self[reflection.
|
308
|
+
self[reflection.foreign_key] = record.id
|
309
309
|
association.loaded!
|
310
310
|
end
|
311
311
|
|
data/lib/active_fedora/base.rb
CHANGED
@@ -30,6 +30,7 @@ module ActiveFedora
|
|
30
30
|
extend LdpCache::ClassMethods
|
31
31
|
|
32
32
|
include Core
|
33
|
+
include Identifiable
|
33
34
|
include Persistence
|
34
35
|
include Indexing
|
35
36
|
include Scoping
|
@@ -49,6 +50,8 @@ module ActiveFedora
|
|
49
50
|
include Attributes
|
50
51
|
include Versionable
|
51
52
|
include LoadableFromJson
|
53
|
+
include Schema
|
54
|
+
include Pathing
|
52
55
|
end
|
53
56
|
|
54
57
|
ActiveSupport.run_load_hooks(:active_fedora, Base)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
# This is the base class for ldp containers, it is not an ldp:BasicContainer
|
3
|
+
class Container < ActiveFedora::Base
|
4
|
+
|
5
|
+
property :membership_resource, predicate: ::RDF::Vocab::LDP.membershipResource
|
6
|
+
property :has_member_relation, predicate: ::RDF::Vocab::LDP.hasMemberRelation
|
7
|
+
property :is_member_of_relation, predicate: ::RDF::Vocab::LDP.isMemberOfRelation
|
8
|
+
property :contained, predicate: ::RDF::Vocab::LDP.contains
|
9
|
+
|
10
|
+
def parent
|
11
|
+
@parent || raise("Parent hasn't been set on #{self.class}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def parent=(parent)
|
15
|
+
@parent = parent
|
16
|
+
self.membership_resource = [::RDF::URI(parent.uri)]
|
17
|
+
end
|
18
|
+
|
19
|
+
def mint_id
|
20
|
+
"#{id}/#{SecureRandom.uuid}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.find_or_initialize(id)
|
24
|
+
find(id)
|
25
|
+
rescue ActiveFedora::ObjectNotFoundError
|
26
|
+
new(id)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# Don't allow directly setting contained
|
32
|
+
def contained=(*args)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
data/lib/active_fedora/core.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module ActiveFedora
|
2
2
|
module Core
|
3
|
+
extend ActiveSupport::Autoload
|
3
4
|
extend ActiveSupport::Concern
|
4
5
|
|
6
|
+
autoload :FedoraIdTranslator
|
7
|
+
autoload :FedoraUriTranslator
|
8
|
+
|
5
9
|
included do
|
6
10
|
##
|
7
11
|
# :singleton-method:
|
@@ -9,30 +13,6 @@ module ActiveFedora
|
|
9
13
|
# Accepts a logger conforming to the interface of Log4r which can be
|
10
14
|
# retrieved on both a class and instance level by calling +logger+.
|
11
15
|
mattr_accessor :logger, instance_writer: false
|
12
|
-
|
13
|
-
##
|
14
|
-
# :singleton-method
|
15
|
-
#
|
16
|
-
# Accepts a proc that takes an id and transforms it to a URI
|
17
|
-
mattr_reader :translate_id_to_uri do
|
18
|
-
FedoraIdTranslator
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.translate_id_to_uri=(translator)
|
22
|
-
@@translate_id_to_uri = translator || FedoraIdTranslator
|
23
|
-
end
|
24
|
-
|
25
|
-
##
|
26
|
-
# :singleton-method
|
27
|
-
#
|
28
|
-
# Accepts a proc that takes a uri and transforms it to an id
|
29
|
-
mattr_reader :translate_uri_to_id do
|
30
|
-
FedoraUriTranslator
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.translate_uri_to_id=(translator)
|
34
|
-
@@translate_uri_to_id = translator || FedoraUriTranslator
|
35
|
-
end
|
36
16
|
end
|
37
17
|
|
38
18
|
def ldp_source
|
@@ -141,30 +121,6 @@ module ActiveFedora
|
|
141
121
|
name
|
142
122
|
end
|
143
123
|
|
144
|
-
##
|
145
|
-
# Transforms an id into a uri
|
146
|
-
# if translate_id_to_uri is set it uses that proc, otherwise just the default
|
147
|
-
def id_to_uri(id)
|
148
|
-
translate_id_to_uri.call(id)
|
149
|
-
end
|
150
|
-
|
151
|
-
##
|
152
|
-
# Transforms a uri into an id
|
153
|
-
# if translate_uri_to_id is set it uses that proc, otherwise just the default
|
154
|
-
def uri_to_id(uri)
|
155
|
-
translate_uri_to_id.call(uri)
|
156
|
-
end
|
157
|
-
|
158
|
-
##
|
159
|
-
# Provides the common interface for ActiveTriples::Identifiable
|
160
|
-
def from_uri(uri,_)
|
161
|
-
begin
|
162
|
-
self.find(uri_to_id(uri))
|
163
|
-
rescue ActiveFedora::ObjectNotFoundError, Ldp::Gone
|
164
|
-
ActiveTriples::Resource.new(uri)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
124
|
private
|
169
125
|
|
170
126
|
def relation
|
@@ -1,106 +1,13 @@
|
|
1
1
|
module ActiveFedora
|
2
|
-
# Represents the mapping between a model attribute and a
|
2
|
+
# Represents the mapping between a model attribute and a property
|
3
3
|
class DelegatedAttribute
|
4
4
|
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :field, :multiple
|
6
6
|
|
7
|
-
def initialize(field,
|
7
|
+
def initialize(field, args={})
|
8
8
|
self.field = field
|
9
|
-
self.
|
10
|
-
self.datastream_class = datastream_class
|
11
|
-
self.multiple = args[:multiple].nil? ? false : args[:multiple]
|
12
|
-
self.at = args[:at]
|
9
|
+
self.multiple = args.fetch(:multiple, false)
|
13
10
|
end
|
14
|
-
|
15
|
-
# Gives the primary solr name for a column. If there is more than one indexer on the field definition, it gives the first
|
16
|
-
def primary_solr_name
|
17
|
-
@datastream ||= datastream_class.new
|
18
|
-
if @datastream.respond_to?(:primary_solr_name)
|
19
|
-
@datastream.primary_solr_name(field, dsid)
|
20
|
-
else
|
21
|
-
raise NoMethodError, "the datastream '#{datastream_class}' doesn't respond to 'primary_solr_name'"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def type
|
26
|
-
if datastream_class.respond_to?(:type)
|
27
|
-
datastream_class.type(field)
|
28
|
-
else
|
29
|
-
raise NoMethodError, "the datastream '#{datastream_class}' doesn't respond to 'type'"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def writer(obj, v)
|
34
|
-
ds = datastream_for_attribute(obj, dsid)
|
35
|
-
obj.mark_as_changed(field) if obj.value_has_changed?(field, v)
|
36
|
-
if ds.kind_of?(ActiveFedora::RDFDatastream)
|
37
|
-
write_rdf(ds, v)
|
38
|
-
else
|
39
|
-
write_om(ds, v)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def reader(obj, *opts)
|
44
|
-
ds = datastream_for_attribute(obj, dsid)
|
45
|
-
if ds.kind_of?(ActiveFedora::RDFDatastream)
|
46
|
-
read_rdf(ds)
|
47
|
-
else
|
48
|
-
read_om(ds, *opts)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def write_om(ds, v)
|
55
|
-
terminology = at || [field]
|
56
|
-
ds.send(:update_indexed_attributes, {terminology => v})
|
57
|
-
end
|
58
|
-
|
59
|
-
def read_om(ds, *opts)
|
60
|
-
terminology = at || [field]
|
61
|
-
if terminology.length == 1 && opts.present?
|
62
|
-
ds.send(terminology.first, *opts)
|
63
|
-
else
|
64
|
-
ds.send(:term_values, *terminology)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def write_rdf(node, v)
|
69
|
-
term = if at
|
70
|
-
vals = at.dup
|
71
|
-
while vals.length > 1
|
72
|
-
node = node.send(vals.shift)
|
73
|
-
node = node.build if node.empty?
|
74
|
-
node = node.first
|
75
|
-
end
|
76
|
-
vals.first
|
77
|
-
else
|
78
|
-
field
|
79
|
-
end
|
80
|
-
node.send("#{term}=", v)
|
81
|
-
end
|
82
|
-
|
83
|
-
def read_rdf(node)
|
84
|
-
term = if at
|
85
|
-
vals = at.dup
|
86
|
-
while vals.length > 1
|
87
|
-
node = node.send(vals.shift)
|
88
|
-
node = if node.empty?
|
89
|
-
node.build
|
90
|
-
else
|
91
|
-
node.first
|
92
|
-
end
|
93
|
-
end
|
94
|
-
vals.first
|
95
|
-
else
|
96
|
-
field
|
97
|
-
end
|
98
|
-
node.send(term)
|
99
|
-
end
|
100
|
-
|
101
|
-
def datastream_for_attribute(obj, dsid)
|
102
|
-
obj.attached_files[dsid] || raise(ArgumentError, "Undefined datastream id: `#{dsid}' in has_attributes")
|
103
|
-
end
|
104
|
-
|
11
|
+
|
105
12
|
end
|
106
13
|
end
|
data/lib/active_fedora/fedora.rb
CHANGED
@@ -29,31 +29,6 @@ module ActiveFedora
|
|
29
29
|
resource.set_value(*args)
|
30
30
|
end
|
31
31
|
|
32
|
-
def id
|
33
|
-
if uri.kind_of?(::RDF::URI) && uri.value.blank?
|
34
|
-
nil
|
35
|
-
elsif uri.present?
|
36
|
-
self.class.uri_to_id(URI.parse(uri))
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def id=(id)
|
41
|
-
raise "ID has already been set to #{self.id}" if self.id
|
42
|
-
@ldp_source = build_ldp_resource(id.to_s)
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
# TODO: Remove after we no longer support #pid.
|
47
|
-
def pid
|
48
|
-
Deprecation.warn FedoraAttributes, "#{self.class}#pid is deprecated and will be removed in active-fedora 10.0. Use #{self.class}#id instead."
|
49
|
-
id
|
50
|
-
end
|
51
|
-
|
52
|
-
def uri
|
53
|
-
# TODO could we return a RDF::URI instead?
|
54
|
-
uri = @ldp_source.try(:subject_uri)
|
55
|
-
uri.value == '' ? uri : uri.to_s
|
56
|
-
end
|
57
32
|
|
58
33
|
##
|
59
34
|
# The resource is the RdfResource object that stores the graph for
|
@@ -62,7 +37,10 @@ module ActiveFedora
|
|
62
37
|
#
|
63
38
|
# set_value, get_value, and property accessors are delegated to this object.
|
64
39
|
def resource
|
65
|
-
|
40
|
+
# Appending the graph at the end is necessary because adding it as the
|
41
|
+
# parent leaves behind triples not related to the ldp_source's rdf
|
42
|
+
# subject.
|
43
|
+
@resource ||= self.class.resource_class.new(@ldp_source.graph.rdf_subject, @ldp_source.graph) << @ldp_source.graph
|
66
44
|
end
|
67
45
|
|
68
46
|
# You can set the URI to use for the rdf_label on ClassMethods.rdf_label, then on
|