dor-services 4.22.3 → 4.22.4

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.
Files changed (71) hide show
  1. checksums.yaml +8 -8
  2. data/bin/dor-indexer +19 -20
  3. data/bin/dor-indexerd +2 -3
  4. data/config/certs/robots-dor-dev.crt +29 -0
  5. data/config/certs/robots-dor-dev.key +27 -0
  6. data/config/dev_console_env.rb +77 -0
  7. data/lib/dor-services.rb +3 -3
  8. data/lib/dor/config.rb +15 -15
  9. data/lib/dor/datastreams/administrative_metadata_ds.rb +5 -5
  10. data/lib/dor/datastreams/content_metadata_ds.rb +181 -225
  11. data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
  12. data/lib/dor/datastreams/default_object_rights_ds.rb +8 -10
  13. data/lib/dor/datastreams/desc_metadata_ds.rb +35 -34
  14. data/lib/dor/datastreams/embargo_metadata_ds.rb +7 -7
  15. data/lib/dor/datastreams/events_ds.rb +11 -11
  16. data/lib/dor/datastreams/geo_metadata_ds.rb +86 -86
  17. data/lib/dor/datastreams/identity_metadata_ds.rb +19 -19
  18. data/lib/dor/datastreams/role_metadata_ds.rb +3 -3
  19. data/lib/dor/datastreams/simple_dublin_core_ds.rb +13 -13
  20. data/lib/dor/datastreams/version_metadata_ds.rb +5 -5
  21. data/lib/dor/datastreams/workflow_definition_ds.rb +21 -21
  22. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +1 -1
  23. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +1 -1
  24. data/lib/dor/migrations/identifiable/record_remediation.rb +2 -2
  25. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +1 -1
  26. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +1 -1
  27. data/lib/dor/migrations/processable/unify_workflows.rb +4 -4
  28. data/lib/dor/migrations/versionable/add_missing_version_md.rb +1 -1
  29. data/lib/dor/models/admin_policy_object.rb +1 -1
  30. data/lib/dor/models/assembleable.rb +5 -5
  31. data/lib/dor/models/contentable.rb +27 -27
  32. data/lib/dor/models/describable.rb +168 -179
  33. data/lib/dor/models/discoverable.rb +13 -13
  34. data/lib/dor/models/editable.rb +55 -55
  35. data/lib/dor/models/embargoable.rb +26 -26
  36. data/lib/dor/models/eventable.rb +3 -3
  37. data/lib/dor/models/geoable.rb +8 -8
  38. data/lib/dor/models/governable.rb +14 -14
  39. data/lib/dor/models/identifiable.rb +117 -143
  40. data/lib/dor/models/item.rb +2 -2
  41. data/lib/dor/models/itemizable.rb +9 -9
  42. data/lib/dor/models/presentable.rb +8 -8
  43. data/lib/dor/models/preservable.rb +4 -4
  44. data/lib/dor/models/processable.rb +22 -23
  45. data/lib/dor/models/releaseable.rb +26 -26
  46. data/lib/dor/models/shelvable.rb +14 -14
  47. data/lib/dor/models/upgradable.rb +13 -13
  48. data/lib/dor/models/versionable.rb +2 -2
  49. data/lib/dor/models/workflow_object.rb +4 -4
  50. data/lib/dor/services/cleanup_reset_service.rb +27 -27
  51. data/lib/dor/services/cleanup_service.rb +4 -7
  52. data/lib/dor/services/digital_stacks_service.rb +10 -10
  53. data/lib/dor/services/merge_service.rb +1 -1
  54. data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +2 -2
  55. data/lib/dor/services/metadata_service.rb +20 -20
  56. data/lib/dor/services/registration_service.rb +27 -27
  57. data/lib/dor/services/reset_workspace_service.rb +15 -15
  58. data/lib/dor/services/sdr_ingest_service.rb +6 -6
  59. data/lib/dor/services/search_service.rb +2 -2
  60. data/lib/dor/services/suri_service.rb +5 -5
  61. data/lib/dor/services/technical_metadata_service.rb +2 -3
  62. data/lib/dor/utils/ng_tidy.rb +9 -9
  63. data/lib/dor/utils/predicate_patch.rb +1 -1
  64. data/lib/dor/utils/solr_doc_helper.rb +2 -2
  65. data/lib/dor/version.rb +1 -1
  66. data/lib/dor/workflow/document.rb +19 -19
  67. data/lib/dor/workflow/graph.rb +36 -36
  68. data/lib/dor/workflow/process.rb +12 -12
  69. data/lib/tasks/dor.rake +1 -1
  70. data/lib/tasks/rdoc.rake +3 -3
  71. metadata +6 -3
