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
@@ -1,18 +1,21 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <!-- $Id: demoFoxmlToLucene.xslt 5734 2006-11-28 11:20:15Z gertsp $ -->
3
- <xsl:stylesheet exclude-result-prefixes="exts" version="1.0"
3
+ <xsl:stylesheet version="1.0"
4
+ exclude-result-prefixes="dc dt ex exts fedora-model fedora-types fn foxml hydra oai_dc rdf rel uvalibadmin uvalibdesc xsl"
4
5
  xmlns:dc="http://purl.org/dc/elements/1.1/"
5
6
  xmlns:exts="xalan://dk.defxws.fedoragsearch.server.GenericOperationsImpl"
7
+ xmlns:ex="http://exslt.org/common"
8
+ xmlns:dt="http://exslt.org/dates-and-times"
6
9
  xmlns:fedora-model="info:fedora/fedora-system:def/model#"
7
10
  xmlns:fedora-types="http://www.fedora.info/definitions/1/0/types/"
8
- xmlns:foxml="info:fedora/fedora-system:def/foxml#" xmlns:mods="http://www.loc.gov/mods/v3"
9
- xmlns:hydra="http://projecthydra.org/ns/relations#"
11
+ xmlns:fn="http://www.w3.org/TR/xpath-functions/"
12
+ xmlns:foxml="info:fedora/fedora-system:def/foxml#"
13
+ xmlns:hydra="http://projecthydra.org/ns/relations#" xmlns:mods="http://www.loc.gov/mods/v3"
10
14
  xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
11
15
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
12
16
  xmlns:rel="info:fedora/fedora-system:def/relations-external#"
13
17
  xmlns:uvalibadmin="http://dl.lib.virginia.edu/bin/admin/admin.dtd/"
14
18
  xmlns:uvalibdesc="http://dl.lib.virginia.edu/bin/dtd/descmeta/descmeta.dtd"
15
- xmlns:fn="http://www.w3.org/TR/xpath-functions/"
16
19
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:zs="http://www.loc.gov/zing/srw/">
17
20
  <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
18
21
  <!--
@@ -21,27 +24,42 @@
21
24
  Options for tailoring:
22
25
  - generation of fields from other XML metadata streams than DC
23
26
  - generation of fields from other datastream types than XML
24
- - from datastream by ID, text fetched, if mimetype can be handled
25
- currently the mimetypes text/plain, text/xml, text/html, application/pdf can be handled.
26
- -->
27
+ - from datastream by ID, text fetched, if mimetype can be handled
28
+ currently the mimetypes text/plain, text/xml, text/html, application/pdf can be handled.
29
+ -->
30
+ <xsl:variable name="INDEXVERSION">2.2.0</xsl:variable>
31
+
32
+ <xsl:param name="INCLUDE_EXTERNALS" select="true()"/>
27
33
  <xsl:param name="REPOSITORYNAME" select="repositoryName"/>
28
34
  <xsl:param name="FEDORASOAP" select="repositoryName"/>
29
35
  <xsl:param name="FEDORAUSER" select="repositoryName"/>
30
36
  <xsl:param name="FEDORAPASS" select="repositoryName"/>
31
37
  <xsl:param name="TRUSTSTOREPATH" select="repositoryName"/>
32
38
  <xsl:param name="TRUSTSTOREPASS" select="repositoryName"/>
33
- <xsl:variable name="scheme" select="substring-before($FEDORASOAP,'//')"/>
34
- <xsl:variable name="path" select="substring-before(substring-after($FEDORASOAP,'//'),'/services')"/>
35
- <xsl:variable name="FEDORAROOT">
36
- <xsl:value-of select="concat($scheme,'//',$FEDORAUSER,':',$FEDORAPASS,'@',$path)"/>
37
- </xsl:variable>
38
39
  <xsl:variable name="PID" select="/foxml:digitalObject/@PID"/>
39
40
  <xsl:variable name="docBoost" select="1.4*2.5"/>
