dor-services 4.25.1 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/dor-indexer +20 -19
- data/bin/dor-indexerd +3 -2
- data/config/certs/robots-dor-dev.crt +29 -0
- data/config/certs/robots-dor-dev.key +27 -0
- data/config/config_defaults.yml +0 -6
- data/config/dev_console_env.rb +65 -0
- data/config/environments/development.rb +84 -0
- data/config/environments/development.rb.old +84 -0
- data/config/environments/test.rb +84 -0
- data/lib/dor-services.rb +8 -18
- data/lib/dor/config.rb +18 -24
- data/lib/dor/datastreams/administrative_metadata_ds.rb +8 -7
- data/lib/dor/datastreams/content_metadata_ds.rb +200 -278
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
- data/lib/dor/datastreams/default_object_rights_ds.rb +10 -8
- data/lib/dor/datastreams/desc_metadata_ds.rb +30 -34
- data/lib/dor/datastreams/embargo_metadata_ds.rb +17 -13
- data/lib/dor/datastreams/events_ds.rb +12 -12
- data/lib/dor/datastreams/geo_metadata_ds.rb +3 -244
- data/lib/dor/datastreams/identity_metadata_ds.rb +34 -30
- data/lib/dor/datastreams/role_metadata_ds.rb +6 -6
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +12 -9
- data/lib/dor/datastreams/version_metadata_ds.rb +14 -33
- data/lib/dor/datastreams/workflow_definition_ds.rb +18 -18
- data/lib/dor/datastreams/workflow_ds.rb +74 -65
- data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +1 -1
- data/lib/dor/migrations/identifiable/fix_model_assertions.rb +1 -1
- data/lib/dor/migrations/identifiable/record_remediation.rb +2 -2
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/processable/unify_workflows.rb +4 -4
- data/lib/dor/migrations/versionable/add_missing_version_md.rb +1 -1
- data/lib/dor/models/admin_policy_object.rb +1 -1
- data/lib/dor/models/assembleable.rb +3 -4
- data/lib/dor/models/collection.rb +0 -2
- data/lib/dor/models/contentable.rb +34 -35
- data/lib/dor/models/describable.rb +80 -122
- data/lib/dor/models/editable.rb +57 -73
- data/lib/dor/models/embargoable.rb +13 -15
- data/lib/dor/models/eventable.rb +3 -3
- data/lib/dor/models/geoable.rb +8 -9
- data/lib/dor/models/governable.rb +36 -54
- data/lib/dor/models/identifiable.rb +119 -115
- data/lib/dor/models/item.rb +4 -4
- data/lib/dor/models/itemizable.rb +9 -9
- data/lib/dor/models/presentable.rb +133 -0
- data/lib/dor/models/preservable.rb +4 -4
- data/lib/dor/models/processable.rb +29 -28
- data/lib/dor/models/publishable.rb +36 -30
- data/lib/dor/models/releasable.rb +310 -0
- data/lib/dor/models/shelvable.rb +14 -14
- data/lib/dor/models/upgradable.rb +13 -13
- data/lib/dor/models/versionable.rb +4 -7
- data/lib/dor/models/workflow_object.rb +16 -36
- data/lib/dor/services/cleanup_reset_service.rb +28 -34
- data/lib/dor/services/cleanup_service.rb +4 -4
- data/lib/dor/services/digital_stacks_service.rb +10 -10
- data/lib/dor/services/merge_service.rb +1 -1
- data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +2 -2
- data/lib/dor/services/metadata_service.rb +20 -20
- data/lib/dor/services/registration_service.rb +26 -27
- data/lib/dor/services/reset_workspace_service.rb +15 -15
- data/lib/dor/services/sdr_ingest_service.rb +4 -4
- data/lib/dor/services/search_service.rb +4 -9
- data/lib/dor/services/suri_service.rb +5 -5
- data/lib/dor/services/technical_metadata_service.rb +3 -2
- data/lib/dor/utils/ng_tidy.rb +9 -9
- data/lib/dor/utils/predicate_patch.rb +1 -1
- data/lib/dor/utils/solr_doc_helper.rb +13 -5
- data/lib/dor/version.rb +1 -1
- data/lib/dor/workflow/document.rb +28 -30
- data/lib/dor/workflow/graph.rb +36 -36
- data/lib/dor/workflow/process.rb +12 -12
- data/lib/tasks/dor.rake +1 -1
- data/lib/tasks/rdoc.rake +3 -3
- metadata +67 -76
- data/lib/dor/datastreams/geo2mods.xsl +0 -867
- data/lib/dor/models/discoverable.rb +0 -64
- data/lib/dor/models/releaseable.rb +0 -357
- data/lib/dor/services/indexing_service.rb +0 -64
- data/lib/dor/utils/sdr_client.rb +0 -23
- data/lib/dor/utils/utc_date_field_mapper.rb +0 -7
@@ -1,11 +1,11 @@
|
|
1
1
|
module Dor
|
2
|
-
class IdentityMetadataDS < ActiveFedora::OmDatastream
|
2
|
+
class IdentityMetadataDS < ActiveFedora::OmDatastream
|
3
3
|
include SolrDocHelper
|
4
|
-
|
4
|
+
|
5
5
|
set_terminology do |t|
|
6
6
|
t.root(:path=>"identityMetadata")
|
7
|
-
t.objectId :index_as => [:searchable]
|
8
|
-
t.objectType :index_as => [:searchable, :facetable]
|
7
|
+
t.objectId :index_as => [:symbol, :searchable]
|
8
|
+
t.objectType :index_as => [:symbol, :searchable, :facetable]
|
9
9
|
t.objectLabel
|
10
10
|
t.citationCreator
|
11
11
|
t.sourceId
|
@@ -13,41 +13,41 @@ class IdentityMetadataDS < ActiveFedora::OmDatastream
|
|
13
13
|
t.name_(:path => { :attribute => 'name' })
|
14
14
|
end
|
15
15
|
t.agreementId :index_as => [:searchable, :facetable]
|
16
|
-
t.tag :index_as => [:searchable, :facetable]
|
16
|
+
t.tag :index_as => [:symbol, :searchable, :facetable]
|
17
17
|
t.citationTitle
|
18
18
|
t.objectCreator :index_as => [:searchable, :facetable]
|
19
19
|
t.adminPolicy :index_as => [:not_searchable]
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
define_template :value do |builder,name,value,attrs|
|
23
23
|
builder.send(name.to_sym, value, attrs)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def self.xml_template
|
27
27
|
Nokogiri::XML('<identityMetadata/>')
|
28
28
|
end #self.xml_template
|
29
|
-
|
30
|
-
def add_value(name, value, attrs
|
29
|
+
|
30
|
+
def add_value(name, value, attrs={})
|
31
31
|
add_child_node(ng_xml.root, :value, name, value, attrs)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def objectId
|
35
|
-
find_by_terms(:objectId).text
|
35
|
+
self.find_by_terms(:objectId).text
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def sourceId
|
39
|
-
node = find_by_terms(:sourceId).first
|
39
|
+
node = self.find_by_terms(:sourceId).first
|
40
40
|
node ? [node['source'],node.text].join(':') : nil
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def sourceId=(value)
|
44
|
-
node = find_by_terms(:sourceId).first
|
44
|
+
node = self.find_by_terms(:sourceId).first
|
45
45
|
unless value.present?
|
46
46
|
node.remove unless node.nil?
|
47
47
|
nil
|
48
48
|
else
|
49
49
|
(source,val) = value.split(/:/,2)
|
50
|
-
unless source.present?
|
50
|
+
unless source.present? and value.present?
|
51
51
|
raise ArgumentError, "Source ID must follow the format namespace:value"
|
52
52
|
end
|
53
53
|
node = ng_xml.root.add_child('<sourceId/>').first if node.nil?
|
@@ -58,13 +58,13 @@ class IdentityMetadataDS < ActiveFedora::OmDatastream
|
|
58
58
|
end
|
59
59
|
def tags()
|
60
60
|
result=[]
|
61
|
-
ng_xml.search('//tag').each do |node|
|
61
|
+
self.ng_xml.search('//tag').each do |node|
|
62
62
|
result << node.content
|
63
63
|
end
|
64
64
|
result
|
65
65
|
end
|
66
66
|
def otherId(type = nil)
|
67
|
-
result = find_by_terms(:otherId).to_a
|
67
|
+
result = self.find_by_terms(:otherId).to_a
|
68
68
|
if type.nil?
|
69
69
|
result.collect { |n| [n['name'],n.text].join(':') }
|
70
70
|
else
|
@@ -79,31 +79,35 @@ class IdentityMetadataDS < ActiveFedora::OmDatastream
|
|
79
79
|
node.content = val
|
80
80
|
node
|
81
81
|
end
|
82
|
-
|
83
|
-
def to_solr(solr_doc
|
82
|
+
|
83
|
+
def to_solr(solr_doc=Hash.new, *args)
|
84
84
|
super(solr_doc, *args)
|
85
85
|
if digital_object.respond_to?(:profile)
|
86
86
|
digital_object.profile.each_pair do |property,value|
|
87
|
-
|
87
|
+
if property =~ /Date/
|
88
|
+
add_solr_value(solr_doc, property.underscore, Time.parse(value).utc.xmlschema, :date, [:searchable, :stored_searchable])
|
89
|
+
else
|
90
|
+
add_solr_value(solr_doc, property.underscore, value, :string, [:searchable, :stored_searchable])
|
91
|
+
end
|
88
92
|
end
|
89
93
|
end
|
90
94
|
if sourceId.present?
|
91
95
|
(name,id) = sourceId.split(/:/,2)
|
92
|
-
add_solr_value(solr_doc, "dor_id", id, :string, [:searchable])
|
93
|
-
add_solr_value(solr_doc, "identifier", sourceId, :string, [:searchable])
|
94
|
-
add_solr_value(solr_doc, "source_id", sourceId, :string, [:searchable])
|
96
|
+
add_solr_value(solr_doc, "dor_id", id, :string, [:searchable, :facetable])
|
97
|
+
add_solr_value(solr_doc, "identifier", sourceId, :string, [:searchable, :facetable, :symbol])
|
98
|
+
add_solr_value(solr_doc, "source_id", sourceId, :string, [:symbol, :searchable, :facetable])
|
95
99
|
end
|
96
100
|
otherId.compact.each { |qid|
|
97
101
|
(name,id) = qid.split(/:/,2)
|
98
|
-
add_solr_value(solr_doc, "dor_id", id, :string, [:searchable])
|
99
|
-
add_solr_value(solr_doc, "identifier", qid, :string, [:searchable])
|
100
|
-
add_solr_value(solr_doc, "#{name}_id", id, :string, [:searchable])
|
102
|
+
add_solr_value(solr_doc, "dor_id", id, :string, [:searchable, :facetable])
|
103
|
+
add_solr_value(solr_doc, "identifier", qid, :string, [:searchable, :facetable, :symbol])
|
104
|
+
add_solr_value(solr_doc, "#{name}_id", id, :string, [:symbol, :searchable, :facetable])
|
101
105
|
}
|
102
|
-
|
103
|
-
find_by_terms(:tag).each { |tag|
|
106
|
+
|
107
|
+
self.find_by_terms(:tag).each { |tag|
|
104
108
|
(top,rest) = tag.text.split(/:/,2)
|
105
109
|
unless rest.nil?
|
106
|
-
add_solr_value(solr_doc, "#{top.downcase.strip.gsub(/\s/,'_')}_tag", rest.strip, :string, [:searchable, :facetable])
|
110
|
+
add_solr_value(solr_doc, "#{top.downcase.strip.gsub(/\s/,'_')}_tag", rest.strip, :string, [:symbol, :searchable, :facetable])
|
107
111
|
end
|
108
112
|
}
|
109
113
|
solr_doc
|
@@ -34,14 +34,14 @@ class RoleMetadataDS < ActiveFedora::OmDatastream
|
|
34
34
|
end
|
35
35
|
|
36
36
|
|
37
|
-
def to_solr(solr_doc
|
38
|
-
find_by_xpath('/roleMetadata/role/*').each do |actor|
|
37
|
+
def to_solr(solr_doc=Hash.new, *args)
|
38
|
+
self.find_by_xpath('/roleMetadata/role/*').each do |actor|
|
39
39
|
role_type = actor.parent['type']
|
40
40
|
val = [actor.at_xpath('identifier/@type'),actor.at_xpath('identifier/text()')].join ':'
|
41
|
-
add_solr_value(solr_doc, "apo_role_#{actor.name}_#{role_type}", val, :string, [:searchable, :facetable])
|
42
|
-
add_solr_value(solr_doc, "apo_role_#{role_type}", val, :string, [:searchable, :facetable])
|
43
|
-
|
44
|
-
add_solr_value(solr_doc, "apo_register_permissions", val, :string, [:searchable, :facetable])
|
41
|
+
add_solr_value(solr_doc, "apo_role_#{actor.name}_#{role_type}", val, :string, [:searchable, :facetable, :symbol])
|
42
|
+
add_solr_value(solr_doc, "apo_role_#{role_type}", val, :string, [:searchable, :facetable, :symbol])
|
43
|
+
if ['dor-apo-manager','dor-apo-depositor'].include? role_type
|
44
|
+
add_solr_value(solr_doc, "apo_register_permissions", val, :string, [:searchable, :facetable, :symbol])
|
45
45
|
end
|
46
46
|
end
|
47
47
|
solr_doc
|
@@ -1,10 +1,11 @@
|
|
1
|
+
module Dor
|
1
2
|
class SimpleDublinCoreDs < ActiveFedora::OmDatastream
|
2
3
|
|
3
4
|
set_terminology do |t|
|
4
5
|
t.root(:path=>"dc", :xmlns=>"http://www.openarchives.org/OAI/2.0/oai_dc/", :schema=>"http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd", :namespace_prefix => 'oai_dc', :index_as => [:not_searchable])
|
5
|
-
t.title(:index_as=>[:
|
6
|
-
t.creator(:index_as=>[:
|
7
|
-
t.identifier(:index_as=>[:
|
6
|
+
t.title( :index_as=>[:displayable, :facetable, :stored_searchable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
|
7
|
+
t.creator( :index_as=>[:displayable, :facetable, :stored_searchable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
|
8
|
+
t.identifier(:index_as=>[:displayable, :stored_searchable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
|
8
9
|
end
|
9
10
|
|
10
11
|
def self.xml_template
|
@@ -17,29 +18,31 @@ class SimpleDublinCoreDs < ActiveFedora::OmDatastream
|
|
17
18
|
}
|
18
19
|
end
|
19
20
|
|
20
|
-
builder.doc
|
21
|
+
return builder.doc
|
21
22
|
end
|
22
23
|
|
23
|
-
def to_solr(solr_doc
|
24
|
+
def to_solr(solr_doc=Hash.new, *args)
|
24
25
|
# There are a whole bunch of namespace-related things that can go
|
25
26
|
# wrong with this terminology. Until it's fixed in OM, ignore them all.
|
26
27
|
begin
|
27
28
|
doc = super solr_doc, *args
|
28
29
|
|
29
|
-
add_solr_value(doc, 'dc_title',
|
30
|
-
add_solr_value(doc, 'dc_creator', creator.first, :string, [:sortable])
|
30
|
+
add_solr_value(doc, 'dc_title', self.title.first, :string, [:sortable])
|
31
|
+
add_solr_value(doc, 'dc_creator', self.creator.first, :string, [:sortable])
|
31
32
|
|
32
33
|
identifiers = {}
|
33
34
|
|
34
|
-
identifier.each { |i| ns, val = i.split(":"); identifiers[ns] ||= val }
|
35
|
+
self.identifier.each { |i| ns, val = i.split(":"); identifiers[ns] ||= val }
|
35
36
|
|
36
37
|
identifiers.each do |ns, val|
|
37
38
|
add_solr_value(doc, "dc_identifier_#{ns}", val, :string, [:sortable])
|
38
39
|
end
|
39
40
|
|
40
41
|
return doc
|
41
|
-
rescue
|
42
|
+
rescue Exception => e
|
43
|
+
warn "ERROR in SimpleDublinCoreDs to_solr()! #{e}"
|
42
44
|
solr_doc
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
48
|
+
end
|
@@ -70,7 +70,7 @@ module Dor
|
|
70
70
|
}
|
71
71
|
}
|
72
72
|
end
|
73
|
-
builder.doc
|
73
|
+
return builder.doc
|
74
74
|
end
|
75
75
|
|
76
76
|
def ensure_non_versionable
|
@@ -107,7 +107,7 @@ module Dor
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
# @return [
|
110
|
+
# @return [Fixnum] value of the most current versionId
|
111
111
|
def current_version_id
|
112
112
|
current_version=current_version_node
|
113
113
|
if current_version.nil?
|
@@ -151,6 +151,11 @@ module Dor
|
|
151
151
|
self.content = ng_xml.to_s
|
152
152
|
end
|
153
153
|
|
154
|
+
# @return [String] The value of the greatest versionId
|
155
|
+
def current_version_id
|
156
|
+
current_version_node[:versionId].to_s
|
157
|
+
end
|
158
|
+
|
154
159
|
# @return [Boolean] returns true if the current version has a tag and a description, false otherwise
|
155
160
|
def current_version_closeable?
|
156
161
|
current = current_version_node
|
@@ -163,28 +168,27 @@ module Dor
|
|
163
168
|
|
164
169
|
# @return [String] The tag for the newest version
|
165
170
|
def current_tag
|
166
|
-
current_version_node[:tag].to_s
|
171
|
+
current_version_node[:tag].to_s
|
167
172
|
end
|
168
|
-
|
173
|
+
|
169
174
|
def tag_for_version(versionId)
|
170
|
-
nodes=ng_xml.search('//version[@versionId=\''+versionId+'\']')
|
175
|
+
nodes=self.ng_xml.search('//version[@versionId=\''+versionId+'\']')
|
171
176
|
if nodes.length == 1
|
172
177
|
nodes.first['tag'].to_s
|
173
178
|
else
|
174
179
|
''
|
175
180
|
end
|
176
181
|
end
|
177
|
-
|
178
182
|
# @return [String] The description for the specified version, or empty string if there is no description
|
179
183
|
def description_for_version(versionId)
|
180
|
-
nodes=ng_xml.search('//version[@versionId=\''+versionId+'\']')
|
181
|
-
if nodes.length == 1 &&
|
184
|
+
nodes=self.ng_xml.search('//version[@versionId=\''+versionId+'\']')
|
185
|
+
if nodes.length == 1 && nodes.first.at_xpath('description')
|
182
186
|
nodes.first.at_xpath('description').content.to_s
|
183
187
|
else
|
184
188
|
''
|
185
189
|
end
|
186
190
|
end
|
187
|
-
|
191
|
+
|
188
192
|
# @return [String] The description for the current version
|
189
193
|
def current_description
|
190
194
|
desc_node=current_version_node.at_xpath('description')
|
@@ -193,29 +197,7 @@ module Dor
|
|
193
197
|
end
|
194
198
|
''
|
195
199
|
end
|
196
|
-
|
197
|
-
# Compares the current_version with the passed in known_version (usually SDRs version)
|
198
|
-
# If the known_version is greater than the current version, then all version nodes greater than the known_version are removed,
|
199
|
-
# then the current_version is incremented. This repairs the case where a previous call to open a new verison
|
200
|
-
# updates the versionMetadata datastream, but versioningWF is not initiated. Prevents the versions from getting
|
201
|
-
# out of synch with SDR
|
202
|
-
#
|
203
|
-
# @param [Integer] known_version object version you wish to synch to, usually SDR's version
|
204
|
-
# @param [Hash] opts optional parameters
|
205
|
-
# @option opts [String] :description describes the version change
|
206
|
-
# @option opts [Symbol] :significance which part of the version tag to increment
|
207
|
-
def sync_then_increment_version known_version, opts = {}
|
208
|
-
cv = current_version_id.to_i
|
209
|
-
raise Dor::Exception.new("Cannot sync to a version greater than current: #{cv}, requested #{known_version}") if cv < known_version
|
210
|
-
|
211
|
-
while cv != known_version &&
|
212
|
-
current_version_node.remove
|
213
|
-
cv = current_version_id.to_i
|
214
|
-
end
|
215
|
-
|
216
|
-
increment_version(opts[:description], opts[:significance])
|
217
|
-
end
|
218
|
-
|
200
|
+
|
219
201
|
private
|
220
202
|
|
221
203
|
# @return [Nokogiri::XML::Node] Node representing the current version
|
@@ -228,6 +210,5 @@ module Dor
|
|
228
210
|
tags = find_by_terms(:version, :tag)
|
229
211
|
tags.map{|t| VersionTag.parse(t.value)}.max
|
230
212
|
end
|
231
|
-
|
232
213
|
end
|
233
214
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Dor
|
2
|
-
class WorkflowDefinitionDs < ActiveFedora::OmDatastream
|
2
|
+
class WorkflowDefinitionDs < ActiveFedora::OmDatastream
|
3
3
|
include SolrDocHelper
|
4
|
-
|
4
|
+
|
5
5
|
set_terminology do |t|
|
6
6
|
t.root(:path => "workflow-def", :index_as => [:not_searchable])
|
7
7
|
t.process(:index_as => [:not_searchable])
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
define_template :process do |builder,workflow,attrs|
|
11
11
|
prereqs = attrs.delete('prerequisite')
|
12
12
|
if prereqs.is_a?(String)
|
@@ -33,25 +33,25 @@ class WorkflowDefinitionDs < ActiveFedora::OmDatastream
|
|
33
33
|
def self.xml_template
|
34
34
|
Nokogiri::XML('<workflow-def/>')
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def add_process(attributes)
|
38
38
|
add_child_node(ng_xml.at_xpath('/workflow-def'), :process, self, attributes)
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def graph(parent = nil)
|
42
|
-
Workflow::Graph.from_processes(repo, name, processes, parent)
|
42
|
+
Workflow::Graph.from_processes(self.repo, self.name, self.processes, parent)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def processes
|
46
46
|
ng_xml.xpath('/workflow-def/process').collect do |node|
|
47
|
-
Workflow::Process.new(repo, name, node)
|
47
|
+
Workflow::Process.new(self.repo, self.name, node)
|
48
48
|
end.sort { |a,b| (a.sequence || 0) <=> (b.sequence || 0) }
|
49
49
|
end
|
50
50
|
|
51
51
|
def name
|
52
52
|
ng_xml.at_xpath('/workflow-def/@id').to_s
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
def repo
|
56
56
|
ng_xml.at_xpath('/workflow-def/@repository').to_s
|
57
57
|
end
|
@@ -63,17 +63,17 @@ class WorkflowDefinitionDs < ActiveFedora::OmDatastream
|
|
63
63
|
processes.each { |process| result[process.name] = process.to_hash }
|
64
64
|
result
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def configuration=(hash)
|
68
68
|
self.ng_xml = Nokogiri::XML(%{<workflow-def id="#{hash['name']}" repository="#{hash['repository']}"/>})
|
69
69
|
i = 0
|
70
|
-
hash.each_pair do |k,v|
|
70
|
+
hash.each_pair do |k,v|
|
71
71
|
if v.is_a?(Hash)
|
72
72
|
add_process(v.merge({:name => k, :sequence => i+=1}))
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
# Creates the xml used by Dor::WorkflowService.create_workflow
|
78
78
|
# @return [String] An object's initial workflow as defined by the <workflow-def> in content
|
79
79
|
def initial_workflow
|
@@ -95,19 +95,19 @@ class WorkflowDefinitionDs < ActiveFedora::OmDatastream
|
|
95
95
|
}
|
96
96
|
Nokogiri::XML(doc.to_xml) { |x| x.noblanks }.to_xml { |config| config.no_declaration }
|
97
97
|
end
|
98
|
-
|
99
|
-
def to_solr(solr_doc
|
98
|
+
|
99
|
+
def to_solr(solr_doc=Hash.new,*args)
|
100
100
|
super(solr_doc,*args)
|
101
|
-
add_solr_value(solr_doc, "workflow_name", name, :symbol, [:searchable])
|
101
|
+
add_solr_value(solr_doc, "workflow_name", self.name, :symbol, [:searchable])
|
102
102
|
processes.each do |p|
|
103
103
|
add_solr_value(solr_doc, "process", "#{p.name}|#{p.label}", :symbol, [:displayable])
|
104
104
|
end
|
105
105
|
solr_doc
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
def to_yaml
|
109
|
-
YAML.dump(configuration)
|
109
|
+
YAML.dump(self.configuration)
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
end
|
113
113
|
end
|
@@ -1,88 +1,97 @@
|
|
1
1
|
module Dor
|
2
|
-
|
3
|
-
class WorkflowDs < ActiveFedora::OmDatastream
|
4
|
-
include SolrDocHelper
|
2
|
+
class WorkflowDs < ActiveFedora::OmDatastream
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
}
|
4
|
+
set_terminology do |t|
|
5
|
+
t.root(:path=>"workflows")
|
6
|
+
t.workflow {
|
7
|
+
t.workflowId(:path=>{:attribute => "id"})
|
8
|
+
t.process {
|
9
|
+
t.name_(:path=>{:attribute=>"name"}, :index_as => [:displayable, :not_searchable])
|
10
|
+
t.status(:path=>{:attribute=>"status"}, :index_as => [:displayable, :not_searchable])
|
11
|
+
t.timestamp(:path=>{:attribute=>"datetime"}, :index_as => [:displayable, :not_searchable])#, :data_type => :date)
|
12
|
+
t.elapsed(:path=>{:attribute=>"elapsed"}, :index_as => [:displayable, :not_searchable])
|
13
|
+
t.lifecycle(:path=>{:attribute=>"lifecycle"}, :index_as => [:displayable, :not_searchable])
|
14
|
+
t.attempts(:path=>{:attribute=>"attempts"}, :index_as => [:displayable, :not_searchable])
|
18
15
|
}
|
19
|
-
|
16
|
+
}
|
17
|
+
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
def get_workflow (wf,repo='dor')
|
20
|
+
xml=Dor::WorkflowService.get_workflow_xml(repo, self.pid, wf)
|
21
|
+
xml=Nokogiri::XML(xml)
|
22
|
+
if xml.xpath('workflow').length == 0
|
23
|
+
nil
|
24
|
+
else
|
25
|
+
Workflow::Document.new(xml.to_s)
|
24
26
|
end
|
27
|
+
end
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
def [](wf)
|
30
|
+
xml=Dor::WorkflowService.get_workflow_xml('dor', self.pid, wf)
|
31
|
+
xml=Nokogiri::XML(xml)
|
32
|
+
if xml.xpath('workflow').length == 0
|
33
|
+
nil
|
34
|
+
else
|
30
35
|
Workflow::Document.new(xml.to_s)
|
31
36
|
end
|
37
|
+
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
self.xml_loaded = true
|
38
|
-
end
|
39
|
+
def ensure_xml_loaded
|
40
|
+
ng_xml
|
41
|
+
self.xml_loaded = true
|
42
|
+
end
|
39
43
|
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
def ng_xml
|
45
|
+
@ng_xml ||= Nokogiri::XML::Document.parse(content)
|
46
|
+
end
|
43
47
|
|
44
|
-
|
45
|
-
|
48
|
+
def content
|
49
|
+
begin
|
50
|
+
@content ||= Dor::WorkflowService.get_workflow_xml 'dor', self.pid, nil
|
46
51
|
rescue RestClient::ResourceNotFound
|
47
|
-
xml = Nokogiri::XML(%
|
48
|
-
digital_object.datastreams.keys.each do |dsid|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
xml = Nokogiri::XML(%{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<workflows objectId="#{self.pid}"/>})
|
53
|
+
self.digital_object.datastreams.keys.each do |dsid|
|
54
|
+
if dsid =~ /WF$/
|
55
|
+
ds_content = Nokogiri::XML(Dor::WorkflowService.get_workflow_xml 'dor', self.pid, dsid)
|
56
|
+
xml.root.add_child(ds_content.root)
|
57
|
+
end
|
52
58
|
end
|
53
59
|
@content ||= xml.to_xml
|
54
60
|
end
|
61
|
+
end
|
55
62
|
|
56
|
-
|
57
|
-
|
58
|
-
|
63
|
+
def workflows
|
64
|
+
@workflows ||= self.workflow.nodeset.collect { |wf_node| Workflow::Document.new wf_node.to_xml }
|
65
|
+
end
|
59
66
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
67
|
+
def graph(dir=nil)
|
68
|
+
result = GraphViz.digraph(self.pid)
|
69
|
+
sg = result.add_graph('rank') { |g| g[:rank => 'same'] }
|
70
|
+
workflows.each do |wf|
|
71
|
+
wf_name = wf.workflowId.first
|
72
|
+
unless wf.nil?
|
73
|
+
g = wf.graph(result)
|
74
|
+
sg.add_node(g.root.id) unless g.nil?
|
68
75
|
end
|
69
|
-
result['rankdir'] = dir || 'TB'
|
70
|
-
result
|
71
76
|
end
|
77
|
+
result['rankdir'] = dir || 'TB'
|
78
|
+
result
|
79
|
+
end
|
72
80
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
+
# Finds the first workflow that is expedited, then returns the value of its priority
|
82
|
+
#
|
83
|
+
# @return [Integer] value of the priority. Defaults to 0 if none of the workflows are expedited
|
84
|
+
def current_priority
|
85
|
+
cp = workflows.detect {|wf| wf.expedited? }
|
86
|
+
return 0 if(cp.nil?)
|
87
|
+
cp.priority.to_i
|
88
|
+
end
|
81
89
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
90
|
+
def to_solr(solr_doc=Hash.new, *args)
|
91
|
+
# super solr_doc, *args
|
92
|
+
self.workflows.each { |wf| wf.to_solr(solr_doc, *args) }
|
93
|
+
solr_doc
|
87
94
|
end
|
95
|
+
|
96
|
+
end
|
88
97
|
end
|