@@ -1,7 +1,7 @@
1
1
  module DatastreamSpecSolrizer
2
2
  extend ActiveSupport::Concern
3
3
  include SolrDocHelper
4
-
4
+
5
5
  def datastream_spec_string
6
6
  s = begin
7
7
  controlGroup == 'E' ? content.to_s.length : size
@@ -1,20 +1,18 @@
1
1
  module Dor
2
- class DefaultObjectRightsDS < ActiveFedora::OmDatastream
2
+ class DefaultObjectRightsDS < ActiveFedora::OmDatastream
3
3
 
4
4
  set_terminology do |t|
5
5
  t.root :path => 'rightsMetadata', :index_as => [:not_searchable]
6
6
  t.copyright :path => 'copyright/human', :index_as => [:facetable]
7
7
  t.use_statement :path => '/use/human[@type=\'useAndReproduction\']', :index_as => [:facetable]
8
-
8
+
9
9
  t.use do
10
10
  t.machine
11
11
  t.human
12
12
  end
13
-
13
+
14
14
  t.creative_commons :path => '/use/machine', :type => 'creativeCommons'
15
15
  t.creative_commons_human :path => '/use/human[@type=\'creativeCommons\']'
16
-
17
-
18
16
  end
19
17
 
20
18
  define_template :creative_commons do |xml|
@@ -23,6 +21,7 @@ module Dor
23
21
  xml.machine(:type => "creativeCommons")
24
22
  }
25
23
  end
24
+
26
25
  def self.xml_template
27
26
  Nokogiri::XML::Builder.new do |xml|
28
27
  xml.rightsMetadata{
@@ -30,7 +29,7 @@ module Dor
30
29
  xml.machine{
31
30
  xml.world
32
31
  }
33
- }
32
+ }
34
33
  xml.access(:type => 'read'){
35
34
  xml.machine{
36
35
  xml.world
@@ -44,9 +43,8 @@ module Dor
44
43
  xml.copyright{
45
44
  xml.human
46
45
  }
47
-
48
- }
49
- end.doc
46
+ }
47
+ end.doc
48
+ end
50
49
  end
51
50
  end
52
- end
@@ -1,39 +1,40 @@
1
1
  module Dor
2
- class DescMetadataDS < ActiveFedora::OmDatastream
3
- include SolrDocHelper
4
-
5
- MODS_NS = 'http://www.loc.gov/mods/v3'
6
- set_terminology do |t|
7
- t.root :path => 'mods', :xmlns => MODS_NS, :index_as => [:not_searchable]
8
- t.originInfo :index_as => [:not_searchable] do
9
- t.publisher :index_as => [:searchable, :displayable]
10
- t.place :index_as => [:not_searchable] do
11
- t.placeTerm :attributes => {:type => 'text'}, :index_as => [:searchable, :displayable]
2
+ class DescMetadataDS < ActiveFedora::OmDatastream
3
+ include SolrDocHelper
4
+
5
+ MODS_NS = 'http://www.loc.gov/mods/v3'
6
+ set_terminology do |t|
7
+ t.root :path => 'mods', :xmlns => MODS_NS, :index_as => [:not_searchable]
8
+ t.originInfo :index_as => [:not_searchable] do
9
+ t.publisher :index_as => [:searchable, :displayable]
10
+ t.place :index_as => [:not_searchable] do
11
+ t.placeTerm :attributes => {:type => 'text'}, :index_as => [:searchable, :displayable]
12
+ end
12
13
  end
14
+ t.title_info(:path => 'titleInfo') {
15
+ t.main_title(:index_as => [:facetable], :path => 'title', :label => 'title') {
16
+ t.main_title_lang(:path => {:attribute => 'xml:lang'})
17
+ }
18
+ }
19
+ t.language {
20
+ t.languageTerm :attributes => {:type => 'code', :authority => 'iso639-2b'}, :index_as => [:not_searchable]
21
+ }
22
+ t.coordinates :index_as => [:searchable]
23
+ t.extent :index_as => [:searchable]
24
+ t.scale :index_as => [:searchable]
25
+ t.topic :index_as => [:searchable]
26
+ t.abstract :index_as => [:displayable]
13
27
  end
