org.torquebox.vfs 1.0.0.Beta22
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/vfs/dir.rb +54 -0
- data/lib/vfs/ext/dir.rb +113 -0
- data/lib/vfs/ext/file.rb +178 -0
- data/lib/vfs/ext/io.rb +123 -0
- data/lib/vfs/ext/kernel.rb +14 -0
- data/lib/vfs/ext/vfs.rb +8 -0
- data/lib/vfs/file.rb +170 -0
- data/lib/vfs/glob_filter.rb +50 -0
- data/lib/vfs.rb +49 -0
- data/licenses/lgpl-2.1.txt +504 -0
- data/spec/dir_spec.rb +159 -0
- data/spec/file_spec.rb +234 -0
- data/spec/io_spec.rb +67 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/vfs_spec.rb +20 -0
- metadata +109 -0
data/lib/vfs/dir.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module VFS
|
4
|
+
class Dir
|
5
|
+
attr_reader :path
|
6
|
+
attr_reader :pos
|
7
|
+
alias_method :tell, :pos
|
8
|
+
|
9
|
+
def initialize(path)
|
10
|
+
@path = path
|
11
|
+
begin
|
12
|
+
@virtual_file = org.jboss.vfs.VFS.child( path )
|
13
|
+
rescue Java::JavaLang::NullPointerException
|
14
|
+
raise Errno::ENOENT.new
|
15
|
+
end
|
16
|
+
@pos = 0
|
17
|
+
@closed = false
|
18
|
+
end
|
19
|
+
|
20
|
+
def close
|
21
|
+
@closed = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def each
|
25
|
+
@virtual_file.children.each do |child|
|
26
|
+
yield child.name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def rewind
|
31
|
+
@pos = 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def read
|
35
|
+
children = @virtual_file.children
|
36
|
+
return nil unless ( @pos < children.size )
|
37
|
+
child = children[@pos]
|
38
|
+
@pos += 1
|
39
|
+
child.name
|
40
|
+
end
|
41
|
+
|
42
|
+
def seek(i)
|
43
|
+
@pos = i
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def pos=(i)
|
48
|
+
@pos = i
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
data/lib/vfs/ext/dir.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
|
2
|
+
class Dir
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
alias_method :open_before_vfs, :open
|
7
|
+
alias_method :glob_before_vfs, :glob
|
8
|
+
alias_method :mkdir_before_vfs, :mkdir
|
9
|
+
|
10
|
+
def open(str,&block)
|
11
|
+
#if ( ::File.exist_without_vfs?( str.to_str ) && ! Java::OrgJbossVirtualPluginsContextJar::JarUtils.isArchive( str.to_str ) )
|
12
|
+
if ( ::File.exist_without_vfs?( str.to_str ) )
|
13
|
+
return open_before_vfs(str,&block)
|
14
|
+
end
|
15
|
+
#puts "open(#{str})"
|
16
|
+
result = dir = VFS::Dir.new( str.to_str )
|
17
|
+
#puts " result = #{result}"
|
18
|
+
if block
|
19
|
+
begin
|
20
|
+
result = block.call(dir)
|
21
|
+
ensure
|
22
|
+
dir.close
|
23
|
+
end
|
24
|
+
end
|
25
|
+
#puts "open(#{str}) return #{result}"
|
26
|
+
result
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](pattern)
|
30
|
+
self.glob( pattern )
|
31
|
+
end
|
32
|
+
|
33
|
+
def glob(pattern,flags=0, &block)
|
34
|
+
is_absolute_vfs = false
|
35
|
+
|
36
|
+
str_pattern = pattern.to_str
|
37
|
+
#puts "glob(#{str_pattern})"
|
38
|
+
|
39
|
+
segments = str_pattern.split( '/' )
|
40
|
+
|
41
|
+
base_segments = []
|
42
|
+
for segment in segments
|
43
|
+
if ( segment =~ /[\*\?\[\{\}]/ )
|
44
|
+
break
|
45
|
+
end
|
46
|
+
base_segments << segment
|
47
|
+
end
|
48
|
+
|
49
|
+
base = base_segments.join( '/' )
|
50
|
+
|
51
|
+
base.gsub!( /\\(.)/, '\1' )
|
52
|
+
|
53
|
+
#if ( base.empty? || ( ::File.exist_without_vfs?( base ) && ! Java::OrgJbossVirtualPluginsContextJar::JarUtils.isArchive( base ) ) )
|
54
|
+
#if ( base.empty? || ( ::File.exist_without_vfs?( base ) ) )
|
55
|
+
#puts "doing FS glob"
|
56
|
+
#paths = glob_before_vfs( str_pattern, flags, &block )
|
57
|
+
#return paths
|
58
|
+
#end
|
59
|
+
|
60
|
+
#puts "base= #{base}"
|
61
|
+
|
62
|
+
vfs_url, child_path = VFS.resolve_within_archive( base )
|
63
|
+
#puts "vfs_url=#{vfs_url}"
|
64
|
+
#puts "child_path=#{child_path}"
|
65
|
+
|
66
|
+
return [] if vfs_url.nil?
|
67
|
+
#puts "segments.size==base_segments.size? #{segments.size == base_segments.size}"
|
68
|
+
return [ base ] if segments.size == base_segments.size
|
69
|
+
|
70
|
+
matcher_segments = segments - base_segments
|
71
|
+
matcher = matcher_segments.join( '/' )
|
72
|
+
#puts "matcher [#{matcher}]"
|
73
|
+
|
74
|
+
begin
|
75
|
+
#puts "0 vfs_url=#{vfs_url}"
|
76
|
+
starting_point = root = org.jboss.vfs::VFS.child( vfs_url )
|
77
|
+
#puts "A starting_point=#{starting_point.path_name}"
|
78
|
+
starting_point = root.get_child( child_path ) unless ( child_path.nil? || child_path == '' )
|
79
|
+
#puts "B starting_point=#{starting_point.path_name}"
|
80
|
+
return [] if ( starting_point.nil? || ! starting_point.exists? )
|
81
|
+
child_path = starting_point.path_name
|
82
|
+
#puts "child- #{child_path}"
|
83
|
+
unless ( child_path =~ %r(/$) )
|
84
|
+
child_path = "#{child_path}/"
|
85
|
+
end
|
86
|
+
child_path = "" if child_path == "/"
|
87
|
+
#puts "child_path=#{child_path}"
|
88
|
+
#puts "base=#{base}"
|
89
|
+
filter = VFS::GlobFilter.new( child_path, matcher )
|
90
|
+
#puts "filter is #{filter}"
|
91
|
+
paths = starting_point.getChildrenRecursively( filter ).collect{|e|
|
92
|
+
#path_name = e.path_name
|
93
|
+
path_name = e.getPathNameRelativeTo( starting_point )
|
94
|
+
#puts "(collect) path_name=#{path_name}"
|
95
|
+
result = ::File.join( base, path_name )
|
96
|
+
#puts "(collect) result=#{result}"
|
97
|
+
result
|
98
|
+
}
|
99
|
+
paths.each{|p| block.call(p)} if block
|
100
|
+
#puts "Path=#{paths.inspect}"
|
101
|
+
paths
|
102
|
+
rescue Java::JavaIo::IOException => e
|
103
|
+
return []
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def mkdir(path, mode=0777)
|
108
|
+
real_path = path =~ /^vfs:/ ? path[4..-1] : path
|
109
|
+
mkdir_before_vfs( real_path, mode )
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
data/lib/vfs/ext/file.rb
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class File
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
alias_method :open_without_vfs, :open
|
8
|
+
alias_method :mtime_without_vfs, :mtime
|
9
|
+
alias_method :stat_without_vfs, :stat
|
10
|
+
alias_method :exist_without_vfs?, :exist?
|
11
|
+
alias_method :directory_without_vfs?, :directory?
|
12
|
+
alias_method :dirname_without_vfs, :dirname
|
13
|
+
alias_method :file_without_vfs?, :file?
|
14
|
+
alias_method :expand_path_without_vfs, :expand_path
|
15
|
+
alias_method :unlink_without_vfs, :unlink
|
16
|
+
alias_method :readable_without_vfs?, :readable?
|
17
|
+
alias_method :chmod_without_vfs, :chmod
|
18
|
+
alias_method :new_without_vfs, :new
|
19
|
+
|
20
|
+
def open(fname,mode_str='r', flags=nil, &block)
|
21
|
+
if ( Fixnum === fname )
|
22
|
+
return File.open_without_vfs( fname, mode_str, &block )
|
23
|
+
end
|
24
|
+
unless ( vfs_path?(fname) )
|
25
|
+
return File.open_without_vfs(fname, mode_str, flags, &block )
|
26
|
+
end
|
27
|
+
if ( File.exist_without_vfs?( name_without_vfs(fname) ) )
|
28
|
+
return File.open_without_vfs( name_without_vfs(fname), mode_str, flags, &block )
|
29
|
+
end
|
30
|
+
self.vfs_open( fname.to_s, mode_str, &block )
|
31
|
+
end
|
32
|
+
|
33
|
+
def expand_path(*args)
|
34
|
+
if ( vfs_path?(args[1]) )
|
35
|
+
return expand_path_without_vfs(args[0], name_without_vfs(args[1].to_s))
|
36
|
+
end
|
37
|
+
return args[0].to_s.dup if ( vfs_path?(args[0]) )
|
38
|
+
expand_path_without_vfs(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def readable?(filename)
|
42
|
+
readable_without_vfs? name_without_vfs(filename)
|
43
|
+
end
|
44
|
+
|
45
|
+
def unlink(*file_names)
|
46
|
+
file_names.each do |file_name|
|
47
|
+
if ( vfs_path?(file_name) )
|
48
|
+
virtual_file = org.jboss.vfs::VFS.child( file_name.to_s )
|
49
|
+
raise Errno::ENOENT.new unless virtual_file.exists()
|
50
|
+
virtual_file.delete
|
51
|
+
else
|
52
|
+
unlink_without_vfs( file_name )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
file_names.size
|
56
|
+
end
|
57
|
+
|
58
|
+
alias_method :delete, :unlink
|
59
|
+
|
60
|
+
def mtime(filename)
|
61
|
+
return mtime_without_vfs(filename) if ( File.exist_without_vfs?( filename ) )
|
62
|
+
|
63
|
+
vfs_url, child_path = VFS.resolve_within_archive(filename)
|
64
|
+
raise Errno::ENOENT.new unless vfs_url
|
65
|
+
|
66
|
+
virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
|
67
|
+
virtual_file = virtual_file.get_child( child_path ) if child_path
|
68
|
+
|
69
|
+
Time.at( virtual_file.getLastModified() / 1000 )
|
70
|
+
end
|
71
|
+
|
72
|
+
def stat(filename)
|
73
|
+
return stat_without_vfs(filename) if ( File.exist_without_vfs?( filename ) )
|
74
|
+
|
75
|
+
vfs_url, child_path = VFS.resolve_within_archive(filename)
|
76
|
+
raise Errno::ENOENT.new nil unless vfs_url
|
77
|
+
|
78
|
+
virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
|
79
|
+
virtual_file = virtual_file.get_child( child_path ) if child_path
|
80
|
+
|
81
|
+
VFS::File::Stat.new( virtual_file )
|
82
|
+
end
|
83
|
+
|
84
|
+
def exists?(filename)
|
85
|
+
exist?(filename)
|
86
|
+
end
|
87
|
+
|
88
|
+
def exist?(filename)
|
89
|
+
return true if exist_without_vfs?( filename )
|
90
|
+
|
91
|
+
vfs_url, child_path = VFS.resolve_within_archive(filename)
|
92
|
+
return false unless vfs_url
|
93
|
+
|
94
|
+
begin
|
95
|
+
virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
|
96
|
+
virtual_file = virtual_file.get_child( child_path ) if child_path
|
97
|
+
|
98
|
+
return ( ( ! virtual_file.nil? ) && virtual_file.exists() )
|
99
|
+
rescue Java::JavaIo::IOException => e
|
100
|
+
return false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def writable?(filename)
|
105
|
+
stat = stat(filename)
|
106
|
+
return stat.writable? if stat
|
107
|
+
false
|
108
|
+
end
|
109
|
+
|
110
|
+
def directory?(filename)
|
111
|
+
return true if directory_without_vfs?( filename )
|
112
|
+
|
113
|
+
vfs_url, child_path = VFS.resolve_within_archive(filename)
|
114
|
+
return false unless vfs_url
|
115
|
+
|
116
|
+
begin
|
117
|
+
virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
|
118
|
+
virtual_file = virtual_file.get_child( child_path ) if child_path
|
119
|
+
|
120
|
+
return ( ( ! virtual_file.nil? ) && ( virtual_file.isDirectory() ) )
|
121
|
+
rescue Java::JavaIo::IOException => e
|
122
|
+
return false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def file?(filename)
|
127
|
+
return true if file_without_vfs?( filename )
|
128
|
+
|
129
|
+
vfs_url, child_path = VFS.resolve_within_archive(filename)
|
130
|
+
return false unless vfs_url
|
131
|
+
|
132
|
+
begin
|
133
|
+
virtual_file = Java::org.jboss.vfs.VFS.child( vfs_url )
|
134
|
+
virtual_file = virtual_file.get_child( child_path ) if child_path
|
135
|
+
|
136
|
+
return ( ( ! virtual_file.nil? ) && ( virtual_file.isLeaf() ) )
|
137
|
+
rescue Java::JavaIo::IOException => e
|
138
|
+
return false
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def chmod(mode_int, *files)
|
143
|
+
files.each do |name|
|
144
|
+
chmod_without_vfs( mode_int, name_without_vfs(name) )
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def new(*args, &block)
|
149
|
+
fname = args.size > 0 ? args[0] : nil
|
150
|
+
if ( Fixnum === fname )
|
151
|
+
return self.new_without_vfs( *args, &block )
|
152
|
+
end
|
153
|
+
unless ( vfs_path?(fname) )
|
154
|
+
return self.new_without_vfs( *args, &block )
|
155
|
+
end
|
156
|
+
if ( File.exist_without_vfs?( name_without_vfs(fname) ) )
|
157
|
+
args[0] = name_without_vfs(fname)
|
158
|
+
return File.new_without_vfs( *args, &block )
|
159
|
+
end
|
160
|
+
# File.new doesn't pass a block through to the opened file
|
161
|
+
IO.vfs_open( *args )
|
162
|
+
end
|
163
|
+
|
164
|
+
def dirname(filename)
|
165
|
+
dirname = dirname_without_vfs(name_without_vfs(filename))
|
166
|
+
vfs_path?(filename) ? "vfs:#{dirname}" : dirname
|
167
|
+
end
|
168
|
+
|
169
|
+
def name_without_vfs(filename)
|
170
|
+
vfs_path?(filename) ? filename[4..-1] : filename
|
171
|
+
end
|
172
|
+
|
173
|
+
def vfs_path?(path)
|
174
|
+
path.to_s =~ /^vfs:/
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
data/lib/vfs/ext/io.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
class IO
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
#alias_method :open_without_vfs, :open
|
7
|
+
alias_method :read_without_vfs, :read
|
8
|
+
|
9
|
+
def vfs_open(fd,mode_str='r', &block)
|
10
|
+
append = false
|
11
|
+
truncate = false
|
12
|
+
write = false
|
13
|
+
read = false
|
14
|
+
create = false
|
15
|
+
case ( mode_str )
|
16
|
+
when /r/
|
17
|
+
read = true
|
18
|
+
write = false
|
19
|
+
append = false
|
20
|
+
create = false
|
21
|
+
when /r\+/
|
22
|
+
read = true
|
23
|
+
write = true
|
24
|
+
create = false
|
25
|
+
append = false
|
26
|
+
when /w/
|
27
|
+
read = false
|
28
|
+
write = true
|
29
|
+
create = true
|
30
|
+
append = false
|
31
|
+
truncate = true
|
32
|
+
when /w\+/
|
33
|
+
read = false
|
34
|
+
write = true
|
35
|
+
create = true
|
36
|
+
append = false
|
37
|
+
truncate = true
|
38
|
+
when /a/
|
39
|
+
read = false
|
40
|
+
write = true
|
41
|
+
create = true
|
42
|
+
append = true
|
43
|
+
when /a\+/
|
44
|
+
read = true
|
45
|
+
write = true
|
46
|
+
create = true
|
47
|
+
when Fixnum
|
48
|
+
if ( mode_str & File::RDONLY != 0 )
|
49
|
+
read = true
|
50
|
+
write = false
|
51
|
+
end
|
52
|
+
if ( mode_str & File::WRONLY != 0 )
|
53
|
+
read = false
|
54
|
+
write = true
|
55
|
+
end
|
56
|
+
if ( mode_str & File::RDWR != 0)
|
57
|
+
read = true
|
58
|
+
write = true
|
59
|
+
end
|
60
|
+
if ( mode_str & File::APPEND != 0)
|
61
|
+
append = true
|
62
|
+
end
|
63
|
+
if ( mode_str & File::TRUNC != 0)
|
64
|
+
append = false
|
65
|
+
truncate = true
|
66
|
+
end
|
67
|
+
if ( mode_str & File::CREAT != 0)
|
68
|
+
create = true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
virtual_file = org.jboss.vfs.VFS.child( fd )
|
73
|
+
|
74
|
+
if ( ! create && ! virtual_file.exists )
|
75
|
+
raise Errno::ENOENT
|
76
|
+
end
|
77
|
+
|
78
|
+
if ( read && ! write )
|
79
|
+
java_in = virtual_file.open_stream()
|
80
|
+
ruby_io = java_in.to_io
|
81
|
+
elsif ( write && ! read )
|
82
|
+
physical_file = virtual_file.physical_file
|
83
|
+
java_out = java.io::FileOutputStream.new( physical_file, append )
|
84
|
+
ruby_io = java_out.to_io
|
85
|
+
elsif ( read && write )
|
86
|
+
raise Error.new( "Random-access on VFS not supported" )
|
87
|
+
end
|
88
|
+
|
89
|
+
if ( block )
|
90
|
+
begin
|
91
|
+
block.call( ruby_io )
|
92
|
+
ensure
|
93
|
+
ruby_io.close
|
94
|
+
end
|
95
|
+
else
|
96
|
+
return ruby_io
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
def read(name, length=nil, offset=nil)
|
102
|
+
return read_without_vfs(name, length, offset) if ::File.exist_without_vfs?( name )
|
103
|
+
|
104
|
+
if ( name =~ /^\// || name =~ /^vfs:\// )
|
105
|
+
full_path = name
|
106
|
+
else
|
107
|
+
full_path = File.join( Dir.pwd, name )
|
108
|
+
end
|
109
|
+
virtual_file = org.jboss.vfs.VFS.child( full_path )
|
110
|
+
raise ::Errno::ENOENT.new( "#{name} (#{virtual_file})" ) unless virtual_file.exists()
|
111
|
+
|
112
|
+
stream = virtual_file.openStream()
|
113
|
+
io = stream.to_io
|
114
|
+
begin
|
115
|
+
s = io.read
|
116
|
+
ensure
|
117
|
+
io.close()
|
118
|
+
end
|
119
|
+
s
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
data/lib/vfs/ext/vfs.rb
ADDED
data/lib/vfs/file.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
|
2
|
+
module VFS
|
3
|
+
module File
|
4
|
+
class Stat
|
5
|
+
def initialize(virtual_file)
|
6
|
+
@virtual_file = virtual_file
|
7
|
+
end
|
8
|
+
|
9
|
+
def cmp(other)
|
10
|
+
@virtual_file.last_modified <=> other.last_modified
|
11
|
+
end
|
12
|
+
|
13
|
+
def atime()
|
14
|
+
Time.at( @virtual_file.last_modified )
|
15
|
+
end
|
16
|
+
|
17
|
+
def blksize
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def blockdev?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
def blocks
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def chardev?
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def ctime
|
34
|
+
Time.at( @virtual_file.last_modified )
|
35
|
+
end
|
36
|
+
|
37
|
+
def dev
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def dev_major
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def dev_minor
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def directory?
|
50
|
+
@virtual_file.eixsts && ! @virtual_file.is_leaf
|
51
|
+
end
|
52
|
+
|
53
|
+
def executable?
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def executable_real?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
def file?
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
def ftype
|
66
|
+
return 'file' if @virtual_file.is_leaf
|
67
|
+
'directory'
|
68
|
+
end
|
69
|
+
|
70
|
+
def gid
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
|
74
|
+
def grpowned?
|
75
|
+
false
|
76
|
+
end
|
77
|
+
|
78
|
+
def ino
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def mode
|
83
|
+
0x444
|
84
|
+
end
|
85
|
+
|
86
|
+
def mtime
|
87
|
+
Time.at( @virtual_file.getLastModified() / 1000 )
|
88
|
+
end
|
89
|
+
|
90
|
+
def nlink
|
91
|
+
1
|
92
|
+
end
|
93
|
+
|
94
|
+
def owned?
|
95
|
+
false
|
96
|
+
end
|
97
|
+
|
98
|
+
def pipe?
|
99
|
+
false
|
100
|
+
end
|
101
|
+
|
102
|
+
def rdev
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
|
106
|
+
def rdev_major
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def rdev_minor
|
111
|
+
nil
|
112
|
+
end
|
113
|
+
|
114
|
+
def readable?
|
115
|
+
true
|
116
|
+
end
|
117
|
+
|
118
|
+
def readable_real?
|
119
|
+
true
|
120
|
+
end
|
121
|
+
|
122
|
+
def setgid?
|
123
|
+
false
|
124
|
+
end
|
125
|
+
|
126
|
+
def setuid?
|
127
|
+
false
|
128
|
+
end
|
129
|
+
|
130
|
+
def size
|
131
|
+
@virtual_file.size
|
132
|
+
end
|
133
|
+
|
134
|
+
def socket?
|
135
|
+
false
|
136
|
+
end
|
137
|
+
|
138
|
+
def sticky?
|
139
|
+
false
|
140
|
+
end
|
141
|
+
|
142
|
+
def symlink?
|
143
|
+
false
|
144
|
+
end
|
145
|
+
|
146
|
+
def uid
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def writable?
|
151
|
+
begin
|
152
|
+
physical_file = @virtual_file.physical_file
|
153
|
+
physical_file.canWrite
|
154
|
+
rescue => e
|
155
|
+
false
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def writable_real?
|
160
|
+
writable?
|
161
|
+
end
|
162
|
+
|
163
|
+
def zero?
|
164
|
+
self.size == 0
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module VFS
|
4
|
+
class GlobFilter
|
5
|
+
include Java::org.jboss.vfs.VirtualFileFilter
|
6
|
+
|
7
|
+
def initialize(child_path, glob)
|
8
|
+
#puts "init #{child_path} #{glob}"
|
9
|
+
@child_path = child_path
|
10
|
+
glob_segments = glob.split( '/' )
|
11
|
+
regexp_segments = []
|
12
|
+
|
13
|
+
glob_segments.each_with_index do |gs,i|
|
14
|
+
if ( gs == '**' )
|
15
|
+
regexp_segments << '(.*)'
|
16
|
+
else
|
17
|
+
gs.gsub!( /\*/, '[^\/]*')
|
18
|
+
gs.gsub!( /\?/, '.')
|
19
|
+
gs.gsub!( /\{[^\}]+\}/ ) do |m|
|
20
|
+
options = m[1..-2].split(',', -1)
|
21
|
+
options = options.collect{|e| "(#{e})"}
|
22
|
+
"(#{options.join('|')})"
|
23
|
+
end
|
24
|
+
if ( i < (glob_segments.size()-1))
|
25
|
+
gs = "#{gs}/"
|
26
|
+
end
|
27
|
+
regexp_segments << gs
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
regexp_str = regexp_segments.join
|
32
|
+
#puts "regexp_str(1) [#{regexp_str}]"
|
33
|
+
if ( @child_path && @child_path != '' )
|
34
|
+
regexp_str = ::File.join( "^#{@child_path}", "#{regexp_str}$" )
|
35
|
+
else
|
36
|
+
regexp_str = "^#{regexp_str}$"
|
37
|
+
end
|
38
|
+
#puts "regexp_str(2) [#{regexp_str}]"
|
39
|
+
@regexp = Regexp.new( regexp_str )
|
40
|
+
end
|
41
|
+
|
42
|
+
def accepts(file)
|
43
|
+
#puts "accepts(#{file.path_name}) vs #{@regexp}"
|
44
|
+
acceptable = ( !!( file.path_name =~ @regexp ) )
|
45
|
+
#puts " -> #{acceptable}"
|
46
|
+
!!( file.path_name =~ @regexp )
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|