41
+ <xsl:variable name="OBJECTTYPE"
42
+ select="//foxml:datastream/foxml:datastreamVersion[last()]//identityMetadata/objectType/text()"/>
43
+ <xsl:variable name="first-workflow-url">
44
+ <xsl:value-of select="//foxml:contentLocation[@TYPE='URL' and contains(@REF, 'workflow/dor/objects')]/@REF"/>
45
+ </xsl:variable>
46
+ <xsl:variable name="workflow-stem">
47
+ <xsl:value-of select="substring-before($first-workflow-url, $PID)"/>
48
+ </xsl:variable>
49
+ <xsl:variable name="DATASTREAM_LIST">
50
+ <ds name="RELS-EXT"/>
51
+ <ds name="DC"/>
52
+ <ds name="identityMetadata"/>
53
+ <ds name="descMetadata"/>
54
+ <ds name="embargoMetadata"/>
55
+ <ds name="administrativeMetadata"/>
56
+ <ds name="roleMetadata"/>
57
+ <ds name="contentMetadata"/>
58
+ <ds name="rightsMetadata"/>
59
+ <ds name="workflows"/>
60
+ <!--<ds match="WF"/>-->
61
+ </xsl:variable>
40
62
 
41
- <xsl:variable name="OBJECTTYPE" select="//foxml:datastream/foxml:datastreamVersion[last()]//identityMetadata/objectType/text()"/>
42
-
43
- <xsl:variable name="INDEXVERSION">1.3.2011102001</xsl:variable>
44
-
45
63
  <!-- or any other calculation, default boost is 1.0 -->
46
64
  <xsl:template match="/">
47
65
  <add>
@@ -50,7 +68,7 @@
50
68
  </doc>
51
69
  </add>
52
70
  </xsl:template>
53
-
71
+
54
72
  <xsl:template match="/foxml:digitalObject">
55
73
  <field name="index_version_field">
56
74
  <xsl:value-of select="$INDEXVERSION"/>
@@ -66,64 +84,111 @@
66
84
  </field>
67
85
  <field name="link_text_display">
68
86
  <xsl:choose>
69
- <xsl:when test="//dc:title"><xsl:value-of select="//dc:title/text()"/></xsl:when>
70
- <xsl:otherwise><xsl:value-of select="$PID"/></xsl:otherwise>
87
+ <xsl:when test="//dc:title">
88
+ <xsl:value-of select="//dc:title/text()"/>
89
+ </xsl:when>
90
+ <xsl:otherwise>
91
+ <xsl:value-of select="$PID"/>
92
+ </xsl:otherwise>
71
93
  </xsl:choose>
72
94
  </field>
95
+ <xsl:call-template name="lifecycle"/>
73
96
  <xsl:apply-templates select="*"/>
97
+ <xsl:call-template name="workflows"/>
74
98
  </xsl:template>
75
99
 
76
100
  <xsl:template match="foxml:objectProperties/foxml:property">
77
- <field>
78
- <xsl:attribute name="name">
79
- <!-- if this is a data field, append with date, otherwise field -->
80
- <xsl:choose>
81
- <xsl:when test="contains(@NAME, 'Date')">
82
- <xsl:value-of
83
- select="concat('fgs_', substring-after(@NAME,'#'), '_date')"/>
84
- </xsl:when>
85
- <xsl:otherwise>
86
- <xsl:value-of
87
- select="concat('fgs_', substring-after(@NAME,'#'), '_field')"/>
88
- </xsl:otherwise>
89
- </xsl:choose>
90
- </xsl:attribute>
91
- <xsl:value-of select="@VALUE"/>
92
- </field>
101
+ <field>
102
+ <xsl:attribute name="name">
103
+ <!-- if this is a data field, append with date, otherwise field -->
104
+ <xsl:choose>
105
+ <xsl:when test="contains(@NAME, 'Date')">
106
+ <xsl:value-of select="concat('fgs_', substring-after(@NAME,'#'), '_date')"/>
107
+ </xsl:when>
108
+ <xsl:otherwise>
109
+ <xsl:value-of select="concat('fgs_', substring-after(@NAME,'#'), '_field')"
110
+ />
111
+ </xsl:otherwise>
112
+ </xsl:choose>
113
+ </xsl:attribute>
114
+ <xsl:value-of select="@VALUE"/>
115
+ </field>
93
116
  </xsl:template>
94
117
 
95
118
  <xsl:template match="foxml:datastream">
96
- <!--
97
- <field name="fedora_datastream_id_field">
98
- <xsl:value-of select="@ID"/>
119
+ <field name="fedora_datastream_version_field">
120
+ <xsl:value-of select="foxml:datastreamVersion[last()]/@ID"/>
99
121
  </field>
