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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dor-indexer +20 -19
  3. data/bin/dor-indexerd +3 -2
  4. data/config/certs/robots-dor-dev.crt +29 -0
  5. data/config/certs/robots-dor-dev.key +27 -0
  6. data/config/config_defaults.yml +0 -6
  7. data/config/dev_console_env.rb +65 -0
  8. data/config/environments/development.rb +84 -0
  9. data/config/environments/development.rb.old +84 -0
  10. data/config/environments/test.rb +84 -0
  11. data/lib/dor-services.rb +8 -18
  12. data/lib/dor/config.rb +18 -24
  13. data/lib/dor/datastreams/administrative_metadata_ds.rb +8 -7
  14. data/lib/dor/datastreams/content_metadata_ds.rb +200 -278
  15. data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
  16. data/lib/dor/datastreams/default_object_rights_ds.rb +10 -8
  17. data/lib/dor/datastreams/desc_metadata_ds.rb +30 -34
  18. data/lib/dor/datastreams/embargo_metadata_ds.rb +17 -13
  19. data/lib/dor/datastreams/events_ds.rb +12 -12
  20. data/lib/dor/datastreams/geo_metadata_ds.rb +3 -244
  21. data/lib/dor/datastreams/identity_metadata_ds.rb +34 -30
  22. data/lib/dor/datastreams/role_metadata_ds.rb +6 -6
  23. data/lib/dor/datastreams/simple_dublin_core_ds.rb +12 -9
  24. data/lib/dor/datastreams/version_metadata_ds.rb +14 -33
  25. data/lib/dor/datastreams/workflow_definition_ds.rb +18 -18
  26. data/lib/dor/datastreams/workflow_ds.rb +74 -65
  27. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +1 -1
  28. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +1 -1
  29. data/lib/dor/migrations/identifiable/record_remediation.rb +2 -2
  30. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +1 -1
  31. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +1 -1
  32. data/lib/dor/migrations/processable/unify_workflows.rb +4 -4
  33. data/lib/dor/migrations/versionable/add_missing_version_md.rb +1 -1
  34. data/lib/dor/models/admin_policy_object.rb +1 -1
  35. data/lib/dor/models/assembleable.rb +3 -4
  36. data/lib/dor/models/collection.rb +0 -2
  37. data/lib/dor/models/contentable.rb +34 -35
  38. data/lib/dor/models/describable.rb +80 -122
  39. data/lib/dor/models/editable.rb +57 -73
  40. data/lib/dor/models/embargoable.rb +13 -15
  41. data/lib/dor/models/eventable.rb +3 -3
  42. data/lib/dor/models/geoable.rb +8 -9
  43. data/lib/dor/models/governable.rb +36 -54
  44. data/lib/dor/models/identifiable.rb +119 -115
  45. data/lib/dor/models/item.rb +4 -4
  46. data/lib/dor/models/itemizable.rb +9 -9
  47. data/lib/dor/models/presentable.rb +133 -0
  48. data/lib/dor/models/preservable.rb +4 -4
  49. data/lib/dor/models/processable.rb +29 -28
  50. data/lib/dor/models/publishable.rb +36 -30
  51. data/lib/dor/models/releasable.rb +310 -0
  52. data/lib/dor/models/shelvable.rb +14 -14
  53. data/lib/dor/models/upgradable.rb +13 -13
  54. data/lib/dor/models/versionable.rb +4 -7
  55. data/lib/dor/models/workflow_object.rb +16 -36
  56. data/lib/dor/services/cleanup_reset_service.rb +28 -34
  57. data/lib/dor/services/cleanup_service.rb +4 -4
  58. data/lib/dor/services/digital_stacks_service.rb +10 -10
  59. data/lib/dor/services/merge_service.rb +1 -1
  60. data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +2 -2
  61. data/lib/dor/services/metadata_service.rb +20 -20
  62. data/lib/dor/services/registration_service.rb +26 -27
  63. data/lib/dor/services/reset_workspace_service.rb +15 -15
  64. data/lib/dor/services/sdr_ingest_service.rb +4 -4
  65. data/lib/dor/services/search_service.rb +4 -9
  66. data/lib/dor/services/suri_service.rb +5 -5
  67. data/lib/dor/services/technical_metadata_service.rb +3 -2
  68. data/lib/dor/utils/ng_tidy.rb +9 -9
  69. data/lib/dor/utils/predicate_patch.rb +1 -1
  70. data/lib/dor/utils/solr_doc_helper.rb +13 -5
  71. data/lib/dor/version.rb +1 -1
  72. data/lib/dor/workflow/document.rb +28 -30
  73. data/lib/dor/workflow/graph.rb +36 -36
  74. data/lib/dor/workflow/process.rb +12 -12
  75. data/lib/tasks/dor.rake +1 -1
  76. data/lib/tasks/rdoc.rake +3 -3
  77. metadata +67 -76
  78. data/lib/dor/datastreams/geo2mods.xsl +0 -867
  79. data/lib/dor/models/discoverable.rb +0 -64
  80. data/lib/dor/models/releaseable.rb +0 -357
  81. data/lib/dor/services/indexing_service.rb +0 -64
  82. data/lib/dor/utils/sdr_client.rb +0 -23
  83. 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? && value.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 = Hash.new, *args)
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
- add_solr_value(solr_doc, property.underscore, value, property =~ /Date/ ? :date : :string, [:searchable])
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 = Hash.new, *args)
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
- unless role_type =~ /^hydrus/
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=>[:searchable, :displayable, :facetable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
6
- t.creator(:index_as=>[:searchable, :displayable, :facetable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
7
- t.identifier(:index_as=>[:searchable, :displayable], :xmlns => "http://purl.org/dc/elements/1.1/", :namespace_prefix => 'dc')
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 = Hash.new, *args)
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', title.first, :string, [:sortable])
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 [String] value of the most current versionId
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 && nodes.first.at_xpath('description')
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 = Hash.new,*args)
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
- # TODO: class docs
3
- class WorkflowDs < ActiveFedora::OmDatastream
4
- include SolrDocHelper
2
+ class WorkflowDs < ActiveFedora::OmDatastream
5
3
 
6
- set_terminology do |t|
7
- t.root(:path => 'workflows')
8
- t.workflow {
9
- t.workflowId( :path => {:attribute => 'id'} )
10
- t.process {
11
- t.name_( :path => {:attribute => 'name' }, :index_as => [:displayable, :not_searchable] )
12
- t.status( :path => {:attribute => 'status' }, :index_as => [:displayable, :not_searchable] )
13
- t.timestamp(:path => {:attribute => 'datetime' }, :index_as => [:displayable, :not_searchable] )#, :data_type => :date)
14
- t.elapsed( :path => {:attribute => 'elapsed' }, :index_as => [:displayable, :not_searchable] )
15
- t.lifecycle(:path => {:attribute => 'lifecycle'}, :index_as => [:displayable, :not_searchable] )
16
- t.attempts( :path => {:attribute => 'attempts' }, :index_as => [:displayable, :not_searchable] )
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
- end
16
+ }
17
+ end
20
18
 
21
- def initialize(*args)
22
- self.field_mapper = UtcDateFieldMapper.new
23
- super
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
- def get_workflow(wf, repo = 'dor')
27
- xml = Dor::WorkflowService.get_workflow_xml(repo, pid, wf)
28
- xml = Nokogiri::XML(xml)
29
- return nil if xml.xpath('workflow').length == 0
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
- alias :[] :get_workflow
34
-
35
- def ensure_xml_loaded
36
- ng_xml
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
- def ng_xml
41
- @ng_xml ||= Nokogiri::XML::Document.parse(content)
42
- end
44
+ def ng_xml
45
+ @ng_xml ||= Nokogiri::XML::Document.parse(content)
46
+ end
43
47
 
44
- def content
45
- @content ||= Dor::WorkflowService.get_workflow_xml 'dor', pid, nil
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(%(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<workflows objectId="#{pid}"/>))
48
- digital_object.datastreams.keys.each do |dsid|
49
- next unless dsid =~ /WF$/
50
- ds_content = Nokogiri::XML(Dor::WorkflowService.get_workflow_xml 'dor', pid, dsid)
51
- xml.root.add_child(ds_content.root)
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
- def workflows
57
- @workflows ||= workflow.nodeset.collect { |wf_node| Workflow::Document.new wf_node.to_xml }
58
- end
63
+ def workflows
64
+ @workflows ||= self.workflow.nodeset.collect { |wf_node| Workflow::Document.new wf_node.to_xml }
65
+ end
59
66
 
60
- def graph(dir = nil)
61
- result = GraphViz.digraph(pid)
62
- sg = result.add_graph('rank') { |g| g[:rank => 'same'] }
63
- workflows.each do |wf|
64
- unless wf.nil?
65
- g = wf.graph(result)
66
- sg.add_node(g.root.id) unless g.nil?
67
- end
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
- # Finds the first workflow that is expedited, then returns the value of its priority
74
- #
75
- # @return [Integer] value of the priority. Defaults to 0 if none of the workflows are expedited
76
- def current_priority
77
- cp = workflows.detect &:expedited?
78
- return 0 if cp.nil?
79
- cp.priority.to_i
80
- end
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
- def to_solr(solr_doc = {}, *args)
83
- # super solr_doc, *args
84
- workflows.each { |wf| wf.to_solr(solr_doc, *args) }
85
- solr_doc
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