libis-services 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +36 -0
- data/Rakefile +6 -0
- data/lib/libis-services.rb +1 -0
- data/lib/libis/services.rb +21 -0
- data/lib/libis/services/aleph/search.rb +157 -0
- data/lib/libis/services/collective_access.rb +1 -0
- data/lib/libis/services/collective_access/cataloguing.rb +48 -0
- data/lib/libis/services/collective_access/connector.rb +151 -0
- data/lib/libis/services/collective_access/item_info.rb +36 -0
- data/lib/libis/services/collective_access/search.rb +26 -0
- data/lib/libis/services/collective_access/service.rb +80 -0
- data/lib/libis/services/digitool/digital_entity_manager.rb +223 -0
- data/lib/libis/services/digitool/digitool_connector.rb +46 -0
- data/lib/libis/services/digitool/meta_data_manager.rb +193 -0
- data/lib/libis/services/extend/http_fetch.rb +63 -0
- data/lib/libis/services/generic_search.rb +38 -0
- data/lib/libis/services/http_error.rb +21 -0
- data/lib/libis/services/oracle_client.rb +47 -0
- data/lib/libis/services/primo.rb +2 -0
- data/lib/libis/services/primo/limo.rb +33 -0
- data/lib/libis/services/primo/search.rb +46 -0
- data/lib/libis/services/rest_client.rb +66 -0
- data/lib/libis/services/rosetta.rb +1 -0
- data/lib/libis/services/rosetta/client.rb +107 -0
- data/lib/libis/services/rosetta/collection_handler.rb +45 -0
- data/lib/libis/services/rosetta/collection_info.rb +35 -0
- data/lib/libis/services/rosetta/deposit_activity.rb +48 -0
- data/lib/libis/services/rosetta/deposit_handler.rb +187 -0
- data/lib/libis/services/rosetta/ie.rb +19 -0
- data/lib/libis/services/rosetta/ie_handler.rb +29 -0
- data/lib/libis/services/rosetta/pds_handler.rb +60 -0
- data/lib/libis/services/rosetta/producer.rb +71 -0
- data/lib/libis/services/rosetta/producer_handler.rb +125 -0
- data/lib/libis/services/rosetta/service.rb +399 -0
- data/lib/libis/services/rosetta/sip.rb +26 -0
- data/lib/libis/services/rosetta/sip_handler.rb +30 -0
- data/lib/libis/services/rosetta/user.rb +70 -0
- data/lib/libis/services/rosetta/user_manager.rb +28 -0
- data/lib/libis/services/scope/search.rb +46 -0
- data/lib/libis/services/search_factory.rb +40 -0
- data/lib/libis/services/sharepoint/connector.rb +236 -0
- data/lib/libis/services/sharepoint/search.rb +19 -0
- data/lib/libis/services/soap_client.rb +57 -0
- data/lib/libis/services/soap_error.rb +22 -0
- data/lib/libis/services/version.rb +5 -0
- data/libis-services.gemspec +38 -0
- data/spec/primo_limo_spec.rb +394 -0
- data/spec/primo_search_spec.rb +39 -0
- data/spec/rosetta_collection_spec.rb +206 -0
- data/spec/rosetta_deposit_spec.rb +82 -0
- data/spec/rosetta_ie_spec.rb +345 -0
- data/spec/rosetta_pds_spec.rb +79 -0
- data/spec/rosetta_producer_spec.rb +270 -0
- data/spec/rosetta_sip_spec.rb +39 -0
- data/spec/spec_helper.rb +12 -0
- metadata +307 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'virtus'
|
2
|
+
|
3
|
+
module Libis
|
4
|
+
module Services
|
5
|
+
module Rosetta
|
6
|
+
class Sip
|
7
|
+
# noinspection RubyResolve
|
8
|
+
include Virtus.model nullify_blank: true
|
9
|
+
|
10
|
+
MODULE = %w'PER'
|
11
|
+
STAGE = %w'Finished'
|
12
|
+
STATUS = %w'FINISHED'
|
13
|
+
|
14
|
+
attribute :id, Integer
|
15
|
+
attribute :module, String
|
16
|
+
attribute :stage, String
|
17
|
+
attribute :status, String
|
18
|
+
|
19
|
+
def to_hash
|
20
|
+
super.cleanup
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'libis/tools/extend/hash'
|
4
|
+
require_relative 'client'
|
5
|
+
require_relative 'sip'
|
6
|
+
require_relative 'ie'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Services
|
10
|
+
module Rosetta
|
11
|
+
|
12
|
+
class SipHandler < Libis::Services::Rosetta::Client
|
13
|
+
|
14
|
+
def initialize(base_url = 'http://depot.lias.be', options = {})
|
15
|
+
super 'repository', 'SipWebServices', {url: base_url}.merge(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_info(sip_id)
|
19
|
+
request_object :get_sip_status_info, Rosetta::Sip, arg0: sip_id
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_ies(sip_id)
|
23
|
+
request_array :get_sip_i_es, arg0: sip_id
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'virtus'
|
2
|
+
|
3
|
+
module Libis
|
4
|
+
module Services
|
5
|
+
module Rosetta
|
6
|
+
class User
|
7
|
+
# noinspection RubyResolve
|
8
|
+
include Virtus.model nullify_blank: true
|
9
|
+
|
10
|
+
RECORD_TYPE = %w'USER CONTACT ORGANIZATION STAFF PUBLIC'
|
11
|
+
USER_STATUS = %w'ACTIVE INACTIVE DELETED'
|
12
|
+
USER_ROLES_STATUS = %w'NEW ACTIVE INACTIVE PENDING DELETED'
|
13
|
+
USER_TYPE = %w'CASUAL INTERNAL EXTERNAL INTEXTAUTH'
|
14
|
+
|
15
|
+
attribute :first_name, String
|
16
|
+
attribute :last_name, String
|
17
|
+
attribute :user_name, String
|
18
|
+
attribute :user_group, String
|
19
|
+
attribute :expiry_date, String
|
20
|
+
attribute :job_title, String
|
21
|
+
attribute :default_language, String
|
22
|
+
attribute :street, String
|
23
|
+
attribute :suburb, String
|
24
|
+
attribute :city, String
|
25
|
+
attribute :country, String
|
26
|
+
attribute :address_1, String
|
27
|
+
attribute :address_2, String
|
28
|
+
attribute :address_3, String
|
29
|
+
attribute :address_4, String
|
30
|
+
attribute :address_5, String
|
31
|
+
attribute :zip, Integer
|
32
|
+
attribute :email_address, String
|
33
|
+
attribute :web_site_url, String
|
34
|
+
attribute :telephone_1, String
|
35
|
+
attribute :telephone_2, String
|
36
|
+
attribute :fax, String
|
37
|
+
|
38
|
+
attribute :password, String
|
39
|
+
attribute :password_verify, String
|
40
|
+
|
41
|
+
def to_hash
|
42
|
+
super.cleanup
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_xml
|
46
|
+
Libis::Tools::XmlDocument.build do |xml|
|
47
|
+
# noinspection RubyResolve
|
48
|
+
xml.user_info {
|
49
|
+
xml.parent.default_namespace = 'http://www.exlibrisgroup.com/xsd/dps/backoffice/service'
|
50
|
+
self.attributes.each do |name, value|
|
51
|
+
xml.send(name, xmlns: '') { xml.text(value) } if value
|
52
|
+
end
|
53
|
+
}
|
54
|
+
end.to_xml
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.from_xml(xml)
|
58
|
+
xml_doc = Libis::Tools::XmlDocument.parse(xml)
|
59
|
+
hash = xml_doc.to_hash(
|
60
|
+
strip_namespaces: true,
|
61
|
+
delete_namespace_attributes: true,
|
62
|
+
empty_tag_value: nil,
|
63
|
+
convert_tags_to: lambda { |tag| tag.to_sym }
|
64
|
+
)
|
65
|
+
self.new(hash[:producer_info])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'virtus'
|
3
|
+
|
4
|
+
require 'libis/tools/extend/hash'
|
5
|
+
require_relative 'client'
|
6
|
+
|
7
|
+
module Libis
|
8
|
+
module Services
|
9
|
+
module Rosetta
|
10
|
+
|
11
|
+
class UserManager < Libis::Services::Rosetta::Client
|
12
|
+
|
13
|
+
def initialize(base_url = 'http://depot.lias.be', options = {})
|
14
|
+
super 'infra', 'UserManagerWS', {url: base_url}.merge(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def user(user_id, user_info)
|
18
|
+
user_info = user_info.to_hash if user_info.is_a? User
|
19
|
+
do_request :update_user, arg0: user_info, arg1: user_id
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'libis/services/oracle_client'
|
4
|
+
require 'libis/tools/xml_document'
|
5
|
+
|
6
|
+
module Libis
|
7
|
+
module Services
|
8
|
+
module Scope
|
9
|
+
|
10
|
+
class Search
|
11
|
+
include ::Libis::Services::GenericSearch
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@doc = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def find(term, options = {})
|
18
|
+
super
|
19
|
+
OracleClient.new('SCOPE01', 'APLKN_ARCHV_LIAS', 'archvsc').
|
20
|
+
call('kul_packages.scope_xml_meta_file_ed', [term.upcase])
|
21
|
+
err_file = "/nas/vol03/oracle/scope01/#{term}_err.XML"
|
22
|
+
if File.exist? err_file
|
23
|
+
doc = XmlDocument.open(err_file)
|
24
|
+
msg = doc.xpath('/error/error_msg').first.content
|
25
|
+
msg_detail = doc.xpath('/error/error_').first.content
|
26
|
+
File.delete(err_file)
|
27
|
+
@doc = nil
|
28
|
+
raise RuntimeError, "Scope search failed: '#{msg}'. Details: '#{msg_detail}'"
|
29
|
+
else
|
30
|
+
@doc = XmlDocument.open("/nas/vol03/oracle/scope01/#{term}_md.XML").to_hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def each(_ = {})
|
35
|
+
yield @doc
|
36
|
+
end
|
37
|
+
|
38
|
+
def next_record(_ = {})
|
39
|
+
yield @doc
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require_relative 'aleph/search'
|
4
|
+
require_relative 'primo/search'
|
5
|
+
require_relative 'sharepoint/search'
|
6
|
+
require_relative 'scope/search'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Services
|
10
|
+
|
11
|
+
class SearchFactory
|
12
|
+
def initialize(format, *args)
|
13
|
+
@search_class = self.class.const_get("Libis::Services::#{format}::Search")
|
14
|
+
@search_client = @search_class.new *args
|
15
|
+
|
16
|
+
rescue Exception => e
|
17
|
+
puts e.message
|
18
|
+
exit -1
|
19
|
+
end
|
20
|
+
|
21
|
+
def query(query, options = {})
|
22
|
+
@search_client.get(query, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def find(term, options = {})
|
26
|
+
@search_client.find(term, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def each(options = {}, &block)
|
30
|
+
@search_client.each(options, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def next_record(options = {}, &block)
|
34
|
+
@search_client.next_record(options, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'highline'
|
4
|
+
require 'libis/tools/logger'
|
5
|
+
|
6
|
+
require 'libis/services/soap_client'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Services
|
10
|
+
module Sharepoint
|
11
|
+
|
12
|
+
class Search
|
13
|
+
include ::Libis::Services::SoapClient
|
14
|
+
include ::Libis::Tools::Logger
|
15
|
+
include ::Libis::Services::GenericSearch
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
MY_QUERY_SYMBOLS = {
|
20
|
+
nil => 'Eq',
|
21
|
+
'==' => 'Eq',
|
22
|
+
'!=' => 'Neq',
|
23
|
+
'>' => 'Gt',
|
24
|
+
'>=' => 'Geq',
|
25
|
+
'<' => 'Lt',
|
26
|
+
'<=' => 'Leq',
|
27
|
+
'is null' => 'IsNull'
|
28
|
+
}
|
29
|
+
|
30
|
+
MAX_QUERY_RETRY = 10
|
31
|
+
|
32
|
+
public
|
33
|
+
|
34
|
+
def initialize(options = {})
|
35
|
+
options[:server_url] = (options[:url] || 'https://www.groupware.kuleuven.be/sites/lias') + (options[:url_ext] || '/_vti_bin')
|
36
|
+
options[:ssl] = true if options[:server_url] =~ /^https:/
|
37
|
+
# options[:soap_url] = options[:server_url].gsub(/^(https?):\/\/)/,"\\1#{CGI.escape(username)}:#{CGI.escape(password)}@") + '/Lists.asmx'
|
38
|
+
options[:wsse_auth] = [options[:username], options[:password]]
|
39
|
+
options[:soap_url] = options[:server_url] + '/Lists.asmx'
|
40
|
+
options[:wsdl_url] = options[:soap_url] + '?wsdl'
|
41
|
+
configure options[:wsdl_url], options
|
42
|
+
options
|
43
|
+
end
|
44
|
+
|
45
|
+
def query(term, options = {})
|
46
|
+
|
47
|
+
options[:term] = term
|
48
|
+
|
49
|
+
options[:limit] ||= 100
|
50
|
+
options[:value_type] ||= 'Text'
|
51
|
+
options[:query_operator] = MY_QUERY_SYMBOLS[options[:query_operator] || '==']
|
52
|
+
|
53
|
+
options[:query_operator] = 'BeginsWith' if term =~ /^[^*]+\*$/
|
54
|
+
options[:query_operator] = 'Contains' if term =~ /^\*[^*]+\*$/
|
55
|
+
|
56
|
+
restart_query options
|
57
|
+
|
58
|
+
options
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def each(options)
|
63
|
+
|
64
|
+
# we start with a new search
|
65
|
+
restart_query options
|
66
|
+
get_next_set options
|
67
|
+
|
68
|
+
while records_to_process? options
|
69
|
+
|
70
|
+
yield options[:result][:records][options[:current]]
|
71
|
+
|
72
|
+
options[:current] += 1
|
73
|
+
|
74
|
+
get_next_set(options) if require_next_set?(options)
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
restart_query(options)
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
protected
|
83
|
+
|
84
|
+
def restart_query(options)
|
85
|
+
options[:start_id] = 0
|
86
|
+
options[:result] = nil
|
87
|
+
options[:current] = 0
|
88
|
+
options[:set_count] = 0
|
89
|
+
options[:next_set] = nil
|
90
|
+
end
|
91
|
+
|
92
|
+
def records_to_process?(options)
|
93
|
+
options[:current] < options[:set_count]
|
94
|
+
end
|
95
|
+
|
96
|
+
def require_next_set?(options)
|
97
|
+
options[:current] >= options[:set_count] and options[:next_set]
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_next_set(options)
|
101
|
+
|
102
|
+
options[:current] = 0
|
103
|
+
options[:set_count] = 0
|
104
|
+
|
105
|
+
retry_count = MAX_QUERY_RETRY
|
106
|
+
|
107
|
+
while retry_count > 0
|
108
|
+
|
109
|
+
warn "Retrying (#{retry_count}) ..." if retry_count < MAX_QUERY_RETRY
|
110
|
+
|
111
|
+
query = {
|
112
|
+
'Query' => {
|
113
|
+
'Where' => {
|
114
|
+
options[:query_operator] => {
|
115
|
+
'FieldRef' => '',
|
116
|
+
'Value' => options[:term],
|
117
|
+
:attributes! => {
|
118
|
+
'FieldRef' => {
|
119
|
+
'Name' => options[:index]
|
120
|
+
},
|
121
|
+
'Value' => {
|
122
|
+
'Type' => options[:value_type]
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
query_options = {
|
131
|
+
'QueryOptions' => {
|
132
|
+
'ViewAttributes' => '',
|
133
|
+
:attributes! => {
|
134
|
+
'ViewAttributes' => {
|
135
|
+
'Scope' => 'RecursiveAll'
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
now = Time.now
|
142
|
+
window_start = Time.new(now.year, now.month, now.day, 12, 15)
|
143
|
+
window_end = Time.new(now.year, now.month, now.day, 13, 15)
|
144
|
+
if options[:selection] and now > window_start and now < window_end
|
145
|
+
query_options['QueryOptions']['Folder'] = options[:server_url] + 'Gedeelde%20documenten/' + options[:selection] + '/.'
|
146
|
+
end
|
147
|
+
|
148
|
+
if options[:next_set]
|
149
|
+
query_options['QueryOptions']['Paging'] = ''
|
150
|
+
query_options['QueryOptions'][:attributes!]['Paging'] = {'ListItemCollectionPositionNext' => options[:next_set]}
|
151
|
+
end
|
152
|
+
|
153
|
+
result = request 'GetListItems', {
|
154
|
+
soap_options: {
|
155
|
+
endpoint: options[:soap_url]
|
156
|
+
},
|
157
|
+
wsse_auth: options[:wsse_auth],
|
158
|
+
listName: options[:base],
|
159
|
+
viewName: '',
|
160
|
+
query: query,
|
161
|
+
viewFields: {'ViewFields' => ''},
|
162
|
+
rowLimit: options[:limit].to_s,
|
163
|
+
query_options: query_options,
|
164
|
+
webID: ''
|
165
|
+
}, {}, options
|
166
|
+
|
167
|
+
if result[:error]
|
168
|
+
warn "SOAP error: '#{result[:error]}'"
|
169
|
+
raise RuntimeError, 'Too many SOAP errors, giving up.' unless retry_count > 0
|
170
|
+
elsif result[:exception]
|
171
|
+
warn "SOAP exception: '#{result[:exception].message}'"
|
172
|
+
raise result[:exception] unless retry_count > 0
|
173
|
+
else
|
174
|
+
options[:result] = result
|
175
|
+
options[:set_count] = result[:count]
|
176
|
+
options[:next_set] = result[:next_set]
|
177
|
+
retry_count = 0
|
178
|
+
retry_count = MAX_QUERY_RETRY + 1 if options[:set_count] == 0 and options[:next_set]
|
179
|
+
end
|
180
|
+
|
181
|
+
retry_count -= 1
|
182
|
+
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
def result_parser(result, options)
|
188
|
+
|
189
|
+
records = []
|
190
|
+
result = result[:get_list_items_response][:get_list_items_result]
|
191
|
+
|
192
|
+
data = result[:listitems][:data]
|
193
|
+
|
194
|
+
rows = data[:row]
|
195
|
+
rows = [rows] unless rows.is_a? Array
|
196
|
+
|
197
|
+
rows.each do |row|
|
198
|
+
if options[:selection].nil? or row[:ows_FileRef] =~ /^\d+;#sites\/lias\/Gedeelde documenten\/#{options[:selection]}(|\/.*)$/
|
199
|
+
records << clean_row(row, options)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
next_set = data[:@list_item_collection_position_next]
|
204
|
+
|
205
|
+
# the itemcount in the response is not interesting. We count only the records that match our selection criteria.
|
206
|
+
count = records.size
|
207
|
+
|
208
|
+
{next_set: next_set, records: records, count: count}
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
def clean_row(row, options)
|
213
|
+
|
214
|
+
options[:fields_found] ||= Set.new
|
215
|
+
row.keys.each { |k| options[:fields_found] << k }
|
216
|
+
|
217
|
+
fields_to_be_removed = [:ows_MetaInfo]
|
218
|
+
fields_to_be_removed = row.keys - options[:field_selection] if options[:field_selection]
|
219
|
+
|
220
|
+
record = SharepointRecord.new
|
221
|
+
|
222
|
+
row.each do |k, v|
|
223
|
+
key = k.to_s.gsub(/^@/, '').to_sym
|
224
|
+
next if fields_to_be_removed.include? key
|
225
|
+
record[key] = v.dot_net_clean
|
226
|
+
end
|
227
|
+
|
228
|
+
record
|
229
|
+
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|