14
- t.title_info(:path=>"titleInfo") {
15
- t.main_title(:index_as=>[:facetable],:path=>"title", :label=>"title") {
16
- t.main_title_lang(:path=>{:attribute=> "xml:lang"})
17
- }
18
- }
19
- t.coordinates :index_as => [:searchable]
20
- t.extent :index_as => [:searchable]
21
- t.scale :index_as => [:searchable]
22
- t.topic :index_as => [:searchable]
23
- t.abstract :index_as=>[:displayable]
24
- end
25
-
26
- def self.xml_template
27
- Nokogiri::XML::Builder.new do |xml|
28
- xml.mods( 'xmlns' => 'http://www.loc.gov/mods/v3', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',:version => '3.3', "xsi:schemaLocation" => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd'){
29
- xml.titleInfo{
30
- xml.title
31
- }
32
- }
33
- end.doc
34
- end
35
-
36
-
37
28
 
38
- end
29
+ def self.xml_template
30
+ Nokogiri::XML::Builder.new do |xml|
31
+ xml.mods( 'xmlns' => MODS_NS, 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', :version => '3.3', 'xsi:schemaLocation' => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd'){
32
+ xml.titleInfo{
33
+ xml.title
34
+ }
35
+ }
36
+ end.doc
37
+ end
38
+
39
+ end
39
40
  end
@@ -24,13 +24,13 @@ class EmbargoMetadataDS < ActiveFedora::OmDatastream
24
24
  xml.twentyPctVisibilityReleaseDate
25
25
  }
26
26
  end
27
- return builder.doc
27
+ builder.doc
28
28
  end
29
29
 
30
30
  def to_solr solr_doc = {}, *args
31
31
  super
32
- add_solr_value(solr_doc, 'embargo_release_date', self.release_date.utc.strftime('%FT%TZ') , :date, [:searchable]) rescue nil
33
- add_solr_value(solr_doc, 'twenty_pct_visibility_release_date', self.twenty_pct_release_date.utc.strftime('%FT%TZ') , :date, [:searchable]) rescue nil
32
+ add_solr_value(solr_doc, 'embargo_release_date', release_date.utc.strftime('%FT%TZ') , :date, [:searchable]) rescue nil
33
+ add_solr_value(solr_doc, 'twenty_pct_visibility_release_date', twenty_pct_release_date.utc.strftime('%FT%TZ') , :date, [:searchable]) rescue nil
34
34
 
35
35
  solr_doc
36
36
  end
@@ -54,9 +54,9 @@ class EmbargoMetadataDS < ActiveFedora::OmDatastream
54
54
 
55
55
  # Sets the release date. Converts the date to beginning-of-day, UTC to help with Solr indexing
56
56
  # @param [Time] rd A Time object represeting the release date. By default, it is set to now
57
- def release_date=(rd=Time.now)
58
- update_values([:release_date] => rd.beginning_of_day.utc.xmlschema)
59
- self.content=self.ng_xml.to_s
57
+ def release_date=(rd = Time.now)
58
+ update_values([:release_date] => rd.beginning_of_day.utc.xmlschema)
59
+ self.content=ng_xml.to_s
60
60
  end
61
61
 
62
62
  # Current releaseDate value
@@ -76,7 +76,7 @@ class EmbargoMetadataDS < ActiveFedora::OmDatastream
76
76
 
77
77
  # Sets the 20% visibility release date. Converts the date to beginning-of-day, UTC to help with Solr indexing
78
78
  # @param [Time] rd A Time object represeting the release date. By default, it is set to now
79
- def twenty_pct_release_date=(rd=Time.now)
79
+ def twenty_pct_release_date=(rd = Time.now)
80
80
  update_values([:twenty_pct_release_date] => rd.beginning_of_day.utc.xmlschema)
81
81
  content_will_change!
82
82
  end
@@ -1,7 +1,7 @@
1
1
  module Dor
2
2
  class EventsDS < ActiveFedora::OmDatastream
3
3
  before_create :ensure_non_versionable
4
-
4
+
5
5
  set_terminology do |t|
6
6
  t.root(:path => "events")
7
7
  t.event do
@@ -11,30 +11,30 @@ class EventsDS < ActiveFedora::OmDatastream
11
11
  t.message :path => "text()", :index_as => [:displayable, :not_searchable]
12
12
  end
13
13
  end
