dor-services 2.2.4 → 4.4.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +15 -0
  2. data/bin/dor-indexer +108 -0
  3. data/bin/dor-indexerd +73 -0
  4. data/bin/nokogiri +19 -0
  5. data/bin/rake +19 -0
  6. data/bin/ruby_noexec_wrapper +14 -0
  7. data/bin/solrizer +19 -0
  8. data/bin/solrizerd +19 -0
  9. data/config/certs/README +1 -0
  10. data/config/config_defaults.yml +62 -0
  11. data/config/dev_console_env.rb.example +67 -0
  12. data/config/predicate_mappings.yml +55 -0
  13. data/lib/dor-services.rb +152 -19
  14. data/lib/dor/config.rb +133 -35
  15. data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
  16. data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
  17. data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
  18. data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
  19. data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
  20. data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
  21. data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
  22. data/lib/dor/datastreams/identity.xsl +8 -0
  23. data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
  24. data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
  25. data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
  26. data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
  27. data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
  28. data/lib/dor/datastreams/workflow_ds.rb +103 -0
  29. data/lib/dor/exceptions.rb +0 -1
  30. data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
  31. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
  32. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
  33. data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
  34. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
  35. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
  36. data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
  37. data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
  38. data/lib/dor/models/admin_policy_object.rb +16 -0
  39. data/lib/dor/models/assembleable.rb +14 -0
  40. data/lib/dor/models/collection.rb +14 -0
  41. data/lib/dor/models/contentable.rb +227 -0
  42. data/lib/dor/models/describable.rb +194 -0
  43. data/lib/dor/models/discoverable.rb +66 -0
  44. data/lib/dor/models/editable.rb +267 -0
  45. data/lib/dor/models/embargoable.rb +97 -0
  46. data/lib/dor/models/eventable.rb +12 -0
  47. data/lib/dor/models/governable.rb +162 -0
  48. data/lib/dor/models/identifiable.rb +211 -0
  49. data/lib/dor/models/item.rb +44 -0
  50. data/lib/dor/models/itemizable.rb +66 -0
  51. data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
  52. data/lib/dor/models/preservable.rb +50 -0
  53. data/lib/dor/models/processable.rb +229 -0
  54. data/lib/dor/models/publishable.rb +74 -0
  55. data/lib/dor/models/set.rb +12 -0
  56. data/lib/dor/models/shelvable.rb +27 -0
  57. data/lib/dor/models/upgradable.rb +74 -0
  58. data/lib/dor/models/versionable.rb +94 -0
  59. data/lib/dor/models/workflow_object.rb +54 -0
  60. data/lib/dor/services/cleanup_service.rb +47 -0
  61. data/lib/dor/services/digital_stacks_service.rb +55 -0
  62. data/lib/dor/services/merge_service.rb +96 -0
  63. data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
  64. data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
  65. data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
  66. data/lib/dor/services/registration_service.rb +181 -0
  67. data/lib/dor/services/sdr_ingest_service.rb +181 -0
  68. data/lib/dor/services/search_service.rb +131 -0
  69. data/lib/dor/services/suri_service.rb +32 -0
  70. data/lib/dor/services/technical_metadata_service.rb +226 -0
  71. data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
  72. data/lib/dor/utils/ng_tidy.rb +37 -0
  73. data/lib/dor/utils/predicate_patch.rb +23 -0
  74. data/lib/dor/utils/solr_doc_helper.rb +9 -0
  75. data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
  76. data/lib/dor/version.rb +3 -0
  77. data/lib/dor/workflow/document.rb +131 -0
  78. data/lib/dor/workflow/graph.rb +166 -0
  79. data/lib/dor/workflow/process.rb +99 -0
  80. data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
  81. data/lib/tasks/dor.rake +39 -0
  82. metadata +494 -384
  83. data/lib/datastreams/content_metadata_ds.rb +0 -12
  84. data/lib/datastreams/identity_metadata_ds.rb +0 -28
  85. data/lib/datastreams/ng_tidy.rb +0 -19
  86. data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
  87. data/lib/datastreams/workflow_definition_ds.rb +0 -105
  88. data/lib/datastreams/workflow_ds.rb +0 -16
  89. data/lib/dor/admin_policy_object.rb +0 -11
  90. data/lib/dor/base.rb +0 -81
  91. data/lib/dor/cleanup_service.rb +0 -32
  92. data/lib/dor/digital_stacks_service.rb +0 -82
  93. data/lib/dor/druid_utils.rb +0 -41
  94. data/lib/dor/embargo.rb +0 -41
  95. data/lib/dor/item.rb +0 -141
  96. data/lib/dor/provenance_metadata_service.rb +0 -65
  97. data/lib/dor/registration_service.rb +0 -87
  98. data/lib/dor/rsolr.rb +0 -27
  99. data/lib/dor/sdr_ingest_service.rb +0 -117
  100. data/lib/dor/search_service.rb +0 -86
  101. data/lib/dor/suri_service.rb +0 -37
  102. data/lib/dor/workflow_object.rb +0 -13
  103. data/lib/dor/workflow_service.rb +0 -111
  104. data/lib/xml_models/foxml.rb +0 -261
  105. data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
  106. data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -288
