libis-services 0.1.0-java
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/aleph/search.rb +157 -0
- data/lib/libis/services/alma/web_service.rb +36 -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/collective_access.rb +1 -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/limo.rb +33 -0
- data/lib/libis/services/primo/search.rb +46 -0
- data/lib/libis/services/primo.rb +2 -0
- data/lib/libis/services/rest_client.rb +66 -0
- data/lib/libis/services/rosetta/client.rb +108 -0
- data/lib/libis/services/rosetta/collection_handler.rb +45 -0
- data/lib/libis/services/rosetta/collection_info.rb +44 -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/oai_pmh.rb +48 -0
- data/lib/libis/services/rosetta/oai_set.rb +21 -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 +403 -0
- data/lib/libis/services/rosetta/sip.rb +26 -0
- data/lib/libis/services/rosetta/sip_handler.rb +31 -0
- data/lib/libis/services/rosetta/user.rb +70 -0
- data/lib/libis/services/rosetta/user_manager.rb +28 -0
- data/lib/libis/services/rosetta.rb +2 -0
- data/lib/libis/services/scope/search.rb +46 -0
- data/lib/libis/services/search_factory.rb +40 -0
- data/lib/libis/services/service_error.rb +16 -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/lib/libis/services.rb +22 -0
- data/lib/libis-services.rb +1 -0
- data/libis-services.gemspec +40 -0
- data/spec/alma_service_spec.rb +104 -0
- data/spec/ie_data.rb +726 -0
- data/spec/primo_limo_spec.rb +363 -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 +54 -0
- data/spec/rosetta_oai_spec.rb +52 -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 +28 -0
- metadata +317 -0
@@ -0,0 +1,223 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
require 'libis/services/soap_client'
|
6
|
+
|
7
|
+
#noinspection RubyStringKeysInHashInspection
|
8
|
+
module Libis
|
9
|
+
module Services
|
10
|
+
module Digitool
|
11
|
+
|
12
|
+
class DigitalEntityManager
|
13
|
+
include Singleton
|
14
|
+
include Libis::Services::SoapClient
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
setup 'DigitalEntityManager'
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_object(de_info)
|
21
|
+
de_call = create_digital_entity_call de_info, 'create'
|
22
|
+
request :digital_entity_call, :general => general.to_s, :digital_entity_call => de_call.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def update_object(de_info, update_options = {})
|
26
|
+
de_call = create_digital_entity_call de_info, 'update', update_options
|
27
|
+
request :digital_entity_call, :general => general.to_s, :digital_entity_call => de_call.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_object(pid)
|
31
|
+
de_info = {'pid' => pid}
|
32
|
+
de_options = {'metadata' => 'all', 'relation' => 'all'}
|
33
|
+
de_call1 = create_digital_entity_call de_info, 'update', de_options
|
34
|
+
result = request :digital_entity_call, :general => 200.to_s, :digital_entity_call => de_call1.to_s
|
35
|
+
return result if result[:error] and result[:error].size > 0
|
36
|
+
de_call2 = create_digital_entity_call de_info, 'delete'
|
37
|
+
request :digital_entity_call, :general => general.to_s, :digital_entity_call => de_call2.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def retrieve_object(pid)
|
41
|
+
de_info = {'pid' => pid}
|
42
|
+
de_call = create_digital_entity_call de_info, 'retrieve'
|
43
|
+
request :digital_entity_call, :general => general.to_s, :digital_entity_call => de_call.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def link_dc(pid, mid)
|
47
|
+
link_md pid, mid, 'descriptive', 'dc'
|
48
|
+
end
|
49
|
+
|
50
|
+
def unlink_dc(pid, mid)
|
51
|
+
unlink_md pid, mid, 'descriptive', 'dc'
|
52
|
+
end
|
53
|
+
|
54
|
+
def unlink_all_dc(pid)
|
55
|
+
unlink_all_md pid, 'descriptive', 'dc'
|
56
|
+
end
|
57
|
+
|
58
|
+
def link_acl(pid, mid)
|
59
|
+
link_md pid, mid, 'accessrights', 'rights_md'
|
60
|
+
end
|
61
|
+
|
62
|
+
def unlink_acl(pid, mid)
|
63
|
+
unlink_md pid, mid, 'accessrights', 'rights_md'
|
64
|
+
end
|
65
|
+
|
66
|
+
def unlink_all_acl(pid)
|
67
|
+
unlink_all_md pid, 'accessrights', 'rights_md'
|
68
|
+
end
|
69
|
+
|
70
|
+
def link_md(pid, mid, md_name, md_type)
|
71
|
+
update_object({'pid' => pid.to_s,
|
72
|
+
'metadata' =>
|
73
|
+
[{'cmd' => 'insert',
|
74
|
+
'link_to_exists' => 'true',
|
75
|
+
'mid' => mid.to_s,
|
76
|
+
'name' => md_name,
|
77
|
+
'type' => md_type
|
78
|
+
}
|
79
|
+
]
|
80
|
+
},
|
81
|
+
{'metadata' => 'delta'}
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def unlink_md(pid, mid, md_name, md_type)
|
86
|
+
update_object({'pid' => pid.to_s,
|
87
|
+
'metadata' =>
|
88
|
+
[{'cmd' => 'delete',
|
89
|
+
'shared' => 'true',
|
90
|
+
'mid' => mid.to_s,
|
91
|
+
'name' => md_name,
|
92
|
+
'type' => md_type
|
93
|
+
}
|
94
|
+
]
|
95
|
+
},
|
96
|
+
{'metadata' => 'delta'}
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def unlink_all_md(pid, md_name = nil, md_type = nil)
|
101
|
+
de_info = {'pid' => pid.to_s,
|
102
|
+
'metadata' =>
|
103
|
+
[{'cmd' => 'delete',
|
104
|
+
'shared' => 'true'
|
105
|
+
}
|
106
|
+
]
|
107
|
+
}
|
108
|
+
de_info['metadata'][0]['name'] = md_name if md_name
|
109
|
+
de_info['metadata'][0]['type'] = md_type if md_type
|
110
|
+
update_object(de_info, {'metadata' => 'all'})
|
111
|
+
end
|
112
|
+
|
113
|
+
def add_relations(pid, relation_type, related_pids)
|
114
|
+
relations = []
|
115
|
+
related_pids.each do |p|
|
116
|
+
relations << {'cmd' => 'insert',
|
117
|
+
'type' => relation_type.to_s,
|
118
|
+
'pid' => p.to_s
|
119
|
+
}
|
120
|
+
end
|
121
|
+
update_object({'pid' => pid.to_s,
|
122
|
+
'relation' => relations
|
123
|
+
},
|
124
|
+
{'relation' => 'delta'}
|
125
|
+
)
|
126
|
+
end
|
127
|
+
|
128
|
+
def update_stream(pid, filename)
|
129
|
+
update_object({'pid' => pid,
|
130
|
+
'stream_ref' =>
|
131
|
+
{'cmd' => 'update',
|
132
|
+
'store_command' => 'copy',
|
133
|
+
'location' => 'nfs',
|
134
|
+
'file_name' => filename
|
135
|
+
}
|
136
|
+
}
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
def create_digital_entity_call(de_info = {}, command = 'create', update_options = {})
|
143
|
+
# de_info is a hash like this:
|
144
|
+
# { 'vpid' => 0, || 'pid' => 0,
|
145
|
+
# 'control' => { 'label' => 'abc', 'usage_type' => 'archive' },
|
146
|
+
# 'metadata' => [ { 'name' => 'descriptive', 'type' => 'dc', 'value' => '<record>...</record>'},
|
147
|
+
# { 'cmd' => 'insert', 'link_to_exists' => true, 'mid' => '12345' } ],
|
148
|
+
# 'relation' => [ { 'cmd' => 'update', 'type' => 'manifestation', 'pid' => '12345' },
|
149
|
+
# { 'cmd' => 'delete', 'type' => 'part_of', pid => '12345' } ],
|
150
|
+
# 'stream_ref' => { 'file_name' => 'abc.tif', 'file_extension' => 'tif', ... }
|
151
|
+
# }
|
152
|
+
# update_options is something like this:
|
153
|
+
# { 'metadata' => 'delta',
|
154
|
+
# 'relation' => 'all',
|
155
|
+
# }
|
156
|
+
digital_entity_call = Libis::Tools::XmlDocument.new
|
157
|
+
root = digital_entity_call.create_node('digital_entity_call',
|
158
|
+
:namespaces => {:node_ns => 'xb',
|
159
|
+
'xb' => 'http://com/exlibris/digitool/repository/api/xmlbeans'})
|
160
|
+
digital_entity_call.root = root
|
161
|
+
|
162
|
+
root << (digital_entity = digital_entity_call.create_node('xb:digital_entity'))
|
163
|
+
digital_entity << digital_entity_call.create_text_node('pid', de_info['pid']) if de_info['pid']
|
164
|
+
digital_entity << digital_entity_call.create_text_node('vpid', de_info['vpid']) if de_info['vpid']
|
165
|
+
if de_info['control']
|
166
|
+
digital_entity << (ctrl = digital_entity_call.create_node('control'))
|
167
|
+
de_info['control'].each { |k, v| ctrl << digital_entity_call.create_text_node(k.to_s, v.to_s) }
|
168
|
+
end
|
169
|
+
if de_info['metadata'] || update_options['metadata']
|
170
|
+
attributes = {}
|
171
|
+
cmd = update_options.delete 'metadata'
|
172
|
+
attributes['cmd'] = 'delete_and_insert_' + cmd if cmd
|
173
|
+
digital_entity << (mds = digital_entity_call.create_node('mds', :attributes => attributes))
|
174
|
+
if de_info['metadata']
|
175
|
+
de_info['metadata'].each do |m|
|
176
|
+
attributes = {}
|
177
|
+
shared = m.delete 'shared'
|
178
|
+
attributes['shared'] = shared if shared
|
179
|
+
cmd = m.delete 'cmd'
|
180
|
+
attributes['cmd'] = cmd if cmd
|
181
|
+
link_to_exists = m.delete 'link_to_exists'
|
182
|
+
attributes['link_to_exists'] = link_to_exists if link_to_exists
|
183
|
+
mds << (md = digital_entity_call.create_node('md', :attributes => attributes))
|
184
|
+
m.each { |k, v| md << digital_entity_call.create_text_node(k.to_s, v.to_s) }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
if de_info['relation'] || update_options['relation']
|
189
|
+
attributes = {}
|
190
|
+
cmd = update_options.delete 'relation'
|
191
|
+
attributes['cmd'] = 'delete_and_insert_' + cmd if cmd
|
192
|
+
digital_entity << (relations = digital_entity_call.create_node('relations', :attributes => attributes))
|
193
|
+
if de_info['relation']
|
194
|
+
de_info['relation'].each do |r|
|
195
|
+
attributes = {}
|
196
|
+
cmd = r.delete 'cmd'
|
197
|
+
attributes['cmd'] = cmd if cmd
|
198
|
+
relations << (relation = digital_entity_call.create_node('relation', :attributes => attributes))
|
199
|
+
r.each { |k, v| relation << digital_entity_call.create_text_node(k.to_s, v.to_s) }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
f = de_info['stream_ref']
|
204
|
+
if f
|
205
|
+
attributes = {}
|
206
|
+
cmd = f.delete 'cmd'
|
207
|
+
attributes['cmd'] = cmd if cmd
|
208
|
+
store_command = f.delete 'store_command'
|
209
|
+
attributes['store_command'] = store_command if store_command
|
210
|
+
location = f.delete 'location'
|
211
|
+
attributes['location'] = location if location
|
212
|
+
digital_entity << (stream_ref = digital_entity_call.create_node('stream_ref', :attributes => attributes))
|
213
|
+
de_info['stream_ref'].each { |k, v| stream_ref << digital_entity_call.create_text_node(k.to_s, v.to_s) }
|
214
|
+
end
|
215
|
+
root << digital_entity_call.create_text_node('command', command)
|
216
|
+
digital_entity_call.document
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'libis/tools/xml_document'
|
4
|
+
require 'libis/services/soap_client'
|
5
|
+
|
6
|
+
module Libis
|
7
|
+
module Services
|
8
|
+
module Digitool
|
9
|
+
|
10
|
+
class DigitoolConnector
|
11
|
+
include Libis::Services::SoapClient
|
12
|
+
|
13
|
+
def initialize(service, host = nil)
|
14
|
+
@host = host || 'aleph08.libis.kuleuven.be:1801'
|
15
|
+
@service = service.to_s.downcase
|
16
|
+
end
|
17
|
+
|
18
|
+
def init
|
19
|
+
@base_url = "http://#{@host}/de_repository_web/services/"
|
20
|
+
@wsdl_extension = '?wsdl'
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def result_parser(response, options = {})
|
26
|
+
result = get_xml_response(response)
|
27
|
+
error = nil
|
28
|
+
pids = nil
|
29
|
+
mids = nil
|
30
|
+
de = nil
|
31
|
+
doc = Libis::Tools::XmlDocument.parse(result)
|
32
|
+
doc.xpath('//error_description').each { |x| error ||= []; error << x.content unless x.content.nil? }
|
33
|
+
doc.xpath('//pid').each { |x| pids ||= []; pids << x.content unless x.content.nil? }
|
34
|
+
doc.xpath('//mid').each { |x| mids ||= []; mids << x.content unless x.content.nil? }
|
35
|
+
doc.xpath('//xb:digital_entity').each { |x| de ||= []; de << x.to_s }
|
36
|
+
{errors: error, pids: pids, mids: mids, digital_entities: de}
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_xml_response(response)
|
40
|
+
response.first[1][response.first[1][:result].snakecase.to_sym]
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,193 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
#require 'iconv'
|
5
|
+
#require 'htmlentities'
|
6
|
+
|
7
|
+
require 'libis/services/soap_client'
|
8
|
+
|
9
|
+
module Libis
|
10
|
+
module Services
|
11
|
+
module Digitool
|
12
|
+
|
13
|
+
# noinspection RubyStringKeysInHashInspection
|
14
|
+
class MetaDataManager
|
15
|
+
include Singleton, Libis::Services::SoapClient
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
setup 'MetaDataManager'
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_dc(dc)
|
22
|
+
dc_string = dc.to_s
|
23
|
+
dc_string.force_encoding('UTF-8')
|
24
|
+
dc_string.gsub!(/<\?xml[^\?]*\?>(\n)*/x, '')
|
25
|
+
dc_string = '<?xml version="1.0" encoding="UTF-8"?>' + dc_string
|
26
|
+
# dc_string.gsub!('&','&')
|
27
|
+
# dc_string.gsub!('<', '<')
|
28
|
+
# dc_string = HTMLEntities.new.encode(dc_string, :named)
|
29
|
+
request :create_meta_data_entry, :general => general.to_s, :description => nil, :name => 'descriptive', :type => 'dc', :value => dc_string
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_dc_from_xml(xml_doc)
|
33
|
+
create_dc_record_from_xml xml_doc
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_dc(mid, dc)
|
37
|
+
request :update_meta_data_entry, :mid => mid.to_s, :general => general.to_s, :description => nil, :name => 'descriptive', :type => 'dc', :value => dc.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_acl(acl)
|
41
|
+
request :create_meta_data_entry, :general => general.to_s, :description => nil, :name => 'accessrights', :type => 'rights_md', :value => acl.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def update_acl(mid, acl)
|
45
|
+
request :update_meta_data_entry, :mid => mid.to_s, :general => general.to_s, :description => nil, :name => 'accessrights', :type => 'rights_md', :value => acl.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def delete(mid)
|
49
|
+
request :delete_meta_data_entry, :mid => mid.to_s, :general => general.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def retrieve(mid)
|
53
|
+
request :retrieve_meta_data_entry, :mid => mid.to_s, :general => general.to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_dc_record_from_xml(xml_doc)
|
57
|
+
doc = Libis::Tools::XmlDocument.open xml_doc
|
58
|
+
records = doc.xpath('/records/record')
|
59
|
+
return nil unless records.size > 0
|
60
|
+
create_dc(records[0])
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_dc_record(dc_info)
|
64
|
+
doc = Libis::Tools::XmlDocument.new
|
65
|
+
doc.root = doc.create_node('record',
|
66
|
+
:namespaces => {'dc' => 'http://purl.org/dc/elements/1.1',
|
67
|
+
'dcterms' => 'http://purl.org/dc/terms',
|
68
|
+
'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'})
|
69
|
+
if dc_info
|
70
|
+
dc_info.each do |k, v|
|
71
|
+
doc.root << (n = doc.create_text_node(k.to_s, v.to_s))
|
72
|
+
n['xsi:type'] = 'dcterms:URI' if v =~ /^http:\/\//
|
73
|
+
end
|
74
|
+
end
|
75
|
+
doc
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_acl_record(acl_info = nil)
|
79
|
+
doc = Libis::Tools::XmlDocument.new
|
80
|
+
doc.root = doc.create_node('access_right_md',
|
81
|
+
:namespaces => {:node_ns => 'ar',
|
82
|
+
'ar' => 'http://com/exlibris/digitool/repository/api/xmlbeans',
|
83
|
+
'xs' => 'http://www.w3.org/2001/XMLSchema'})
|
84
|
+
root = doc.root
|
85
|
+
root['enabled'] = 'true'
|
86
|
+
return doc unless acl_info
|
87
|
+
c = acl_info[:copyright]
|
88
|
+
add_acl_copyright(doc, c[:text_file], c[:required]) if c
|
89
|
+
e = acl_info[:conditions]
|
90
|
+
if e
|
91
|
+
e.each do |x|
|
92
|
+
add_acl_condition(doc, x[:expressions], x[:negate])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
doc
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_acl_copyright(doc, text_file, required = true)
|
99
|
+
root = doc.root
|
100
|
+
top = root.xpath('ar_copyrigths')
|
101
|
+
if top.empty?
|
102
|
+
top = doc.create_node('ar_copyrights')
|
103
|
+
root << top
|
104
|
+
else
|
105
|
+
top = top[0]
|
106
|
+
end
|
107
|
+
top['required'] = required.to_s if required
|
108
|
+
child = top.xpath('text_file')
|
109
|
+
child = child.empty? ? doc.create_node('text_file') : top[0]
|
110
|
+
child.content = text_file
|
111
|
+
top << child
|
112
|
+
doc
|
113
|
+
end
|
114
|
+
|
115
|
+
def add_acl_user_group_ip(doc, user, group, iprange, negate = false)
|
116
|
+
expressions = []
|
117
|
+
user.split.each { |u| expressions << create_acl_expression_user(u) } if user
|
118
|
+
group.split.each { |g| expressions << create_acl_expression_group(g) } if group
|
119
|
+
iprange.split.each { |i| expressions << create_acl_expression_iprange(i) } if iprange
|
120
|
+
add_acl_condition doc, expressions, negate
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_acl_user(doc, user, negate = false)
|
124
|
+
expressions = Array.new
|
125
|
+
user.split.each { |u| expressions << create_acl_expression_user(u, negate) }
|
126
|
+
add_acl_condition doc, expressions
|
127
|
+
end
|
128
|
+
|
129
|
+
def add_acl_group(doc, group, negate = false)
|
130
|
+
expressions = Array.new
|
131
|
+
group.split.each { |g| expressions << create_acl_expression_group(g, negate) }
|
132
|
+
add_acl_condition doc, expressions
|
133
|
+
end
|
134
|
+
|
135
|
+
def add_acl_iprange(doc, iprange, negate = false)
|
136
|
+
expressions = Array.new
|
137
|
+
iprange.split.each { |i| expressions << create_acl_expression_iprange(i, negate) }
|
138
|
+
add_acl_condition doc, expressions
|
139
|
+
end
|
140
|
+
|
141
|
+
def add_acl_condition(doc, expressions, negate = false)
|
142
|
+
root = doc.root
|
143
|
+
top = root.xpath('ar_conditions')
|
144
|
+
if top.empty?
|
145
|
+
top = doc.create_node('ar_conditions')
|
146
|
+
root << top
|
147
|
+
else
|
148
|
+
top = top[0]
|
149
|
+
end
|
150
|
+
top << (cond_node = doc.create_node('ar_condition'))
|
151
|
+
cond_node['negate'] = negate.to_s if negate
|
152
|
+
cond_node << (exprs_node = doc.create_node('ar_expressions'))
|
153
|
+
expressions.each do |e|
|
154
|
+
exprs_node << (expr_node = doc.create_node('ar_expression'))
|
155
|
+
expr_node['negate'] = e[:negate].to_s if e[:negate]
|
156
|
+
expr_node['ar_operation'] = e[:operation].to_s if e[:operation]
|
157
|
+
expr_node << doc.create_text_node('key', e[:key].to_s)
|
158
|
+
expr_node << doc.create_text_node('val1', e[:val1].to_s)
|
159
|
+
expr_node << doc.create_text_node('val2', e[:val2].to_s) if e[:val2]
|
160
|
+
end
|
161
|
+
doc
|
162
|
+
end
|
163
|
+
|
164
|
+
def create_acl_expression_user(user, negate = false)
|
165
|
+
{:operation => 'eq',
|
166
|
+
:negate => negate.to_s,
|
167
|
+
:key => 'user_id',
|
168
|
+
:val1 => user.to_s
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
def create_acl_expression_group(group, negate = false)
|
173
|
+
{:operation => 'eq',
|
174
|
+
:negate => negate.to_s,
|
175
|
+
:key => 'group_id',
|
176
|
+
:val1 => group.to_s
|
177
|
+
}
|
178
|
+
end
|
179
|
+
|
180
|
+
def create_acl_expression_iprange(iprange, negate = false)
|
181
|
+
return nil unless iprange =~ /(\d+\.\d+\.\d+\.\d+)-(\d+\.\d+\.\d+\.\d+)/
|
182
|
+
{:operation => 'within',
|
183
|
+
:negate => negate.to_s,
|
184
|
+
:key => 'ip_range',
|
185
|
+
:val1 => $1,
|
186
|
+
:val2 => $2
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
@@ -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
|