14
-
15
- # Default EventsDS xml
14
+
15
+ # Default EventsDS xml
16
16
  def self.xml_template
17
17
  builder = Nokogiri::XML::Builder.new do |xml|
18
18
  xml.events
19
19
  end
20
- return builder.doc
20
+ builder.doc
21
21
  end
22
-
22
+
23
23
  def ensure_non_versionable
24
24
  self.versionable = "false"
25
25
  end
26
-
26
+
27
27
  # Adds an event to the datastream
28
28
  # @param [String] type a tag used to group events together. Sets the type attribute for the event
29
29
  # @param [String] who who is responsible for this event. Sets the who attribute for the event
30
30
  # @param [String] message what happened. Sets the content of the event with this message
31
31
  def add_event(type, who, message)
32
- ev = ng_xml.create_element "event", message,
32
+ ev = ng_xml.create_element "event", message,
33
33
  :type => type, :who => who, :when => Time.now.xmlschema
34
34
  ng_xml.root.add_child(ev)
35
35
  content_will_change!
36
36
  end
37
-
37
+
38
38
  # Finds events with the desired type attribute
39
39
  # @param [String] tag events where type == tag will be returned
40
40
  # @yield [who, timestamp, message] The values of the current event
@@ -46,7 +46,7 @@ class EventsDS < ActiveFedora::OmDatastream
46
46
  block.call(node['who'], Time.parse(node['when']), node.content)
47
47
  end
48
48
  end
49
-
49
+
50
50
  # Returns all the events in the datastream
51
51
  # @yield [type, who, timestamp, message] The values of the current event
52
52
  # @yieldparam [String] type tag for this particular event. Value of the 'type' attribute
@@ -58,6 +58,6 @@ class EventsDS < ActiveFedora::OmDatastream
58
58
  block.call(node['type'], node['who'], Time.parse(node['when']), node.content)
59
59
  end
60
60
  end
61
-
61
+
62
+ end
62
63
  end
63
- end
@@ -9,11 +9,11 @@ module Dor
9
9
  # The datastream is packaged using RDF to identify the optional ISO 19139 feature catalog
10
10
  # @see http://www.isotc211.org
11
11
  # @author Darren Hardy
12
- class GeoMetadataDS < ActiveFedora::NokogiriDatastream
12
+ class GeoMetadataDS < ActiveFedora::NokogiriDatastream
13
13
  include SolrDocHelper
14
-
14
+
15
15
  attr_accessor :geometryType, :zipName, :purl
16
-
16
+
17
17
  # namespaces
18
18
  NS = {
19
19
  :rdf => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
@@ -21,75 +21,74 @@ module Dor
21
21
  :gmd => 'http://www.isotc211.org/2005/gmd',
22
22
  :gfc => 'http://www.isotc211.org/2005/gfc'
23
23
  }
24
-
24
+
25
25
  # hash with all namespaces
26
26
  XMLNS = Hash[NS.map {|k,v| ["xmlns:#{k}", v]}]
27
-
27
+
28
28
  # schema locations
29
29
  NS_XSD = NS.keys.collect {|k| "#{NS[k]} #{NS[k]}/#{k}.xsd"}
30
30
 
31
31
  # [Nokogiri::XSLT::Stylesheet] for ISO 19139 to MODS
32
32
  XSLT_GEOMODS = Nokogiri::XSLT(File.read(
33
- File.join(
34
- File.dirname(__FILE__), 'geo2mods.xsl')))
35
-
33
+ File.join(
34
+ File.dirname(__FILE__), 'geo2mods.xsl')))
35
+
36
36
  XSLT_DC = Nokogiri::XSLT(File.new(
37
- File.expand_path(
38
- File.dirname(__FILE__) + '/../models/mods2dc.xslt')))
39
-
37
+ File.expand_path(
38
+ File.dirname(__FILE__) + '/../models/mods2dc.xslt')))
39
+
40
40
  # @see http://ruby-doc.org/gems/docs/o/om-1.8.0/OM/XML/Document/ClassMethods.html#method-i-set_terminology
41
41
  set_terminology do |t|
42
- t.root :path => '/rdf:RDF/rdf:Description/gmd:MD_Metadata',
43
- 'xmlns:gmd' => NS[:gmd],
44
- 'xmlns:gco' => NS[:gco],
42
+ t.root :path => '/rdf:RDF/rdf:Description/gmd:MD_Metadata',
43
+ 'xmlns:gmd' => NS[:gmd],
44
+ 'xmlns:gco' => NS[:gco],
45
45
  'xmlns:rdf' => NS[:rdf]
