ddr-core 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +12 -0
- data/README.md +27 -0
- data/Rakefile +30 -0
- data/app/assets/config/ddr_core_manifest.js +0 -0
- data/app/controllers/users/omniauth_callbacks_controller.rb +11 -0
- data/app/controllers/users/sessions_controller.rb +15 -0
- data/app/models/concerns/ddr/captionable.rb +25 -0
- data/app/models/concerns/ddr/describable.rb +108 -0
- data/app/models/concerns/ddr/governable.rb +25 -0
- data/app/models/concerns/ddr/has_admin_metadata.rb +141 -0
- data/app/models/concerns/ddr/has_attachments.rb +10 -0
- data/app/models/concerns/ddr/has_children.rb +10 -0
- data/app/models/concerns/ddr/has_content.rb +132 -0
- data/app/models/concerns/ddr/has_extracted_text.rb +10 -0
- data/app/models/concerns/ddr/has_intermediate_file.rb +25 -0
- data/app/models/concerns/ddr/has_multires_image.rb +14 -0
- data/app/models/concerns/ddr/has_parent.rb +18 -0
- data/app/models/concerns/ddr/has_struct_metadata.rb +21 -0
- data/app/models/concerns/ddr/has_thumbnail.rb +33 -0
- data/app/models/concerns/ddr/solr_document_behavior.rb +429 -0
- data/app/models/concerns/ddr/streamable.rb +25 -0
- data/app/models/ddr/admin_set.rb +28 -0
- data/app/models/ddr/attachment.rb +14 -0
- data/app/models/ddr/collection.rb +28 -0
- data/app/models/ddr/component.rb +31 -0
- data/app/models/ddr/contact.rb +23 -0
- data/app/models/ddr/digest.rb +8 -0
- data/app/models/ddr/file.rb +40 -0
- data/app/models/ddr/item.rb +36 -0
- data/app/models/ddr/language.rb +31 -0
- data/app/models/ddr/media_type.rb +22 -0
- data/app/models/ddr/resource.rb +94 -0
- data/app/models/ddr/rights_statement.rb +25 -0
- data/app/models/ddr/target.rb +17 -0
- data/config/initializers/devise.rb +262 -0
- data/config/locales/ddr-core.en.yml +85 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20141104181418_create_users.rb +34 -0
- data/db/migrate/20141107124012_add_columns_to_user.rb +46 -0
- data/lib/ddr-core.rb +1 -0
- data/lib/ddr/auth.rb +80 -0
- data/lib/ddr/auth/ability.rb +18 -0
- data/lib/ddr/auth/ability_definitions.rb +26 -0
- data/lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb +9 -0
- data/lib/ddr/auth/ability_definitions/alias_ability_definitions.rb +23 -0
- data/lib/ddr/auth/ability_definitions/attachment_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/collection_ability_definitions.rb +28 -0
- data/lib/ddr/auth/ability_definitions/component_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/item_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/lock_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +16 -0
- data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +39 -0
- data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +9 -0
- data/lib/ddr/auth/ability_factory.rb +10 -0
- data/lib/ddr/auth/abstract_ability.rb +48 -0
- data/lib/ddr/auth/affiliation.rb +14 -0
- data/lib/ddr/auth/affiliation_groups.rb +20 -0
- data/lib/ddr/auth/anonymous_ability.rb +7 -0
- data/lib/ddr/auth/auth_context.rb +109 -0
- data/lib/ddr/auth/auth_context_factory.rb +13 -0
- data/lib/ddr/auth/detached_auth_context.rb +19 -0
- data/lib/ddr/auth/dynamic_groups.rb +13 -0
- data/lib/ddr/auth/effective_permissions.rb +12 -0
- data/lib/ddr/auth/effective_roles.rb +9 -0
- data/lib/ddr/auth/failure_app.rb +16 -0
- data/lib/ddr/auth/group.rb +40 -0
- data/lib/ddr/auth/grouper_gateway.rb +70 -0
- data/lib/ddr/auth/groups.rb +32 -0
- data/lib/ddr/auth/ldap_gateway.rb +74 -0
- data/lib/ddr/auth/permissions.rb +18 -0
- data/lib/ddr/auth/remote_groups.rb +14 -0
- data/lib/ddr/auth/role_based_access_controls_enforcement.rb +56 -0
- data/lib/ddr/auth/roles.rb +28 -0
- data/lib/ddr/auth/roles/role.rb +121 -0
- data/lib/ddr/auth/roles/role_type.rb +23 -0
- data/lib/ddr/auth/roles/role_types.rb +52 -0
- data/lib/ddr/auth/superuser_ability.rb +7 -0
- data/lib/ddr/auth/test_helpers.rb +22 -0
- data/lib/ddr/auth/user.rb +54 -0
- data/lib/ddr/auth/web_auth_context.rb +29 -0
- data/lib/ddr/core.rb +110 -0
- data/lib/ddr/core/engine.rb +8 -0
- data/lib/ddr/core/version.rb +5 -0
- data/lib/ddr/error.rb +16 -0
- data/lib/ddr/files.rb +13 -0
- data/lib/ddr/fits.rb +189 -0
- data/lib/ddr/index.rb +29 -0
- data/lib/ddr/index/abstract_query_result.rb +22 -0
- data/lib/ddr/index/connection.rb +38 -0
- data/lib/ddr/index/csv_query_result.rb +84 -0
- data/lib/ddr/index/document_builder.rb +9 -0
- data/lib/ddr/index/field.rb +35 -0
- data/lib/ddr/index/field_attribute.rb +22 -0
- data/lib/ddr/index/fields.rb +154 -0
- data/lib/ddr/index/filter.rb +139 -0
- data/lib/ddr/index/query.rb +82 -0
- data/lib/ddr/index/query_builder.rb +185 -0
- data/lib/ddr/index/query_clause.rb +112 -0
- data/lib/ddr/index/query_params.rb +40 -0
- data/lib/ddr/index/query_result.rb +102 -0
- data/lib/ddr/index/response.rb +30 -0
- data/lib/ddr/index/sort_order.rb +28 -0
- data/lib/ddr/index/unique_key_field.rb +12 -0
- data/lib/ddr/managers.rb +9 -0
- data/lib/ddr/managers/manager.rb +13 -0
- data/lib/ddr/managers/technical_metadata_manager.rb +141 -0
- data/lib/ddr/structure.rb +188 -0
- data/lib/ddr/structures/agent.rb +49 -0
- data/lib/ddr/structures/component_type_term.rb +29 -0
- data/lib/ddr/structures/div.rb +64 -0
- data/lib/ddr/structures/f_locat.rb +54 -0
- data/lib/ddr/structures/file.rb +52 -0
- data/lib/ddr/structures/file_grp.rb +35 -0
- data/lib/ddr/structures/file_sec.rb +22 -0
- data/lib/ddr/structures/fptr.rb +31 -0
- data/lib/ddr/structures/mets_hdr.rb +37 -0
- data/lib/ddr/structures/mptr.rb +49 -0
- data/lib/ddr/structures/struct_map.rb +40 -0
- data/lib/ddr/utils.rb +185 -0
- data/lib/ddr/vocab.rb +22 -0
- data/lib/ddr/vocab/asset.rb +51 -0
- data/lib/ddr/vocab/contact.rb +9 -0
- data/lib/ddr/vocab/display.rb +9 -0
- data/lib/ddr/vocab/duke_terms.rb +13 -0
- data/lib/ddr/vocab/rdf_vocabulary_parser.rb +43 -0
- data/lib/ddr/vocab/roles.rb +25 -0
- data/lib/ddr/vocab/sources/duketerms.rdf +870 -0
- data/lib/ddr/vocab/vocabulary.rb +37 -0
- data/lib/ddr/workflow.rb +8 -0
- data/lib/tasks/ddr/core_tasks.rake +4 -0
- metadata +428 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ddr::Auth
|
2
|
+
class WebAuthContext < AuthContext
|
3
|
+
|
4
|
+
# @return [String] the IP address, or nil
|
5
|
+
# @see ActionDispatch::RemoteIp
|
6
|
+
def ip_address
|
7
|
+
if middleware = env["action_dispatch.remote_ip"]
|
8
|
+
middleware.calculate_ip
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Array<String>]
|
13
|
+
def affiliation
|
14
|
+
split_env("affiliation").map { |a| a.sub(/@duke\.edu\z/, "") }
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Array<String>]
|
18
|
+
def ismemberof
|
19
|
+
split_env("ismemberof")
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def split_env(attr, delim = ";")
|
25
|
+
env.fetch(attr, "").split(delim)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/ddr/core.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'ddr/core/engine'
|
2
|
+
require 'ddr/vocab'
|
3
|
+
require 'ddr/auth'
|
4
|
+
require 'ddr/error'
|
5
|
+
|
6
|
+
module Ddr
|
7
|
+
extend ActiveSupport::Autoload
|
8
|
+
|
9
|
+
autoload :Files
|
10
|
+
autoload :NotFoundError, 'ddr/error'
|
11
|
+
autoload :Fits
|
12
|
+
autoload :Index
|
13
|
+
autoload :Managers
|
14
|
+
autoload :Utils
|
15
|
+
autoload :Workflow
|
16
|
+
|
17
|
+
autoload :Structure
|
18
|
+
module Structures
|
19
|
+
extend ActiveSupport::Autoload
|
20
|
+
autoload :Agent
|
21
|
+
autoload :Div
|
22
|
+
autoload :File
|
23
|
+
autoload :FileGrp
|
24
|
+
autoload :FileSec
|
25
|
+
autoload :FLocat
|
26
|
+
autoload :Fptr
|
27
|
+
autoload :MetsHdr
|
28
|
+
autoload :Mptr
|
29
|
+
autoload :StructMap
|
30
|
+
autoload :ComponentTypeTerm
|
31
|
+
end
|
32
|
+
|
33
|
+
SOLR_DOCUMENT_ID = "id"
|
34
|
+
|
35
|
+
# Default metadata adapter configured for Valkyrie
|
36
|
+
def self.metadata_adapter
|
37
|
+
@metadata_adapter ||= Valkyrie.config.metadata_adapter
|
38
|
+
end
|
39
|
+
|
40
|
+
# Persister for default metadata_adapter
|
41
|
+
def self.persister
|
42
|
+
@persister ||= metadata_adapter.persister
|
43
|
+
end
|
44
|
+
|
45
|
+
# Query Service for default metadata_adapter
|
46
|
+
def self.query_service
|
47
|
+
@query_service ||= metadata_adapter.query_service
|
48
|
+
end
|
49
|
+
|
50
|
+
# Default storage adapter
|
51
|
+
def self.storage_adapter
|
52
|
+
@storage_adapter ||= Valkyrie.config.storage_adapter
|
53
|
+
end
|
54
|
+
|
55
|
+
# Convenient to be able to set the default storage adapter in certain cases
|
56
|
+
def self.storage_adapter=(storage_adapter)
|
57
|
+
@storage_adapter = storage_adapter
|
58
|
+
end
|
59
|
+
|
60
|
+
mattr_accessor :default_mime_type do
|
61
|
+
"application/octet-stream"
|
62
|
+
end
|
63
|
+
|
64
|
+
# Maps media types to preferred file extensions
|
65
|
+
mattr_accessor :preferred_file_extensions do
|
66
|
+
{
|
67
|
+
'application/zip' => 'zip',
|
68
|
+
'audio/mp4' => 'm4a',
|
69
|
+
'audio/mpeg' => 'mp3',
|
70
|
+
'audio/ogg' => 'ogg',
|
71
|
+
'audio/wav' => 'wav',
|
72
|
+
'text/vtt' => 'vtt',
|
73
|
+
'video/flv' => 'flv',
|
74
|
+
'video/mp4' => 'mp4',
|
75
|
+
'video/quicktime' => 'mov',
|
76
|
+
'video/webm' => 'webm'
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# Maps file extensions to preferred media types
|
81
|
+
mattr_accessor :preferred_media_types do
|
82
|
+
{
|
83
|
+
'.aac' => 'audio/mp4',
|
84
|
+
'.f4a' => 'audio/mp4',
|
85
|
+
'.flv' => 'video/flv',
|
86
|
+
'.m4a' => 'audio/mp4',
|
87
|
+
'.mov' => 'video/quicktime',
|
88
|
+
'.mp3' => 'audio/mpeg',
|
89
|
+
'.mp4' => 'video/mp4',
|
90
|
+
'.oga' => 'audio/ogg',
|
91
|
+
'.ogg' => 'audio/ogg',
|
92
|
+
'.srt' => 'text/plain',
|
93
|
+
'.vtt' => 'text/vtt',
|
94
|
+
'.wav' => 'audio/wav',
|
95
|
+
'.webm' => 'video/webm',
|
96
|
+
'.zip' => 'application/zip'
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
# Is repository locked? Default is false.
|
101
|
+
# A locked repository behaves as though each object in the repository is locked.
|
102
|
+
mattr_accessor :repository_locked do
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
module Core
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
data/lib/ddr/error.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ddr
|
2
|
+
# Base class for custom exceptions
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
# # Invalid checksum
|
6
|
+
# class ChecksumInvalid < Error; end
|
7
|
+
#
|
8
|
+
# # Derivative generation failure
|
9
|
+
# class DerivativeGenerationFailure < Error; end
|
10
|
+
#
|
11
|
+
# # Content model casting error
|
12
|
+
# class ContentModelError < Error; end
|
13
|
+
|
14
|
+
# A model instance was not found
|
15
|
+
class NotFoundError < Error; end
|
16
|
+
end
|
data/lib/ddr/files.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Files
|
3
|
+
|
4
|
+
CHECKSUM_TYPE_MD5 = 'MD5'.freeze
|
5
|
+
CHECKSUM_TYPE_SHA1 = 'SHA1'.freeze
|
6
|
+
CHECKSUM_TYPE_SHA256 = 'SHA256'.freeze
|
7
|
+
CHECKSUM_TYPE_SHA384 = 'SHA384'.freeze
|
8
|
+
CHECKSUM_TYPE_SHA512 = 'SHA512'.freeze
|
9
|
+
|
10
|
+
CHECKSUM_TYPES = Valkyrie::Types::Strict::String.enum(CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA1, CHECKSUM_TYPE_SHA256,
|
11
|
+
CHECKSUM_TYPE_SHA384, CHECKSUM_TYPE_SHA512)
|
12
|
+
end
|
13
|
+
end
|
data/lib/ddr/fits.rb
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
module Ddr
|
2
|
+
class Fits < SimpleDelegator
|
3
|
+
|
4
|
+
FITS_XMLNS = "http://hul.harvard.edu/ois/xml/ns/fits/fits_output".freeze
|
5
|
+
FITS_SCHEMA = "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd".freeze
|
6
|
+
|
7
|
+
EXIFTOOL = "Exiftool"
|
8
|
+
|
9
|
+
def version
|
10
|
+
root.xpath('@version').map(&:value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def timestamp
|
14
|
+
root.xpath('@timestamp').map(&:value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def format_label
|
18
|
+
root.xpath('fits:identification/fits:identity/@format', fits: FITS_XMLNS).map(&:value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def format_version
|
22
|
+
root.xpath('fits:identification/fits:identity/fits:version', fits: FITS_XMLNS).map(&:text)
|
23
|
+
end
|
24
|
+
|
25
|
+
def media_type
|
26
|
+
root.xpath('fits:identification/fits:identity/@mimetype', fits: FITS_XMLNS).map(&:value)
|
27
|
+
end
|
28
|
+
|
29
|
+
def pronom_identifier
|
30
|
+
root.xpath('fits:identification/fits:identity/fits:externalIdentifier[@type = "puid"]', fits: FITS_XMLNS)
|
31
|
+
.map(&:text)
|
32
|
+
end
|
33
|
+
|
34
|
+
def valid
|
35
|
+
root.xpath('fits:filestatus/fits:valid', fits: FITS_XMLNS).map(&:text)
|
36
|
+
end
|
37
|
+
|
38
|
+
def well_formed
|
39
|
+
root.xpath('fits:filestatus/fits:well-formed', fits: FITS_XMLNS).map(&:text)
|
40
|
+
end
|
41
|
+
|
42
|
+
def created
|
43
|
+
root.xpath('fits:fileinfo/fits:created', fits: FITS_XMLNS).map(&:text)
|
44
|
+
end
|
45
|
+
|
46
|
+
def creating_application
|
47
|
+
root.xpath('fits:fileinfo/fits:creatingApplicationName', fits: FITS_XMLNS).map(&:text)
|
48
|
+
end
|
49
|
+
|
50
|
+
def extent
|
51
|
+
root.xpath('fits:fileinfo/fits:size', fits: FITS_XMLNS).map(&:text)
|
52
|
+
end
|
53
|
+
|
54
|
+
def md5
|
55
|
+
root.xpath('fits:fileinfo/fits:md5checksum', fits: FITS_XMLNS).map(&:text)
|
56
|
+
end
|
57
|
+
|
58
|
+
def color_space
|
59
|
+
root.xpath('fits:metadata/fits:image/fits:colorSpace', fits: FITS_XMLNS).map(&:text)
|
60
|
+
end
|
61
|
+
|
62
|
+
def icc_profile_name
|
63
|
+
root.xpath('fits:metadata/fits:image/fits:iccProfileName', fits: FITS_XMLNS).map(&:text)
|
64
|
+
end
|
65
|
+
|
66
|
+
def icc_profile_version
|
67
|
+
root.xpath('fits:metadata/fits:image/fits:iccProfileVersion', fits: FITS_XMLNS).map(&:text)
|
68
|
+
end
|
69
|
+
|
70
|
+
def image_height
|
71
|
+
root.xpath('fits:metadata/fits:image/fits:imageHeight', fits: FITS_XMLNS).map(&:text)
|
72
|
+
end
|
73
|
+
|
74
|
+
def image_width
|
75
|
+
root.xpath('fits:metadata/fits:image/fits:imageWidth', fits: FITS_XMLNS).map(&:text)
|
76
|
+
end
|
77
|
+
|
78
|
+
def modified
|
79
|
+
root.xpath("fits:fileinfo/fits:lastmodified[@toolname != '#{EXIFTOOL}']", fits: FITS_XMLNS).map(&:text)
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.xml_template
|
83
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
84
|
+
xml.fits("xmlns"=>FITS_XMLNS,
|
85
|
+
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
86
|
+
"xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output #{FITS_SCHEMA}")
|
87
|
+
end
|
88
|
+
builder.doc
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def root
|
94
|
+
xpath('//fits:fits', fits: FITS_XMLNS).first
|
95
|
+
end
|
96
|
+
|
97
|
+
### DDRevo ##########################################
|
98
|
+
# From Ddr::Datastreams::FitsDatastream. Code above accounts for proxy terms from below and has a private 'root'
|
99
|
+
# method but does not (yet) provide methods for all the terms in the terminology. Thought it was better to wait
|
100
|
+
# and see which ones are actually needed.
|
101
|
+
### DDRevo ##########################################
|
102
|
+
# set_terminology do |t|
|
103
|
+
# t.root(path: "fits",
|
104
|
+
# xmlns: FITS_XMLNS,
|
105
|
+
# schema: FITS_SCHEMA)
|
106
|
+
# t.version(path: {attribute: "version"})
|
107
|
+
# t.timestamp(path: {attribute: "timestamp"})
|
108
|
+
# t.identification {
|
109
|
+
# t.identity {
|
110
|
+
# t.mimetype(path: {attribute: "mimetype"})
|
111
|
+
# t.format_label(path: {attribute: "format"})
|
112
|
+
# t.version
|
113
|
+
# t.externalIdentifier
|
114
|
+
# t.pronom_identifier(path: "externalIdentifier", attributes: {type: "puid"})
|
115
|
+
# }
|
116
|
+
# }
|
117
|
+
# t.fileinfo {
|
118
|
+
# t.created
|
119
|
+
# t.creatingApplicationName
|
120
|
+
# t.creatingos
|
121
|
+
# t.filename
|
122
|
+
# t.filepath
|
123
|
+
# t.fslastmodified
|
124
|
+
# t.lastmodified
|
125
|
+
# t.md5checksum
|
126
|
+
# t.size
|
127
|
+
# }
|
128
|
+
# t.filestatus {
|
129
|
+
# t.valid
|
130
|
+
# t.well_formed(path: "well-formed")
|
131
|
+
# }
|
132
|
+
# t.metadata {
|
133
|
+
# t.image {
|
134
|
+
# t.imageWidth
|
135
|
+
# t.imageHeight
|
136
|
+
# t.colorSpace
|
137
|
+
# t.iccProfileName
|
138
|
+
# t.iccProfileVersion
|
139
|
+
# }
|
140
|
+
# t.document {
|
141
|
+
# # TODO - configure to get from Tika?
|
142
|
+
# # t.encoding
|
143
|
+
# }
|
144
|
+
# t.text
|
145
|
+
# t.audio
|
146
|
+
# t.video
|
147
|
+
# }
|
148
|
+
#
|
149
|
+
# ## proxy terms
|
150
|
+
#
|
151
|
+
# # identification / identity
|
152
|
+
# t.format_label proxy: [:identification, :identity, :format_label]
|
153
|
+
# t.format_version proxy: [:identification, :identity, :version]
|
154
|
+
# t.media_type proxy: [:identification, :identity, :mimetype]
|
155
|
+
# t.pronom_identifier proxy: [:identification, :identity, :pronom_identifier]
|
156
|
+
#
|
157
|
+
# # filestatus
|
158
|
+
# t.valid proxy: [:filestatus, :valid]
|
159
|
+
# t.well_formed proxy: [:filestatus, :well_formed]
|
160
|
+
#
|
161
|
+
# # fileinfo
|
162
|
+
# t.created proxy: [:fileinfo, :created]
|
163
|
+
# t.creating_application proxy: [:fileinfo, :creatingApplicationName]
|
164
|
+
# t.extent proxy: [:fileinfo, :size]
|
165
|
+
# t.md5 proxy: [:fileinfo, :md5checksum]
|
166
|
+
#
|
167
|
+
# # image metadata
|
168
|
+
# t.color_space proxy: [:metadata, :image, :colorSpace]
|
169
|
+
# t.icc_profile_name proxy: [:metadata, :image, :iccProfileName]
|
170
|
+
# t.icc_profile_version proxy: [:metadata, :image, :iccProfileVersion]
|
171
|
+
# t.image_height proxy: [:metadata, :image, :imageHeight]
|
172
|
+
# t.image_width proxy: [:metadata, :image, :imageWidth]
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
# def self.xml_template
|
176
|
+
# builder = Nokogiri::XML::Builder.new do |xml|
|
177
|
+
# xml.fits("xmlns"=>FITS_XMLNS,
|
178
|
+
# "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
179
|
+
# "xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd")
|
180
|
+
# end
|
181
|
+
# builder.doc
|
182
|
+
# end
|
183
|
+
#
|
184
|
+
# def prefix
|
185
|
+
# "fits__"
|
186
|
+
# end
|
187
|
+
|
188
|
+
end
|
189
|
+
end
|
data/lib/ddr/index.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Index
|
3
|
+
extend ActiveSupport::Autoload
|
4
|
+
|
5
|
+
autoload :AbstractQueryResult
|
6
|
+
autoload :Connection
|
7
|
+
autoload :CSVQueryResult
|
8
|
+
autoload :DocumentBuilder
|
9
|
+
autoload :Field
|
10
|
+
autoload :FieldAttribute
|
11
|
+
autoload :Fields
|
12
|
+
autoload :Filter
|
13
|
+
autoload :Query
|
14
|
+
autoload :QueryBuilder
|
15
|
+
autoload :QueryClause
|
16
|
+
autoload :QueryParams
|
17
|
+
autoload :QueryResult
|
18
|
+
autoload :Response
|
19
|
+
autoload :SortOrder
|
20
|
+
autoload :UniqueKeyField
|
21
|
+
|
22
|
+
def self.pids
|
23
|
+
builder = QueryBuilder.new { field UniqueKeyField.instance }
|
24
|
+
query = builder.query
|
25
|
+
query.pids
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ddr::Index
|
2
|
+
class AbstractQueryResult
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :query
|
6
|
+
delegate :params, to: :query
|
7
|
+
|
8
|
+
def initialize(query)
|
9
|
+
@query = query.dup.freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
def count
|
13
|
+
response = Connection.select(params, rows: 0)
|
14
|
+
response.num_found
|
15
|
+
end
|
16
|
+
|
17
|
+
def each
|
18
|
+
raise NotImplementedError, "Subclasses must implement `#each`."
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "rsolr"
|
2
|
+
require "forwardable"
|
3
|
+
|
4
|
+
module Ddr::Index
|
5
|
+
#
|
6
|
+
# Wraps an RSolr connection
|
7
|
+
#
|
8
|
+
class Connection
|
9
|
+
|
10
|
+
module Methods
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
delegate [:get, :post, :paginate] => :solr
|
14
|
+
|
15
|
+
def solr
|
16
|
+
# Changed for Valkyrie
|
17
|
+
# RSolr.connect(ActiveFedora.solr_config)
|
18
|
+
Blacklight.default_index.connection
|
19
|
+
end
|
20
|
+
|
21
|
+
def select(params, extra={})
|
22
|
+
Response.new post("select", params: params.merge(extra))
|
23
|
+
end
|
24
|
+
|
25
|
+
def page(*args)
|
26
|
+
Response.new paginate(*args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def count(params)
|
30
|
+
select(params, rows: 0).num_found
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
extend Methods
|
35
|
+
include Methods
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|