zookeeper-ng 1.5.2.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +7 -0
  2. data/.ctags_paths +1 -0
  3. data/.dotfiles/ruby-gemset +1 -0
  4. data/.dotfiles/ruby-version +1 -0
  5. data/.dotfiles/rvmrc +2 -0
  6. data/.github/workflows/build.yml +57 -0
  7. data/.gitignore +19 -0
  8. data/.gitmodules +3 -0
  9. data/CHANGELOG +408 -0
  10. data/Gemfile +30 -0
  11. data/Guardfile +8 -0
  12. data/LICENSE +23 -0
  13. data/Manifest +29 -0
  14. data/README.markdown +62 -0
  15. data/Rakefile +121 -0
  16. data/cause-abort.rb +117 -0
  17. data/ext/.gitignore +6 -0
  18. data/ext/Rakefile +41 -0
  19. data/ext/c_zookeeper.rb +398 -0
  20. data/ext/common.h +17 -0
  21. data/ext/dbg.h +53 -0
  22. data/ext/depend +5 -0
  23. data/ext/event_lib.c +740 -0
  24. data/ext/event_lib.h +175 -0
  25. data/ext/extconf.rb +103 -0
  26. data/ext/generate_gvl_code.rb +321 -0
  27. data/ext/patches/zkc-3.3.5-network.patch +24 -0
  28. data/ext/patches/zkc-3.4.5-buffer-overflow.patch +11 -0
  29. data/ext/patches/zkc-3.4.5-config.patch +5454 -0
  30. data/ext/patches/zkc-3.4.5-fetch-and-add.patch +16 -0
  31. data/ext/patches/zkc-3.4.5-logging.patch +41 -0
  32. data/ext/patches/zkc-3.4.5-out-of-order-ping.patch +163 -0
  33. data/ext/patches/zkc-3.4.5-yosemite-htonl-fix.patch +102 -0
  34. data/ext/zkc-3.4.5.tar.gz +0 -0
  35. data/ext/zkrb.c +1080 -0
  36. data/ext/zkrb_wrapper.c +775 -0
  37. data/ext/zkrb_wrapper.h +350 -0
  38. data/ext/zkrb_wrapper_compat.c +15 -0
  39. data/ext/zkrb_wrapper_compat.h +11 -0
  40. data/ext/zookeeper_base.rb +256 -0
  41. data/java/java_base.rb +501 -0
  42. data/lib/zookeeper/acls.rb +44 -0
  43. data/lib/zookeeper/callbacks.rb +108 -0
  44. data/lib/zookeeper/client.rb +30 -0
  45. data/lib/zookeeper/client_methods.rb +282 -0
  46. data/lib/zookeeper/common/queue_with_pipe.rb +110 -0
  47. data/lib/zookeeper/common.rb +122 -0
  48. data/lib/zookeeper/compatibility.rb +138 -0
  49. data/lib/zookeeper/constants.rb +97 -0
  50. data/lib/zookeeper/continuation.rb +223 -0
  51. data/lib/zookeeper/core_ext.rb +58 -0
  52. data/lib/zookeeper/em_client.rb +55 -0
  53. data/lib/zookeeper/exceptions.rb +135 -0
  54. data/lib/zookeeper/forked.rb +19 -0
  55. data/lib/zookeeper/latch.rb +34 -0
  56. data/lib/zookeeper/logger/forwarding_logger.rb +84 -0
  57. data/lib/zookeeper/logger.rb +39 -0
  58. data/lib/zookeeper/monitor.rb +19 -0
  59. data/lib/zookeeper/rake_tasks.rb +165 -0
  60. data/lib/zookeeper/request_registry.rb +153 -0
  61. data/lib/zookeeper/stat.rb +21 -0
  62. data/lib/zookeeper/version.rb +4 -0
  63. data/lib/zookeeper.rb +115 -0
  64. data/notes.txt +14 -0
  65. data/scripts/upgrade-1.0-sed-alike.rb +46 -0
  66. data/spec/c_zookeeper_spec.rb +51 -0
  67. data/spec/chrooted_connection_spec.rb +83 -0
  68. data/spec/compatibilty_spec.rb +8 -0
  69. data/spec/default_watcher_spec.rb +41 -0
  70. data/spec/em_spec.rb +51 -0
  71. data/spec/ext/zookeeper_base_spec.rb +19 -0
  72. data/spec/forked_connection_spec.rb +122 -0
  73. data/spec/latch_spec.rb +24 -0
  74. data/spec/log4j.properties +17 -0
  75. data/spec/shared/all_success_return_values.rb +10 -0
  76. data/spec/shared/connection_examples.rb +1081 -0
  77. data/spec/spec_helper.rb +61 -0
  78. data/spec/support/00_logging.rb +38 -0
  79. data/spec/support/10_spawn_zookeeper.rb +20 -0
  80. data/spec/support/progress_formatter.rb +15 -0
  81. data/spec/support/zookeeper_spec_helpers.rb +96 -0
  82. data/spec/zookeeper_spec.rb +24 -0
  83. data/zookeeper.gemspec +46 -0
  84. data/zoomonkey/duplicates +3 -0
  85. data/zoomonkey/zoomonkey.rb +194 -0
  86. metadata +185 -0