@@ -0,0 +1,18 @@
1
+ module DatastreamSpecSolrizer
2
+ extend ActiveSupport::Concern
3
+ include SolrDocHelper
4
+
5
+ def datastream_spec_string
6
+ s = begin
7
+ controlGroup == 'E' ? content.to_s.length : size
8
+ rescue
9
+ 0
10
+ end
11
+ v = versionID.nil? ? '0' : versionID.to_s.split(/\./).last
12
+ [dsid,controlGroup,mimeType,v,s,label].join("|")
13
+ end
14
+ end
15
+
16
+ class ActiveFedora::Datastream
17
+ include DatastreamSpecSolrizer
18
+ end
@@ -0,0 +1,52 @@
1
+ module Dor
2
+ class DefaultObjectRightsDS < ActiveFedora::OmDatastream
3
+
4
+ set_terminology do |t|
5
+ t.root :path => 'rightsMetadata', :index_as => [:not_searchable]
6
+ t.copyright :path => 'copyright/human', :index_as => [:facetable]
7
+ t.use_statement :path => '/use/human[@type=\'useAndReproduction\']', :index_as => [:facetable]
8
+
9
+ t.use do
10
+ t.machine
11
+ t.human
12
+ end
13
+
14
+ t.creative_commons :path => '/use/machine', :type => 'creativeCommons'
15
+ t.creative_commons_human :path => '/use/human[@type=\'creativeCommons\']'
16
+
17
+
18
+ end
19
+
20
+ define_template :creative_commons do |xml|
21
+ xml.use {
22
+ xml.human(:type => "creativeCommons")
23
+ xml.machine(:type => "creativeCommons")
24
+ }
25
+ end
26
+ def self.xml_template
27
+ Nokogiri::XML::Builder.new do |xml|
28
+ xml.rightsMetadata{
29
+ xml.access(:type => 'discover'){
30
+ xml.machine{
31
+ xml.world
32
+ }
33
+ }
34
+ xml.access(:type => 'read'){
35
+ xml.machine{
36
+ xml.world
37
+ }
38
+ }
39
+ xml.use{
40
+ xml.human(:type => 'useAndReproduction')
41
+ xml.human(:type => "creativeCommons")
42
+ xml.machine(:type => "creativeCommons")
43
+ }
44
+ xml.copyright{
45
+ xml.human
46
+ }
47
+
48
+ }
49
+ end.doc
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
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]
12
+ end
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.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
+
38
+ end
39
+ end
@@ -1,17 +1,16 @@
1
- require 'active_fedora'
2
- require 'nokogiri'
3
- require 'time'
1
+ module Dor
2
+ class EmbargoMetadataDS < ActiveFedora::OmDatastream
3
+ include SolrDocHelper
4
4
 
5
- class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
5
+ before_create :ensure_non_versionable
6
6
 
7
7
  set_terminology do |t|
8
- t.root(:path => "embargoMetadata", :xmlns => '', :namespace_prefix => nil)
9
- t.status(:namespace_prefix => nil)
10
- t.release_date(:path => "releaseDate", :namespace_prefix => nil)
11
- t.twenty_pct_status( :path => "twentyPctVisibilityStatus", :namespace_prefix => nil)
12
- t.twenty_pct_release_date(:path => "twentyPctVisibilityReleaseDate", :namespace_prefix => nil)
13
-
14
- t.release_access(:path => "releaseAccess", :namespace_prefix => nil)
8
+ t.root(:path => "embargoMetadata")
9
+ t.status(:index_as => [:searchable, :facetable])
10
+ t.release_date(:path => "releaseDate")
11
+ t.release_access(:path => "releaseAccess")
12
+ t.twenty_pct_status( :path => "twentyPctVisibilityStatus", :index_as => [:searchable, :facetable])
13
+ t.twenty_pct_release_date(:path => "twentyPctVisibilityReleaseDate")
15
14
  end