100
- -->
101
- <xsl:apply-templates select="./foxml:datastreamVersion[last()]/foxml:xmlContent"/>
102
- <xsl:apply-templates select="./foxml:datastreamVersion[last()]/foxml:contentLocation"/>
122
+ <xsl:apply-templates select="foxml:datastreamVersion[last()]"/>
123
+ </xsl:template>
124
+
125
+ <!-- Index inline datastreams -->
126
+ <xsl:template match="foxml:datastream[foxml:datastreamVersion/foxml:xmlContent]/foxml:datastreamVersion[last()]">
127
+ <xsl:variable name="datastream-name" select="../@ID"/>
128
+ <xsl:apply-templates select="foxml:xmlContent/*">
129
+ <xsl:with-param name="datastream-name" select="$datastream-name"/>
130
+ </xsl:apply-templates>
131
+ </xsl:template>
132
+
133
+ <!-- Index managed/external datastreams -->
134
+ <xsl:template match="foxml:datastream[foxml:datastreamVersion/foxml:contentLocation]/foxml:datastreamVersion[last()]">
135
+ <xsl:if test="$INCLUDE_EXTERNALS">
136
+ <xsl:variable name="ds" select="."/>
137
+ <xsl:call-template name="process-datastream">
138
+ <xsl:with-param name="ds" select="$ds"/>
139
+ <xsl:with-param name="datastreams" select="ex:node-set($DATASTREAM_LIST)"/>
140
+ </xsl:call-template>
141
+ </xsl:if>
103
142
  </xsl:template>
104
143
 
144
+ <xsl:template name="process-datastream">
145
+ <xsl:param name="ds"/>
146
+ <xsl:param name="datastreams"/>
147
+ <xsl:variable name="datastream-name" select="$ds/../@ID"/>
148
+ <xsl:variable name="datastream-ts" select="$ds/@CREATED"/>
149
+ <xsl:variable name="content-location" select="$ds/foxml:contentLocation/@REF"/>
150
+ <xsl:for-each select="$datastreams/*">
151
+ <xsl:if test="(@name and (@name = $datastream-name)) or (@match and contains($datastream-name,@match))">
152
+ <xsl:variable name="content-uri">
153
+ <xsl:choose>
154
+ <xsl:when test="contains($content-location, '/fedora/get/')">http://localhost:8080/fedora/<xsl:value-of select="substring-after($content-location,'/fedora/')"/></xsl:when>
155
+ <xsl:otherwise><xsl:value-of select="$content-location"/></xsl:otherwise>
156
+ </xsl:choose>
157
+ </xsl:variable>
158
+ <xsl:message>Retrieving <xsl:value-of select="$content-uri"/></xsl:message>
159
+ <xsl:apply-templates select="document($content-uri)/*">
160
+ <xsl:with-param name="datastream-name" select="$datastream-name"/>
161
+ </xsl:apply-templates>
162
+ </xsl:if>
163
+ </xsl:for-each>
164
+ </xsl:template>
165
+
166
+ <xsl:template name="workflows">
167
+ <xsl:variable name="combined-workflow-stream" select="document(concat($workflow-stem,$PID,'/workflows'))"/>
168
+ <xsl:apply-templates select="$combined-workflow-stream/workflows/workflow"/>
169
+ </xsl:template>
170
+
105
171
  <!-- Index RELS-EXT -->
106
- <xsl:template match="rdf:RDF[ancestor::foxml:datastream[@ID='RELS-EXT']]/rdf:Description">
172
+ <xsl:template match="rdf:RDF/rdf:Description">
107
173
  <!-- Grab the cmodel -->
108
174
  <xsl:for-each select="./fedora-model:hasModel">
109
175
  <field name="fedora_has_model_field">
110
176
  <xsl:value-of select="@rdf:resource"/>
111
177
  </field>
112
178
  </xsl:for-each>
113
-
114
179
  <xsl:for-each select="*[@rdf:resource]">
