dor-services 4.5.0 → 4.6.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/lib/dor/models/describable.rb +79 -32
- data/lib/dor/models/publishable.rb +1 -1
- data/lib/dor/version.rb +1 -1
- metadata +2 -2
@@ -7,7 +7,7 @@ module Dor
|
|
7
7
|
"http://www.loc.gov/mods/v3" => 'mods'
|
8
8
|
}
|
9
9
|
class CrosswalkError < Exception; end
|
10
|
-
|
10
|
+
|
11
11
|
included do
|
12
12
|
has_metadata :name => "descMetadata", :type => Dor::DescMetadataDS, :label => 'Descriptive Metadata', :control_group => 'M'
|
13
13
|
end
|
@@ -31,7 +31,7 @@ module Dor
|
|
31
31
|
ds.content = ds.ng_xml.to_xml
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
# Generates Dublin Core from the MODS in the descMetadata datastream using the LoC mods2dc stylesheet
|
36
36
|
# Should not be used for the Fedora DC datastream
|
37
37
|
# @raise [Exception] Raises an Exception if the generated DC is empty or has no children
|
@@ -41,7 +41,9 @@ module Dor
|
|
41
41
|
raise CrosswalkError, "Unknown descMetadata namespace: #{metadata_namespace.inspect}"
|
42
42
|
end
|
43
43
|
xslt = Nokogiri::XSLT(File.new(File.expand_path(File.dirname(__FILE__) + "/#{format}2dc.xslt")) )
|
44
|
-
|
44
|
+
desc_md = self.descMetadata.ng_xml.dup(1)
|
45
|
+
self.add_collection_reference(desc_md)
|
46
|
+
dc_doc = xslt.transform(desc_md)
|
45
47
|
# Remove empty nodes
|
46
48
|
dc_doc.xpath('/oai_dc:dc/*[count(text()) = 0]').remove
|
47
49
|
if(dc_doc.root.nil? || dc_doc.root.children.size == 0)
|
@@ -49,54 +51,90 @@ module Dor
|
|
49
51
|
end
|
50
52
|
dc_doc
|
51
53
|
end
|
52
|
-
|
53
|
-
|
54
|
+
|
55
|
+
def generate_public_desc_md
|
56
|
+
doc = self.descMetadata.ng_xml.dup(1)
|
57
|
+
add_collection_reference(doc)
|
58
|
+
add_access_conditions(doc)
|
59
|
+
Nokogiri::XML(doc.to_xml) { |x| x.noblanks }.to_xml { |config| config.no_declaration }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Create MODS accessCondition statements from rightsMetadata
|
63
|
+
# @param [Nokogiri::XML::Document] doc Document representing the descriptiveMetadata of the object
|
64
|
+
# @note this method modifies the passed in doc
|
65
|
+
def add_access_conditions(doc)
|
66
|
+
# clear out any existing accessConditions
|
67
|
+
doc.xpath('//mods:accessCondition').each {|n| n.remove}
|
68
|
+
rights = self.datastreams['rightsMetadata'].ng_xml
|
69
|
+
|
70
|
+
rights.xpath('//use/human[@type="useAndReproduction"]').each do |use|
|
71
|
+
new_use = doc.create_element("accessCondition", use.text.strip, :type => 'useAndReproduction')
|
72
|
+
doc.root.element_children.last.add_next_sibling new_use
|
73
|
+
end
|
74
|
+
rights.xpath('//copyright/human[@type="copyright"]').each do |cr|
|
75
|
+
new_use = doc.create_element("accessCondition", cr.text.strip, :type => 'copyright')
|
76
|
+
doc.root.element_children.last.add_next_sibling new_use
|
77
|
+
end
|
78
|
+
rights.xpath("//use/machine[#{ci_compare('type', 'creativecommons')}]").each do |lic|
|
79
|
+
next if(lic.text =~ /none/i)
|
80
|
+
new_text = "CC #{lic.text} : " << rights.at_xpath("//use/human[#{ci_compare('type', 'creativecommons')}]").text.strip
|
81
|
+
new_lic = doc.create_element("accessCondition", new_text, :type => 'license')
|
82
|
+
doc.root.element_children.last.add_next_sibling new_lic
|
83
|
+
end
|
84
|
+
rights.xpath("//use/machine[#{ci_compare('type', 'opendata')}]").each do |lic|
|
85
|
+
next if(lic.text =~ /none/i)
|
86
|
+
new_text = "ODC #{lic.text} : " << rights.at_xpath("//use/human[#{ci_compare('type', 'opendata')}]").text.strip
|
87
|
+
new_lic = doc.create_element("accessCondition", new_text, :type => 'license')
|
88
|
+
doc.root.element_children.last.add_next_sibling new_lic
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# returns the desc metadata a relatedItem with information about the collection this object belongs to for use in published mods and mods to DC conversion
|
93
|
+
# @param [Nokogiri::XML::Document] doc Document representing the descriptiveMetadata of the object
|
94
|
+
# @note this method modifies the passed in doc
|
95
|
+
def add_collection_reference(doc)
|
54
96
|
if not self.methods.include? :public_relationships
|
55
|
-
return
|
97
|
+
return
|
56
98
|
end
|
57
99
|
relationships=self.public_relationships
|
58
|
-
|
59
|
-
|
100
|
+
|
60
101
|
collections=relationships.search('//rdf:RDF/rdf:Description/fedora:isMemberOfCollection','fedora' => 'info:fedora/fedora-system:def/relations-external#', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' )
|
61
102
|
#if there is an existing relatedItem node with type=host and a child typeOfResource @collection=yes dont add anything
|
62
|
-
existing_node=
|
63
|
-
if(existing_node.length>0)
|
64
|
-
return
|
103
|
+
existing_node=doc.search('//mods:relatedItem/mods:typeOfResource[@collection=\'yes\']', 'mods' => 'http://www.loc.gov/mods/v3')
|
104
|
+
if(existing_node.length > 0)
|
105
|
+
return
|
65
106
|
end
|
66
107
|
collections.each do |collection_node|
|
67
108
|
druid=collection_node['rdf:resource']
|
68
109
|
druid=druid.gsub('info:fedora/','')
|
69
110
|
collection_obj=Dor::Item.find(druid)
|
70
111
|
collection_title = Dor::Describable.get_collection_title(collection_obj)
|
71
|
-
|
72
|
-
node=node.first
|
73
|
-
related_item_node=Nokogiri::XML::Node.new('relatedItem',xml)
|
112
|
+
related_item_node=Nokogiri::XML::Node.new('relatedItem',doc)
|
74
113
|
related_item_node['type']='host'
|
75
|
-
title_info_node=Nokogiri::XML::Node.new('titleInfo',
|
76
|
-
title_node=Nokogiri::XML::Node.new('title',
|
114
|
+
title_info_node=Nokogiri::XML::Node.new('titleInfo',doc)
|
115
|
+
title_node=Nokogiri::XML::Node.new('title',doc)
|
77
116
|
title_node.content=collection_title
|
78
|
-
type_node=Nokogiri::XML::Node.new('typeOfResource',
|
117
|
+
type_node=Nokogiri::XML::Node.new('typeOfResource',doc)
|
79
118
|
type_node['collection'] = 'yes'
|
80
|
-
|
119
|
+
doc.root.add_child(related_item_node)
|
81
120
|
related_item_node.add_child(title_info_node)
|
82
121
|
title_info_node.add_child(title_node)
|
83
122
|
related_item_node.add_child(type_node)
|
84
123
|
end
|
85
|
-
Nokogiri::XML(xml.to_s) {|x| x.noblanks }.to_s
|
86
124
|
end
|
87
125
|
def metadata_namespace
|
88
126
|
desc_md = self.datastreams['descMetadata'].ng_xml
|
89
127
|
if desc_md.nil? or desc_md.root.nil? or desc_md.root.namespace.nil?
|
90
|
-
return nil
|
128
|
+
return nil
|
91
129
|
else
|
92
130
|
return desc_md.root.namespace.href
|
93
131
|
end
|
94
132
|
end
|
95
|
-
|
133
|
+
|
96
134
|
def metadata_format
|
97
135
|
DESC_MD_FORMATS[metadata_namespace]
|
98
136
|
end
|
99
|
-
|
137
|
+
|
100
138
|
def to_solr(solr_doc=Hash.new, *args)
|
101
139
|
super solr_doc, *args
|
102
140
|
add_solr_value(solr_doc, "metadata_format", self.metadata_format, :string, [:searchable, :facetable])
|
@@ -135,18 +173,18 @@ module Dor
|
|
135
173
|
end
|
136
174
|
end
|
137
175
|
def delete_identifier(type,value=nil)
|
138
|
-
|
176
|
+
|
139
177
|
ds_xml=self.descMetadata.ng_xml
|
140
|
-
ds_xml.search('//mods:identifier','mods' => 'http://www.loc.gov/mods/v3').each do |node|
|
178
|
+
ds_xml.search('//mods:identifier','mods' => 'http://www.loc.gov/mods/v3').each do |node|
|
141
179
|
if node.content == value or value==nil
|
142
180
|
node.remove
|
143
|
-
return true
|
181
|
+
return true
|
144
182
|
end
|
145
183
|
end
|
146
184
|
return false
|
147
185
|
end
|
148
|
-
|
149
|
-
def set_desc_metadata_using_label(force=false)
|
186
|
+
|
187
|
+
def set_desc_metadata_using_label(force=false)
|
150
188
|
ds=self.descMetadata
|
151
189
|
unless force or ds.new?#22 is the length of <?xml version="1.0"?>
|
152
190
|
raise 'Cannot proceed, there is already content in the descriptive metadata datastream.'+ds.content.to_s
|
@@ -158,10 +196,10 @@ module Dor
|
|
158
196
|
xml.title label
|
159
197
|
}
|
160
198
|
}
|
161
|
-
}
|
199
|
+
}
|
162
200
|
self.descMetadata.content=builder.to_xml
|
163
201
|
end
|
164
|
-
|
202
|
+
|
165
203
|
def self.get_collection_title(obj)
|
166
204
|
xml=obj.descMetadata.ng_xml
|
167
205
|
preferred_citation=xml.search('//mods:mods/mods:note[@type=\'preferredCitation\']','mods' => 'http://www.loc.gov/mods/v3')
|
@@ -177,7 +215,7 @@ module Dor
|
|
177
215
|
end
|
178
216
|
title
|
179
217
|
end
|
180
|
-
|
218
|
+
|
181
219
|
private
|
182
220
|
#generic updater useful for updating things like title or subtitle which can only have a single occurance and must be present
|
183
221
|
def update_simple_field(field,new_val)
|
@@ -188,7 +226,16 @@ module Dor
|
|
188
226
|
end
|
189
227
|
return false
|
190
228
|
end
|
191
|
-
|
192
|
-
|
229
|
+
|
230
|
+
# Builds case-insensitive xpath translate function call that will match the attribute to a value
|
231
|
+
def ci_compare(attribute, value)
|
232
|
+
"translate(
|
233
|
+
@#{attribute},
|
234
|
+
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
235
|
+
'abcdefghijklmnopqrstuvwxyz'
|
236
|
+
) = '#{value}' "
|
237
|
+
end
|
238
|
+
|
239
|
+
|
193
240
|
end
|
194
241
|
end
|
@@ -56,7 +56,7 @@ module Dor
|
|
56
56
|
DigitalStacksService.transfer_to_document_store(pid, self.datastreams['rightsMetadata'].to_xml, 'rightsMetadata')
|
57
57
|
DigitalStacksService.transfer_to_document_store(pid, public_xml, 'public')
|
58
58
|
if self.metadata_format == 'mods'
|
59
|
-
DigitalStacksService.transfer_to_document_store(pid, self.
|
59
|
+
DigitalStacksService.transfer_to_document_store(pid, self.generate_public_desc_md, 'mods')
|
60
60
|
end
|
61
61
|
else
|
62
62
|
# Clear out the document cache for this item
|
data/lib/dor/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-services
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2014-02-
|
16
|
+
date: 2014-02-28 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: active-fedora
|