data/java/java_base.rb ADDED
@@ -0,0 +1,501 @@
1
+ require 'java'
2
+ require 'thread'
3
+
4
+ # require 'rubygems'
5
+ # gem 'slyphon-log4j', '= 1.2.15'
6
+ # gem 'zk-ruby-zookeeper_jar', "= #{Zookeeper::DRIVER_VERSION}"
7
+
8
+ require 'log4j'
9
+ require 'zookeeper_jar'
10
+
11
+
12
+ # XXX: reindent this WHOLE FILE later
13
+ module Zookeeper
14
+
15
+ # The low-level wrapper-specific methods for the Java lib,
16
+ # subclassed by the top-level Zookeeper class
17
+ class JavaBase
18
+ include Java
19
+ include Common
20
+ include Constants
21
+ include Callbacks
22
+ include Exceptions
23
+ include ACLs
24
+ include Logger
25
+
26
+ JZK = org.apache.zookeeper
27
+ JZKD = org.apache.zookeeper.data
28
+ Code = JZK::KeeperException::Code
29
+
30
+ ANY_VERSION = -1
31
+ DEFAULT_SESSION_TIMEOUT = 10_000
32
+
33
+ JZKD::Stat.class_eval do
34
+ MEMBERS = [:version, :czxid, :mzxid, :ctime, :mtime, :cversion, :aversion, :ephemeralOwner, :dataLength, :numChildren, :pzxid]
35
+ def to_hash
36
+ MEMBERS.inject({}) { |h,k| h[k] = __send__(k); h }
37
+ end
38
+ end
39
+
40
+ JZKD::Id.class_eval do
41
+ def to_hash
42
+ { :scheme => getScheme, :id => getId }
43
+ end
44
+ end
45
+
46
+ JZKD::ACL.class_eval do
47
+ def self.from_ruby_acl(acl)
48
+ raise TypeError, "acl must be a Zookeeper::ACLs::ACL not #{acl.inspect}" unless acl.kind_of?(Zookeeper::ACLs::ACL)
49
+ id = org.apache.zookeeper.data.Id.new(acl.id.scheme.to_s, acl.id.id.to_s)
50
+ new(acl.perms.to_i, id)
51
+ end
52
+
53
+ def to_hash
54
+ { :perms => getPerms, :id => getId.to_hash }
55
+ end
56
+ end
57
+
58
+ JZK::WatchedEvent.class_eval do
59
+ def to_hash
60
+ { :type => getType.getIntValue, :state => getState.getIntValue, :path => getPath }
61
+ end
62
+ end
63
+
64
+ # used for internal dispatching
65
+ # @private
66
+ module JavaCB
67
+ class Callback
68
+ include Logger
69
+
70
+ attr_reader :req_id
71
+
72
+ def initialize(req_id)
73
+ @req_id = req_id
74
+ end
75
+ end
76
+
77
+ class DataCallback < Callback
78
+ include JZK::AsyncCallback::DataCallback
79
+
80
+ def processResult(rc, path, queue, data, stat)
81
+ logger.debug { "#{self.class.name}#processResult rc: #{rc}, req_id: #{req_id}, path: #{path}, queue: #{queue.inspect}, data: #{data.inspect}, stat: #{stat.inspect}" }
82
+
83
+ hash = {
84
+ :rc => rc,
85
+ :req_id => req_id,
86
+ :path => path,
87
+ :data => (data && String.from_java_bytes(data)),
88
+ :stat => (stat && stat.to_hash),
89
+ }
90
+
91
+ # if rc == Zookeeper::ZOK
92
+ # hash.merge!({
93
+ # :data => String.from_java_bytes(data),
94
+ # :stat => stat.to_hash,
95
+ # })
96
+ # end
97
+
98
+ queue.push(hash)
99
+ end
100
+ end
101
+
102
+ class StringCallback < Callback
103
+ include JZK::AsyncCallback::StringCallback
104
+
105
+ def processResult(rc, path, queue, str)
106
+ logger.debug { "#{self.class.name}#processResult rc: #{rc}, req_id: #{req_id}, path: #{path}, queue: #{queue.inspect}, str: #{str.inspect}" }
107
+ queue.push(:rc => rc, :req_id => req_id, :path => path, :string => str)
108
+ end
109
+ end
110
+
111
+ class StatCallback < Callback
112
+ include JZK::AsyncCallback::StatCallback
113
+
114
+ def processResult(rc, path, queue, stat)
115
+ logger.debug { "#{self.class.name}#processResult rc: #{rc.inspect}, req_id: #{req_id}, path: #{path.inspect}, queue: #{queue.inspect}, stat: #{stat.inspect}" }
116
+ queue.push(:rc => rc, :req_id => req_id, :stat => (stat and stat.to_hash), :path => path)
117
+ end
118
+ end
119
+
120
+ class Children2Callback < Callback
121
+ include JZK::AsyncCallback::Children2Callback
122
+
123
+ def processResult(rc, path, queue, children, stat)
124
+ logger.debug { "#{self.class.name}#processResult rc: #{rc}, req_id: #{req_id}, path: #{path}, queue: #{queue.inspect}, children: #{children.inspect}, stat: #{stat.inspect}" }
125
+ hash = {
126
+ :rc => rc,
127
+ :req_id => req_id,
128
+ :path => path,
129
+ :strings => (children && children.to_a),
130
+ :stat => (stat and stat.to_hash),
131
+ }
132
+
133
+ queue.push(hash)
134
+ end
135
+ end
136
+
137
+ class ACLCallback < Callback
138
+ include JZK::AsyncCallback::ACLCallback
139
+
140
+ def processResult(rc, path, queue, acl, stat)
141
+ logger.debug { "ACLCallback#processResult rc: #{rc.inspect}, req_id: #{req_id}, path: #{path.inspect}, queue: #{queue.inspect}, acl: #{acl.inspect}, stat: #{stat.inspect}" }
142
+ a = Array(acl).map { |a| a.to_hash }
143
+ queue.push(:rc => rc, :req_id => req_id, :path => path, :acl => a, :stat => (stat && stat.to_hash))
144
+ end
145
+ end
146
+
147
+ class VoidCallback < Callback
148
+ include JZK::AsyncCallback::VoidCallback
149
+
150
+ def processResult(rc, path, queue)
151
+ logger.debug { "#{self.class.name}#processResult rc: #{rc}, req_id: #{req_id}, queue: #{queue.inspect}" }
152
+ queue.push(:rc => rc, :req_id => req_id, :path => path)
153
+ end
154
+ end
155
+
156
+ class WatcherCallback < Callback
157
+ include JZK::Watcher
158
+ include Zookeeper::Constants
159
+
160
+ attr_reader :client
161
+
162
+ def initialize(event_queue, opts={})
163
+ @event_queue = event_queue
164
+ @client = opts[:client]
165
+ super(ZKRB_GLOBAL_CB_REQ)
166
+ end
167
+
168
+ def process(event)
169
+ hash = event.to_hash
170
+ logger.debug { "WatcherCallback got event: #{hash.inspect}" }
171
+
172
+ if client && (hash[:type] == ZOO_SESSION_EVENT) && (hash[:state] == ZOO_CONNECTED_STATE)
173
+ logger.debug { "#{self.class}##{__method__} notifying client of connected state!" }
174
+ client.notify_connected!
175
+ end
176
+
177
+ hash = event.to_hash.merge(:req_id => req_id)
178
+ @event_queue.push(hash)
179
+ end
180
+ end
181
+ end
182
+
183
+ attr_reader :event_queue
184
+
185
+ def reopen(timeout=10, watcher=nil, opts = {})
186
+ @mutex.synchronize do
187
+ @req_registry.clear_watchers!
188
+
189
+ replace_jzk!(opts)
190
+ wait_until_connected(timeout)
191
+ end
192
+
193
+ state
194
+ end
195
+
196
+ def wait_until_connected(timeout=10)
197
+ @connected_latch.await(timeout) unless connected?
198
+ connected?
199
+ end
200
+
201
+ def initialize(host, timeout=10, watcher=nil, options={})
202
+ @host = host
203
+ @event_queue = QueueWithPipe.new
204
+
205
+ watcher ||= get_default_global_watcher()
206
+
207
+ @req_registry = RequestRegistry.new(watcher)
208
+
209
+ @mutex = Monitor.new
210
+ @dispatch_shutdown_cond = @mutex.new_cond
211
+ @connected_latch = Latch.new
212
+
213
+ @_running = nil
214
+ @_closed = false
215
+ @options = {}
216
+
217
+
218
+ # allows connected-state handlers to be registered before
219
+ yield self if block_given?
220
+
221
+ reopen(timeout, nil, options)
222
+ return nil unless connected?
223
+ @_running = true
224
+ setup_dispatch_thread!
225
+ end
226
+
227
+ def close
228
+ shutdown_thread = Thread.new do
229
+ @mutex.synchronize do
230
+ unless @_closed
231
+ @_closed = true # these are probably unnecessary
232
+ @_running = false
233
+
234
+ stop_dispatch_thread!
235
+ @jzk.close if @jzk
236
+ end
237
+ end
238
+ end
239
+
240
+ shutdown_thread.join unless event_dispatch_thread?
241
+ end
242
+
243
+ def state
244
+ @mutex.synchronize { @jzk.state }
245
+ end
246
+
247
+ def connected?
248
+ state == JZK::ZooKeeper::States::CONNECTED
249
+ end
250
+
251
+ def connecting?
252
+ state == JZK::ZooKeeper::States::CONNECTING
253
+ end
254
+
255
+ def associating?
256
+ state == JZK::ZooKeeper::States::ASSOCIATING
257
+ end
258
+
259
+ def running?
260
+ @_running
261
+ end
262
+
263
+ def closed?
264
+ @_closed
265
+ end
266
+
267
+ def self.set_debug_level(*a)
268
+ # IGNORED IN JRUBY
269
+ end
270
+
271
+ def set_debug_level(*a)
272
+ # IGNORED IN JRUBY
273
+ end
274
+
275
+ def get(req_id, path, callback, watcher)
276
+ handle_keeper_exception do
277
+ watch_cb = watcher ? create_watcher(req_id, path) : false
278
+
279
+ if callback
280
+ jzk.getData(path, watch_cb, JavaCB::DataCallback.new(req_id), event_queue)
281
+ [Code::Ok, nil, nil] # the 'nil, nil' isn't strictly necessary here
282
+ else # sync
283
+ stat = JZKD::Stat.new
284
+
285
+ value = jzk.getData(path, watch_cb, stat)
286
+ data = String.from_java_bytes(value) unless value.nil?
287
+ [Code::Ok, data, stat.to_hash]
288
+ end
289
+ end
290
+ end
291
+
292
+ def set(req_id, path, data, callback, version)
293
+ handle_keeper_exception do
294
+ version ||= ANY_VERSION
295
+
296
+ if callback
297
+ jzk.setData(path, data.to_java_bytes, version, JavaCB::StatCallback.new(req_id), event_queue)
298
+ [Code::Ok, nil]
299
+ else
300
+ stat = jzk.setData(path, data.to_java_bytes, version).to_hash
301
+ [Code::Ok, stat]
302
+ end
303
+ end
304
+ end
305
+
306
+ def get_children(req_id, path, callback, watcher)
307
+ handle_keeper_exception do
308
+ watch_cb = watcher ? create_watcher(req_id, path) : false
309
+
310
+ if callback
311
+ jzk.getChildren(path, watch_cb, JavaCB::Children2Callback.new(req_id), event_queue)
312
+ [Code::Ok, nil, nil]
313
+ else
314
+ stat = JZKD::Stat.new
315
+ children = jzk.getChildren(path, watch_cb, stat)
316
+ [Code::Ok, children.to_a, stat.to_hash]
317
+ end
318
+ end
319
+ end
320
+
321
+ def add_auth(req_id, scheme, cert)
322
+ handle_keeper_exception do
323
+ jzk.addAuthInfo(scheme, cert.to_java_bytes)
324
+ Code::Ok
325
+ end
326
+ end
327
+
328
+ def create(req_id, path, data, callback, acl, flags)
329
+ handle_keeper_exception do
330
+ acl = Array(acl).map{ |a| JZKD::ACL.from_ruby_acl(a) }
331
+ mode = JZK::CreateMode.fromFlag(flags)
332
+
333
+ data ||= ''
334
+
335
+ if callback
336
+ jzk.create(path, data.to_java_bytes, acl, mode, JavaCB::StringCallback.new(req_id), event_queue)
337
+ [Code::Ok, nil]
338
+ else
339
+ new_path = jzk.create(path, data.to_java_bytes, acl, mode)
340
+ [Code::Ok, new_path]
341
+ end
342
+ end
343
+ end
344
+
345
+ def sync(req_id, path)
346
+ handle_keeper_exception do
347
+ jzk.sync(path, JavaCB::VoidCallback.new(req_id), event_queue)
348
+ Code::Ok
349
+ end
350
+ end
351
+
352
+ def delete(req_id, path, version, callback)
353
+ handle_keeper_exception do
354
+ if callback
355
+ jzk.delete(path, version, JavaCB::VoidCallback.new(req_id), event_queue)
356
+ else
357
+ jzk.delete(path, version)
358
+ end
359
+
360
+ Code::Ok
361
+ end
362
+ end
363
+
364
+ def set_acl(req_id, path, acl, callback, version)
365
+ handle_keeper_exception do
366
+ logger.debug { "set_acl: acl #{acl.inspect}" }
367
+ acl = Array(acl).flatten.map { |a| JZKD::ACL.from_ruby_acl(a) }
368
+ logger.debug { "set_acl: converted #{acl.inspect}" }
369
+
370
+ if callback
371
+ jzk.setACL(path, acl, version, JavaCB::ACLCallback.new(req_id), event_queue)
372
+ else
373
+ jzk.setACL(path, acl, version)
374
+ end
375
+
376
+ Code::Ok
377
+ end
378
+ end
379
+
380
+ def exists(req_id, path, callback, watcher)
381
+ handle_keeper_exception do
382
+ watch_cb = watcher ? create_watcher(req_id, path) : false
383
+
384
+ if callback
385
+ jzk.exists(path, watch_cb, JavaCB::StatCallback.new(req_id), event_queue)
386
+ [Code::Ok, nil, nil]
387
+ else
388
+ stat = jzk.exists(path, watch_cb)
389
+ [Code::Ok, (stat and stat.to_hash)]
390
+ end
391
+ end
392
+ end
393
+
394
+ def get_acl(req_id, path, callback)
395
+ handle_keeper_exception do
396
+ stat = JZKD::Stat.new
397
+
398
+ if callback
399
+ logger.debug { "calling getACL, path: #{path.inspect}, stat: #{stat.inspect}" }
400
+ jzk.getACL(path, stat, JavaCB::ACLCallback.new(req_id), event_queue)
401
+ [Code::Ok, nil, nil]
402
+ else
403
+ acls = jzk.getACL(path, stat).map { |a| a.to_hash }
404
+
405
+ [Code::Ok, Array(acls).map{|m| m.to_hash}, stat.to_hash]
406
+ end
407
+ end
408
+ end
409
+
410
+ def assert_open
411
+ # XXX don't know how to check for valid session state!
412
+ raise NotConnected unless connected?
413
+ end
414
+
415
+ def session_id
416
+ jzk.session_id
417
+ end
418
+
419
+ def session_passwd
420
+ jzk.session_passwd.to_s
421
+ end
422
+
423
+ # called from watcher when we are connected
424
+ # @private
425
+ def notify_connected!
426
+ @connected_latch.release
427
+ end
428
+
429
+ def pause_before_fork_in_parent
430
+ # this is a no-op in java-land
431
+ end
432
+
433
+ def resume_after_fork_in_parent
434
+ # this is a no-op in java-land
435
+ end
436
+
437
+ private
438
+ def jzk
439
+ @mutex.synchronize { @jzk }
440
+ end
441
+
442
+ # java exceptions are not wrapped anymore in JRuby 1.7+
443
+ if JRUBY_VERSION >= '1.7.0'
444
+ def handle_keeper_exception
445
+ yield
446
+ rescue JZK::KeeperException => e
447
+ # code is an enum and always set -> we don't need any additional checks here
448
+ e.code.intValue
449
+ end
450
+ else
451
+ def handle_keeper_exception
452
+ yield
453
+ rescue JZK::KeeperException => e
454
+ if e.respond_to?(:cause) and e.cause and e.cause.respond_to?(:code) and e.cause.code and e.cause.code.respond_to?(:intValue)
455
+ e.cause.code.intValue
456
+ else
457
+ raise e # dunno what happened, just raise it
458
+ end
459
+ end
460
+ end
461
+
462
+ def call_type(callback, watcher)
463
+ if callback
464
+ watcher ? :async_watch : :async
465
+ else
466
+ watcher ? :sync_watch : :sync
467
+ end
468
+ end
469
+
470
+ def create_watcher(req_id, path)
471
+ logger.debug { "creating watcher for req_id: #{req_id} path: #{path}" }
472
+ lambda do |event|
473
+ ev_type, ev_state = event.type.int_value, event.state.int_value
474
+
475
+ logger.debug { "watcher for req_id #{req_id}, path: #{path} called back" }
476
+
477
+ h = { :req_id => req_id, :type => ev_type, :state => ev_state, :path => path }
478
+ event_queue.push(h)
479
+ end
480
+ end
481
+
482
+ def get_default_global_watcher
483
+ Proc.new { |args|
484
+ logger.debug { "Ruby ZK Global CB called type=#{event_by_value(args[:type])} state=#{state_by_value(args[:state])}" }
485
+ true
486
+ }
487
+ end
488
+
489
+ def replace_jzk!(opts = {})
490
+ orig_jzk = @jzk
491
+ if opts.has_key?(:session_id) && opts.has_key?(:session_passwd)
492
+ @jzk = JZK::ZooKeeper.new(@host, DEFAULT_SESSION_TIMEOUT, JavaCB::WatcherCallback.new(event_queue, :client => self), opts.fetch(:session_id), opts.fetch(:session_passwd).to_java_bytes)
493
+ else
494
+ @jzk = JZK::ZooKeeper.new(@host, DEFAULT_SESSION_TIMEOUT, JavaCB::WatcherCallback.new(event_queue, :client => self))
495
+ end
496
+ ensure
497
+ orig_jzk.close if orig_jzk
498
+ end
499
+ end
500
+ end
501
+
@@ -0,0 +1,44 @@
1
+ module Zookeeper
2
+ module ACLs
3
+ class Id
4
+ attr_reader :scheme, :id
5
+ def initialize(hash)
6
+ @scheme = hash[:scheme]
7
+ @id = hash[:id]
8
+ end
9
+
10
+ def to_hash
11
+ { :id => id, :scheme => scheme }
12
+ end
13
+ end
14
+
15
+ class ACL
16
+ attr_reader :perms, :id
17
+ def initialize(hash)
18
+ @perms = hash[:perms]
19
+ v = hash[:id]
20
+ @id = v.kind_of?(Hash) ? Id.new(v) : v
21
+ end
22
+
23
+ def to_hash
24
+ { :perms => perms, :id => id.to_hash }
25
+ end
26
+ end
27
+
28
+ module Constants
29
+ ZOO_PERM_READ = 1 << 0
30
+ ZOO_PERM_WRITE = 1 << 1
31
+ ZOO_PERM_CREATE = 1 << 2
32
+ ZOO_PERM_DELETE = 1 << 3
33
+ ZOO_PERM_ADMIN = 1 << 4
34
+ ZOO_PERM_ALL = ZOO_PERM_READ | ZOO_PERM_WRITE | ZOO_PERM_CREATE | ZOO_PERM_DELETE | ZOO_PERM_ADMIN
35
+
36
+ ZOO_ANYONE_ID_UNSAFE = Id.new(:scheme => "world", :id => "anyone")
37
+ ZOO_AUTH_IDS = Id.new(:scheme => "auth", :id => "")
38
+
39
+ ZOO_OPEN_ACL_UNSAFE = [ACL.new(:perms => ZOO_PERM_ALL, :id => ZOO_ANYONE_ID_UNSAFE)]
40
+ ZOO_READ_ACL_UNSAFE = [ACL.new(:perms => ZOO_PERM_READ, :id => ZOO_ANYONE_ID_UNSAFE)]
41
+ ZOO_CREATOR_ALL_ACL = [ACL.new(:perms => ZOO_PERM_ALL, :id => ZOO_AUTH_IDS)]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,108 @@
1
+ module Zookeeper
2
+ module Callbacks
3
+ class Base
4
+ attr_reader :proc, :completed, :context
5
+
6
+ # allows for easier construction of a user callback block that will be
7
+ # called with the callback object itself as an argument.
8
+ #
9
+ # @example
10
+ #
11
+ # Base.create do |cb|
12
+ # puts "watcher callback called with argument: #{cb.inspect}"
13
+ # end
14
+ #
15
+ # "watcher callback called with argument: #<Zookeeper::Callbacks::Base:0x1018a3958 @state=3, @type=1, ...>"
16
+ #
17
+ #
18
+ def self.create
19
+ cb_inst = new { yield cb_inst }
20
+ end
21
+
22
+ def initialize
23
+ @completed = false
24
+ @proc = Proc.new do |hash|
25
+ initialize_context(hash)
26
+ yield if block_given?
27
+ @completed = true
28
+ end
29
+ end
30
+
31
+ def call(*args)
32
+ @proc.call(*args)
33
+ end
34
+
35
+ def completed?
36
+ @completed
37
+ end
38
+
39
+ def initialize_context(hash)
40
+ @context = nil
41
+ end
42
+ end
43
+
44
+ class WatcherCallback < Base
45
+ ## wexists, awexists, wget, awget, wget_children, awget_children
46
+ attr_reader :type, :state, :path
47
+
48
+ def initialize_context(hash)
49
+ @type, @state, @path, @context = hash[:type], hash[:state], hash[:path], hash[:context]
50
+ end
51
+ end
52
+
53
+ class DataCallback < Base
54
+ ## aget, awget
55
+ attr_reader :return_code, :data, :stat
56
+
57
+ def initialize_context(hash)
58
+ @return_code, @data, @stat, @context = hash[:rc], hash[:data], hash[:stat], hash[:context]
59
+ end
60
+ end
61
+
62
+ class StringCallback < Base
63
+ ## acreate, async
64
+ attr_reader :return_code, :string, :context
65
+
66
+ alias path string
67
+
68
+ def initialize_context(hash)
69
+ @return_code, @string, @context = hash[:rc], hash[:string], hash[:context]
70
+ end
71
+ end
72
+
73
+ class StringsCallback < Base
74
+ ## aget_children, awget_children
75
+ attr_reader :return_code, :children, :stat
76
+
77
+ def initialize_context(hash)
78
+ @return_code, @children, @stat, @context = hash[:rc], hash[:strings], hash[:stat], hash[:context]
79
+ end
80
+ end
81
+
82
+ class StatCallback < Base
83
+ ## aset, aexists, awexists
84
+ attr_reader :return_code, :stat
85
+
86
+ def initialize_context(hash)
87
+ @return_code, @stat, @context = hash[:rc], hash[:stat], hash[:context]
88
+ end
89
+ end
90
+
91
+ class VoidCallback < Base
92
+ ## adelete, aset_acl, add_auth
93
+ attr_reader :return_code
94
+
95
+ def initialize_context(hash)
96
+ @return_code, @context = hash[:rc], hash[:context]
97
+ end
98
+ end
99
+
100
+ class ACLCallback < Base
101
+ ## aget_acl
102
+ attr_reader :return_code, :acl, :stat
103
+ def initialize_context(hash)
104
+ @return_code, @acl, @stat, @context = hash[:rc], hash[:acl], hash[:stat], hash[:context]
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,30 @@
1
+ # figure out what platform we're on
2
+ # this way there's no ambiguity about which file to include
3
+ # or which class we're subclassing.
4
+
5
+ if defined?(::JRUBY_VERSION)
6
+ Zookeeper.require_root('java/java_base')
7
+ else
8
+ Zookeeper.require_root('ext/zookeeper_base')
9
+ end
10
+
11
+
12
+ module Zookeeper
13
+ if defined?(::JRUBY_VERSION)
14
+ class Client < Zookeeper::JavaBase
15
+ end
16
+ else
17
+ class Client < Zookeeper::ZookeeperBase
18
+ end
19
+ end
20
+
21
+ def self.new(*a, &b)
22
+ Zookeeper::Client.new(*a, &b)
23
+ end
24
+ end
25
+
26
+
27
+ Zookeeper::Client.class_eval do
28
+ include Zookeeper::ClientMethods
29
+ end
30
+