115
- <xsl:variable name="doc-pid" select="substring-after(./@rdf:resource,'info:fedora/')"></xsl:variable>
116
- <field name="{local-name(.)}_id_field">
117
- <xsl:value-of select="$doc-pid"/>
118
- </field>
119
- <field name="{local-name(.)}_id_facet">
120
- <xsl:value-of select="$doc-pid"/>
121
- </field>
122
- </xsl:for-each>
180
+ <xsl:variable name="doc-pid" select="substring-after(./@rdf:resource,'info:fedora/')"/>
181
+ <field name="{local-name(.)}_id_field">
182
+ <xsl:value-of select="$doc-pid"/>
183
+ </field>
184
+ <field name="{local-name(.)}_id_facet">
185
+ <xsl:value-of select="$doc-pid"/>
186
+ </field>
187
+ </xsl:for-each>
123
188
  </xsl:template>
124
189
 
125
190
  <!-- Index DC -->
126
- <xsl:template match="oai_dc:dc[ancestor::foxml:datastream[@ID='DC']]">
191
+ <xsl:template match="oai_dc:dc">
127
192
  <xsl:for-each select="dc:title|dc:creator|dc:identifier">
128
193
  <field name="dc_{local-name(.)}_text">
129
194
  <xsl:value-of select="text()"/>
@@ -135,9 +200,11 @@
135
200
  </field>
136
201
  </xsl:for-each>
137
202
  </xsl:template>
203
+
138
204
 
205
+
139
206
  <!-- Index identity metadata -->
140
- <xsl:template match="identityMetadata[ancestor::foxml:datastream[@ID='identityMetadata']]">
207
+ <xsl:template match="identityMetadata">
141
208
  <xsl:for-each select="./objectType">
142
209
  <field name="object_type_field">
143
210
  <xsl:value-of select="./text()"/>
@@ -148,7 +215,7 @@
148
215
  <xsl:value-of select="concat(@source, ':', normalize-space(./text()))"/>
149
216
  </field>
150
217
  <field name="source_id_field">
151
- <xsl:value-of select="normalize-space(./text())"/>
218
+ <xsl:value-of select="concat(@source, ':', normalize-space(./text()))"/>
152
219
  </field>
153
220
  <field name="identifier_text">
154
221
  <xsl:value-of select="concat(@source, ':', normalize-space(./text()))"/>
@@ -177,7 +244,9 @@
177
244
  <xsl:variable name="tag-name"
178
245
  select="normalize-space(substring-before($text-value, ':'))"/>
179
246
  <xsl:variable name="field-name">
180
- <xsl:call-template name="valid-field-name"><xsl:with-param name="name" select="$tag-name"/></xsl:call-template>
247
+ <xsl:call-template name="valid-field-name">
248
+ <xsl:with-param name="name" select="$tag-name"/>
249
+ </xsl:call-template>
181
250
  <xsl:text>_tag</xsl:text>
182
251
  </xsl:variable>
183
252
  <field name="{$field-name}_field">
@@ -188,13 +257,17 @@
188
257
  </field>
189
258
  </xsl:for-each>
190
259
  </xsl:template>
191
-
260
+
192
261
  <!-- Index MODS descriptive metadata -->
193
- <xsl:template match="mods:mods[ancestor::foxml:datastream[@ID='descMetadata']]">
262
+ <xsl:template match="mods:mods">
263
+ <field name="metadata_format_field">mods</field>
264
+ <field name="metadata_format_facet">mods</field>
194
265
  <!-- Grab the MODS identifiers -->
195
266
  <xsl:for-each select="./mods:identifier">
196
267
  <xsl:variable name="identifier-label">
197
- <xsl:call-template name="valid-field-name"><xsl:with-param name="name" select="@displayLabel"/></xsl:call-template>
268
+ <xsl:call-template name="valid-field-name">
269
+ <xsl:with-param name="name" select="@displayLabel"/>
270
+ </xsl:call-template>
198
271
  </xsl:variable>
199
272
  <field name="mods_identifier_field">
200
273
  <xsl:value-of select="@displayLabel"/>:<xsl:value-of select="text()"/>
@@ -209,15 +282,9 @@
209
282
  <xsl:value-of select="text()"/>
210
283
  </field>
211
284
  </xsl:for-each>
212
-
213
285
  <xsl:for-each select="mods:titleInfo">
214
286
  <xsl:variable name="title-info">