16
15
 
17
16
  # Default EmbargoMetadataDS xml
@@ -28,9 +27,16 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
28
27
  return builder.doc
29
28
  end
30
29
 
31
- def initialize(attrs=nil)
30
+ def to_solr solr_doc = {}, *args
32
31
  super
33
- @attributes[:versionable] = false
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
34
+
35
+ solr_doc
36
+ end
37
+
38
+ def ensure_non_versionable
39
+ self.versionable = "false"
34
40
  end
35
41
 
36
42
  #################################################################################
@@ -40,7 +46,6 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
40
46
 
41
47
  def status=(new_status)
42
48
  update_values([:status] => new_status)
43
- self.dirty = true
44
49
  end
45
50
 
46
51
  def status
@@ -50,8 +55,8 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
50
55
  # Sets the release date. Converts the date to beginning-of-day, UTC to help with Solr indexing
51
56
  # @param [Time] rd A Time object represeting the release date. By default, it is set to now
52
57
  def release_date=(rd=Time.now)
53
- update_values([:release_date] => rd.beginning_of_day.utc.xmlschema)
54
- self.dirty = true
58
+ update_values([:release_date] => rd.beginning_of_day.utc.xmlschema)
59
+ self.content=self.ng_xml.to_s
55
60
  end
56
61
 
57
62
  # Current releaseDate value
@@ -62,7 +67,7 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
62
67
 
63
68
  def twenty_pct_status=(new_status)
64
69
  update_values([:twenty_pct_status] => new_status)
65
- self.dirty = true
70
+ content_will_change!
66
71
  end
67
72
 
68
73
  def twenty_pct_status
@@ -73,7 +78,7 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
73
78
  # @param [Time] rd A Time object represeting the release date. By default, it is set to now
74
79
  def twenty_pct_release_date=(rd=Time.now)
75
80
  update_values([:twenty_pct_release_date] => rd.beginning_of_day.utc.xmlschema)
76
- self.dirty = true
81
+ content_will_change!
77
82
  end
78
83
 
79
84
  # Current twentyPctVisibilityReleaseDate value
@@ -93,7 +98,7 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
93
98
  end
94
99
 
95
100
  # Sets the embargaAccess node
96
- # @param [Nokogiri::XML::Document] new_node Document that will replace the existing releaseAccess node
101
+ # @param [Nokogiri::XML::Document] new_doc Document that will replace the existing releaseAccess node
97
102
  def release_access_node=(new_doc)
98
103
  if(new_doc.root.name != 'releaseAccess')
99
104
  raise "Trying to replace releaseAccess with a non-releaseAccess document"
@@ -101,7 +106,7 @@ class EmbargoMetadataDS < ActiveFedora::NokogiriDatastream
101
106
 
102
107
  term_value_delete(:select => '//embargoMetadata/releaseAccess')
103
108
  ng_xml.root.add_child(new_doc.root.clone)
104
- self.dirty = true
105
109
  end
106
110
 
107
111
  end
112
+ end
@@ -1,10 +1,15 @@
1
- require 'active_fedora'
2
-
3
- class EventsDS < ActiveFedora::NokogiriDatastream
1
+ module Dor
2
+ class EventsDS < ActiveFedora::OmDatastream
3
+ before_create :ensure_non_versionable
4
4
 
5
5
  set_terminology do |t|
6
- t.root(:path => "events", :xmlns => '', :namespace_prefix => nil)
7
- t.event(:namespace_prefix => nil)
6
+ t.root(:path => "events")
7
+ t.event do
8
+ t.who :path => { :attribute => "who" }, :index_as => [:displayable, :not_searchable]
9
+ t.type_ :path => { :attribute => "type" }, :index_as => [:displayable, :not_searchable]
10
+ t.when :path => { :attribute => "when" }, :index_as => [:displayable, :not_searchable], :data_type => :date
11
+ t.message :path => "text()", :index_as => [:displayable, :not_searchable]
12
+ end
8
13
  end
9
14
 
