cheri 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README +98 -0
- data/Rakefile +121 -0
- data/examples/hello_world_1.rb +28 -0
- data/examples/table_1.rb +44 -0
- data/lib/cheri/awt.rb +41 -0
- data/lib/cheri/builder.rb +31 -0
- data/lib/cheri/builder/awt/connecter.rb +63 -0
- data/lib/cheri/builder/awt/constants.rb +1003 -0
- data/lib/cheri/builder/awt/main.rb +191 -0
- data/lib/cheri/builder/awt/types.rb +220 -0
- data/lib/cheri/builder/base.rb +533 -0
- data/lib/cheri/builder/config.rb +187 -0
- data/lib/cheri/builder/connecter.rb +386 -0
- data/lib/cheri/builder/context.rb +655 -0
- data/lib/cheri/builder/generator.rb +425 -0
- data/lib/cheri/builder/html/charsets.rb +154 -0
- data/lib/cheri/builder/html/common.rb +32 -0
- data/lib/cheri/builder/html/connecter.rb +57 -0
- data/lib/cheri/builder/html/element.rb +156 -0
- data/lib/cheri/builder/html/main.rb +116 -0
- data/lib/cheri/builder/html/types.rb +123 -0
- data/lib/cheri/builder/main.rb +483 -0
- data/lib/cheri/builder/swing/connecter.rb +141 -0
- data/lib/cheri/builder/swing/constants.rb +420 -0
- data/lib/cheri/builder/swing/main.rb +446 -0
- data/lib/cheri/builder/swing/types.rb +270 -0
- data/lib/cheri/builder/xml/charsets.rb +154 -0
- data/lib/cheri/builder/xml/common.rb +32 -0
- data/lib/cheri/builder/xml/connecter.rb +42 -0
- data/lib/cheri/builder/xml/element.rb +189 -0
- data/lib/cheri/builder/xml/main.rb +130 -0
- data/lib/cheri/builder/xml/types.rb +36 -0
- data/lib/cheri/cheri.rb +70 -0
- data/lib/cheri/cjx.rb +3 -0
- data/lib/cheri/explorer.rb +32 -0
- data/lib/cheri/explorer/explorer.rb +560 -0
- data/lib/cheri/html.rb +31 -0
- data/lib/cheri/image/Delete24.gif +0 -0
- data/lib/cheri/image/Find24.gif +0 -0
- data/lib/cheri/image/FindAgain24.gif +0 -0
- data/lib/cheri/image/Refresh24.gif +0 -0
- data/lib/cheri/image/Search24.gif +0 -0
- data/lib/cheri/image/Thumbs.db +0 -0
- data/lib/cheri/image/cheri_icon_16x16.png +0 -0
- data/lib/cheri/image/cheri_icon_24x24.png +0 -0
- data/lib/cheri/image/cheri_logo_medium.png +0 -0
- data/lib/cheri/image/close_10x10.png +0 -0
- data/lib/cheri/image/close_10x10s.png +0 -0
- data/lib/cheri/image/close_12x12.png +0 -0
- data/lib/cheri/image/close_14x14.png +0 -0
- data/lib/cheri/image/close_24x24.png +0 -0
- data/lib/cheri/image/close_dim2_12x12.png +0 -0
- data/lib/cheri/image/close_dim_12x12.png +0 -0
- data/lib/cheri/image/cls_tree.png +0 -0
- data/lib/cheri/image/con_tree.png +0 -0
- data/lib/cheri/image/jruby_14x16.png +0 -0
- data/lib/cheri/image/jruby_logo.png +0 -0
- data/lib/cheri/image/mod_tree.png +0 -0
- data/lib/cheri/image/obj_tree.png +0 -0
- data/lib/cheri/image/ruby_16x16.png +0 -0
- data/lib/cheri/image/vars_tree.png +0 -0
- data/lib/cheri/java.rb +26 -0
- data/lib/cheri/java/builder.rb +28 -0
- data/lib/cheri/java/builder/main.rb +407 -0
- data/lib/cheri/java/builder/util.rb +480 -0
- data/lib/cheri/java/java.rb +56 -0
- data/lib/cheri/jruby.rb +32 -0
- data/lib/cheri/jruby/explorer.rb +43 -0
- data/lib/cheri/jruby/explorer/common.rb +38 -0
- data/lib/cheri/jruby/explorer/dialogs.rb +383 -0
- data/lib/cheri/jruby/explorer/explorer.rb +904 -0
- data/lib/cheri/jruby/explorer/splash.rb +80 -0
- data/lib/cheri/jruby/explorer/viewer.rb +619 -0
- data/lib/cheri/jruby/explorer/viewers.rb +1057 -0
- data/lib/cheri/jruby/jruby.rb +59 -0
- data/lib/cheri/swing.rb +41 -0
- data/lib/cheri/xml.rb +31 -0
- metadata +135 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
module Cheri
|
26
|
+
module Xml
|
27
|
+
Types = Hash[
|
28
|
+
:xml => XmlRoot,
|
29
|
+
:text! => TextElem,
|
30
|
+
:t! => TextElem,
|
31
|
+
:esc! => EscElem,
|
32
|
+
:proc! => ProcElem,
|
33
|
+
]
|
34
|
+
|
35
|
+
end #Xml
|
36
|
+
end #Cheri
|
data/lib/cheri/cheri.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
require 'thread'
|
26
|
+
|
27
|
+
# TODO: module comments
|
28
|
+
module Cheri
|
29
|
+
module VERSION #:nodoc:
|
30
|
+
MAJOR = 0
|
31
|
+
MINOR = 0
|
32
|
+
TINY = 2
|
33
|
+
STRING = [MAJOR, MINOR, TINY].join('.').freeze
|
34
|
+
end
|
35
|
+
PathExp = Regexp.new "cheri-#{VERSION::STRING}\\/lib$" #:nodoc:
|
36
|
+
class CheriException < StandardError; end
|
37
|
+
# global threadsafe; set if all Cheri module instances in a system
|
38
|
+
# must be threadsafe
|
39
|
+
# TODO: not yet widely implemented by Cheri modules
|
40
|
+
@threadsafe = false
|
41
|
+
class << self
|
42
|
+
def threadsafe?
|
43
|
+
@threadsafe
|
44
|
+
end
|
45
|
+
# once threadsafe is set, it cannot be unset (by normal means)
|
46
|
+
def threadsafe!
|
47
|
+
@threadsafe ||= true
|
48
|
+
end
|
49
|
+
def type_error(object, *expected_type)
|
50
|
+
TypeError.new("wrong argument type #{object.class} (expected #{expected_type.join(' or ')})")
|
51
|
+
end
|
52
|
+
def argument_error(argc, expected_argc)
|
53
|
+
ArgumentError.new("wrong number of arguments (#{argc} for #{expected_argc})")
|
54
|
+
end
|
55
|
+
def load_path
|
56
|
+
unless @load_path
|
57
|
+
$LOAD_PATH.each do |path|
|
58
|
+
if path =~ PathExp
|
59
|
+
@load_path = "#{path}/"
|
60
|
+
break
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@load_path ||= ''
|
65
|
+
end
|
66
|
+
def img_path
|
67
|
+
@img_path ||= "#{load_path}cheri/image/"
|
68
|
+
end
|
69
|
+
end #self
|
70
|
+
end #Cheri
|
data/lib/cheri/cjx.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
require 'cheri/cheri'
|
26
|
+
|
27
|
+
if (defined?JRUBY_VERSION) && 0 == (JRUBY_VERSION =~ /(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/) &&
|
28
|
+
(($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')
|
29
|
+
require 'cheri/jruby'
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'cheri/explorer/explorer'
|
@@ -0,0 +1,560 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
#
|
24
|
+
|
25
|
+
require 'drb'
|
26
|
+
require 'rbconfig'
|
27
|
+
require 'cheri/cheri'
|
28
|
+
|
29
|
+
module Cheri
|
30
|
+
#
|
31
|
+
# I just want to reiterate this section from the license. Be *VERY* sure you
|
32
|
+
# have adequate safeguards in place (firewalls, secure network, etc.) before
|
33
|
+
# you install this component on a remote machine, particularly anything running
|
34
|
+
# live applications with real (therefore potentially private/sensitive) data.
|
35
|
+
#
|
36
|
+
# "Careful, it's hot!"
|
37
|
+
#
|
38
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
39
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
40
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
41
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
42
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
43
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
44
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
45
|
+
#
|
46
|
+
module Explorer
|
47
|
+
|
48
|
+
def self.start(port)
|
49
|
+
if (server = @server)
|
50
|
+
raise "server active -- call stop first" if server.alive?
|
51
|
+
server.stop_service rescue nil
|
52
|
+
server.thread.kill rescue nil
|
53
|
+
end
|
54
|
+
@explorer = RubyExplorer.new
|
55
|
+
@server = DRb::DRbServer.new("druby://localhost:#{port}",@explorer)
|
56
|
+
puts "Cheri::Explorer started on port #{port}\n"
|
57
|
+
STDERR.puts %{
|
58
|
+
WARNING! This server can expose sensitive information about the Ruby instance
|
59
|
+
in which it runs, including file/directory paths, configuration information,
|
60
|
+
and, if ObjectSpace is enabled, any object that has not been garbage-collected.
|
61
|
+
If you have not taken adequate precautions to secure this installation, such as,
|
62
|
+
but not limited to, firewalls, secure network access, and access control lists,
|
63
|
+
you should terminate this application now by entering the following command:
|
64
|
+
|
65
|
+
Cheri::Explorer.thread.kill
|
66
|
+
|
67
|
+
}
|
68
|
+
end
|
69
|
+
def self.stop
|
70
|
+
if (server = @server)
|
71
|
+
server.stop_service rescue nil
|
72
|
+
server.thread.kill rescue nil
|
73
|
+
@explorer = nil
|
74
|
+
@server = nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
def self.thread
|
78
|
+
@server.thread if @server
|
79
|
+
end
|
80
|
+
|
81
|
+
class ObjectRec
|
82
|
+
def initialize(obj)
|
83
|
+
@z = obj.class.to_s rescue nil
|
84
|
+
@i = obj.__id__ rescue nil
|
85
|
+
if obj.respond_to?(:instance_variables) && (vars = (obj.instance_variables rescue nil)) && !vars.empty?
|
86
|
+
@v = []
|
87
|
+
vars.each do |v|
|
88
|
+
value = obj.instance_variable_get(v.to_sym) rescue nil
|
89
|
+
type = value.class rescue nil
|
90
|
+
@v << NameTypeValue.new(v,type,value)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
if obj.respond_to?(:ancestors) && (a = obj.ancestors rescue nil)
|
94
|
+
@a = Array.new(a.length) {|i| ValueType.new(a[i]) }
|
95
|
+
end
|
96
|
+
@u = (obj.superclass.to_s rescue nil) if obj.respond_to?(:superclass)
|
97
|
+
@s = obj.inspect rescue nil
|
98
|
+
end
|
99
|
+
def clazz
|
100
|
+
@z
|
101
|
+
end
|
102
|
+
def superclazz
|
103
|
+
@u
|
104
|
+
end
|
105
|
+
def id
|
106
|
+
@i
|
107
|
+
end
|
108
|
+
def value
|
109
|
+
@s
|
110
|
+
end
|
111
|
+
def vars
|
112
|
+
@v
|
113
|
+
end
|
114
|
+
def ancestors
|
115
|
+
@a
|
116
|
+
end
|
117
|
+
def <=>(other)
|
118
|
+
if ObjectRec === other
|
119
|
+
value <=> other.value
|
120
|
+
else
|
121
|
+
value <=> (other.to_s rescue '')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
def to_s
|
125
|
+
@s || ''
|
126
|
+
end
|
127
|
+
|
128
|
+
end #ObjectRec
|
129
|
+
|
130
|
+
class ConstRec < ObjectRec
|
131
|
+
def initialize(parent,name,obj)
|
132
|
+
raise Cheri.type_error(name,String) unless String === name
|
133
|
+
raise Cheri.type_error(parent,String) if parent && !(String === parent)
|
134
|
+
super(obj)
|
135
|
+
@p = parent if parent
|
136
|
+
@n = name
|
137
|
+
end
|
138
|
+
def parent
|
139
|
+
@p
|
140
|
+
end
|
141
|
+
def name
|
142
|
+
@n
|
143
|
+
end
|
144
|
+
def qname
|
145
|
+
@p ? "#{@p}::#{@n}" : @n
|
146
|
+
end
|
147
|
+
def <=>(other)
|
148
|
+
if ConstRec === other
|
149
|
+
name <=> other.name
|
150
|
+
else
|
151
|
+
name <=> (other.to_s rescue '')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end #ConstRec
|
155
|
+
|
156
|
+
class ValueType
|
157
|
+
def initialize(value)
|
158
|
+
@z = value.class.to_s rescue '?'
|
159
|
+
@i = value.__id__ rescue '?'
|
160
|
+
@v = value.to_s rescue '?'
|
161
|
+
end
|
162
|
+
def clazz
|
163
|
+
@z
|
164
|
+
end
|
165
|
+
def id
|
166
|
+
@i
|
167
|
+
end
|
168
|
+
def value
|
169
|
+
@v
|
170
|
+
end
|
171
|
+
def <=>(other)
|
172
|
+
if ValueRec === other
|
173
|
+
value <=> other.value
|
174
|
+
else
|
175
|
+
value <=> (other.to_s rescue '')
|
176
|
+
end
|
177
|
+
end
|
178
|
+
def to_a
|
179
|
+
[@v,@z,@i]
|
180
|
+
end
|
181
|
+
alias_method :to_ary, :to_a
|
182
|
+
end #ValueType
|
183
|
+
|
184
|
+
class NameValue
|
185
|
+
def initialize(name,value)
|
186
|
+
raise Cheri.type_error(name,String) unless String === name
|
187
|
+
@n = name
|
188
|
+
@i = value.__id__ rescue '?'
|
189
|
+
@v = String === value ? value[0,100] : (value.to_s[0,100] rescue '?')
|
190
|
+
end
|
191
|
+
def name
|
192
|
+
@n
|
193
|
+
end
|
194
|
+
def value
|
195
|
+
@v
|
196
|
+
end
|
197
|
+
def id
|
198
|
+
@i
|
199
|
+
end
|
200
|
+
def <=>(other)
|
201
|
+
if NameValue === other
|
202
|
+
value <=> other.value
|
203
|
+
else
|
204
|
+
value <=> (other.to_s rescue '')
|
205
|
+
end
|
206
|
+
end
|
207
|
+
def to_a
|
208
|
+
[@n,@v,@i]
|
209
|
+
end
|
210
|
+
alias_method :to_ary, :to_a
|
211
|
+
end #NameValue
|
212
|
+
|
213
|
+
class NameTypeValue < NameValue
|
214
|
+
def initialize(name,type,value)
|
215
|
+
super(name,value)
|
216
|
+
@t = String === type ? type : (type.to_s rescue '?')
|
217
|
+
@d = type.__id__ rescue nil
|
218
|
+
end
|
219
|
+
def type
|
220
|
+
@t
|
221
|
+
end
|
222
|
+
def type_id
|
223
|
+
@d
|
224
|
+
end
|
225
|
+
def to_a
|
226
|
+
[@n,@t,@v,@i]
|
227
|
+
end
|
228
|
+
alias_method :to_ary, :to_a
|
229
|
+
end #NameTypeValue
|
230
|
+
|
231
|
+
class SearchArgs
|
232
|
+
def initialize(clazz,vars=nil,any=nil)
|
233
|
+
raise Cheri.type_error(clazz,String) unless String === clazz
|
234
|
+
raise ArgumentError,"Invalid class "+ clazz unless /^([A-Z])((\w|::[A-Z])*)$/.match clazz
|
235
|
+
@z = clazz
|
236
|
+
if vars
|
237
|
+
raise Cheri.type_error(vars,Array) unless Array === vars
|
238
|
+
vars.each do |v|
|
239
|
+
raise Cheri.type_error(v,SearchNameValue) unless SearchNameValue === v
|
240
|
+
raise Cheri.type_error(v.name,Symbol) unless Symbol === v.name
|
241
|
+
end
|
242
|
+
@v = vars
|
243
|
+
@a = !(any == nil || any == false)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def clazz
|
248
|
+
@z
|
249
|
+
end
|
250
|
+
|
251
|
+
def vars
|
252
|
+
@v
|
253
|
+
end
|
254
|
+
|
255
|
+
def any
|
256
|
+
@a
|
257
|
+
end
|
258
|
+
|
259
|
+
end #SearchArgs
|
260
|
+
|
261
|
+
class SearchNameValue
|
262
|
+
def initialize(name,value)
|
263
|
+
@n = name
|
264
|
+
@v = value
|
265
|
+
@r = Regexp === value
|
266
|
+
end
|
267
|
+
def name
|
268
|
+
@n
|
269
|
+
end
|
270
|
+
def value
|
271
|
+
@v
|
272
|
+
end
|
273
|
+
def rx?
|
274
|
+
@r
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
class SearchResults
|
279
|
+
def initialize(sargs,results)
|
280
|
+
raise Cheri.type_error(sargs,SearchArgs) unless SearchArgs === sargs
|
281
|
+
raise Cheri.type_error(results,Array) unless Array === results
|
282
|
+
@a = sargs
|
283
|
+
@r = results
|
284
|
+
end
|
285
|
+
def args
|
286
|
+
@a
|
287
|
+
end
|
288
|
+
def results
|
289
|
+
@r
|
290
|
+
end
|
291
|
+
def length
|
292
|
+
@r.length
|
293
|
+
end
|
294
|
+
end
|
295
|
+
class MethodRec
|
296
|
+
def initialize(mod)
|
297
|
+
@pu = mod.public_methods(false) if mod.respond_to?(:public_methods)
|
298
|
+
# rescue works around JRuby bug prior to 1.0.0RC3
|
299
|
+
@pt = mod.protected_methods(false) rescue mod.protected_methods if mod.respond_to?(:protected_methods)
|
300
|
+
@pv = mod.private_methods(false) rescue mod.private_methods if mod.respond_to?(:private_methods)
|
301
|
+
@pui = mod.public_instance_methods(false) if mod.respond_to?(:public_instance_methods)
|
302
|
+
@pti = mod.protected_instance_methods(false) if mod.respond_to?(:protected_instance_methods)
|
303
|
+
@pvi = mod.private_instance_methods(false) if mod.respond_to?(:private_instance_methods)
|
304
|
+
end
|
305
|
+
|
306
|
+
def pub
|
307
|
+
@pu
|
308
|
+
end
|
309
|
+
def pro
|
310
|
+
@pt
|
311
|
+
end
|
312
|
+
def pri
|
313
|
+
@pv
|
314
|
+
end
|
315
|
+
def pub_inst
|
316
|
+
@pui
|
317
|
+
end
|
318
|
+
def pro_inst
|
319
|
+
@pti
|
320
|
+
end
|
321
|
+
def pri_inst
|
322
|
+
@pvi
|
323
|
+
end
|
324
|
+
end #MethodRec
|
325
|
+
|
326
|
+
|
327
|
+
class RubyExplorer
|
328
|
+
# TODO: aggregate values that will be displayed together
|
329
|
+
def ruby_platform
|
330
|
+
RUBY_PLATFORM
|
331
|
+
end
|
332
|
+
def ruby_version
|
333
|
+
RUBY_VERSION
|
334
|
+
end
|
335
|
+
def ruby_release_date
|
336
|
+
RUBY_RELEASE_DATE
|
337
|
+
end
|
338
|
+
def env
|
339
|
+
ENV.to_a
|
340
|
+
end
|
341
|
+
# TODO: this doesn't make much sense, needs to be per thread
|
342
|
+
def global_vars
|
343
|
+
result = []
|
344
|
+
global_variables.each do |v|
|
345
|
+
ev = eval(v) rescue '???'
|
346
|
+
if Array === ev
|
347
|
+
eva = []
|
348
|
+
ev.each do |e|
|
349
|
+
eva << e.to_s
|
350
|
+
end
|
351
|
+
ev = eva
|
352
|
+
elsif Hash === ev
|
353
|
+
eva = []
|
354
|
+
ev.each_pair do |k,e|
|
355
|
+
eva << [k.to_s,e.to_s]
|
356
|
+
end
|
357
|
+
ev = eva
|
358
|
+
else
|
359
|
+
ev = ev.to_s
|
360
|
+
end
|
361
|
+
result << [v,ev]
|
362
|
+
end
|
363
|
+
result
|
364
|
+
end
|
365
|
+
def constants
|
366
|
+
result = []
|
367
|
+
begin
|
368
|
+
Module.constants.each do |c|
|
369
|
+
result << ([c,eval("::#{c}.class").to_s,eval("::#{c}.to_s")] rescue [c.to_s,'???', '???'])
|
370
|
+
end
|
371
|
+
rescue
|
372
|
+
end
|
373
|
+
result
|
374
|
+
end
|
375
|
+
def const_recs(parent_str=nil)
|
376
|
+
parent_str = nil if 'Module' == parent_str
|
377
|
+
result = []
|
378
|
+
if parent_str
|
379
|
+
raise Cheri.type_error(parent_str,String) unless String === parent_str
|
380
|
+
# make sure we don't have anything executable before we eval it
|
381
|
+
raise ArgumentError,"Invalid constant "+parent_str unless /^([A-Z])((\w|::[A-Z])*)$/.match parent_str
|
382
|
+
parent_str = parent_str[2,parent_str.length-2] if parent_str.rindex('::',0)
|
383
|
+
if (parent = eval("::#{parent_str}") rescue nil) &&
|
384
|
+
((parent.respond_to?(:constants) && (consts = parent.constants rescue nil)) ||
|
385
|
+
(parent.respond_to?(:__constants__) && (consts = parent.__constants__ rescue nil)))
|
386
|
+
consts.each do |c|
|
387
|
+
if (ec = (eval("::#{parent_str}::#{c}") rescue nil))
|
388
|
+
result << ConstRec.new(parent_str,c,ec)
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
else
|
393
|
+
Module.constants.each do |c|
|
394
|
+
if (ec = (eval("::#{c}") rescue nil))
|
395
|
+
result << ConstRec.new(nil,c,ec)
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
399
|
+
result
|
400
|
+
end
|
401
|
+
|
402
|
+
def module_methods(name,id=nil)
|
403
|
+
if id && defined?ObjectSpace
|
404
|
+
raise Cheri.type_error(id,Fixnum) unless Fixnum === id
|
405
|
+
if Module === (mod = ObjectSpace._id2ref(id) rescue nil)
|
406
|
+
return MethodRec.new(mod)
|
407
|
+
end
|
408
|
+
elsif name
|
409
|
+
raise Cheri.type_error(name,String) unless String === name
|
410
|
+
return if /#/.match name
|
411
|
+
# make sure we don't have anything executable before we eval it
|
412
|
+
raise ArgumentError,"Invalid module "+name unless /^([A-Z])((\w|::[A-Z])*)$/.match name
|
413
|
+
if Module === (mod = eval("::#{name}") rescue nil)
|
414
|
+
return MethodRec.new(mod)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
nil
|
418
|
+
end
|
419
|
+
|
420
|
+
def object(id)
|
421
|
+
return unless id && defined?ObjectSpace
|
422
|
+
raise Cheri.type_error(id,Fixnum) unless Fixnum === id
|
423
|
+
if (obj = ObjectSpace._id2ref(id) rescue nil) && !(Fixnum === obj)
|
424
|
+
if Module === obj && (name = obj.name rescue nil)
|
425
|
+
if (ix = name.rindex('::'))
|
426
|
+
parent = name[0,ix]
|
427
|
+
name = name[ix+2,name.length - ix - 2]
|
428
|
+
else
|
429
|
+
parent = nil
|
430
|
+
end
|
431
|
+
ConstRec.new(parent,name,obj)
|
432
|
+
else
|
433
|
+
ObjectRec.new(obj)
|
434
|
+
end
|
435
|
+
else
|
436
|
+
nil
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
def object_methods(id)
|
441
|
+
return unless id && defined?ObjectSpace
|
442
|
+
raise Cheri.type_error(id,Fixnum) unless Fixnum === id
|
443
|
+
if (obj = ObjectSpace._id2ref(id) rescue nil) && !(Fixnum === obj)
|
444
|
+
return MethodRec.new(obj)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
def simple_value(id)
|
449
|
+
return unless id && defined?ObjectSpace
|
450
|
+
raise Cheri.type_error(id,Fixnum) unless Fixnum === id
|
451
|
+
if (obj = ObjectSpace._id2ref(id)) && !(Fixnum === obj)
|
452
|
+
obj.to_s[0,40] rescue 'Unreadable'
|
453
|
+
else
|
454
|
+
'Unavailable'
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
def find(sargs)
|
459
|
+
return unless sargs && defined?ObjectSpace
|
460
|
+
raise Cheri.type_error(sargs,SearchArgs) unless SearchArgs === sargs
|
461
|
+
sclazz = sargs.clazz
|
462
|
+
raise Cheri.type_error(sclazz,String) unless String === sclazz
|
463
|
+
# make sure we don't have anything executable before we eval it
|
464
|
+
raise ArgumentError,"Invalid class "+ sclazz unless /^([A-Z])((\w|::[A-Z])*)$/.match sclazz
|
465
|
+
if Module === (clazz = (eval("::#{sclazz}") rescue nil))
|
466
|
+
#GC.start
|
467
|
+
result = []
|
468
|
+
vars = sargs.vars
|
469
|
+
len = vars.length if vars
|
470
|
+
any = sargs.any
|
471
|
+
ObjectSpace.each_object(clazz) do |o|
|
472
|
+
if (id = o.__id__ rescue nil)
|
473
|
+
if vars
|
474
|
+
match = 0
|
475
|
+
vars.each do |v|
|
476
|
+
if (iv = o.instance_variable_get(v.name) rescue nil) &&
|
477
|
+
(v.rx? ? (iv.to_s =~ v.value rescue nil) : (iv.to_s.index(v.value) rescue nil))
|
478
|
+
if any
|
479
|
+
match = 1
|
480
|
+
break
|
481
|
+
else
|
482
|
+
match += 1
|
483
|
+
end
|
484
|
+
end
|
485
|
+
end
|
486
|
+
result << id if (any && match == 1) || match == len
|
487
|
+
else
|
488
|
+
result << id
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
result
|
493
|
+
else
|
494
|
+
[]
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
def config
|
499
|
+
Config::CONFIG
|
500
|
+
end
|
501
|
+
|
502
|
+
if (defined?JRUBY_VERSION) && 0 == (JRUBY_VERSION =~ /(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/) &&
|
503
|
+
(($1 == '1.0.0' && ($2.empty? || $2 >= 'RC2')) || $1 > '1.0.0')
|
504
|
+
|
505
|
+
System = ::Java::JavaLang::System
|
506
|
+
Runtime = ::Java::JavaLang::Runtime
|
507
|
+
JDate = ::Java::JavaUtil::Date
|
508
|
+
JVersion = 'java.version'.freeze
|
509
|
+
JVendor = 'java.vendor'.freeze
|
510
|
+
RtName = 'java.runtime.name'.freeze
|
511
|
+
RtVersion = 'java.runtime.version'.freeze
|
512
|
+
VmName = 'java.vm.name'.freeze
|
513
|
+
VmVersion = 'java.vm.version'.freeze
|
514
|
+
VmVendor = 'java.vm.vendor'.freeze
|
515
|
+
|
516
|
+
def jruby_version
|
517
|
+
JRUBY_VERSION
|
518
|
+
end
|
519
|
+
def env_java
|
520
|
+
ENV_JAVA.to_hash
|
521
|
+
end
|
522
|
+
def env_java_brief
|
523
|
+
{
|
524
|
+
JVersion => ENV_JAVA[JVersion],
|
525
|
+
JVendor => ENV_JAVA[JVendor],
|
526
|
+
RtName => ENV_JAVA[RtName],
|
527
|
+
RtVersion => ENV_JAVA[RtVersion],
|
528
|
+
VmName => ENV_JAVA[VmName],
|
529
|
+
VmVersion => ENV_JAVA[VmVersion],
|
530
|
+
VmVendor => ENV_JAVA[VmVendor],
|
531
|
+
}
|
532
|
+
end
|
533
|
+
def security_manager
|
534
|
+
System.security_manager ? System.security_manager.to_string : nil
|
535
|
+
end
|
536
|
+
def available_processors
|
537
|
+
Runtime.runtime.available_processors
|
538
|
+
end
|
539
|
+
def free_memory
|
540
|
+
Runtime.runtime.free_memory
|
541
|
+
end
|
542
|
+
def total_memory
|
543
|
+
Runtime.runtime.total_memory
|
544
|
+
end
|
545
|
+
def max_memory
|
546
|
+
Runtime.runtime.max_memory
|
547
|
+
end
|
548
|
+
def jruby_start_time
|
549
|
+
@start_time ||= JDate.new(Cheri::JRuby.start_time).to_string
|
550
|
+
end
|
551
|
+
def object_space?
|
552
|
+
Cheri::JRuby.object_space?
|
553
|
+
end
|
554
|
+
|
555
|
+
end # if defined...
|
556
|
+
|
557
|
+
end #RubyExplorer
|
558
|
+
|
559
|
+
end #Explorer
|
560
|
+
end #Cheri
|