215
- <xsl:value-of select="mods:nonSort/text()"/>
216
- <xsl:value-of select="mods:title/text()"/>
217
- <xsl:if test="mods:subTitle">
218
- <xsl:text> : </xsl:text>
219
- <xsl:value-of select="mods:subTitle/text()"/>
220
- </xsl:if>
287
+ <xsl:call-template name="mods-title"/>
221
288
  </xsl:variable>
222
289
  <field name="mods_titleInfo_field">
223
290
  <xsl:value-of select="$title-info"/>
@@ -226,16 +293,42 @@
226
293
  <xsl:value-of select="$title-info"/>
227
294
  </field>
228
295
  </xsl:for-each>
229
-
230
296
  <xsl:for-each select="mods:name">
297
+ <xsl:variable name="name-info">
298
+ <xsl:call-template name="mods-name"/>
299
+ </xsl:variable>
231
300
  <field name="mods_name_field">
232
- <xsl:value-of select="mods:namePart/text()"/>
301
+ <xsl:value-of select="$name-info"/>
233
302
  </field>
234
303
  <field name="mods_name_text">
235
- <xsl:value-of select="mods:namePart/text()"/>
304
+ <xsl:value-of select="$name-info"/>
305
+ </field>
306
+ <xsl:if test="mods:role/mods:roleTerm[@type='text']">
307
+ <xsl:variable name="role" select="mods:role/mods:roleTerm[@type='text']/text()"/>
308
+ <field name="mods_{$role}_field">
309
+ <xsl:value-of select="mods:namePart/text()"/>
310
+ </field>
311
+ <field name="mods_{$role}_text">
312
+ <xsl:value-of select="mods:namePart/text()"/>
313
+ </field>
314
+ </xsl:if>
315
+ </xsl:for-each>
316
+ <xsl:for-each select="mods:originInfo/mods:publisher">
317
+ <field name="mods_publisher_field">
318
+ <xsl:value-of select="text()"/>
319
+ </field>
320
+ <field name="mods_publisher_text">
321
+ <xsl:value-of select="text()"/>
322
+ </field>
323
+ </xsl:for-each>
324
+ <xsl:for-each select="mods:originInfo/mods:place/mods:placeTerm[@type='text']">
325
+ <field name="mods_origininfo_place_field">
326
+ <xsl:value-of select="text()"/>
327
+ </field>
328
+ <field name="mods_origininfo_place_text">
329
+ <xsl:value-of select="text()"/>
236
330
  </field>
237
331
  </xsl:for-each>
238
-
239
332
  <!-- Index some, but not all, MODS fields -->
240
333
  <xsl:for-each select="//mods:coordinates|//mods:extent|//mods:scale|//mods:topic">
241
334
  <xsl:if test="./text()">
@@ -244,83 +337,194 @@
244
337
  </field>
245
338
  </xsl:if>
246
339
  </xsl:for-each>
247
-
248
- <xsl:for-each select="//mods:*[contains(local-name(),'date') or contains(local-name(), 'Date')]">
340
+ <xsl:for-each
341
+ select="//mods:*[contains(local-name(),'date') or contains(local-name(), 'Date')]">
249
342
  <xsl:variable name="date-label">
250
- <xsl:call-template name="valid-field-name"><xsl:with-param name="name" select="local-name()"/></xsl:call-template>
343
+ <xsl:call-template name="valid-field-name">
344
+ <xsl:with-param name="name" select="local-name()"/>
345
+ </xsl:call-template>
251
346
  </xsl:variable>
252
347
  <field name="mods_{$date-label}_field">
253
348
  <xsl:value-of select="normalize-space(./text())"/>
254
349
  </field>
255
350
  </xsl:for-each>
256
- <!--
351
+ <!--
257
352
  <xsl:for-each select=".//mods:*[string-length(normalize-space(text())) &gt; 0]">
258
353
  <field name="mods_{local-name(.)}_field"><xsl:value-of select="normalize-space(./text())"/></field>
259
354
  </xsl:for-each>
260
355
  -->
261
356
  </xsl:template>
262
-
263
- <!-- Index content metadata -->
264
- <xsl:template match="contentMetadata[ancestor::foxml:datastream[@ID='contentMetadata']]">
265
- <field name="content_type_facet">
266
- <xsl:value-of select="@type"/>
267
- </field>
268
- <xsl:apply-templates/>
269
- </xsl:template>
270
-
271
- <xsl:template match="contentMetadata/resource/file">
272
- <field name="content_file_field">
273
- <xsl:value-of select="@id"/>
274
- </field>
275
- <xsl:if test="@shelve = 'yes'">
276
- <field name="shelved_content_file_field">
277
- <xsl:value-of select="@id"/>
278
- </field>
279
- </xsl:if>
280
- </xsl:template>
281
357
 
