ddr-core 0.2.1
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.
- 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
|