libis-services 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +36 -0
  6. data/Rakefile +6 -0
  7. data/lib/libis/services/aleph/search.rb +157 -0
  8. data/lib/libis/services/alma/web_service.rb +36 -0
  9. data/lib/libis/services/collective_access/cataloguing.rb +48 -0
  10. data/lib/libis/services/collective_access/connector.rb +151 -0
  11. data/lib/libis/services/collective_access/item_info.rb +36 -0
  12. data/lib/libis/services/collective_access/search.rb +26 -0
  13. data/lib/libis/services/collective_access/service.rb +80 -0
  14. data/lib/libis/services/collective_access.rb +1 -0
  15. data/lib/libis/services/digitool/digital_entity_manager.rb +223 -0
  16. data/lib/libis/services/digitool/digitool_connector.rb +46 -0
  17. data/lib/libis/services/digitool/meta_data_manager.rb +193 -0
  18. data/lib/libis/services/extend/http_fetch.rb +63 -0
  19. data/lib/libis/services/generic_search.rb +38 -0
  20. data/lib/libis/services/http_error.rb +21 -0
  21. data/lib/libis/services/oracle_client.rb +47 -0
  22. data/lib/libis/services/primo/limo.rb +33 -0
  23. data/lib/libis/services/primo/search.rb +46 -0
  24. data/lib/libis/services/primo.rb +2 -0
  25. data/lib/libis/services/rest_client.rb +66 -0
  26. data/lib/libis/services/rosetta/client.rb +108 -0
  27. data/lib/libis/services/rosetta/collection_handler.rb +45 -0
  28. data/lib/libis/services/rosetta/collection_info.rb +44 -0
  29. data/lib/libis/services/rosetta/deposit_activity.rb +48 -0
  30. data/lib/libis/services/rosetta/deposit_handler.rb +187 -0
  31. data/lib/libis/services/rosetta/ie.rb +19 -0
  32. data/lib/libis/services/rosetta/ie_handler.rb +29 -0
  33. data/lib/libis/services/rosetta/oai_pmh.rb +48 -0
  34. data/lib/libis/services/rosetta/oai_set.rb +21 -0
  35. data/lib/libis/services/rosetta/pds_handler.rb +60 -0
  36. data/lib/libis/services/rosetta/producer.rb +71 -0
  37. data/lib/libis/services/rosetta/producer_handler.rb +125 -0
  38. data/lib/libis/services/rosetta/service.rb +403 -0
  39. data/lib/libis/services/rosetta/sip.rb +26 -0
  40. data/lib/libis/services/rosetta/sip_handler.rb +31 -0
  41. data/lib/libis/services/rosetta/user.rb +70 -0
  42. data/lib/libis/services/rosetta/user_manager.rb +28 -0
  43. data/lib/libis/services/rosetta.rb +2 -0
  44. data/lib/libis/services/scope/search.rb +46 -0
  45. data/lib/libis/services/search_factory.rb +40 -0
  46. data/lib/libis/services/service_error.rb +16 -0
  47. data/lib/libis/services/sharepoint/connector.rb +236 -0
  48. data/lib/libis/services/sharepoint/search.rb +19 -0
  49. data/lib/libis/services/soap_client.rb +57 -0
  50. data/lib/libis/services/soap_error.rb +22 -0
  51. data/lib/libis/services/version.rb +5 -0
  52. data/lib/libis/services.rb +22 -0
  53. data/lib/libis-services.rb +1 -0
  54. data/libis-services.gemspec +40 -0
  55. data/spec/alma_service_spec.rb +104 -0
  56. data/spec/ie_data.rb +726 -0
  57. data/spec/primo_limo_spec.rb +363 -0
  58. data/spec/primo_search_spec.rb +39 -0
  59. data/spec/rosetta_collection_spec.rb +206 -0
  60. data/spec/rosetta_deposit_spec.rb +82 -0
  61. data/spec/rosetta_ie_spec.rb +54 -0
  62. data/spec/rosetta_oai_spec.rb +52 -0
  63. data/spec/rosetta_pds_spec.rb +79 -0
  64. data/spec/rosetta_producer_spec.rb +270 -0
  65. data/spec/rosetta_sip_spec.rb +39 -0
  66. data/spec/spec_helper.rb +28 -0
  67. metadata +317 -0
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+ require 'json'
3
+
4
+ require 'libis/services/rest_client'
5
+ require 'libis/services/generic_search'
6
+
7
+ module Libis
8
+ module Services
9
+ module Primo
10
+
11
+ class Search
12
+ include ::Libis::Services::RestClient
13
+ include ::Libis::Services::GenericSearch
14
+
15
+ def initialize(url = 'https://services.libis.be')
16
+ configure(url)
17
+ end
18
+
19
+ def query(query, options = {})
20
+ index = options.delete(:index) || 'any'
21
+ get 'search', {query: "#{index}:#{query}"}.merge(options)
22
+ end
23
+
24
+ def find(term, options = {})
25
+ max_count = options.delete(:max_count) || 100
26
+ result = []
27
+ while result.size < max_count
28
+ reply = query(term, options.merge(from: result.size + 1))
29
+ max_count = [max_count, reply[:count]].min
30
+ reply[:data].each do |record|
31
+ next unless result.size < max_count
32
+ result << record[:display]
33
+ end
34
+ end
35
+ result
36
+ end
37
+
38
+ protected
39
+
40
+ def result_parser(response)
41
+ JSON.parse(response, symbolize_names: true)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'primo/search'
2
+ require_relative 'primo/limo'
@@ -0,0 +1,66 @@
1
+ # coding: utf-8
2
+
3
+ require 'rest-client'
4
+ require 'nori'
5
+ require 'json'
6
+ require 'gyoku'
7
+
8
+ module Libis
9
+ module Services
10
+
11
+ module RestClient
12
+ attr_reader :client
13
+
14
+ def configure(url, options = {})
15
+ @client = ::RestClient::Resource.new(url, options)
16
+ end
17
+
18
+ def get(path, params = {}, headers = {}, &block)
19
+ response = client[path].get({params: params}.merge headers, &block)
20
+ parse_result response, &block
21
+ rescue ::RestClient::Exception => e
22
+ return {error_type: e.class.name, error_name: e.message, response: parse_result(e.response, &block)}
23
+ end
24
+
25
+ def post_url(path, params = {}, headers = {}, &block)
26
+ response = client[path].post({params: params}.merge headers, &block)
27
+ parse_result response, &block
28
+ rescue ::RestClient::Exception => e
29
+ return {error_type: e.class.name, error_name: e.message, response: parse_result(e.response, &block)}
30
+ end
31
+
32
+ def post_data(path, payload, headers = {}, &block)
33
+ response = client[path].post(payload, headers, &block)
34
+ parse_result response, &block
35
+ rescue ::RestClient::Exception => e
36
+ return {error_type: e.class.name, error_name: e.message, response: parse_result(e.response, &block)}
37
+ end
38
+
39
+ def put_url(path, params = {}, headers = {}, &block)
40
+ response = client[path].put({params: params}.merge headers, &block)
41
+ parse_result response, &block
42
+ rescue ::RestClient::Exception => e
43
+ return {error_type: e.class.name, error_name: e.message, response: parse_result(e.response, &block)}
44
+ end
45
+
46
+ def put_data(path, payload, headers = {}, &block)
47
+ response = client[path].put(payload, headers, &block)
48
+ parse_result response, &block
49
+ rescue ::RestClient::Exception => e
50
+ return {error_type: e.class.name, error_name: e.message, response: parse_result(e.response, &block)}
51
+ end
52
+
53
+ protected
54
+
55
+ def parse_result(response)
56
+ block_given? ? yield(response) : result_parser(response)
57
+ end
58
+
59
+ def result_parser(response)
60
+ response
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,108 @@
1
+ # coding: utf-8
2
+
3
+ require 'awesome_print'
4
+
5
+ require 'libis/tools/extend/hash'
6
+ require 'libis/tools/config'
7
+ require 'libis/tools/logger'
8
+
9
+ require 'libis/services/soap_client'
10
+ require 'libis/services/service_error'
11
+ module Libis
12
+ module Services
13
+ module Rosetta
14
+
15
+ class Client
16
+ include ::Libis::Services::SoapClient
17
+ include ::Libis::Tools::Logger
18
+
19
+ def initialize(section, service, options = {})
20
+ opts = {strip_namespaces: true, logger: ::Libis::Tools::Config.logger}.merge options
21
+ base_url = opts.delete(:url) || 'http://depot.lias.be'
22
+ configure "#{base_url}/dpsws/#{section}/#{service}?wsdl", opts
23
+ end
24
+
25
+ def pds_handle=(handle)
26
+ @pds_handle = handle
27
+ end
28
+
29
+ def get_heart_bit
30
+ request :get_heart_bit
31
+ end
32
+
33
+ protected
34
+
35
+ def call_raw(operation, args = {})
36
+ data = request operation.to_s.to_sym, args
37
+
38
+ # remove wrapper
39
+ data = data["#{operation}_response".to_sym]
40
+ data.delete(:'@xmlns:ns1')
41
+
42
+ # drill down the returned Hash
43
+ data = data.first.last while data.is_a?(Hash) && 1 == data.size
44
+
45
+ data
46
+ end
47
+
48
+ def call(operation, args = {})
49
+ # upstream call
50
+ data = call_raw(operation, args)
51
+
52
+ # try to parse as XML
53
+ if data.is_a?(String)
54
+ xml_data = Libis::Tools::XmlDocument.parse(data).to_hash(
55
+ empty_tag_value: nil,
56
+ delete_namespace_attributes: true,
57
+ strip_namespaces: true,
58
+ convert_tags_to: lambda { |tag| tag.to_sym }
59
+ )
60
+ data = xml_data unless xml_data.empty?
61
+ end
62
+
63
+ return data unless data.is_a?(Hash)
64
+
65
+ # drill down
66
+ data = data.first.last if 1 == data.size
67
+
68
+ return data unless data.is_a?(Hash)
69
+
70
+ # check for errors
71
+ if data.delete :is_error
72
+ msg = data.delete(:error_description) || data.delete(:message_desc)
73
+ raise Libis::Services::ServiceError.new(msg)
74
+ end
75
+
76
+ # only delete if there is other info. ProducerService isUserExists uses this field as return value.
77
+ data.delete :error_description if data.size > 1
78
+
79
+ # continue drilling down the Hash
80
+ data = data.first.last while data.is_a?(Hash) && 1 == data.size
81
+
82
+ # return
83
+ data
84
+ end
85
+
86
+ def request_object(method, klass, args = {})
87
+ data = call method, args
88
+ return nil unless data.is_a?(Hash)
89
+ klass.new(data)
90
+ end
91
+
92
+ def request_array(method, args = {})
93
+ data = call method, args
94
+ data = data.split(/[\s,]+/) if data.is_a?(String)
95
+ data = [data] if data.is_a?(Hash)
96
+ data.is_a?(Array) ? data : []
97
+ end
98
+
99
+ def request_object_array(method, klass, args = {})
100
+ data = request_array(method, args)
101
+ data.map { |x| klass.new(x) }
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ require 'virtus'
3
+
4
+ require 'libis/tools/extend/hash'
5
+ require_relative 'collection_info'
6
+ require_relative 'client'
7
+
8
+ module Libis
9
+ module Services
10
+ module Rosetta
11
+
12
+ class CollectionHandler < Libis::Services::Rosetta::Client
13
+
14
+
15
+ def initialize(base_url = 'http://depot.lias.be', options = {})
16
+ super 'repository', 'CollectionWebServices', {url: base_url}.merge(options)
17
+ end
18
+
19
+ def get(id)
20
+ request_object :get_collection_by_id, Rosetta::CollectionInfo, pds_handle: @pds_handle, collection_id: id
21
+ end
22
+
23
+ def find(path)
24
+ request_object :get_collection_by_name, Rosetta::CollectionInfo, pds_handle: @pds_handle, collection_path: path
25
+ end
26
+
27
+ def create(collection_info)
28
+ collection_info = collection_info.to_hash.cleanup if collection_info.is_a? CollectionInfo
29
+ call :create_collection, pds_handle: @pds_handle, collection: collection_info
30
+ end
31
+
32
+ def delete(id)
33
+ call :delete_collection, pds_handle: @pds_handle, collection_id: id
34
+ end
35
+
36
+ def update(collection_info)
37
+ collection_info = collection_info.attributes if collection_info.is_a? CollectionInfo
38
+ call :update_collection, pds_handle: @pds_handle, collection: collection_info
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ require 'virtus'
3
+
4
+ module Libis
5
+ module Services
6
+ module Rosetta
7
+
8
+ class CollectionInfo
9
+ # noinspection RubyResolve
10
+ include Virtus.model
11
+
12
+ class MetaData
13
+ # noinspection RubyResolve
14
+ include Virtus.model
15
+
16
+ attribute :mid, String
17
+ attribute :type, String
18
+ attribute :sub_type, String
19
+ attribute :content, String
20
+ end
21
+
22
+ attribute :id, String
23
+ attribute :name, String
24
+ attribute :parent_id, String
25
+ attribute :description, String
26
+ attribute :md_dc, MetaData
27
+ attribute :md_source, Array[MetaData]
28
+ attribute :navigate, Boolean
29
+ attribute :publish, Boolean
30
+ attribute :external_id, String
31
+ attribute :external_system, String
32
+
33
+ def to_hash
34
+ result = self.attributes
35
+ result[:md_dc] = result[:md_dc].attributes if result[:md_dc]
36
+ result[:md_source] = result[:md_source].map { |md| md.attributes }
37
+ result
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,48 @@
1
+ require 'virtus'
2
+ require 'libis/tools/extend/hash'
3
+
4
+ module Libis
5
+ module Services
6
+ module Rosetta
7
+ class DepositActivity
8
+ # noinspection RubyResolve
9
+ include Virtus.model nullify_blank: true
10
+
11
+ STATUS = %w'Inprocess Incomplete Rejected Draft Approved Declined'
12
+
13
+ attribute :deposit_activity_id, Integer
14
+ attribute :creation_date, String
15
+ attribute :status, String
16
+ attribute :title, String
17
+ attribute :producer_agent_id, Integer
18
+ attribute :submit_date, String
19
+ attribute :update_date, String
20
+ attribute :sip_id, Integer
21
+ attribute :producer_id, Integer
22
+ attribute :sip_reason, String
23
+
24
+ def to_hash
25
+ super.cleanup
26
+ end
27
+
28
+ end
29
+
30
+ class DepositActivityList
31
+ # noinspection RubyResolve
32
+ include Virtus.model nullify_blank: true
33
+
34
+ attribute :total_records, String
35
+ attribute :records, Array(DepositActivity)
36
+
37
+ def to_hash
38
+ {
39
+ total_records: total_records,
40
+ records: records.map {|record| record.to_hash}
41
+ }
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,187 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'deposit_activity'
4
+ require_relative 'client'
5
+
6
+ module Libis
7
+ module Services
8
+ module Rosetta
9
+
10
+ class DepositHandler < ::Libis::Services::Rosetta::Client
11
+
12
+ def initialize(base_url = 'http://depot.lias.be', options = {})
13
+ super 'deposit', 'DepositWebServices', {url: base_url}.merge(options)
14
+ end
15
+
16
+ # @param [Object] flow_id ID of the material flow used
17
+ # @param [Object] subdir name of the load directory
18
+ # @param [Object] producer_id ID of the Producer
19
+ # @param [Object] deposit_set_id ID of the set of deposits
20
+ def submit(flow_id, subdir, producer_id, deposit_set_id = '1')
21
+ call :submit_deposit_activity,
22
+ arg0: @pds_handle,
23
+ arg1: flow_id,
24
+ arg2: subdir,
25
+ arg3: producer_id,
26
+ arg4: deposit_set_id
27
+ end
28
+
29
+ def deposits(opts = {})
30
+ options = opts.dup
31
+ flow_id = options.delete :flow_id
32
+ submit_date_from, submit_date_to = options.delete :submit_date
33
+ submit_date_to ||= submit_date_from if submit_date_from
34
+ update_date_from, update_date_to = options.delete :update_date
35
+ update_date_to ||= update_date_from if update_date_from
36
+ if submit_date_from
37
+ if flow_id
38
+ get_by_submit_flow submit_date_from, submit_date_to, flow_id, options
39
+ else
40
+ get_by_submit_date submit_date_from, submit_date_to, options
41
+ end
42
+ elsif update_date_from
43
+ if flow_id
44
+ get_by_update_flow update_date_from, update_date_to, flow_id, options
45
+ else
46
+ get_by_update_date update_date_from, update_date_to, options
47
+ end
48
+ else
49
+ error "unsupported deposit query: #{opts}."
50
+ []
51
+ end
52
+ end
53
+
54
+ # @param [String] date_from Start date for lookup range
55
+ # @param [String] date_to End date for lookup range
56
+ # @param [Hash] options optional string parameters limiting the search with:
57
+ # - status: Status of the deposit [All (default), In process, Rejected, Draft, Approved, Declined]
58
+ # - producer_id: optional, limits by producer_id
59
+ # - agent_id: optional, limits by agent_id
60
+ # - start_record: optional, pagination start
61
+ # - end_record: optional, pagination end
62
+ def get_by_submit_date(date_from, date_to, options = {})
63
+ options = {
64
+ status: 'All',
65
+ producer_id: nil,
66
+ agent_id: nil,
67
+ start_record: nil,
68
+ end_record: nil
69
+ }.merge options
70
+ params = {
71
+ arg0: @pds_handle,
72
+ arg1: options[:status],
73
+ arg2: options[:producer_id],
74
+ arg3: options[:agent_id],
75
+ arg4: date_from,
76
+ arg5: date_to,
77
+ arg6: options[:start_record],
78
+ arg7: options[:end_record]
79
+ }.cleanup
80
+ request_activities :get_deposit_activity_by_submit_date, params
81
+ end
82
+
83
+ # @param [String] date_from Start date for lookup range
84
+ # @param [String] date_to End date for lookup range
85
+ # @param [Object] flow_id ID of the material flow used
86
+ # @param [Hash] options optional string parameters limiting the search with:
87
+ # - status: Status of the deposit [All (default), In process, Rejected, Draft, Approved, Declined]
88
+ # - producer_id: optional, limits by producer_id
89
+ # - agent_id: optional, limits by agent_id
90
+ # - start_record: optional, pagination start
91
+ # - end_record: optional, pagination end
92
+ def get_by_submit_flow(date_from, date_to, flow_id, options = {})
93
+ options = {
94
+ status: 'All',
95
+ producer_id: nil,
96
+ agent_id: nil,
97
+ start_record: nil,
98
+ end_record: nil
99
+ }.merge options
100
+ params = {
101
+ arg0: @pds_handle,
102
+ arg1: options[:status],
103
+ arg2: flow_id,
104
+ arg3: options[:producer_id],
105
+ arg4: options[:agent_id],
106
+ arg5: date_from,
107
+ arg6: date_to,
108
+ arg7: options[:start_record],
109
+ arg8: options[:end_record]
110
+ }.cleanup
111
+ request_activities :get_deposit_activity_by_submit_date_by_material_flow, params
112
+ end
113
+
114
+ # @param [String] date_from Start date for lookup range
115
+ # @param [String] date_to End date for lookup range
116
+ # @param [Hash] options optional string parameters limiting the search with:
117
+ # - status: Status of the deposit [All (default), In process, Rejected, Draft, Approved, Declined]
118
+ # - producer_id: optional, limits by producer_id
119
+ # - agent_id: optional, limits by agent_id
120
+ # - start_record: optional, pagination start
121
+ # - end_record: optional, pagination end
122
+ def get_by_update_date(date_from, date_to, options = {})
123
+ options = {
124
+ status: 'All',
125
+ producer_id: nil,
126
+ agent_id: nil,
127
+ start_record: nil,
128
+ end_record: nil
129
+ }.merge options
130
+ params = {
131
+ arg0: @pds_handle,
132
+ arg1: options[:status],
133
+ arg2: options[:producer_id],
134
+ arg3: options[:agent_id],
135
+ arg4: date_from,
136
+ arg5: date_to,
137
+ arg6: options[:start_record],
138
+ arg7: options[:end_record]
139
+ }.cleanup
140
+ request_activities :get_deposit_activity_by_update_date, params
141
+ end
142
+
143
+ # @param [String] date_from Start date for lookup range
144
+ # @param [String] date_to End date for lookup range
145
+ # @param [Object] flow_id ID of the material flow used
146
+ # @param [Hash] options optional string parameters limiting the search with:
147
+ # - status: Status of the deposit [All (default), In process, Rejected, Draft, Approved, Declined]
148
+ # - producer_id: optional, limits by producer_id
149
+ # - agent_id: optional, limits by agent_id
150
+ # - start_record: optional, pagination start
151
+ # - end_record: optional, pagination end
152
+ def get_by_update_flow(date_from, date_to, flow_id, options = {})
153
+ options = {
154
+ status: 'All',
155
+ producer_id: nil,
156
+ agent_id: nil,
157
+ start_record: nil,
158
+ end_record: nil
159
+ }.merge options
160
+ params = {
161
+ arg0: @pds_handle,
162
+ arg1: options[:status],
163
+ arg2: flow_id,
164
+ arg3: options[:producer_id],
165
+ arg4: options[:agent_id],
166
+ arg5: date_from,
167
+ arg6: date_to,
168
+ arg7: options[:start_record],
169
+ arg8: options[:end_record]
170
+ }.cleanup
171
+ request_activities :get_deposit_activity_by_update_date_by_material_flow, params
172
+ end
173
+
174
+ protected
175
+
176
+ def request_activities(method, args = {})
177
+ data = call method, args
178
+ list = Rosetta::DepositActivityList.new(total_records: data[:total_records])
179
+ records = data[:records][:record]
180
+ list.records = (records.is_a?(Array) ? records : [records]).map { |record| Rosetta::DepositActivity.new(record)}
181
+ list
182
+ end
183
+ end
184
+
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,19 @@
1
+ require 'virtus'
2
+
3
+ module Libis
4
+ module Services
5
+ module Rosetta
6
+ class Ie
7
+ # noinspection RubyResolve
8
+ include Virtus.model nullify_blank: true
9
+
10
+ attribute :pid, String
11
+
12
+ def to_hash
13
+ super.cleanup
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require 'libis/tools/xml_document'
4
+ require_relative 'client'
5
+
6
+ module Libis
7
+ module Services
8
+ module Rosetta
9
+
10
+ class IeHandler < Libis::Services::Rosetta::Client
11
+
12
+ def initialize(base_url = 'http://depot.lias.be', options = {})
13
+ super 'repository', 'IEWebServices', {url: base_url}.merge(options)
14
+ end
15
+
16
+ def get_mets(ie, flags = 0)
17
+ result = call_raw :get_ie, pds_handle: @pds_handle, ie_pid: ie, flags: flags
18
+ Libis::Tools::MetsFile.parse(result)
19
+ end
20
+
21
+ def get_metadata(ie)
22
+ result = call_raw :get_md, pds_handle: @pds_handle, 'PID' => ie
23
+ Libis::Tools::MetsFile.parse(result)
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ require 'oai'
3
+ require 'libis/tools/extend/hash'
4
+
5
+ module Libis
6
+ module Services
7
+ module Rosetta
8
+ class OaiPmh
9
+ include OAI::XPath
10
+
11
+ def initialize(base_url = 'http://depot.lias.be', options = {})
12
+ @oai_client = OAI::Client.new(base_url + '/oaiprovider/request', options)
13
+ end
14
+
15
+ def sets
16
+ response = @oai_client.list_sets
17
+ response.map do |oai_set|
18
+ {name: oai_set.name, spec: oai_set.spec, description: oai_set.description}.cleanup
19
+ end
20
+ end
21
+
22
+ def collections(institute, status = {})
23
+ result = records("#{institute}-collections", status)
24
+ result.map do |record|
25
+ record[:title] = xpath_first(record[:metadata], './/dc:title').text
26
+ end
27
+ end
28
+
29
+ def records(spec, status = {})
30
+ options = { set: spec }
31
+ options[:resumption_token] = status[:token] if status[:token]
32
+ result = []
33
+ response = @oai_client.list_records(options)
34
+ response.each do |record|
35
+ next if record.deleted?
36
+ result << {
37
+ id: record.header.identifier,
38
+ date: record.header.datestamp,
39
+ metadata: record.metadata,
40
+ }
41
+ end
42
+ result
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ require 'virtus'
2
+
3
+ module Libis
4
+ module Services
5
+ module Rosetta
6
+ class OaiSet
7
+ # noinspection RubyResolve
8
+ include Virtus.model nullify_blank: true
9
+
10
+ attribute :description, String
11
+ attribute :name, String
12
+ attribute :spec, String
13
+
14
+ def to_hash
15
+ super.cleanup
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end