282
- <!-- Index embargo metadata -->
283
- <xsl:template match="embargoMetadata[ancestor::foxml:datastream[@ID='embargoMetadata']]">
284
- <xsl:if test="(status != '') and (releaseDate != '')">
285
- <field name="embargo_status_field">
286
- <xsl:value-of select="status"/>
287
- </field>
288
- <field name="embargo_release_date">
289
- <xsl:value-of select="releaseDate"/>
290
- </field>
291
- </xsl:if>
292
- </xsl:template>
293
-
294
- <!-- Workflows -->
295
- <xsl:template match="foxml:contentLocation[contains(@REF,'/workflows/')]">
296
- <xsl:apply-templates select="document(@REF)/workflow">
297
- <xsl:with-param name="workflow-name" select="ancestor::foxml:datastream/@ID"/>
358
+ <!-- mods-title and mods-name templates cribbed from mods2dc.xslt -->
359
+ <xsl:template name="mods-title">
360
+ <xsl:value-of select="mods:nonSort"/>
361
+ <xsl:if test="mods:nonSort">
362
+
363
+ <xsl:text> </xsl:text>
364
+ </xsl:if>
365
+ <xsl:value-of select="mods:title"/>
366
+ <xsl:if test="mods:subTitle">
367
+ <xsl:text>: </xsl:text>
368
+ <xsl:value-of select="mods:subTitle"/>
369
+ </xsl:if>
370
+ <xsl:if test="mods:partNumber">
371
+
372
+ <xsl:text>. </xsl:text>
373
+ <xsl:value-of select="mods:partNumber"/>
374
+ </xsl:if>
375
+ <xsl:if test="mods:partName">
376
+ <xsl:text>. </xsl:text>
377
+ <xsl:value-of select="mods:partName"/>
378
+ </xsl:if>
379
+ </xsl:template>
380
+
381
+ <xsl:template name="mods-name">
382
+ <xsl:variable name="name">
383
+ <xsl:for-each select="mods:namePart[not(@type)]">
384
+ <xsl:value-of select="."/>
385
+
386
+ <xsl:text> </xsl:text>
387
+ </xsl:for-each>
388
+ <xsl:value-of select="mods:namePart[@type='family']"/>
389
+ <xsl:if test="mods:namePart[@type='given']">
390
+ <xsl:text>, </xsl:text>
391
+ <xsl:value-of select="mods:namePart[@type='given']"/>
392
+ </xsl:if>
393
+ <xsl:if test="mods:namePart[@type='date']">
394
+
395
+ <xsl:text>, </xsl:text>
396
+ <xsl:value-of select="mods:namePart[@type='date']"/>
397
+ <xsl:text/>
398
+ </xsl:if>
399
+ <xsl:if test="mods:displayForm">
400
+ <xsl:text> (</xsl:text>
401
+ <xsl:value-of select="mods:displayForm"/>
402
+
403
+ <xsl:text>) </xsl:text>
404
+ </xsl:if>
405
+ <xsl:for-each select="mods:role[mods:roleTerm[@type='text']!='creator']">
406
+ <xsl:text> (</xsl:text>
407
+ <xsl:value-of select="normalize-space(.)"/>
408
+ <xsl:text>) </xsl:text>
409
+ </xsl:for-each>
410
+
411
+ </xsl:variable>
412
+ <xsl:value-of select="normalize-space($name)"/>
413
+ </xsl:template>
414
+
415
+ <!-- Index content metadata -->
416
+ <xsl:template match="contentMetadata">
417
+ <field name="content_type_facet">
418
+ <xsl:value-of select="@type"/>
419
+ </field>
420
+ <xsl:apply-templates select="./resource">
421
+ <xsl:sort data-type="number" select="@sequence"/>
298
422
  </xsl:apply-templates>
299
423
  </xsl:template>