46
46
 
47
47
  t.id_ :path => '/rdf:RDF/rdf:Description[1]/@rdf:about'
48
48
 
49
49
  p = './'
50
- t.dataset_id :path => p + 'gmd:dataSetURI/gco:CharacterString'
51
- t.file_id :path => p + 'gmd:fileIdentifier/gco:CharacterString'
52
- t.metadata_dt :path => p + 'gmd:dateStamp/gco:Date/text()' # XXX: Allow DateTime
50
+ t.dataset_id :path => p + 'gmd:dataSetURI/gco:CharacterString'
51
+ t.file_id :path => p + 'gmd:fileIdentifier/gco:CharacterString'
52
+ t.metadata_dt :path => p + 'gmd:dateStamp/gco:Date/text()' # XXX: Allow DateTime
53
53
  t.metadata_language :path => p + 'gmd:MD_Metadata/gmd:language/gmd:LanguageCode[@codeSpace="ISO639-2"]/@codeListValue'
54
54
 
55
55
  p = 'gmd:identificationInfo/gmd:MD_DataIdentification/'
56
- t.abstract :path => p + 'gmd:abstract/gco:CharacterString/text()'
57
- t.purpose :path => p + 'gmd:purpose/gco:CharacterString/text()'
56
+ t.abstract :path => p + 'gmd:abstract/gco:CharacterString/text()'
57
+ t.purpose :path => p + 'gmd:purpose/gco:CharacterString/text()'
58
58
  t.publisher :path => p + 'gmd:pointOfContact/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode/@codeListValue="pointOfContact"]/gmd:organisationName/gco:CharacterString/text()'
59
59
 
60
60
  p = 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/'
61
- t.title :path => p + 'gmd:title/gco:CharacterString/text()'
61
+ t.title :path => p + 'gmd:title/gco:CharacterString/text()'
62
62
  t.publish_dt :path => p + 'gmd:date/gmd:CI_Date/gmd:date/gco:Date/text()'
63
63
  t.originator :path => p + 'gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode/@codeListValue="originator"]/gmd:organisationName/gco:CharacterString/text()'
64
64
 
65
65
  p = 'gmd:distributionInfo/gmd:MD_Distribution/gmd:distributionFormat/gmd:MD_Format/'
66
66
  t.format :path => p + 'gmd:name/gco:CharacterString/text()'#, :index_as => [:facetable]
67
-
67
+
68
68
  p = 'gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/'
69
69
  t.layername :path => p + 'gmd:name/gco:CharacterString/text()'
70
-
70
+
71
71
  # XXX should define projection as codeSpace + ':' + code in terminology
72
72
  p = 'gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/'
73
- t.projection :path => p + 'gmd:code/gco:CharacterString/text()'
73
+ t.projection :path => p + 'gmd:code/gco:CharacterString/text()'
74
74
  t.projection_code_space :path => p + 'gmd:codeSpace/gco:CharacterString/text()'
75
75
  end
76
-
76
+
77
77
  # @return [Nokogiri::XML::Document] with gmd:MD_Metadata as root node
78
78
  # @raise [Dor::ParameterError] if MD_Metadata is missing
79
79
  def metadata
80
80
  root = ng_xml.xpath('/rdf:RDF/rdf:Description/gmd:MD_Metadata', XMLNS)
81
- if root.nil? or root.empty?
82
- raise Dor::ParameterError, "Invalid geoMetadata -- missing MD_Metadata: #{root}"
81
+ if root.nil? || root.empty?
82
+ raise Dor::ParameterError, "Invalid geoMetadata -- missing MD_Metadata: #{root}"
83
83
  else
84
84
  Nokogiri::XML(root.first.to_xml)
85
85
  end
86
86
  end
87
-
88
- # @return [Nokogiri::XML::Document] with gfc:FC_FeatureCatalogue as root node,
89
- # or nil if not provided
87
+
88
+ # @return [Nokogiri::XML::Document] with gfc:FC_FeatureCatalogue as root node or nil if not provided
90
89
  def feature_catalogue
91
90
  root = ng_xml.xpath('/rdf:RDF/rdf:Description/gfc:FC_FeatureCatalogue', XMLNS)
92
- if root.nil? or root.empty?
91
+ if root.nil? || root.empty?
93
92
  nil # Feature catalog is optional
