eXistAPI 0.0.0
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.
- data/lib/collection.rb +59 -0
- data/lib/document.rb +34 -0
- data/lib/eXistAPI.rb +209 -0
- data/lib/exist_exception.rb +52 -0
- metadata +49 -0
data/lib/collection.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require "xmlrpc/client"
|
2
|
+
require 'document'
|
3
|
+
|
4
|
+
class Collection
|
5
|
+
|
6
|
+
attr_reader :name
|
7
|
+
attr_reader :owner
|
8
|
+
attr_reader :group
|
9
|
+
attr_reader :permissions
|
10
|
+
attr_reader :childCollection
|
11
|
+
|
12
|
+
def initialize(client, collectionName)
|
13
|
+
@client = client
|
14
|
+
load(collectionName)
|
15
|
+
rescue => e
|
16
|
+
raise e
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s()
|
20
|
+
return "#{@permissions} #{@owner} #{@group} #{@name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def documents
|
24
|
+
@documents.each { |d| yield d }
|
25
|
+
end
|
26
|
+
|
27
|
+
def docs #returns string array of all documents in collection
|
28
|
+
ds = []
|
29
|
+
@documents.each{ |d| ds.push(d.name)}
|
30
|
+
return ds
|
31
|
+
end
|
32
|
+
|
33
|
+
def [](key)
|
34
|
+
@documents.each { |d|
|
35
|
+
return d if key == d.name
|
36
|
+
}
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def load(collectionName)
|
43
|
+
resp = @client.call("getCollectionDesc", collectionName)
|
44
|
+
@name = resp['name']+"/"
|
45
|
+
@owner = resp['owner']
|
46
|
+
@group = resp['group']
|
47
|
+
@permissions = resp['permissions']
|
48
|
+
@childCollection = resp['collections']
|
49
|
+
|
50
|
+
@documents = Array.new
|
51
|
+
docs = resp['documents']
|
52
|
+
#puts "docs #{docs}"
|
53
|
+
docs.each { |d| @documents.push(Document.new(@client, d, @name)) }
|
54
|
+
rescue XMLRPC::FaultException => e
|
55
|
+
raise e
|
56
|
+
rescue
|
57
|
+
raise ExistException.new("Failed to load Collection", 10), callers
|
58
|
+
end #end def load
|
59
|
+
end #end class Collection
|
data/lib/document.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class Document
|
2
|
+
|
3
|
+
attr_reader :path
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :owner
|
6
|
+
attr_reader :group
|
7
|
+
attr_reader :permissions
|
8
|
+
|
9
|
+
def initialize(client, hash, colname)
|
10
|
+
@client = client
|
11
|
+
@path = colname + hash['name']
|
12
|
+
@name = @path[/[^\/]+$/]
|
13
|
+
#puts "filename #{@name}"
|
14
|
+
@owner = hash['owner']
|
15
|
+
@group = hash['group']
|
16
|
+
@permissions = hash['permissions']
|
17
|
+
rescue => e
|
18
|
+
raise e
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
return "#{@permissions} #{@owner} #{@group} #{@name}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def content
|
26
|
+
options = { "indent" => "yes", "encoding" => "UTF-8",
|
27
|
+
"expand-xincludes" => "yes" }
|
28
|
+
return @client.call("getDocument", @path, options)
|
29
|
+
rescue XMLRPC::FaultException => e
|
30
|
+
raise e
|
31
|
+
rescue
|
32
|
+
raise ExistException.new("Failed to load content of Document", 11), callers
|
33
|
+
end
|
34
|
+
end
|
data/lib/eXistAPI.rb
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
require "xmlrpc/client"
|
2
|
+
require 'collection'
|
3
|
+
|
4
|
+
class ExistAPI
|
5
|
+
#example ExistAPI.new("http://localhost:8080/exist/xmlrpc", "admin", "password")
|
6
|
+
def initialize(uri = nil , username = nil, password = nil)
|
7
|
+
@uri = uri
|
8
|
+
@username = username
|
9
|
+
@password = password
|
10
|
+
@parameters = { "encoding" => "UTF-8", "indent" => "yes"}
|
11
|
+
#outputoptions = { "encoding" => "UTF-8", "indent" => "yes"}
|
12
|
+
connect
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def connect
|
17
|
+
@client = XMLRPC::Client.new2(@uri)
|
18
|
+
@client.user=(@username)
|
19
|
+
@client.password=(@password)
|
20
|
+
@client.call("isXACMLEnabled") #test if the connection is established.
|
21
|
+
rescue XMLRPC::FaultException => e
|
22
|
+
raise e
|
23
|
+
rescue
|
24
|
+
raise ExistException.new("Database login failed", 1), caller
|
25
|
+
end
|
26
|
+
|
27
|
+
public
|
28
|
+
|
29
|
+
def createcollection(_name, _parent = nil)
|
30
|
+
if (_parent == nil)
|
31
|
+
begin
|
32
|
+
result = @client.call("createCollection", _name)
|
33
|
+
return result
|
34
|
+
end
|
35
|
+
else
|
36
|
+
begin
|
37
|
+
colname = _parent.getname + _name
|
38
|
+
result = @client.call("createCollection", colname)
|
39
|
+
return result
|
40
|
+
end
|
41
|
+
end
|
42
|
+
rescue XMLRPC::FaultException => e
|
43
|
+
raise e
|
44
|
+
rescue
|
45
|
+
raise ExistException.new("Failed to create Collection", 2), caller
|
46
|
+
end
|
47
|
+
|
48
|
+
def getcollection(path)
|
49
|
+
if(path[-1] != "/") #if last is not "/" then add it
|
50
|
+
path += "/"
|
51
|
+
end
|
52
|
+
col = Collection.new(@client, path)
|
53
|
+
return col
|
54
|
+
rescue => e
|
55
|
+
raise e
|
56
|
+
end
|
57
|
+
|
58
|
+
def existscollection?(orig_path)
|
59
|
+
collections = orig_path.split("/")
|
60
|
+
collections.delete("")
|
61
|
+
i=0
|
62
|
+
path = "/"
|
63
|
+
while(i < collections.length)
|
64
|
+
path = path + collections[i] + "/"
|
65
|
+
col = Collection.new(@client, path)
|
66
|
+
if (!col.childCollection.include?(collections[i+1]))
|
67
|
+
break
|
68
|
+
end
|
69
|
+
i = i + 1
|
70
|
+
end
|
71
|
+
|
72
|
+
if(path[-1]=="/")
|
73
|
+
path = path[0..-2]
|
74
|
+
end
|
75
|
+
if(orig_path[-1]=="/")
|
76
|
+
orig_path = orig_path[0..-2]
|
77
|
+
end
|
78
|
+
|
79
|
+
if(path == orig_path)
|
80
|
+
return true
|
81
|
+
else
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
rescue => e
|
85
|
+
raise e
|
86
|
+
end
|
87
|
+
|
88
|
+
def remove_collection(_name)
|
89
|
+
# boolean removeCollection( String collection)
|
90
|
+
result = @client.call("removeCollection", _name)
|
91
|
+
return result
|
92
|
+
rescue XMLRPC::FaultException => e
|
93
|
+
raise e
|
94
|
+
rescue
|
95
|
+
raise ExistException.new("Failed to remove Collection", 3), caller
|
96
|
+
end
|
97
|
+
|
98
|
+
def storeresource(_res, _docname, _overwrite = 1)
|
99
|
+
if ((_res == nil)||(_docname == nil))
|
100
|
+
raise ExistException.new("Resource or document name is nil", 4), caller
|
101
|
+
end
|
102
|
+
begin
|
103
|
+
@client.call("parse",_res.to_s, _docname, _overwrite)
|
104
|
+
rescue XMLRPC::FaultException => e
|
105
|
+
raise e
|
106
|
+
rescue ExistException => e
|
107
|
+
raise e
|
108
|
+
rescue
|
109
|
+
raise ExistException.new("Failed to store resource", 5), caller
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def execute_query(xquery, parameters = @parameters)
|
114
|
+
#puts xquery
|
115
|
+
begin
|
116
|
+
handle = @client.call("executeQuery", XMLRPC::Base64.new(xquery), parameters)
|
117
|
+
return handle
|
118
|
+
rescue XMLRPC::FaultException => e
|
119
|
+
raise e
|
120
|
+
rescue
|
121
|
+
raise ExistException.new("Failed to execute query", 6), caller
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def retrieve(handle, pos)
|
126
|
+
begin
|
127
|
+
res = @client.call("retrieve", handle, pos, @parameters)
|
128
|
+
return res
|
129
|
+
rescue XMLRPC::FaultException => e
|
130
|
+
raise e
|
131
|
+
rescue
|
132
|
+
raise ExistException.new("Failed to retrive resource", 7), caller
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_hits(handle)
|
137
|
+
begin
|
138
|
+
summary = @client.call("querySummary", handle)
|
139
|
+
hits = summary['hits']
|
140
|
+
return hits
|
141
|
+
rescue XMLRPC::FaultException => e
|
142
|
+
raise e
|
143
|
+
rescue
|
144
|
+
raise ExistException.new("Failed to get number of hits", 8), caller
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
#<email type="office">andrew@gmail.com</email>, pos = into | following | preceding, expr_single e.g. //address[fname="Andrew"]
|
149
|
+
def update_insert(expr, pos, expr_single)
|
150
|
+
query = "update insert "+expr+" "+pos+" "+expr_single
|
151
|
+
#puts "query #{query}"
|
152
|
+
execute_query(query)
|
153
|
+
rescue => e
|
154
|
+
raise e
|
155
|
+
end
|
156
|
+
|
157
|
+
def update_replace(expr, expr_single)
|
158
|
+
query = "update replace "+expr+" with "+expr_single
|
159
|
+
execute_query(query)
|
160
|
+
rescue => e
|
161
|
+
raise e
|
162
|
+
end
|
163
|
+
|
164
|
+
def update_value(expr, expr_single)
|
165
|
+
query = "update replace " + expr + " with " + expr_single
|
166
|
+
execute_query(query)
|
167
|
+
rescue => e
|
168
|
+
raise e
|
169
|
+
end
|
170
|
+
|
171
|
+
def update_delete(expr)
|
172
|
+
query = "update delete " + expr
|
173
|
+
#puts "query #{query}"
|
174
|
+
execute_query(query)
|
175
|
+
rescue => e
|
176
|
+
raise e
|
177
|
+
end
|
178
|
+
|
179
|
+
def update_rename(expr, expr_single)
|
180
|
+
query = "update rename " + expr + " as " + expr_single
|
181
|
+
#puts "query #{query}"
|
182
|
+
execute_query(query)
|
183
|
+
rescue => e
|
184
|
+
raise e
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
#db = ExistAPI.new("http://localhost:8080/exist/xmlrpc", "admin", "admin")
|
190
|
+
#puts db.existscollection?("db")
|
191
|
+
|
192
|
+
#client = XMLRPC::Client.new("localhost", "/exist/xmlrpc", 8080)
|
193
|
+
|
194
|
+
#-----------------
|
195
|
+
#if $*.length < 1 then
|
196
|
+
# puts "usage: collections.rb collection-path"
|
197
|
+
# exit(0)
|
198
|
+
#end
|
199
|
+
#
|
200
|
+
#path = $*[0]
|
201
|
+
#collection = Collection.new(client, "/db/pokus/")
|
202
|
+
#puts collection.to_s
|
203
|
+
#collection.documents { |d| puts d.to_s }
|
204
|
+
#
|
205
|
+
#doc = collection['books.xml']
|
206
|
+
#if doc == nil
|
207
|
+
# error("document not found")
|
208
|
+
#end
|
209
|
+
#puts doc.content
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# To change this template, choose Tools | Templates
|
2
|
+
# and open the template in the editor.
|
3
|
+
|
4
|
+
class ExistException < RuntimeError
|
5
|
+
|
6
|
+
@description
|
7
|
+
@number
|
8
|
+
|
9
|
+
def initialize(_description = "Epic fail \n", _number = nil)
|
10
|
+
@description = _description + "\n"
|
11
|
+
@number = _number
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
self.tostring
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
self.tostring
|
20
|
+
end
|
21
|
+
|
22
|
+
def tostring
|
23
|
+
@number.to_s + ": " +@description
|
24
|
+
end
|
25
|
+
|
26
|
+
def code
|
27
|
+
@number
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
#Soupis jednotlivych vyjimek, v zavorce metoda tera tuto vyjimku vyhazuje
|
33
|
+
#1: Database login failed (DatabaseManager.connect)
|
34
|
+
#2: Failed to create Collection (DatabaseManager.createcollection)
|
35
|
+
#3: Failed to remove Collection (DatabaseManager.removecollection)
|
36
|
+
#
|
37
|
+
#10: Failed to initialize Collection (Collection.initialize)
|
38
|
+
#11: Failed to close Collection (Collection.close)
|
39
|
+
#12: No such child Collection (Collection.getchildcollection)
|
40
|
+
#13: Failed to get parent Collection (Collection.getparentcollection)
|
41
|
+
#14: Unknown resource (Collection.getresource)
|
42
|
+
#15: Failed to list child Collections (Collection.listchildcollection)
|
43
|
+
#16: Failed to list resources (Collection.listresources)
|
44
|
+
#17: Failed to remove resource (Collection.removeresource)
|
45
|
+
#18: Failed to store resource (Collection.storeresource)
|
46
|
+
#
|
47
|
+
#20: Failed to execute query (XPathQueryService.query)
|
48
|
+
#21: Failed to query Resource (XPathQueryService.queryresource)
|
49
|
+
#
|
50
|
+
#30: Failed to update Collection (XUpdateService.update)
|
51
|
+
#31: Failed to update Resource (XUpdateService.updateResource)
|
52
|
+
#
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: eXistAPI
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jenda Sirl
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-02 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! "API for eXist-db based on XML-RPC. \nAPI is using xQuery, xPath and
|
15
|
+
xQuery Update Facility."
|
16
|
+
email: jan.sirl@seznam.cz
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/eXistAPI.rb
|
22
|
+
- lib/collection.rb
|
23
|
+
- lib/document.rb
|
24
|
+
- lib/exist_exception.rb
|
25
|
+
homepage: http://rubygems.org/gems/existapi
|
26
|
+
licenses: []
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 1.8.16
|
46
|
+
signing_key:
|
47
|
+
specification_version: 3
|
48
|
+
summary: API for eXist-db based on XML-RPC.
|
49
|
+
test_files: []
|