424
+ <xsl:template match="contentMetadata/resource/file">
425
+ <field name="content_file_field">
426
+ <xsl:value-of select="@id"/>
427
+ </field>
428
+ <xsl:if test="@shelve = 'yes'">
429
+ <field name="shelved_content_file_field">
430
+ <xsl:value-of select="@id"/>
431
+ </field>
432
+ </xsl:if>
433
+ </xsl:template>
434
+
435
+ <!-- Index rights metadata -->
436
+ <xsl:template match="rightsMetadata">
437
+ <xsl:if test="access[@type='read']/machine/embargoReleaseDate">
438
+ <field name="embargo_status_facet">embargoed</field>
439
+ <field name="embargo_status_field">embargoed</field>
440
+ <field name="embargo_release_date">
441
+ <xsl:call-template name="long-enough-date">
442
+ <xsl:with-param name="date" select="access[@type='read']/machine/embargoReleaseDate/text()"/>
443
+ </xsl:call-template>
444
+ </field>
445
+ </xsl:if>
446
+ </xsl:template>
447
+
448
+ <!-- Index embargo metadata -->
449
+ <xsl:template match="embargoMetadata">
450
+ <xsl:if test="(status != '') and (releaseDate != '')">
451
+ <field name="embargo_status_facet">
452
+ <xsl:value-of select="status"/>
453
+ </field>
454
+ <field name="embargo_status_field">
455
+ <xsl:value-of select="status"/>
456
+ </field>
457
+ <field name="embargo_release_date">
458
+ <xsl:call-template name="long-enough-date">
459
+ <xsl:with-param name="date" select="releaseDate"/>
460
+ </xsl:call-template>
461
+ </field>
462
+ </xsl:if>
463
+ </xsl:template>
464
+
465
+ <!-- Workflows -->
466
+ <xsl:template name="lifecycle">
467
+ <xsl:variable name="lifecycle-uri" select="concat($workflow-stem, $PID, '/lifecycle')"/>
468
+ <xsl:message>Retrieving <xsl:value-of select="$lifecycle-uri"/></xsl:message>
469
+ <xsl:variable name="doc" select="document($lifecycle-uri)"/>
470
+ <xsl:apply-templates select="$doc/*"/>
471
+ </xsl:template>
300
472
 
473
+ <xsl:template match="lifecycle">
474
+ <xsl:for-each select="milestone">
475
+ <xsl:variable name="zdate" select="concat(substring(@date,1,19),'Z')"/>
476
+ <field name="lifecycle_field">
477
+ <xsl:value-of select="text()"/>:<xsl:value-of select="$zdate"/>
478
+ </field>
479
+ <field>
480
+ <xsl:attribute name="name">
481
+ <xsl:value-of select="concat(text(),'_date')"/>
482
+ </xsl:attribute>
483
+ <xsl:value-of select="$zdate"/>
484
+ </field>
485
+ <xsl:if test="position() = last()">
486
+ <field name="lifecycle_facet">
487
+ <xsl:value-of select="text()"/>
488
+ </field>
489
+ </xsl:if>
490
+ </xsl:for-each>
491
+ </xsl:template>
492
+
493
+ <xsl:template match="workflows">
494
+ <xsl:apply-templates select="./workflow"/>
495
+ </xsl:template>
496
+
301
497
  <xsl:template match="workflow">
302
- <xsl:param name="workflow-name" select="ancestor::foxml:datastream/@ID"/>
498
+ <xsl:param name="datastream-name" select="@id | ancestor::foxml:datastream/@ID"/>
499
+ <xsl:variable name="workflow-name" select="$datastream-name"/>
303
500
  <xsl:variable name="workflow-token">
304
- <xsl:call-template name="valid-field-name"><xsl:with-param name="name" select="$workflow-name"/></xsl:call-template>
501
+ <xsl:call-template name="valid-field-name">
502
+ <xsl:with-param name="name" select="$workflow-name"/>
503
+ </xsl:call-template>
305
504
  </xsl:variable>
306
- <field name="wf_facet"><xsl:value-of select="$workflow-name"/></field>
307
- <field name="wf_wsp_facet"><xsl:value-of select="$workflow-name"/></field>
308
- <field name="wf_wps_facet"><xsl:value-of select="$workflow-name"/></field>
505
+ <field name="wf_facet">
506
+ <xsl:value-of select="$workflow-name"/>
507
+ </field>
508
+ <field name="wf_wsp_facet">
509
+ <xsl:value-of select="$workflow-name"/>
510
+ </field>
511
+ <field name="wf_wps_facet">
512
+ <xsl:value-of select="$workflow-name"/>
513
+ </field>
309
514
  <xsl:for-each select="process">
