jubilee 2.1.0.beta-java → 2.1.0.rc1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +13 -1
  3. data/README.md +65 -54
  4. data/Rakefile +23 -21
  5. data/examples/chatapp/Gemfile +1 -2
  6. data/examples/chatapp/Gemfile.lock +2 -2
  7. data/examples/chatapp/README.md +14 -2
  8. data/examples/chatapp/app.rb +1 -0
  9. data/examples/chatapp/config.json +4 -0
  10. data/examples/chatapp/config.ru +0 -2
  11. data/jars/annotations-1.3.2.jar +0 -0
  12. data/jars/lang-jruby-2.1.0-final.jar +0 -0
  13. data/jars/log4j-1.2.16.jar +0 -0
  14. data/jars/slf4j-api-1.6.2.jar +0 -0
  15. data/jars/vertx-core-2.1.2.jar +0 -0
  16. data/jars/{vertx-hazelcast-2.1.1.jar → vertx-hazelcast-2.1.2.jar} +0 -0
  17. data/jars/{vertx-platform-2.1.1.jar → vertx-platform-2.1.2.jar} +0 -0
  18. data/lib/container.rb +117 -0
  19. data/lib/{vertx → core}/buffer.rb +1 -1
  20. data/lib/core/datagram.rb +280 -0
  21. data/lib/core/dns.rb +143 -0
  22. data/lib/{vertx → core}/event_bus.rb +79 -8
  23. data/lib/core/file_system.rb +479 -0
  24. data/lib/{vertx → core}/http.rb +635 -5
  25. data/lib/core/net.rb +251 -0
  26. data/lib/core/network_support.rb +77 -0
  27. data/lib/core/parsetools.rb +105 -0
  28. data/lib/{vertx → core}/shared_data.rb +2 -2
  29. data/lib/core/sock_js.rb +116 -0
  30. data/lib/{vertx → core}/ssl_support.rb +21 -1
  31. data/lib/{vertx → core}/streams.rb +32 -21
  32. data/lib/{vertx → core}/tcp_support.rb +22 -36
  33. data/lib/core/timers.rb +73 -0
  34. data/lib/core/vertx_require.rb +25 -0
  35. data/lib/{vertx → core}/wrapped_handler.rb +0 -0
  36. data/lib/jubilee.rb +5 -8
  37. data/lib/jubilee/cli.rb +1 -1
  38. data/lib/jubilee/jubilee.jar +0 -0
  39. data/lib/jubilee/jubilee_require.rb +24 -0
  40. data/lib/jubilee/version.rb +1 -1
  41. data/lib/test_utils.rb +66 -0
  42. data/lib/vertx.rb +13 -10
  43. data/lib/vertx_tests.rb +8 -0
  44. data/pom.xml +351 -0
  45. data/src/main/assembly/mod.xml +21 -0
  46. data/{java/src → src/main/java}/jubilee/JubileeService.java +0 -0
  47. data/{java/src → src/main/java}/org/jruby/jubilee/Const.java +0 -0
  48. data/{java/src → src/main/java}/org/jruby/jubilee/JubileeVerticle.java +12 -2
  49. data/src/main/java/org/jruby/jubilee/JubileeVerticleFactory.java +258 -0
  50. data/{java/src → src/main/java}/org/jruby/jubilee/RackApplication.java +3 -1
  51. data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironment.java +2 -2
  52. data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironmentHash.java +0 -0
  53. data/{java/src → src/main/java}/org/jruby/jubilee/RackInput.java +0 -0
  54. data/{java/src → src/main/java}/org/jruby/jubilee/RackResponse.java +0 -0
  55. data/{java/src → src/main/java}/org/jruby/jubilee/RubyCallable.java +0 -0
  56. data/{java/src → src/main/java}/org/jruby/jubilee/RubyHttpServerResponse.java +0 -0
  57. data/{java/src → src/main/java}/org/jruby/jubilee/RubyNetSocket.java +0 -0
  58. data/{java/src → src/main/java}/org/jruby/jubilee/RubyPlatformManager.java +0 -0
  59. data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyIORackInput.java +0 -0
  60. data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyNullIO.java +0 -0
  61. data/{java/src → src/main/java}/org/jruby/jubilee/utils/RubyHelper.java +0 -0
  62. data/{java/src → src/main/java}/org/jruby/jubilee/vertx/JubileeVertx.java +0 -0
  63. data/{java → src/main}/resources/META-INF/services/org.vertx.java.core.spi.cluster.ClusterManagerFactory +0 -0
  64. data/src/main/resources/META-INF/services/org.vertx.java.deploy.impl.jruby.JubileeVerticleFactory +1 -0
  65. data/{java → src/main}/resources/default-cluster.xml +0 -0
  66. data/src/main/resources/mod.json +11 -0
  67. data/test/jubilee/test_upload.rb +3 -1
  68. data/vertx_classpath.txt +12 -0
  69. metadata +69 -47
  70. data/Guardfile +0 -24
  71. data/jars/vertx-core-2.1.1.jar +0 -0
  72. data/java/src/org/jruby/jubilee/RubyChannel.java +0 -89
  73. data/lib/vertx/README.md +0 -7
