libis-services 0.0.2
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/.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,63 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'set'
|
5
|
+
|
6
|
+
class Net::HTTPResponse
|
7
|
+
#noinspection RubyResolve
|
8
|
+
attr_accessor :final_uri
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
module Net
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'net/https'
|
16
|
+
HTTPS_SUPPORTED = true
|
17
|
+
rescue LoadError
|
18
|
+
end
|
19
|
+
|
20
|
+
class HTTP
|
21
|
+
def self.fetch(uri, args={}.freeze, &before_fetching)
|
22
|
+
uri = URI.parse(uri) unless uri.is_a? URI
|
23
|
+
proxy_host = args[:proxy_host]
|
24
|
+
proxy_port = args[:proxy_port] || 80
|
25
|
+
action = args[:action] || :get
|
26
|
+
data = args[:data]
|
27
|
+
max_redirects = args[:max_redirects] || 10
|
28
|
+
|
29
|
+
proxy_class = Proxy(proxy_host, proxy_port)
|
30
|
+
#noinspection RubyArgCount
|
31
|
+
request = proxy_class.new(uri.host, uri.port)
|
32
|
+
|
33
|
+
request.use_ssl = true if HTTPS_SUPPORTED && uri.scheme.eql?('https')
|
34
|
+
|
35
|
+
yield request if block_given?
|
36
|
+
#debugger
|
37
|
+
response = request.send(action, uri.path, data)
|
38
|
+
|
39
|
+
urls_seen = args[:_url_seen] || Set.new
|
40
|
+
|
41
|
+
case response
|
42
|
+
when Net::HTTPRedirection
|
43
|
+
if urls_seen.size < max_redirects && response['Location']
|
44
|
+
urls_seen << uri
|
45
|
+
new_uri = URI.parse(response['Location'])
|
46
|
+
if urls_seen.member? new_uri
|
47
|
+
nil
|
48
|
+
else
|
49
|
+
new_args = args.dup
|
50
|
+
new_args[:_urls_seen] = urls_seen
|
51
|
+
|
52
|
+
response = HTTP.fetch(new_uri, new_args, &before_fetching)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
when Net::HTTPSuccess
|
56
|
+
response.final_uri = uri
|
57
|
+
else
|
58
|
+
response.error!
|
59
|
+
end
|
60
|
+
return response
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'libis/services/extend/http_fetch'
|
4
|
+
|
5
|
+
module Libis
|
6
|
+
module Services
|
7
|
+
|
8
|
+
module GenericSearch
|
9
|
+
|
10
|
+
#noinspection RubyResolve
|
11
|
+
attr_accessor :host
|
12
|
+
#noinspection RubyResolve
|
13
|
+
attr_reader :query, :term, :index, :base
|
14
|
+
#noinspection RubyResolve
|
15
|
+
attr_reader :num_records, :set_number
|
16
|
+
#noinspection RubyResolve
|
17
|
+
attr_reader :record_pointer, :session_id
|
18
|
+
|
19
|
+
def query(query, options = {})
|
20
|
+
raise RuntimeError, 'to be implemented'
|
21
|
+
end
|
22
|
+
|
23
|
+
def find(term, options = {})
|
24
|
+
query(term, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def each(options = {}, &block)
|
28
|
+
raise RuntimeError, 'to be implemented'
|
29
|
+
end
|
30
|
+
|
31
|
+
def next_record(options = {}, &block)
|
32
|
+
raise RuntimeError, 'to be implemented'
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Libis
|
4
|
+
module Services
|
5
|
+
|
6
|
+
class HttpError < Exception
|
7
|
+
attr_accessor :code, :header, :body
|
8
|
+
|
9
|
+
def initialize(error)
|
10
|
+
@code = error[:code]
|
11
|
+
@header = error[:header]
|
12
|
+
@body = error[:body]
|
13
|
+
end
|
14
|
+
|
15
|
+
def message
|
16
|
+
code.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Libis
|
2
|
+
module Services
|
3
|
+
|
4
|
+
class OracleClient
|
5
|
+
|
6
|
+
def initialize(database, user, password)
|
7
|
+
@database = database
|
8
|
+
@user = user
|
9
|
+
@password = password
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(procedure, parameters = [])
|
13
|
+
params = ''
|
14
|
+
params = "'" + parameters.join("','") + "'" if parameters and parameters.size > 0
|
15
|
+
system "echo \"call #{procedure}(#{params});\" | sqlplus -S #{@user}/#{@password}@#{@database}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(script, parameters = [])
|
19
|
+
params = ''
|
20
|
+
params = "\"" + parameters.join("\" \"") + "\"" if parameters and parameters.size > 0
|
21
|
+
process_result `sqlplus -S #{@user}/#{@password}@#{@database} @#{script} #{params}`
|
22
|
+
end
|
23
|
+
|
24
|
+
def execute(sql)
|
25
|
+
process_result `echo \"#{sql}\" | sqlplus -S #{@user}/#{@password}@#{@database}`
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def process_result(log)
|
31
|
+
log.gsub!(/\n\n/, "\n")
|
32
|
+
rows_created = 0
|
33
|
+
log.match(/^(\d+) rows? created.$/) { |m| rows_created += m[1] }
|
34
|
+
rows_deleted = 0
|
35
|
+
log.match(/^(\d+) rows? deleted.$/) { |m| rows_deleted += m[1] }
|
36
|
+
rows_updated = 0
|
37
|
+
log.match(/^(\d+) rows? updated.$/) { |m| rows_updated += m[1] }
|
38
|
+
errors = Hash.new(0)
|
39
|
+
error_count = 0
|
40
|
+
log.match(/\nERROR .*\n([^\n]*)\n/) { |m| errors[m[1]] += 1; error_count += 1 }
|
41
|
+
{created: rows_created, updated: rows_updated, deleted: rows_deleted, errors: error_count, error_detail: errors}
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'libis-tools'
|
3
|
+
|
4
|
+
require 'libis/services/rest_client'
|
5
|
+
|
6
|
+
module Libis
|
7
|
+
module Services
|
8
|
+
module Primo
|
9
|
+
|
10
|
+
class Limo
|
11
|
+
include ::Libis::Services::RestClient
|
12
|
+
|
13
|
+
def initialize(url = 'http://limo.libis.be')
|
14
|
+
configure(url)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_marc(alma_id)
|
18
|
+
get 'primo_library/libweb/jqprimo/helpers/record_helper.jsp', id: "#{alma_id}.xml"
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_pnx(alma_id)
|
22
|
+
get 'primo_library/libweb/jqprimo/helpers/record_helper.jsp', id: "#{alma_id}.pnx"
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def result_parser(response)
|
28
|
+
Libis::Tools::XmlDocument.parse(response)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -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,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 @@
|
|
1
|
+
require_relative 'rosetta/service'
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'libis/services/soap_client'
|
4
|
+
require 'libis/tools/extend/hash'
|
5
|
+
require 'libis/tools/config'
|
6
|
+
require 'libis/tools/logger'
|
7
|
+
|
8
|
+
require 'awesome_print'
|
9
|
+
|
10
|
+
module Libis
|
11
|
+
module Services
|
12
|
+
module Rosetta
|
13
|
+
|
14
|
+
class Client
|
15
|
+
include ::Libis::Services::SoapClient
|
16
|
+
include ::Libis::Tools::Logger
|
17
|
+
|
18
|
+
def initialize(section, service, options = {})
|
19
|
+
opts = {strip_namespaces: true, logger: ::Libis::Tools::Config.logger}.merge options
|
20
|
+
base_url = opts.delete(:url) || 'http://depot.lias.be'
|
21
|
+
configure "#{base_url}/dpsws/#{section}/#{service}?wsdl", opts
|
22
|
+
end
|
23
|
+
|
24
|
+
def pds_handle=(handle)
|
25
|
+
@pds_handle = handle
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_heart_bit
|
29
|
+
request :get_heart_bit
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def call_raw(operation, args = {})
|
35
|
+
data = request operation.to_s.to_sym, args
|
36
|
+
|
37
|
+
# remove wrapper
|
38
|
+
data = data["#{operation}_response".to_sym]
|
39
|
+
data.delete(:'@xmlns:ns1')
|
40
|
+
|
41
|
+
# drill down the returned Hash
|
42
|
+
data = data.first.last while data.is_a?(Hash) && 1 == data.size
|
43
|
+
|
44
|
+
data
|
45
|
+
end
|
46
|
+
|
47
|
+
def call(operation, args = {})
|
48
|
+
# upstream call
|
49
|
+
data = call_raw(operation, args)
|
50
|
+
|
51
|
+
# try to parse as XML
|
52
|
+
if data.is_a?(String)
|
53
|
+
xml_data = Libis::Tools::XmlDocument.parse(data).to_hash(
|
54
|
+
empty_tag_value: nil,
|
55
|
+
delete_namespace_attributes: true,
|
56
|
+
strip_namespaces: true,
|
57
|
+
convert_tags_to: lambda { |tag| tag.to_sym }
|
58
|
+
)
|
59
|
+
data = xml_data unless xml_data.empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
return data unless data.is_a?(Hash)
|
63
|
+
|
64
|
+
# drill down
|
65
|
+
data = data.first.last if 1 == data.size
|
66
|
+
|
67
|
+
return data unless data.is_a?(Hash)
|
68
|
+
|
69
|
+
# check for errors
|
70
|
+
if data.delete :is_error
|
71
|
+
error data.delete :error_description
|
72
|
+
return nil
|
73
|
+
end
|
74
|
+
|
75
|
+
# only delete if there is other info. ProducerService isUserExists uses this field as return value.
|
76
|
+
data.delete :error_description if data.size > 1
|
77
|
+
|
78
|
+
# continue drilling down the Hash
|
79
|
+
data = data.first.last while data.is_a?(Hash) && 1 == data.size
|
80
|
+
|
81
|
+
# return
|
82
|
+
data
|
83
|
+
end
|
84
|
+
|
85
|
+
def request_object(method, klass, args = {})
|
86
|
+
data = call method, args
|
87
|
+
return nil unless data.is_a?(Hash)
|
88
|
+
klass.new(data)
|
89
|
+
end
|
90
|
+
|
91
|
+
def request_array(method, args = {})
|
92
|
+
data = call method, args
|
93
|
+
data = data.split(/[\s,]+/) if data.is_a?(String)
|
94
|
+
data = [data] if data.is_a?(Hash)
|
95
|
+
data.is_a?(Array) ? data : []
|
96
|
+
end
|
97
|
+
|
98
|
+
def reqeust_object_array(method, klass, args = {})
|
99
|
+
data = request_array(method, args)
|
100
|
+
data.map { |x| klass.new(x) }
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
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.attributes 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
|