Skip to content

Commit

Permalink
Align behavior of server managed properties with Fedora.
Browse files Browse the repository at this point in the history
Fedora's criteria for determining if a property is server managed has been more selective than Valkyrie's.
Relevant docs and code:
https://wiki.lyrasis.org/display/FEDORA6x/Server+Managed+Triples
https://github.com/fcrepo/fcrepo/blob/1cae11d1bfb1fda3ddd39f0ab8c01f780f3c3432/fcrepo-kernel-api/src/main/java/org/fcrepo/kernel/api/RdfLexicon.java#L74-L75

The spec is based on the needs of the Hyrax ResourceStatus service.
  • Loading branch information
dlpierce committed Nov 13, 2024
1 parent b1b9f7a commit 8e55af3
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/valkyrie/persistence/fedora/persister/orm_converter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ class DenylistedValue < ::Valkyrie::ValueMapper
# @param [Property] value
# @return [Boolean]
def self.handles?(value)
value.statement.object.to_s.start_with?("http://www.w3.org/ns/ldp", "http://fedora.info")
value.statement.predicate == RDF.type &&
value.statement.object.to_s.start_with?('http://www.w3.org/ns/ldp#', 'http://fedora.info/definitions/v4/repository#')
end

# Provide the NullApplicator Class for any Property in a deny listed namespace
Expand Down Expand Up @@ -562,7 +563,7 @@ def cast_array(values)
# @return [Array<String>]
def denylist
[
"http://fedora.info/definitions",
"http://fedora.info/definitions/v4/repository#",
"http://www.iana.org/assignments/relation/last"
]
end
Expand Down
55 changes: 55 additions & 0 deletions spec/valkyrie/persistence/fedora/persister_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,61 @@ class CustomResource < Valkyrie::Resource
end
end

context "saving a server managed predicate" do
before do
raise 'persister must be set with `let(:persister)`' unless defined? persister
class CustomResource < Valkyrie::Resource
attribute :test_managed
end
end
after do
Object.send(:remove_const, :CustomResource)
end
let(:resource_class) { CustomResource }
let(:adapter) do
Valkyrie::Persistence::Fedora::MetadataAdapter.new(
**fedora_adapter_config(
base_path: "test_fed",
schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new(test_managed: RDF::Vocab::Fcrepo4.created),
fedora_version: version
)
)
end

it "raises an error" do
expect { persister.save(resource: resource_class.new(test_managed: 'whatever')) }.to raise_error ::Ldp::Conflict
end
end

context "saving a fedora.info predicate that is not managed" do
before do
raise 'persister must be set with `let(:persister)`' unless defined? persister
class CustomResource < Valkyrie::Resource
attribute :state, Valkyrie::Types::URI
end
end
after do
Object.send(:remove_const, :CustomResource)
end
let(:resource_class) { CustomResource }
let(:adapter) do
Valkyrie::Persistence::Fedora::MetadataAdapter.new(
**fedora_adapter_config(
base_path: "test_fed",
schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new(
state: RDF::URI('http://fedora.info/definitions/1/0/access/ObjState#objState')
),
fedora_version: version
)
)
end

it "succeeds" do
id = persister.save(resource: resource_class.new(state: RDF::URI('http://fedora.info/definitions/1/0/access/ObjState#inactive'))).id
expect(query_service.find_by(id: id).state).to eq RDF::URI('http://fedora.info/definitions/1/0/access/ObjState#inactive')
end
end

context "when given an alternate identifier" do
before do
raise 'persister must be set with `let(:persister)`' unless defined? persister
Expand Down

0 comments on commit 8e55af3

Please sign in to comment.