cul_scv_hydra 0.19.5 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/concerns/nfo/common.rb +17 -0
- data/app/models/concerns/nfo/file_data_object.rb +10 -0
- data/app/models/concerns/nfo/folder.rb +10 -0
- data/app/models/concerns/nie/information_element.rb +10 -0
- data/app/models/concerns/ore/proxy.rb +123 -0
- data/app/models/concerns/rdf/sc.rb +47 -0
- data/app/models/concerns/sc/canvas.rb +12 -0
- data/app/models/concerns/sc/sequence.rb +21 -0
- data/app/models/cul/scv/hydra/datastreams/struct_metadata.rb +46 -0
- data/app/models/generic_aggregator.rb +16 -0
- data/config/fedora.yml +8 -8
- data/config/locales/nnc.ntriples +12 -0
- data/config/predicate_mappings.yml +1 -1
- data/config/subs.yml +12 -0
- data/config/xsl/marc_to_mods.xsl +5542 -0
- data/fixtures/cmodels/ore_Proxy.xml +50 -0
- data/fixtures/spec/MARCXML/3867996.mods.xml +7 -0
- data/fixtures/spec/MARCXML/3867996.xml +100 -0
- data/fixtures/spec/STRUCTMAP/structmap-nested.xml +10 -0
- data/lib/cul_scv_hydra/version.rb +1 -1
- data/lib/tasks/transform.rake +23 -0
- metadata +32 -4
- data/config/solr.yml +0 -5
- data/lib/cul_scv_hydra/version.rb~ +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46d4b43e9073bab05dbc6a72b36d3a0ea1120ee1
|
4
|
+
data.tar.gz: 5c2392b7aecea8c413aa0e2729987fb15ef400b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca1e49735e2168b74d6942ad4c7b7c51bb055fa24937278c58b92eb5c9a9b7b2c22d587847506d3fea688f46dcefd1e8965a6dc27d6775a96c4ff3179f9b06ab
|
7
|
+
data.tar.gz: 5ab6897aa13e0c987f1103b21866d474a7cabff4fdc1ec872947728ff46304a1aeffe9d335aa0f5392dbf314d4336f5ecbdd920c995e2b8bacf55df5bba41d3e
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module NFO
|
2
|
+
module Common
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
property :belongsToContainer, predicate: RDF::NFO[:"#belongsToContainer"], multivalue: false do |ix|
|
6
|
+
ix.as :stored_sortable
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_solr(solr_doc={})
|
11
|
+
solr_doc = super(solr_doc)
|
12
|
+
if solr_doc['']
|
13
|
+
end
|
14
|
+
solr_doc
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module NFO
|
2
|
+
class FileDataObject < ORE::Proxy
|
3
|
+
include NIE::InformationElement
|
4
|
+
include NFO::Common
|
5
|
+
def initialize(proxy_for_uri, context_uri, *args)
|
6
|
+
super(proxy_for_uri, context_uri, *args)
|
7
|
+
self.get_values(:type) << RDF::NFO[:"#FileDataObject"]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# A named graph describing the location of a Resource in a virtual nested structure
|
2
|
+
require 'digest'
|
3
|
+
module ORE
|
4
|
+
class Proxy < ActiveTriples::Resource
|
5
|
+
include Digest
|
6
|
+
include Solrizer::Common
|
7
|
+
include ActiveFedora::Rdf::Indexing
|
8
|
+
|
9
|
+
module Id
|
10
|
+
class Descriptor < Solrizer::Descriptor
|
11
|
+
def name_and_converter(field_name, field_type)
|
12
|
+
['id']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
def self.id_for2(proxy_in, proxy_for)
|
16
|
+
path = proxy_for.to_s
|
17
|
+
path = path.sub(/^info.fedora\/[^\/]+\/structMetadata\//,'')
|
18
|
+
"urn:proxy:#{proxy_in ? Digest::MD5.hexdigest(proxy_in.to_s) : '' }:#{path}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
def self.type
|
22
|
+
RDF::ORE.Proxy
|
23
|
+
end
|
24
|
+
property :id, predicate: RDF.nodeID, multivalue: false do |ix|
|
25
|
+
ix.as Id::Descriptor.new
|
26
|
+
end
|
27
|
+
property :isAggregatedBy, predicate: RDF::ORE.isAggregatedBy, multivalue: false do |ix|
|
28
|
+
ix.as :stored_sortable
|
29
|
+
end
|
30
|
+
property :lineage, predicate: RDF::ORE.lineage, multivalue: false do |ix|
|
31
|
+
ix.as :stored_sortable
|
32
|
+
end
|
33
|
+
property :proxyFor, predicate: RDF::ORE.proxyFor, multivalue: false do |ix|
|
34
|
+
ix.as :stored_sortable
|
35
|
+
end
|
36
|
+
property :proxyIn, predicate: RDF::ORE.proxyIn, multivalue: false do |ix|
|
37
|
+
ix.as :stored_sortable
|
38
|
+
end
|
39
|
+
property :index, predicate: RDF::OLO.index, multivalue: false do |ix|
|
40
|
+
ix.as :stored_sortable
|
41
|
+
ix.type :integer
|
42
|
+
end
|
43
|
+
property :format, predicate: RDF::DC.format, multivalue: false do |ix|
|
44
|
+
ix.as :stored_sortable
|
45
|
+
end
|
46
|
+
property :extent, predicate: RDF::DC.extent, multivalue: false do |ix|
|
47
|
+
ix.as :displayable
|
48
|
+
end
|
49
|
+
property :label, predicate: RDF::RDFS.label, multivalue: false do |ix|
|
50
|
+
ix.as :stored_sortable
|
51
|
+
end
|
52
|
+
property :hasModel, predicate: RDF::FCREPO3::MODEL.hasModel, multivalue: false do |ix|
|
53
|
+
ix.as :stored_sortable
|
54
|
+
end
|
55
|
+
|
56
|
+
def initialize(proxy_resource_uri, graph_context_uri, *args)
|
57
|
+
proxy_resource_uri = RDF::URI(proxy_resource_uri)
|
58
|
+
super(proxy_resource_uri,*args)
|
59
|
+
update(RDF::Statement(rdf_subject,RDF.nodeID,proxy_resource_uri))
|
60
|
+
self.proxyIn = graph_context_uri
|
61
|
+
self.proxyFor = proxy_resource_uri
|
62
|
+
end
|
63
|
+
|
64
|
+
# override to obscure attempts to identify a containing Datastream
|
65
|
+
def apply_prefix(name)
|
66
|
+
name
|
67
|
+
end
|
68
|
+
|
69
|
+
def resource
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_json
|
74
|
+
to_solr.with_indifferent_access
|
75
|
+
end
|
76
|
+
|
77
|
+
def to_solr(solr_doc = {}) # :nodoc:
|
78
|
+
fields.each do |field_key, field_info|
|
79
|
+
values = resource.get_values(field_key.to_sym).result || []
|
80
|
+
values = [values] unless values.is_a? Array
|
81
|
+
values.each do |val|
|
82
|
+
if val.kind_of? RDF::URI
|
83
|
+
val = val.to_s
|
84
|
+
elsif val.kind_of? ActiveTriples::Resource
|
85
|
+
val = val.solrize
|
86
|
+
end
|
87
|
+
self.class.create_and_insert_terms(apply_prefix(field_key), val, field_info[:behaviors], solr_doc)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
solr_doc
|
91
|
+
end
|
92
|
+
# returns a Hash, e.g.: {field => {:values => [], :type => :something, :behaviors => []}, ...}
|
93
|
+
def fields
|
94
|
+
field_map = {}.with_indifferent_access
|
95
|
+
insert_field_map(:type, type_config(),field_map)
|
96
|
+
self.class.properties.each do |name, config|
|
97
|
+
insert_field_map(name, config, field_map)
|
98
|
+
end
|
99
|
+
field_map
|
100
|
+
end
|
101
|
+
|
102
|
+
def insert_field_map(name, config, field_map={})
|
103
|
+
type = config[:type]
|
104
|
+
behaviors = config[:behaviors]
|
105
|
+
return field_map unless type and behaviors
|
106
|
+
return field_map if config[:class_name] && config[:class_name] < ActiveFedora::Base
|
107
|
+
resource.query(:subject => rdf_subject, :predicate => config[:predicate]).each_statement do |statement|
|
108
|
+
field_map[name] ||= {:values => [], :type => type, :behaviors => behaviors, term: config[:term]}
|
109
|
+
field_map[name][:values] << statement.object.to_s
|
110
|
+
end
|
111
|
+
field_map
|
112
|
+
end
|
113
|
+
|
114
|
+
def type_config
|
115
|
+
@type_node_config ||= begin
|
116
|
+
config = ActiveTriples::NodeConfig.new(:type, RDF.type)
|
117
|
+
config.with_index {|ix| ix.as :symbol }
|
118
|
+
config
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'rdf'
|
3
|
+
module RDF
|
4
|
+
class SC < RDF::StrictVocabulary("http://www.shared-canvas.org/ns/")
|
5
|
+
term :Manifest,
|
6
|
+
type: "rdfs:Class".freeze
|
7
|
+
term :Sequence,
|
8
|
+
type: "rdfs:Class".freeze
|
9
|
+
term :Canvas,
|
10
|
+
type: "rdfs:Class".freeze
|
11
|
+
# IIIF 'attribution'
|
12
|
+
property :attributionLabel
|
13
|
+
# IIIF 'service'
|
14
|
+
property :hasRelatedService
|
15
|
+
# IIIF 'seeAlso'
|
16
|
+
property :hasRelatedDescription
|
17
|
+
# IIIF 'sequences'
|
18
|
+
# range is a collection of Sequence
|
19
|
+
property :hasSequences
|
20
|
+
|
21
|
+
property :withinManifest,
|
22
|
+
range: "http://www.shared-canvas.org/ns/Manifest".freeze,
|
23
|
+
subPropertyOf: "dc:isPartOf".freeze
|
24
|
+
property :withinSequence,
|
25
|
+
range: "http://www.shared-canvas.org/ns/Sequence".freeze,
|
26
|
+
subPropertyOf: "dc:isPartOf".freeze
|
27
|
+
|
28
|
+
# IIIF 'canvases'
|
29
|
+
# range is a collection of Canvas
|
30
|
+
property :hasCanvases
|
31
|
+
# IIIF 'resources'
|
32
|
+
property :hasAnnotations
|
33
|
+
# IIIF 'images'
|
34
|
+
property :hasImageAnnotations
|
35
|
+
# IIIF 'otherContent'
|
36
|
+
property :hasLists
|
37
|
+
# IIIF 'structures'
|
38
|
+
property :hasRanges
|
39
|
+
# IIIF 'metadata'
|
40
|
+
# range is a collection of Resource
|
41
|
+
property :metadataLabels
|
42
|
+
# IIIF 'viewingDirection'
|
43
|
+
property :viewingDirection
|
44
|
+
# IIIF 'viewingHint'
|
45
|
+
property :viewingHint
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module SC
|
2
|
+
class Canvas < ORE::Proxy
|
3
|
+
include NIE::InformationElement
|
4
|
+
property :belongsToContainer, predicate: RDF::DC[:isPartOf], multivalue: false do |ix|
|
5
|
+
ix.as :stored_sortable
|
6
|
+
end
|
7
|
+
def initialize(proxy_for_uri, context_uri, *args)
|
8
|
+
super(proxy_for_uri, context_uri, *args)
|
9
|
+
self.get_values(:type) << RDF::SC[:Canvas]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SC
|
2
|
+
class Sequence < ORE::Proxy
|
3
|
+
include NIE::InformationElement
|
4
|
+
property :viewingDirection, predicate: RDF::SC[:viewingDirection], multivalue: false do |ix|
|
5
|
+
ix.as :stored_sortable
|
6
|
+
end
|
7
|
+
property :viewingHint, predicate: RDF::SC[:viewingHint], multivalue: false do |ix|
|
8
|
+
ix.as :stored_sortable
|
9
|
+
end
|
10
|
+
property :canvases, predicate: RDF::SC[:hasCanvases], multivalue: true do |ix|
|
11
|
+
ix.as :symbol
|
12
|
+
end
|
13
|
+
property :belongsToContainer, predicate: RDF::DC[:isPartOf], multivalue: false do |ix|
|
14
|
+
ix.as :stored_sortable
|
15
|
+
end
|
16
|
+
def initialize(proxy_for_uri, context_uri, *args)
|
17
|
+
super(proxy_for_uri, context_uri, *args)
|
18
|
+
self.get_values(:type) << RDF::SC[:Sequence]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -125,6 +125,52 @@ class StructMetadata < ::ActiveFedora::Datastream
|
|
125
125
|
doc
|
126
126
|
end
|
127
127
|
|
128
|
+
def proxies
|
129
|
+
divs = divs_with_attribute(true)
|
130
|
+
graph_context_uri = RDF::URI("info:fedora/#{self.pid}")
|
131
|
+
file_system = self.type.eql?(RDF::NFO[:"#Filesystem"].to_s)
|
132
|
+
divs.collect do |div|
|
133
|
+
proxy_uri_chain = proxy_uri_chain_for(div)
|
134
|
+
proxy_resource_uri = proxy_uri_chain.pop
|
135
|
+
if div['CONTENTIDS']
|
136
|
+
subclass = file_system ?
|
137
|
+
NFO::FileDataObject : SC::Canvas
|
138
|
+
proxy = subclass.new(proxy_resource_uri, graph_context_uri)
|
139
|
+
proxy.proxyFor = RDF::URI(div['CONTENTIDS'])
|
140
|
+
else
|
141
|
+
subclass = file_system ?
|
142
|
+
NFO::Folder : SC::Sequence
|
143
|
+
proxy = subclass.new(proxy_resource_uri, graph_context_uri)
|
144
|
+
end
|
145
|
+
if div.parent and div.parent.name == 'div'
|
146
|
+
proxy.belongsToContainer = proxy_uri_for(div.parent)
|
147
|
+
end
|
148
|
+
proxy.isPartOf = proxy_uri_chain unless proxy_uri_chain.empty?
|
149
|
+
proxy.index = div['ORDER']
|
150
|
+
proxy.label = div['LABEL']
|
151
|
+
proxy
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
def ancestors(node)
|
157
|
+
current = node
|
158
|
+
labels = []
|
159
|
+
while (current.name == 'div')
|
160
|
+
labels.unshift URI.escape(current['LABEL'])
|
161
|
+
current = current.parent
|
162
|
+
end
|
163
|
+
labels
|
164
|
+
end
|
165
|
+
def proxy_uri_chain_for(node)
|
166
|
+
uris = []
|
167
|
+
ancestors(node).inject(RDF::URI("info:fedora/#{self.pid}/#{self.dsid}")) {|m,a| (uris << m/a).last}
|
168
|
+
uris
|
169
|
+
end
|
170
|
+
def proxy_uri_for(node)
|
171
|
+
# uri = segments.inject(base_uri) {|m,a| m/a}
|
172
|
+
ancestors(node).inject(RDF::URI("info:fedora/#{self.pid}/#{self.dsid}")) {|m,a| m/a}
|
173
|
+
end
|
128
174
|
end
|
129
175
|
end
|
130
176
|
end
|
@@ -49,4 +49,20 @@ class GenericAggregator < ::ActiveFedora::Base
|
|
49
49
|
solr_doc
|
50
50
|
end
|
51
51
|
|
52
|
+
def proxies
|
53
|
+
datastreams['structMetadata'] ? datastreams['structMetadata'].proxies : []
|
54
|
+
end
|
55
|
+
def update_index
|
56
|
+
super
|
57
|
+
if has_struct_metadata?()
|
58
|
+
conn = ActiveFedora::SolrService.instance.conn
|
59
|
+
# delete by query proxyIn_ssi: internal_uri
|
60
|
+
conn.delete_by_query("proxyIn_ssi:#{RSolr.escape(internal_uri())}")
|
61
|
+
|
62
|
+
# reindex proxies
|
63
|
+
proxy_docs = proxies().collect {|p| p.to_solr}
|
64
|
+
conn.add(proxy_docs, params: {softCommit: true})
|
65
|
+
conn.commit
|
66
|
+
end
|
67
|
+
end
|
52
68
|
end
|
data/config/fedora.yml
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
alcott: &alcott
|
2
|
+
:url: http://alcott.cul.columbia.edu:8080/fedora
|
2
3
|
:user: fedoraAdmin
|
3
|
-
:password:
|
4
|
-
|
5
|
-
:
|
6
|
-
|
7
|
-
test:
|
4
|
+
:password: f+BULUS*^
|
5
|
+
default: &default
|
6
|
+
:url: http://127.0.0.1:8983/fedora
|
8
7
|
:user: fedoraAdmin
|
9
8
|
:password: fedoraAdmin
|
10
|
-
|
11
|
-
|
9
|
+
development: *alcott
|
10
|
+
test: *default
|
11
|
+
production: *alcott
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<info:fedora/marcorg:nnc> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.loc.gov/mads/rdf/v1#CorporateName> .
|
2
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#hasReciprocalAuthority> <http://id.loc.gov/vocabulary/organizations/nnc> .
|
3
|
+
<info:fedora/marcorg:nnc> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.loc.gov/mads/rdf/v1#Authority> .
|
4
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#code> "NNC"^^<http://id.loc.gov/datatypes/orgs/code> .
|
5
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#code> "nnc"^^<http://id.loc.gov/datatypes/orgs/normalized> .
|
6
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#authoritativeLabel> "Butler Library"@en .
|
7
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#hasAbbreviationVariant> _:bnodereponncfacet .
|
8
|
+
<info:fedora/marcorg:nnc> <http://www.loc.gov/mads/rdf/v1#hasExpansionVariant> _:bnodereponncfull .
|
9
|
+
_:bnodereponncfacet <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.loc.gov/mads/rdf/v1#Variant> .
|
10
|
+
_:bnodereponncfacet <http://www.loc.gov/mads/rdf/v1#variantLabel> "Butler Library"@en .
|
11
|
+
_:bnodereponncfull <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.loc.gov/mads/rdf/v1#Variant> .
|
12
|
+
_:bnodereponncfull <http://www.loc.gov/mads/rdf/v1#variantLabel> "Butler Library, Columbia University"@en
|
data/config/subs.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
development:
|
2
|
+
djatoka_server: "http://iris.cul.columbia.edu:8080"
|
3
|
+
fedora_server: "http://sayers.cul.columbia.edu:8080"
|
4
|
+
php_server: "http://bach.cul.columbia.edu/dev"
|
5
|
+
test:
|
6
|
+
djatoka_server: "http://iris.cul.columbia.edu:8080"
|
7
|
+
fedora_server: "http://sayers.cul.columbia.edu:8080"
|
8
|
+
php_server: "http://bach.cul.columbia.edu/dev"
|
9
|
+
production:
|
10
|
+
djatoka_server: "http://iris.cul.columbia.edu:8080"
|
11
|
+
fedora_server: "http://alcott.cul.columbia.edu:8080"
|
12
|
+
php_server: "http://bach.cul.columbia.edu"
|