org.torquebox.vfs 1.0.0.Beta22
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|