94
93
  else
95
94
  Nokogiri::XML(root.first.to_xml)
@@ -101,7 +100,7 @@ module Dor
101
100
  # Includes all possible xmlns for gmd and gfc
102
101
  def self.xml_template
103
102
  Nokogiri::XML::Builder.new do |xml|
104
- xml['rdf'].RDF XMLNS,
103
+ xml['rdf'].RDF XMLNS,
105
104
  'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
106
105
  "xsi:schemaLocation" => NS_XSD.join(' ') do
107
106
  xml['rdf'].Description 'rdf:about' => nil do
@@ -122,21 +121,21 @@ module Dor
122
121
  # Uses GML SimpleFeatures for the geometry type (e.g., Polygon, LineString, etc.)
123
122
  # @see http://portal.opengeospatial.org/files/?artifact_id=25355
124
123
  #
125
- def to_mods(params = {})
126
- params = params.merge({
124
+ def to_mods(params = {})
125
+ params = params.merge({
127
126
  'geometryType' => "'#{@geometryType.nil?? 'Polygon' : @geometryType}'",
128
127
  'zipName' => "'#{@zipName.nil?? 'data.zip' : @zipName}'",
129
128
  'purl' => "'#{@purl}'"
130
129
  })
131
130
  doc = XSLT_GEOMODS.transform(metadata.document, params.to_a.flatten)
132
- unless doc.root and doc.root.children.size > 0
131
+ unless doc.root && doc.root.children.size > 0
133
132
  raise CrosswalkError, 'to_mods produced incorrect xml'
134
133
  end
135
134
  # ap doc
136
- doc.xpath('/mods:mods' +
137
- '/mods:subject' +
138
- '/mods:cartographics' +
139
- '/mods:projection',
135
+ doc.xpath('/mods:mods' +
136
+ '/mods:subject' +
137
+ '/mods:cartographics' +
138
+ '/mods:projection',
140
139
  'xmlns:mods' => Dor::DescMetadataDS::MODS_NS).each do |e|
141
140
  # Retrieve this mapping from config file
142
141
  case e.content.downcase
@@ -149,62 +148,63 @@ module Dor
149
148
  doc.xpath('/mods:mods' +
150
149
  '/mods:subject' +
151
150
  '/mods:cartographics' +
152
- '/mods:coordinates',
151
+ '/mods:coordinates',
153
152
  'xmlns:mods' => Dor::DescMetadataDS::MODS_NS).each do |e|
154
153
  e.content = '(' + self.class.to_coordinates_ddmmss(e.content.to_s) + ')'
155
154
  end
156
155
  doc
157
156
  end
158
-
157
+
159
158
  def to_dublin_core
160
159
  XSLT_DC.transform(to_mods)
161
160
  end
162
-
161
+
163
162
  # @deprecated stub for GeoBlacklight (not Argo -- use to_solr as usual)
164
- def to_solr_spatial(solr_doc=Hash.new, *args)
163
+ def to_solr_spatial(solr_doc = {}, *args)
165
164
  # There are a whole bunch of namespace-related things that can go
166
165
  # wrong with this terminology. Until it's fixed in OM, ignore them all.
167
166
  begin
168
- doc = solr_doc#super solr_doc, *args
167
+ doc = solr_doc # super solr_doc, *args
169
168
  bb = to_bbox
170
169
  ap({:doc => doc, :bb => bb, :self => self}) if $DEBUG
170
+ # self is required once below, because format is a keyword
171
171
  {
172
- :id => self.id.first,
173
- :druid => URI(self.id.first).path.gsub(%r{^/}, ''),
174
- :file_id_s => self.file_id.first,
172
+ :id => id.first,
173
+ :druid => URI(id.first).path.gsub(%r{^/}, ''),
174
+ :file_id_s => file_id.first,
175
175
  :geo_bbox => to_solr_bbox,
176
176
  :geo_data_type_s => 'vector',
177
- :geo_format_s => self.format.first,
177
+ :geo_format_s => self.format.first, # rubocop:disable Style/RedundantSelf
178
178
  :geo_geometry_type_s => 'Polygon',
179
- :geo_layername_s => File.basename(self.layername.first, '.shp'),
179
+ :geo_layername_s => File.basename(layername.first, '.shp'),
180
180
  :geo_ne_pt => Dor::GeoMetadataDS.to_wkt([bb.e, bb.n]),
181
181
  :geo_pt => to_solr_centroid,
182
182
  :geo_sw_pt => Dor::GeoMetadataDS.to_wkt([bb.w, bb.s]),
183
- :geo_proj => self.projection.first,
183
+ :geo_proj => projection.first,
184
184
  :dc_coverage_t => to_dc_coverage,
185
- :dc_creator_t => self.originator.first,
186
- :dc_date_i => self.publish_dt.map {|i| i.to_s[0..3]},
187
- :dc_description_t => [self.abstract.first, self.purpose.first].join(";\n"),
185
+ :dc_creator_t => originator.first,
186
+ :dc_date_i => publish_dt.map {|i| i.to_s[0..3]},
187
+ :dc_description_t => [abstract.first, purpose.first].join(";\n"),
188
188
  :dc_format_s => 'application/x-esri-shapefile',
189
- :dc_language_s => self.metadata_language.first,
190
- :dc_title_t => self.title.first,
191
- :text => [self.title.first, self.abstract.first, self.purpose.first].join(";\n")
189
+ :dc_language_s => metadata_language.first,
190
+ :dc_title_t => title.first,
191
+ :text => [title.first, abstract.first, purpose.first].join(";\n")
192
192
  }.each do |id, v|
193
193
  ::Solrizer::Extractor.insert_solr_field_value(doc, id.to_s, v)
194
194
  end
195
195
 
196
196
  return doc
197
- rescue
197
+ rescue
198
198
  solr_doc
199
199
  end
200
200
  end
201
-
202
- # @return [Struct] in minX minY maxX maxY order
201
+
202
+ # @return [Struct] in minX minY maxX maxY order
203
203
  # with .w, .e, .n., .s for west, east, north, south as floats
204
204
  def to_bbox
205
205
  params = { 'xmlns:gmd' => NS[:gmd], 'xmlns:gco' => NS[:gco] }
206
206
  bb = metadata.xpath(
207
- '//gmd:EX_Extent/gmd:geographicElement' +
207
+ '//gmd:EX_Extent/gmd:geographicElement' +
208
208
  '/gmd:EX_GeographicBoundingBox', params).first
209
209
  Struct.new(:w, :e, :n, :s).new(
210
210
  bb.xpath('gmd:westBoundLongitude/gco:Decimal', params).text.to_f,
@@ -213,17 +213,17 @@ module Dor
213
213
  bb.xpath('gmd:southBoundLatitude/gco:Decimal', params).text.to_f
214
214
  )
215
215
  end
216
-
216
+
217
217
  # @return [Array<Numeric>] (x y) coordinates of center point - assumes #to_bbox
218
218
  # @see http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
219
219
  def to_centroid
220
220
  bb = to_bbox
221
221
  [ (bb.w + bb.e)/2, (bb.n + bb.s)/2 ]
222
222
  end
223
-
223
+
224
224
  # A lat-lon rectangle can be indexed with 4 numbers in minX minY maxX maxY order:
225
- #
226
- # <field name="geo">-74.093 41.042 -69.347 44.558</field>
225
+ #
226
+ # <field name="geo">-74.093 41.042 -69.347 44.558</field>
227
227
  # <field name="geo">POLYGON((...))</field>
228
228
  #
229
229
  # @param [Symbol] either :solr3 or :solr4
@@ -231,7 +231,7 @@ module Dor
231
231
  # @see http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
232
232
  def to_solr_bbox format = :solr4
233
233
  bb = to_bbox
234
-
234
+
235
235
  case format
236
236
  when :solr3
237
237
  [bb.w, bb.s, bb.e, bb.n].join(' ')
@@ -241,39 +241,39 @@ module Dor
241
241
  raise ArgumentError, "Unsupported format #{format}"
242
242
  end
243
243
  end
244
-
244
+
245
245
  # @return [String] in Dublin Core Coverage format
246
246
  def to_dc_coverage
247
247
  bb = to_bbox
248
248
  "x.min=#{bb.w} x.max=#{bb.e} y.min=#{bb.s} y.max=#{bb.n}"
249
249
  end
250
-
250
+
251
251
  # A lat-lon point for the centroid of the bounding box:
252
- #
253
- # <field name="geo">69.4325,-78.085007</field>
252
+ #
253
+ # <field name="geo">69.4325,-78.085007</field>
254
254
  # <field name="geo">POINT(-78.085007 69.4325)</field>
255
255
  #
256
256
  # @param [Symbol] either :solr3 or :solr4
257
257
  # @return [String] minX minY maxX maxY for :solr3 or POLYGON((...)) for :solr4
258
258
  # @see http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
259
-
259
+
260
260
  # @return [String] (y,x) coordinates of center point matching the LatLonType Solr type
261
261
  # @see http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
262
262
  def to_solr_centroid format = :solr4
263
263
  x, y = to_centroid
264
-
264
+
265
265
  case format
266
266
  when :solr3
267
- [y,x].join(',') # for solr.LatLonType
267
+ [y, x].join(',') # for solr.LatLonType
268
268
  when :solr4
269
269
  Dor::GeoMetadataDS.to_wkt [x, y]
270
270
  else
271
271
  raise ArgumentError, "Unsupported format #{format}"
272
272
  end
273
273
  end
274
-
275
- private
276
-
274
+
275
+ # Class Methods
276
+
277
277
  # @param [Array<Numeric>] (x,y) coordinates for point or bounding box
278
278
  # @return [String] WKT for point or rectangle
279
279
  def self.to_wkt xy, xy2 = nil
@@ -287,23 +287,23 @@ module Dor
287
287
  "POINT(#{xy[0]} #{xy[1]})"
288
288
  end
289
289
  end
290
-
290
+
291
291
  # Convert to MARC 255 DD into DDMMSS
292
292
  # westernmost longitude, easternmost longitude, northernmost latitude, and southernmost latitude
293
293
  # e.g., -109.758319 -- -88.990844/48.999336 -- 29.423028
294
294
  def self.to_coordinates_ddmmss s
295
295
  w, e, n, s = s.scanf('%f -- %f/%f -- %f')
296
- raise ArgumentError, "Out of bounds latitude: #{n} #{s}" unless n >= -90 and n <= 90 and s >= -90 and s <= 90
297
- raise ArgumentError, "Out of bounds longitude: #{w} #{e}" unless w >= -180 and w <= 180 and e >= -180 and e <= 180
296
+ raise ArgumentError, "Out of bounds latitude: #{n} #{s}" unless n >= -90 && n <= 90 && s >= -90 && s <= 90
297
+ raise ArgumentError, "Out of bounds longitude: #{w} #{e}" unless w >= -180 && w <= 180 && e >= -180 && e <= 180
298
298
  w = "#{w < 0 ? 'W' : 'E'} #{Dor::GeoMetadataDS::dd2ddmmss_abs w}"
299
299
  e = "#{e < 0 ? 'W' : 'E'} #{Dor::GeoMetadataDS::dd2ddmmss_abs e}"
300
300
  n = "#{n < 0 ? 'S' : 'N'} #{Dor::GeoMetadataDS::dd2ddmmss_abs n}"
301
301
  s = "#{s < 0 ? 'S' : 'N'} #{Dor::GeoMetadataDS::dd2ddmmss_abs s}"
302
302
  "#{w}--#{e}/#{n}--#{s}"
303
303
  end
304
-
304
+
305
305
  # Convert DD.DD to DD MM SS.SS
306
- # e.g.,
306
+ # e.g.,
307
307
  # * -109.758319 => 109°45ʹ29.9484ʺ
308
308
  # * 48.999336 => 48°59ʹ57.609ʺ
309
309
  E = 1
@@ -312,13 +312,13 @@ module Dor
312
312
  QDEG = "\u00B0"
313
313
  def self.dd2ddmmss_abs f
314
314
  dd = f.to_f.abs
315
- d = dd.floor
316
- mm = ((dd - d) * 60)
317
- m = mm.floor
318
- s = ((mm - mm.floor) * 60).round
319
- m, s = m+1, 0 if s >= 60
320
- d, m = d+1, 0 if m >= 60
321
- "#{d}#{QDEG}" + (m>0 ? "#{m}#{QMIN}" : '') + (s>0 ? "#{s}#{QSEC}" : '')
315
+ d = dd.floor
316
+ mm = (dd - d) * 60
317
+ m = mm.floor
318
+ s = ((mm - mm.floor) * 60).round
319
+ m, s = m + 1, 0 if s >= 60
320
+ d, m = d + 1, 0 if m >= 60
321
+ "#{d}#{QDEG}" + (m > 0 ? "#{m}#{QMIN}" : '') + (s > 0 ? "#{s}#{QSEC}" : '')
322
322
  end
323
323
  end
324
324
  end