10
15
  # Default EventsDS xml
@@ -15,9 +20,8 @@ class EventsDS < ActiveFedora::NokogiriDatastream
15
20
  return builder.doc
16
21
  end
17
22
 
18
- def initialize(attrs=nil)
19
- super
20
- @attributes[:versionable] = false
23
+ def ensure_non_versionable
24
+ self.versionable = "false"
21
25
  end
22
26
 
23
27
  # Adds an event to the datastream
@@ -28,7 +32,7 @@ class EventsDS < ActiveFedora::NokogiriDatastream
28
32
  ev = ng_xml.create_element "event", message,
29
33
  :type => type, :who => who, :when => Time.now.xmlschema
30
34
  ng_xml.root.add_child(ev)
31
- self.dirty = true
35
+ content_will_change!
32
36
  end
33
37
 
34
38
  # Finds events with the desired type attribute
@@ -55,4 +59,5 @@ class EventsDS < ActiveFedora::NokogiriDatastream
55
59
  end
56
60
  end
57
61
 
62
+ end
58
63
  end
@@ -0,0 +1,8 @@
1
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
2
+ <xsl:output omit-xml-declaration="yes" indent="yes"/>
3
+ <xsl:template match="node()|@*">
4
+ <xsl:copy>
5
+ <xsl:apply-templates select="node()|@*"/>
6
+ </xsl:copy>
7
+ </xsl:template>
8
+ </xsl:stylesheet>
@@ -0,0 +1,112 @@
1
+ module Dor
2
+ class IdentityMetadataDS < ActiveFedora::OmDatastream
3
+ include SolrDocHelper
4
+
5
+ set_terminology do |t|
6
+ t.root(:path=>"identityMetadata")
7
+ t.objectId :index_as => [:searchable]
8
+ t.objectType :index_as => [:searchable, :facetable]
9
+ t.objectLabel
10
+ t.citationCreator
11
+ t.sourceId
12
+ t.otherId(:path => 'otherId') do
13
+ t.name_(:path => { :attribute => 'name' })
14
+ end
15
+ t.agreementId :index_as => [:searchable, :facetable]
16
+ t.tag :index_as => [:searchable, :facetable]
17
+ t.citationTitle
18
+ t.objectCreator :index_as => [:searchable, :facetable]
19
+ t.adminPolicy :index_as => [:not_searchable]
20
+ end
21
+
22
+ define_template :value do |builder,name,value,attrs|
23
+ builder.send(name.to_sym, value, attrs)
24
+ end
25
+
26
+ def self.xml_template
27
+ Nokogiri::XML('<identityMetadata/>')
28
+ end #self.xml_template
29
+
30
+ def add_value(name, value, attrs={})
31
+ add_child_node(ng_xml.root, :value, name, value, attrs)
32
+ end
33
+
34
+ def objectId
35
+ self.find_by_terms(:objectId).text
36
+ end
37
+
38
+ def sourceId
39
+ node = self.find_by_terms(:sourceId).first
40
+ node ? [node['source'],node.text].join(':') : nil
41
+ end
42
+
43
+ def sourceId=(value)
44
+ node = self.find_by_terms(:sourceId).first
45
+ unless value.present?
46
+ node.remove unless node.nil?
47
+ nil
48
+ else
49
+ (source,val) = value.split(/:/,2)
50
+ unless source.present? and value.present?
51
+ raise ArgumentError, "Source ID must follow the format namespace:value"
52
+ end
53
+ node = ng_xml.root.add_child('<sourceId/>').first if node.nil?
54
+ node['source'] = source
55
+ node.content = val
56
+ node
57
+ end
58
+ end
59
+ def tags()
60
+ result=[]
61
+ self.ng_xml.search('//tag').each do |node|
62
+ result << node.content
63
+ end
64
+ result
65
+ end
66
+ def otherId(type = nil)
67
+ result = self.find_by_terms(:otherId).to_a
68
+ if type.nil?
69
+ result.collect { |n| [n['name'],n.text].join(':') }
70
+ else
71
+ result.select { |n| n['name'] == type }.collect { |n| n.text }
72
+ end
73
+ end
74
+
75
+ def add_otherId(other_id)
76
+ (name,val) = other_id.split(/:/,2)
77
+ node = ng_xml.root.add_child('<otherId/>').first
78
+ node['name'] = name
79
+ node.content = val
80
+ node
81
+ end
82
+
83
+ def to_solr(solr_doc=Hash.new, *args)
84
+ super(solr_doc, *args)
85
+ if digital_object.respond_to?(:profile)
86
+ digital_object.profile.each_pair do |property,value|
87
+ add_solr_value(solr_doc, property.underscore, value, property =~ /Date/ ? :date : :string, [:searchable])
88
+ end
89
+ end
90
+ if sourceId.present?
91
+ (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])
95
+ end
96
+ otherId.compact.each { |qid|
97
+ (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])
101
+ }
102
+
103
+ self.find_by_terms(:tag).each { |tag|
104
+ (top,rest) = tag.text.split(/:/,2)
105
+ unless rest.nil?
106
+ add_solr_value(solr_doc, "#{top.downcase.strip.gsub(/\s/,'_')}_tag", rest.strip, :string, [:searchable, :facetable])
107
+ end
108
+ }
109
+ solr_doc
110
+ end
111
+ end #class
112
+ end
@@ -0,0 +1,51 @@
1
+ module Dor
2
+ class RoleMetadataDS < ActiveFedora::OmDatastream
3
+ include SolrDocHelper
4
+
5
+ set_terminology do |t|
6
+ t.root :path => 'roleMetadata'
7
+
8
+ t.actor do
9
+ t.identifier do
10
+ t.type_ :path => {:attribute => 'type'}
11
+ end
12
+ t.name
13
+ end
14
+ t.person :ref => [:actor], :path => 'person'
15
+ t.group :ref => [:actor], :path => 'group'
16
+
17
+ t.role do
18
+ t.type_ :path => {:attribute => 'type'}
19
+ t.person :ref => [:person]
20
+ t.group :ref => [:group]
21
+ end
22
+
23
+ t.manager :ref => [:role], :attributes => {:type => 'manager'}
24
+ t.depositor :ref => [:role], :attributes => {:type => 'depositor'}
25
+ t.reviewer :ref => [:role], :attributes => {:type => 'reviewer'}
26
+ t.viewer :ref => [:role], :attributes => {:type => 'viewer'}
27
+ end
28
+
29
+ def self.xml_template
30
+ Nokogiri::XML::Builder.new do |xml|
31
+ xml.roleMetadata{
32
+ }
33
+ end.doc
34
+ end
35
+
36
+
37
+ def to_solr(solr_doc=Hash.new, *args)
38
+ self.find_by_xpath('/roleMetadata/role/*').each do |actor|
39
+ role_type = actor.parent['type']
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
+ if ['dor-apo-manager','dor-apo-depositor'].include? role_type
44
+ add_solr_value(solr_doc, "apo_register_permissions", val, :string, [:searchable, :facetable])
45
+ end
46
+ end
47
+ solr_doc
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,45 @@
1
+ class SimpleDublinCoreDs < ActiveFedora::OmDatastream
2
+
3
+ set_terminology do |t|
4
+ 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')
8
+ end
9
+
10
+ def self.xml_template
11
+ builder = Nokogiri::XML::Builder.new do |xml|
12
+ xml.dc(:xmlns=>"http://www.openarchives.org/OAI/2.0/oai_dc/",
13
+ 'xmlns:dc'=>'http://purl.org/dc/elements/1.1/') {
14
+ xml['dc'].title
15
+ xml['dc'].creator
16
+ xml['dc'].identifier
17
+ }
18
+ end
19
+
20
+ return builder.doc
21
+ end
22
+
23
+ def to_solr(solr_doc=Hash.new, *args)
24
+ # There are a whole bunch of namespace-related things that can go
25
+ # wrong with this terminology. Until it's fixed in OM, ignore them all.
26
+ begin
27
+ doc = super solr_doc, *args
28
+
29
+ add_solr_value(doc, 'dc_title', self.title.first, :string, [:sortable])
30
+ add_solr_value(doc, 'dc_creator', self.creator.first, :string, [:sortable])
31
+
32
+ identifiers = {}
33
+
34
+ self.identifier.each { |i| ns, val = i.split(":"); identifiers[ns] ||= val }
35
+
36
+ identifiers.each do |ns, val|
37
+ add_solr_value(doc, "dc_identifier_#{ns}", val, :string, [:sortable])
38
+ end
39
+
40
+ return doc
41
+ rescue
42
+ solr_doc
43
+ end
44
+ end
45
+ end