@@ -0,0 +1,479 @@
1
+ # Copyright 2011 the original author or authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'core/streams'
16
+ require 'core/wrapped_handler.rb'
17
+
18
+ module Vertx
19
+
20
+ # Represents the properties of a file on the file system
21
+ # @author {http://tfox.org Tim Fox}
22
+ class FileProps
23
+
24
+ # @private
25
+ def initialize(j_props)
26
+ @j_props = j_props
27
+ end
28
+
29
+ # @return [Time] The creation time of the file.
30
+ def creation_time
31
+ Time.at(@j_props.creationTime.getTime() / 1000)
32
+ end
33
+
34
+ # @return [Time] The last access time of the file.
35
+ def last_access_time
36
+ Time.at(@j_props.lastAccessTime.getTime() / 1000)
37
+ end
38
+
39
+ # @return [Time] The last modified time of the file.
40
+ def last_modified_time
41
+ Time.at(@j_props.lastModifiedTime.getTime() / 1000)
42
+ end
43
+
44
+ # @return [Boolean] Is the file a directory?
45
+ def directory?
46
+ @j_props.isDirectory
47
+ end
48
+
49
+ # @return [Boolean] Is the file some other file type?
50
+ def other?
51
+ @j_props.isOther
52
+ end
53
+
54
+ # @return [Boolean] Is it a regular file?
55
+ def regular_file?
56
+ @j_props.isRegularFile
57
+ end
58
+
59
+ # @return [Boolean] Is it a symbolic link?
60
+ def symbolic_link?
61
+ @j_props.isSymbolicLink
62
+ end
63
+
64
+ # @return [FixNum] The size of the file, in bytes.
65
+ def size
66
+ @j_props.size
67
+ end
68
+
69
+ end
70
+
71
+ # Represents the properties of a file system
72
+ # @author {http://tfox.org Tim Fox}
73
+ class FSProps
74
+
75
+ # @private
76
+ def initialize(j_props)
77
+ @j_props = j_props
78
+ end
79
+
80
+ # @return [FixNum] The total space on the file system, in bytes.
81
+ def total_space
82
+ @j_props.totalSpace
83
+ end
84
+
85
+ # @return [FixNum] Unallocated space on the file system, in bytes.
86
+ def unallocated_space
87
+ @j_props.unallocatedSpace
88
+ end
89
+
90
+ # @return [FixNum] Usable space on the file system, in bytes.
91
+ def usable_space
92
+ @j_props.usableSpace
93
+ end
94
+
95
+ end
96
+
97
+ # Represents a file on the file-system which can be read from, or written to asynchronously.
98
+ # The class also includes {ReadStream} and {WriteStream} - this allows the data to be pumped to and from
99
+ # other streams, e.g. an {HttpClientRequest} instance, using the {Pump} class
100
+ # @author {http://tfox.org Tim Fox}
101
+ class AsyncFile
102
+
103
+ include ReadStream, WriteStream
104
+
105
+ # @private
106
+ def initialize(j_file)
107
+ @j_del = j_file
108
+ end
109
+
110
+ # Close the file, asynchronously.
111
+ def close(&block)
112
+ @j_del.close(ARWrappedHandler.new(block))
113
+ end
114
+
115
+ # Write a {Buffer} to the file, asynchronously.
116
+ # When multiple writes are invoked on the same file
117
+ # there are no guarantees as to order in which those writes actually occur.
118
+ # @param [Buffer] buffer The buffer to write
119
+ # @param [FixNum] position The position in the file where to write the buffer. Position is measured in bytes and
120
+ # starts with zero at the beginning of the file.
121
+ def write_at_pos(buffer, position, &block)
122
+ @j_del.write(buffer._to_java_buffer, position, ARWrappedHandler.new(block))
123
+ self
124
+ end
125
+
126
+ # Reads some data from a file into a buffer, asynchronously.
127
+ # When multiple reads are invoked on the same file
128
+ # there are no guarantees as to order in which those reads actually occur.
129
+ # @param [Buffer] buffer The buffer into which the data which is read is written.
130
+ # @param [FixNum] offset The position in the buffer where to start writing the data.
131
+ # @param [FixNum] position The position in the file where to read the data.
132
+ # @param [FixNum] length The number of bytes to read.
133
+ def read_at_pos(buffer, offset, position, length, &block)
134
+ @j_del.read(buffer._to_java_buffer, offset, position, length, ARWrappedHandler.new(block) { |j_buff| Buffer.new(j_buff) })
135
+ self
136
+ end
137
+
138
+ # Flush any writes made to this file to underlying persistent storage, asynchronously.
139
+ # If the file was opened with flush set to true then calling this method will have no effect.
140
+ # @param [Block] hndlr a block representing the handler which is called on completion.
141
+ def flush
142
+ Future.new(@j_del.flush)
143
+ self
144
+ end
145
+
146
+ end
147
+
148
+
149
+ # Represents the file-system and contains a broad set of operations for manipulating files.
150
+ # An asynchronous and a synchronous version of each operation is provided.
151
+ # The asynchronous versions take a handler as a final argument which is
152
+ # called when the operation completes or an error occurs. The handler is called
153
+ # with two arguments; the first an exception, this will be nil if the operation has
154
+ # succeeded. The second is the result - this will be nil if the operation failed or
155
+ # there was no result to return.
156
+ # The synchronous versions return the results, or throw exceptions directly.
157
+ # @author {http://tfox.org Tim Fox}
158
+ class FileSystem
159
+
160
+ @@j_fs = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.fileSystem()
161
+
162
+ # Copy a file, asynchronously. The copy will fail if from does not exist, or if to already exists.
163
+ # @param [String] from Path of file to copy
164
+ # @param [String] to Path of file to copy to
165
+ # @param [Block] hndlr a block representing the handler which is called on completion.
166
+ def FileSystem.copy(from, to, &block)
167
+ @@j_fs.copy(from, to, ARWrappedHandler.new(block))
168
+ self
169
+ end
170
+
171
+ # Synchronous version of {#FileSystem.copy}
172
+ def FileSystem.copy_sync(from, to)
173
+ @@j_fs.copySync(from, to)
174
+ self
175
+ end
176
+
177
+ # Copy a file recursively, asynchronously. The copy will fail if from does not exist, or if to already exists and is not empty.
178
+ # If the source is a directory all contents of the directory will be copied recursively, i.e. the entire directory
179
+ # tree is copied.
180
+ # @param [String] from Path of file to copy
181
+ # @param [String] to Path of file to copy to
182
+ def FileSystem.copy_recursive(from, to, &block)
183
+ @@j_fs.copy(from, to, true, ARWrappedHandler.new(block))
184
+ self
185
+ end
186
+
187
+ # Synchronous version of {#FileSystem.copy_recursive}
188
+ def FileSystem.copy_recursive_sync(from, to)
189
+ @@j_fs.copySync(from, to, true)
190
+ self
191
+ end
192
+
193
+ # Move a file, asynchronously. The move will fail if from does not exist, or if to already exists.
194
+ # @param [String] from Path of file to move
195
+ # @param [String] to Path of file to move to
196
+ def FileSystem.move(from, to, &block)
197
+ @@j_fs.move(from, to, ARWrappedHandler.new(block))
198
+ self
199
+ end
200
+
201
+ # Synchronous version of {#FileSystem.move}
202
+ def FileSystem.move_sync(from, to)
203
+ @@j_fs.moveSync(from, to)
204
+ self
205
+ end
206
+
207
+ # Truncate a file, asynchronously. The move will fail if path does not exist.
208
+ # @param [String] path Path of file to truncate
209
+ # @param [FixNum] len Length to truncate file to. Will fail if len < 0. If len > file size then will do nothing.
210
+ def FileSystem.truncate(path, len, &block)
211
+ @@j_fs.truncate(path, len, ARWrappedHandler.new(block))
212
+ self
213
+ end
214
+
215
+ # Synchronous version of {#FileSystem.truncate}
216
+ def FileSystem.truncate_sync(path, len)
217
+ @@j_fs.truncateSync(path, len)
218
+ self
219
+ end
220
+
221
+ # Change the permissions on a file, asynchronously. If the file is directory then all contents will also have their permissions changed recursively.
222
+ # @param [String] path Path of file to change permissions
223
+ # @param [String] perms A permission string of the form rwxr-x--- as specified in
224
+ # {http://download.oracle.com/javase/7/docs/api/java/nio/file/attribute/PosixFilePermissions.html}. This is
225
+ # used to set the permissions for any regular files (not directories).
226
+ # @param [String] dir_perms A permission string of the form rwxr-x---. Used to set permissions for regular files.
227
+ def FileSystem.chmod(path, perms, dir_perms = nil, &block)
228
+ @@j_fs.chmod(path, perms, dir_perms, ARWrappedHandler.new(block))
229
+ self
230
+ end
231
+
232
+
233
+ # Synchronous version of {#FileSystem.chmod}
234
+ def FileSystem.chmod_sync(path, perms, dir_perms = nil)
235
+ @@j_fs.chmodSync(path, perms, dir_perms)
236
+ self
237
+ end
238
+
239
+ # Change the ownership of a file, asynchronously.
240
+ # @param [String] path Path of the file
241
+ # @param [String] user the user to set the ownership to
242
+ # @param [String] group the group to set the ownership to
243
+ def FileSystem.chown(path, user, group, &block)
244
+ @@j_fs.chown(path, user, group, ARWrappedHandler.new(block))
245
+ self
246
+ end
247
+
248
+ # Synchronous version of {#FileSystem.chown}
249
+ def FileSystem.chown_sync(path, user, group)
250
+ @@j_fs.chownSync(path, user, group)
251
+ self
252
+ end
253
+
254
+ # Get file properties for a file, asynchronously.
255
+ # @param [String] path Path to file
256
+ def FileSystem.props(path, &block)
257
+ @@j_fs.props(path, ARWrappedHandler.new(block) { |j_props| FileProps.new(j_props) })
258
+ self
259
+ end
260
+
261
+ # Synchronous version of {#FileSystem.props}
262
+ def FileSystem.props_sync(path)
263
+ j_props = @@j_fs.propsSync(path)
264
+ FileProps.new(j_props)
265
+ end
266
+
267
+ # Create a hard link, asynchronously..
268
+ # @param [String] link Path of the link to create.
269
+ # @param [String] existing Path of where the link points to.
270
+ def FileSystem.link(link, existing, &block)
271
+ @@j_fs.link(link, existing, ARWrappedHandler.new(block))
272
+ self
273
+ end
274
+
275
+ # Synchronous version of {#FileSystem.link}
276
+ def FileSystem.link_sync(link, existing)
277
+ @@j_fs.linkSync(link, existing)
278
+ self
279
+ end
280
+
281
+ # Create a symbolic link, asynchronously.
282
+ # @param [String] link Path of the link to create.
283
+ # @param [String] existing Path of where the link points to.
284
+ def FileSystem.symlink(link, existing, &block)
285
+ @@j_fs.symlink(link, existing, ARWrappedHandler.new(block))
286
+ self
287
+ end
288
+
289
+ # Synchronous version of {#FileSystem.symlink}
290
+ def FileSystem.symlink_sync(link, existing)
291
+ @@j_fs.symlinkSync(link, existing)
292
+ self
293
+ end
294
+
295
+ # Unlink a hard link.
296
+ # @param [String] link Path of the link to unlink.
297
+ def FileSystem.unlink(link, &block)
298
+ @@j_fs.unlink(link, ARWrappedHandler.new(block))
299
+ self
300
+ end
301
+
302
+ # Synchronous version of {#FileSystem.unlink}
303
+ def FileSystem.unlinkSync(link)
304
+ @@j_fs.unlinkSync(link)
305
+ self
306
+ end
307
+
308
+ # Read a symbolic link, asynchronously. I.e. tells you where the symbolic link points.
309
+ # @param [String] link Path of the link to read.
310
+ def FileSystem.read_symlink(link, &block)
311
+ @@j_fs.readSymlink(link, ARWrappedHandler.new(block))
312
+ self
313
+ end
314
+
315
+ # Synchronous version of {#FileSystem.read_symlink}
316
+ def FileSystem.read_symlink_sync(link)
317
+ @@j_fs.readSymlinkSync(link)
318
+ end
319
+
320
+ # Delete a file on the file system, asynchronously.
321
+ # The delete will fail if the file does not exist, or is a directory and is not empty.
322
+ # @param [String] path Path of the file to delete.
323
+ def FileSystem.delete(path, &block)
324
+ @@j_fs.delete(path, ARWrappedHandler.new(block))
325
+ self
326
+ end
327
+
328
+ # Synchronous version of {#FileSystem.delete}
329
+ def FileSystem.delete_sync(path)
330
+ @@j_fs.deleteSync(path)
331
+ self
332
+ end
333
+
334
+ # Delete a file on the file system recursively, asynchronously.
335
+ # The delete will fail if the file does not exist. If the file is a directory the entire directory contents
336
+ # will be deleted recursively.
337
+ # @param [String] path Path of the file to delete.
338
+ def FileSystem.delete_recursive(path, &block)
339
+ @@j_fs.delete(path, true, ARWrappedHandler.new(block))
340
+ self
341
+ end
342
+
343
+ # Synchronous version of {#FileSystem.delete_recursive}
344
+ def FileSystem.delete_recursive_sync(path)
345
+ @@j_fs.deleteSync(path, true)
346
+ self
347
+ end
348
+
349
+ # Create a directory, asynchronously.
350
+ # The create will fail if the directory already exists, or if it contains parent directories which do not already
351
+ # exist.
352
+ # @param [String] path Path of the directory to create.
353
+ # @param [String] perms. A permission string of the form rwxr-x--- to give directory.
354
+ def FileSystem.mkdir(path, perms = nil, &block)
355
+ @@j_fs.mkdir(path, perms, ARWrappedHandler.new(block))
356
+ self
357
+ end
358
+
359
+ # Synchronous version of {#FileSystem.mkdir}
360
+ def FileSystem.mkdir_sync(path, perms = nil)
361
+ @@j_fs.mkdirSync(path, perms)
362
+ self
363
+ end
364
+
365
+ # Create a directory, and create all it's parent directories if they do not already exist, asynchronously.
366
+ # The create will fail if the directory already exists.
367
+ # @param [String] path Path of the directory to create.
368
+ # @param [String] perms. A permission string of the form rwxr-x--- to give the created directory(ies).
369
+ def FileSystem.mkdir_with_parents(path, perms = nil, &block)
370
+ @@j_fs.mkdir(path, perms, true, ARWrappedHandler.new(block))
371
+ self
372
+ end
373
+
374
+ # Synchronous version of {#FileSystem.mkdir_with_parents}
375
+ def FileSystem.mkdir_with_parents_sync(path, perms = nil)
376
+ @@j_fs.mkdirSync(path, perms, true)
377
+ self
378
+ end
379
+
380
+ # Read a directory, i.e. list it's contents, asynchronously.
381
+ # The read will fail if the directory does not exist.
382
+ # @param [String] path Path of the directory to read.
383
+ # @param [String] filter A regular expression to filter out the contents of the directory. If the filter is not nil
384
+ # then only files which match the filter will be returned.
385
+ def FileSystem.read_dir(path, filter = nil, &block)
386
+ @@j_fs.readDir(path, filter, ARWrappedHandler.new(block))
387
+ self
388
+ end
389
+
390
+ # Synchronous version of {#FileSystem.read_dir}
391
+ def FileSystem.read_dir_sync(path, filter = nil)
392
+ @@j_fs.readDirSync(path, filter)
393
+ end
394
+
395
+ # Read the contents of an entire file as a {Buffer}, asynchronously.
396
+ # @param [String] path Path of the file to read.
397
+ def FileSystem.read_file_as_buffer(path, &block)
398
+ @@j_fs.readFile(path, ARWrappedHandler.new(block) { |j_buff| Buffer.new(j_buff)})
399
+ self
400
+ end
401
+
402
+ # Synchronous version of {#FileSystem.read_file_as_buffer}
403
+ def FileSystem.read_file_as_buffer_sync(path)
404
+ @@j_fs.readFileSync(path)
405
+ end
406
+
407
+ # Write a [Buffer] as the entire contents of a file, asynchronously.
408
+ # @param [String] path Path of the file to write.
409
+ # @param [String] buffer The Buffer to write
410
+ def FileSystem.write_buffer_to_file(path, buffer, &block)
411
+ @@j_fs.writeFile(path, buffer, ARWrappedHandler.new(block))
412
+ self
413
+ end
414
+
415
+ # Synchronous version of {#FileSystem.write_buffer_to_file}
416
+ def FileSystem.write_buffer_to_file_sync(path, buffer)
417
+ @@j_fs.writeFileSync(path, buffer)
418
+ self
419
+ end
420
+
421
+ # Open a file on the file system, asynchronously.
422
+ # @param [String] path Path of the file to open.
423
+ # @param [String] perms If the file does not exist and create_new is true, then the file will be created with these permissions.
424
+ # @param [Boolean] read Open the file for reading?
425
+ # @param [Boolean] write Open the file for writing?
426
+ # @param [Boolean] create_new Create the file if it doesn't already exist?
427
+ # @param [Boolean] flush Whenever any data is written to the file, flush all changes to permanent storage immediately?
428
+ def FileSystem.open(path, perms = nil, read = true, write = true, create_new = true, flush = false, &block)
429
+ @@j_fs.open(path, perms, read, write, create_new, flush, ARWrappedHandler.new(block){ |j_file| AsyncFile.new(j_file)})
430
+ self
431
+ end
432
+
433
+ # Synchronous version of {#FileSystem.open}
434
+ def FileSystem.open_sync(path, perms = nil, read = true, write = true, create_new = true, flush = false)
435
+ j_af = @@j_fs.open(path, perms, read, write, create_new, flush)
436
+ AsyncFile.new(j_af)
437
+ end
438
+
439
+ # Create a new empty file, asynchronously.
440
+ # @param [String] path Path of the file to create.
441
+ # @param [String] perms The file will be created with these permissions.
442
+ def FileSystem.create_file(path, perms = nil, &block)
443
+ @@j_fs.createFile(path, perms, ARWrappedHandler.new(block))
444
+ self
445
+ end
446
+
447
+ # Synchronous version of {#FileSystem.create_file}
448
+ def FileSystem.create_file_sync(path, perms = nil)
449
+ @@j_fs.createFileSync(path, perms)
450
+ self
451
+ end
452
+
453
+ # Check if a file exists, asynchronously.
454
+ # @param [String] path Path of the file to check.
455
+ def FileSystem.exists?(path, &block)
456
+ @@j_fs.exists(path, ARWrappedHandler.new(block))
457
+ self
458
+ end
459
+
460
+ # Synchronous version of {#FileSystem.exists?}
461
+ def FileSystem.exists_sync?(path)
462
+ @@j_fs.existsSync(path)
463
+ end
464
+
465
+ # Get properties for the file system, asynchronously.
466
+ # @param [String] path Path in the file system.
467
+ def FileSystem.fs_props(path, &block)
468
+ @@j_fs.fsProps(path, ARWrappedHandler.new(block) { |j_props| FSProps.new(j_props)})
469
+ self
470
+ end
471
+
472
+ # Synchronous version of {#FileSystem.fs_props}
473
+ def FileSystem.fs_props_sync(path)
474
+ j_fsprops = @@j_fs.fsPropsSync(path)
475
+ FSProps.new(j_fsprops)
476
+ end
477
+
478
+ end
479
+ end