515
+ <xsl:sort select="@datetime" data-type="text"/>
310
516
  <field name="wf_wsp_facet">
311
517
  <xsl:value-of select="concat($workflow-name,':',@status)"/>
312
518
  </field>
313
519
  <field name="wf_wsp_facet">
314
520
  <xsl:value-of select="concat($workflow-name,':',@status,':',@name)"/>
315
521
  </field>
316
-
317
522
  <field name="wf_wps_facet">
318
523
  <xsl:value-of select="concat($workflow-name,':',@name)"/>
319
524
  </field>
320
525
  <field name="wf_wps_facet">
321
526
  <xsl:value-of select="concat($workflow-name,':',@name,':',@status)"/>
322
527
  </field>
323
-
324
528
  <field name="wf_swp_facet">
325
529
  <xsl:value-of select="@status"/>
326
530
  </field>
@@ -332,9 +536,9 @@
332
536
  </field>
333
537
  </xsl:for-each>
334
538
  </xsl:template>
335
-
539
+
336
540
  <!-- Admin Policy specific fields -->
337
- <xsl:template match="administrativeMetadata[ancestor::foxml:datastream[@ID='administrativeMetadata']]">
541
+ <xsl:template match="administrativeMetadata">
338
542
  <xsl:if test="./descMetadata/format">
339
543
  <field name="apo_metadata_format_field">
340
544
  <xsl:value-of select="./descMetadata/format/text()"/>
@@ -345,17 +549,17 @@
345
549
  <xsl:value-of select="./descMetadata/source/text()"/>
346
550
  </field>
347
551
  </xsl:if>
348
-
349
552
  <xsl:for-each select="registration/workflow">
350
553
  <field name="apo_registration_workflow_field">
351
554
  <xsl:value-of select="@id"/>
352
555
  </field>
353
556
  </xsl:for-each>
354
557
  </xsl:template>
355
-
356
- <xsl:template match="roleMetadata[ancestor::foxml:datastream[@ID='roleMetadata']]">
558
+
559
+ <xsl:template match="roleMetadata">
357
560
  <xsl:for-each select="./role/*">
358
- <xsl:variable name="role_value"><xsl:value-of select="identifier/@type"/>:<xsl:value-of select="identifier/text()"/></xsl:variable>
561
+ <xsl:variable name="role_value"><xsl:value-of select="identifier/@type"/>:<xsl:value-of
562
+ select="identifier/text()"/></xsl:variable>
359
563
  <field name="apo_role_{local-name(.)}_{../@type}_field">
360
564
  <xsl:value-of select="$role_value"/>
361
565
  </field>
@@ -375,10 +579,24 @@
375
579
 
376
580
  <!-- Utility Templates -->
377
581
  <xsl:template match="text()|@*|processing-instruction()|comment()"/>
582
+
583
+ <xsl:template name="long-enough-date">
584
+ <xsl:param name="date"/>
585
+ <xsl:variable name="date-format" select="'0000-00-00T00:00:00Z'"/>
586
+ <xsl:choose>
587
+ <xsl:when test="string-length($date) &lt; string-length($date-format)">
588
+ <xsl:value-of select="$date"/><xsl:value-of select="substring($date-format,string-length($date)+1)"/>
589
+ </xsl:when>
590
+ <xsl:otherwise>
591
+ <xsl:value-of select="$date"/>
592
+ </xsl:otherwise>
593
+ </xsl:choose>
594
+ </xsl:template>
378
595
 
379
596
  <xsl:template name="valid-field-name">
380
597
  <xsl:param name="name"/>
381
- <xsl:value-of select="translate($name,' ABCDEFGHIJKLMNOPQRSTUVWXYZ','_abcdefghijklmnopqrstuvwxyz')"/>
598
+ <xsl:value-of
599
+ select="translate($name,' ABCDEFGHIJKLMNOPQRSTUVWXYZ','_abcdefghijklmnopqrstuvwxyz')"/>
382
600
  </xsl:template>
383
601
 
384
602
  </xsl:stylesheet>