jrubyfx-fxmlloader-master 0.4.master.2015.9.30-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +25 -0
- data/README +17 -0
- data/Rakefile +72 -0
- data/lib/FXMLLoader-j8.jar +0 -0
- data/lib/fxmlloader/elts.rb +576 -0
- data/lib/fxmlloader/fxml_jit_info.rb +158 -0
- data/lib/fxmlloader/j8_expression_value.rb +290 -0
- data/lib/fxmlloader/real_elts.rb +708 -0
- data/lib/fxmlloader/rorba.rb +107 -0
- data/lib/fxmlloader/rrba.rb +769 -0
- data/lib/fxmlloader/value_elts.rb +257 -0
- data/lib/jrubyfx-fxmlloader.rb +800 -0
- metadata +57 -0
@@ -0,0 +1,769 @@
|
|
1
|
+
=begin
|
2
|
+
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
|
3
|
+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
4
|
+
*
|
5
|
+
* This code is free software; you can redistribute it and/or modify it
|
6
|
+
* under the terms of the GNU General Public License version 2 only, as
|
7
|
+
* published by the Free Software Foundation. Oracle designates this
|
8
|
+
* particular file as subject to the "Classpath" exception as provided
|
9
|
+
* by Oracle in the LICENSE file that accompanied this code.
|
10
|
+
*
|
11
|
+
* This code is distributed in the hope that it will be useful, but WITHOUT
|
12
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13
|
+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
14
|
+
* version 2 for more details (a copy is included in the LICENSE file that
|
15
|
+
* accompanied this code).
|
16
|
+
*
|
17
|
+
* You should have received a copy of the GNU General Public License version
|
18
|
+
* 2 along with this work; if not, write to the Free Software Foundation,
|
19
|
+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
20
|
+
*
|
21
|
+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
22
|
+
* or visit www.oracle.com if you need additional information or have any
|
23
|
+
* questions.
|
24
|
+
*/
|
25
|
+
=end
|
26
|
+
|
27
|
+
#/**
|
28
|
+
# * Exposes Java Bean properties of an object via the {@link Mapend interface.
|
29
|
+
# * A call to {@link Map#get(Object)end invokes the getter for the corresponding
|
30
|
+
# * property, and a call to {@link Map#put(Object, Object)end invokes the
|
31
|
+
# * property's setter. Appending a "Property" suffix to the key returns the
|
32
|
+
# * corresponding property model.
|
33
|
+
# */
|
34
|
+
class RubyWrapperBeanAdapter
|
35
|
+
|
36
|
+
@@method_cache = {}
|
37
|
+
|
38
|
+
GET_PREFIX = "get"
|
39
|
+
IS_PREFIX = "is"
|
40
|
+
SET_PREFIX = "set"
|
41
|
+
PROPERTY_SUFFIX = "Property"
|
42
|
+
|
43
|
+
VALUE_OF_METHOD_NAME = "valueOf"
|
44
|
+
|
45
|
+
OBJECT_PUBLIC_METHODS = Object.new.public_methods
|
46
|
+
|
47
|
+
#@param @bean
|
48
|
+
#The Bean object to wrap.
|
49
|
+
def initialize(bean)
|
50
|
+
@bean = bean
|
51
|
+
type = @bean.java_class
|
52
|
+
javas = []
|
53
|
+
while type != java.lang.Object.java_class && !@@method_cache.has_key?(type)
|
54
|
+
javas += build_cache_for(type)
|
55
|
+
type = type.superclass
|
56
|
+
end
|
57
|
+
# class_methods = {}
|
58
|
+
# (@bean.public_methods - OBJECT_PUBLIC_METHODS - javas.map{|x|x.name.to_sym}).each do |method_name|
|
59
|
+
# puts "ruby method: #{method_name}"
|
60
|
+
# name = method_name.to_s
|
61
|
+
# unless class_methods.has_key? name
|
62
|
+
# class_methods[name] = []
|
63
|
+
# else
|
64
|
+
# class_methods[name]
|
65
|
+
# end << method_name.to_sym
|
66
|
+
# end
|
67
|
+
# @@method_cache[@bean.class] =
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_cache_for(type)
|
71
|
+
class_methods = {}
|
72
|
+
|
73
|
+
ReflectUtil.checkPackageAccess(type) # TODO: do I want this ?
|
74
|
+
|
75
|
+
java_methods = type.declared_instance_methods.each do |method|
|
76
|
+
modifiers = method.modifiers
|
77
|
+
if Modifier.public?(modifiers) && !Modifier.static?(modifiers)
|
78
|
+
name = method.name
|
79
|
+
unless class_methods.has_key? name
|
80
|
+
class_methods[name] = []
|
81
|
+
else
|
82
|
+
class_methods[name]
|
83
|
+
end << method
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@@method_cache[type] = class_methods
|
88
|
+
return java_methods
|
89
|
+
end
|
90
|
+
|
91
|
+
def getMethod(name, *parameter_types)
|
92
|
+
type = @bean.java_class
|
93
|
+
while type != java.lang.Object.java_class
|
94
|
+
if methods = (@@method_cache[type] || {})[name]
|
95
|
+
methods.each do |method|
|
96
|
+
return method if method.name == name && method.parameter_types == parameter_types
|
97
|
+
end
|
98
|
+
end
|
99
|
+
type = type.superclass
|
100
|
+
end
|
101
|
+
return nil
|
102
|
+
end
|
103
|
+
|
104
|
+
def getter(key)
|
105
|
+
capital = camelize(key)
|
106
|
+
return getMethod(GET_PREFIX + capital) if @bean.respond_to?(GET_PREFIX + capital)
|
107
|
+
return getMethod(IS_PREFIX + capital)
|
108
|
+
end
|
109
|
+
|
110
|
+
def setter(key)
|
111
|
+
raise java.lang.UnsupportedOperationException.new("Cannot determine type for property #{key}.") unless type = getType(key)
|
112
|
+
return getMethod(method_name(SET_PREFIX, key), type)
|
113
|
+
end
|
114
|
+
|
115
|
+
def method_name(prefix, key)
|
116
|
+
return prefix + camelize(key)
|
117
|
+
end
|
118
|
+
|
119
|
+
def camelize(key)
|
120
|
+
key[0].upcase + key[1..-1]
|
121
|
+
end
|
122
|
+
|
123
|
+
def [](key)
|
124
|
+
key = key.to_s
|
125
|
+
begin
|
126
|
+
unless key.end_with?(PROPERTY_SUFFIX)
|
127
|
+
camel = camelize(key)
|
128
|
+
unless !@bean.respond_to?(GET_PREFIX + camel) and @bean.respond_to?(IS_PREFIX + camel)
|
129
|
+
@bean.send(GET_PREFIX + camel)
|
130
|
+
else
|
131
|
+
@bean.send(IS_PREFIX + camel)
|
132
|
+
end
|
133
|
+
else
|
134
|
+
@bean.send key
|
135
|
+
end
|
136
|
+
rescue NoMethodError => nme
|
137
|
+
raise unless nme.name.to_s.end_with?(key)
|
138
|
+
puts "failing on #{key}"
|
139
|
+
# p @bean
|
140
|
+
# p @bean.class
|
141
|
+
# puts caller
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def []=(key, value)
|
147
|
+
raise "NULL PTR" unless key
|
148
|
+
|
149
|
+
setter = method_name(SET_PREFIX, key)
|
150
|
+
|
151
|
+
raise "Property \"#{key}\" does not exist or is read-only." unless @bean.respond_to? setter
|
152
|
+
ty = getType(key)
|
153
|
+
co = coerce(value, ty)
|
154
|
+
coi = RubyWrapperBeanAdapter.jit_export(co, value, ty, setter(key))
|
155
|
+
rputs @bean, "#{setter}(#{coi})"
|
156
|
+
if coi.start_with?("*[") # cheap way to not compute it twice :D
|
157
|
+
@bean.send(setter, *co)
|
158
|
+
else
|
159
|
+
@bean.send(setter, co)
|
160
|
+
end
|
161
|
+
co
|
162
|
+
end
|
163
|
+
|
164
|
+
def has_key?(key)
|
165
|
+
raise "NULL PTR" unless key
|
166
|
+
getType(key.to_s)
|
167
|
+
end
|
168
|
+
|
169
|
+
def read_only?(key)
|
170
|
+
setter(key) == nil
|
171
|
+
end
|
172
|
+
|
173
|
+
def getPropertyModel(key)
|
174
|
+
raise ArgumentError.new unless key
|
175
|
+
self[key + PROPERTY_SUFFIX]
|
176
|
+
end
|
177
|
+
|
178
|
+
def getType(key)
|
179
|
+
raise ArgumentError.new unless key
|
180
|
+
if @bean.respond_to? "#{key}GetType" # ruby type support ;-D
|
181
|
+
@bean.send("#{key}GetType")
|
182
|
+
else
|
183
|
+
getter = getter(key)
|
184
|
+
getter && getter.return_type
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
alias :getGenericType :getType
|
189
|
+
|
190
|
+
def coerce(value, type)
|
191
|
+
RubyWrapperBeanAdapter.coerce(value, type)
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.jit_export(co, value, ty, setter, ignore=nil)
|
195
|
+
coi = co.inspect
|
196
|
+
if co.is_a? Java::JavaLang::Enum
|
197
|
+
coi = "Java::#{co.java_class.name.gsub(/[\$\.]/, "::")}::#{co.to_s}"
|
198
|
+
elsif co.is_a? EventHandlerWrapper
|
199
|
+
coi = "EventHandlerWrapper.new(__local_fxml_controller, #{co.funcName.inspect})"
|
200
|
+
elsif co.is_a? ScriptEventHandler
|
201
|
+
coi = "ScriptEventHandler.new(#{co.script.inspect}, __local_sem_lang_inst_#{rget_sem(co.scriptEngine)})"
|
202
|
+
elsif tmp = rget(value)
|
203
|
+
coi = tmp
|
204
|
+
elsif co.is_a? Java::javafx.scene.paint.Paint
|
205
|
+
coi = "RubyWrapperBeanAdapter.coerce(#{value.inspect}, #{ty.ruby_class}.java_class)"
|
206
|
+
elsif setter.respond_to? :varargs? and setter.varargs?
|
207
|
+
coi = "*#{coi}"
|
208
|
+
elsif coi.start_with? "#<"
|
209
|
+
# puts "ignoring #{setting}(#{coi})
|
210
|
+
# How about #{setting}(RubyWrapperBeanAdapter.coerce(#{value.inspect}, #{ty})) ?#
|
211
|
+
|
212
|
+
# "
|
213
|
+
coi = "RubyWrapperBeanAdapter.coerce(#{value.inspect}, #{ty.ruby_class}.java_class)"
|
214
|
+
end
|
215
|
+
return coi
|
216
|
+
end
|
217
|
+
|
218
|
+
@@mapper = nil
|
219
|
+
def self.mapper
|
220
|
+
unless @@mapper
|
221
|
+
dir = ->(x){x}
|
222
|
+
to_x = ->(x){->(o){o.send(x)}}
|
223
|
+
to_dbl = ->(x){java.lang.Double.valueOf(x.to_s)}
|
224
|
+
to_bool = ->(x){java.lang.Boolean.valueOf(x.to_s)}
|
225
|
+
value_of = ->(x, type){type.ruby_class.valueOf(x.to_s)}
|
226
|
+
# TODO: Java::double[].java_class.component_type
|
227
|
+
@@mapper = {
|
228
|
+
[String, java.lang.String.java_class] => dir,
|
229
|
+
[Fixnum, java.lang.Integer.java_class] => dir,
|
230
|
+
[Float, java.lang.Double.java_class] => dir,
|
231
|
+
[Float, Java::double.java_class] => dir,
|
232
|
+
[FalseClass, Java::boolean.java_class] => dir,
|
233
|
+
[TrueClass, Java::boolean.java_class] => dir,
|
234
|
+
[String, Java::double.java_class] => to_dbl,
|
235
|
+
[String, java.lang.Double.java_class] => to_dbl,
|
236
|
+
[String, Java::int.java_class] => to_x.call(:to_i),
|
237
|
+
[String,java.lang.Integer.java_class] => to_x.call(:to_i),
|
238
|
+
[String, Java::boolean.java_class] => to_bool,
|
239
|
+
[String, Java::javafx.scene.paint.Paint.java_class] => value_of,
|
240
|
+
[String, Java::javafx.scene.paint.Color.java_class] => value_of,
|
241
|
+
[String, Java::java.lang.Object.java_class] => dir,
|
242
|
+
[String, Java::double[].java_class] => ->(x){x.split(/[, ]+/).map(&:to_f)}
|
243
|
+
}
|
244
|
+
end
|
245
|
+
@@mapper
|
246
|
+
end
|
247
|
+
|
248
|
+
def self.coerce( value, type)
|
249
|
+
if (type == nil)
|
250
|
+
raise "ArgumentError.new();"
|
251
|
+
end
|
252
|
+
if (value.class == Java::JavaObject)
|
253
|
+
value = value.to_java
|
254
|
+
end
|
255
|
+
|
256
|
+
coercedValue = nil;
|
257
|
+
if (value == nil)
|
258
|
+
# Null values can only be coerced to nil
|
259
|
+
coercedValue = nil;
|
260
|
+
elsif type == java.lang.Object.java_class || (value.is_a?(EventHandlerWrapper) && type == Java.javafx.event.EventHandler.java_class) || (value.respond_to?(:java_class) && !value.is_a?(EventHandlerWrapper) && type.assignable_from?(value.java_class))
|
261
|
+
# Value doesn't require coercion
|
262
|
+
coercedValue = value;
|
263
|
+
elsif !value.respond_to?(:java_class) && !type.enum?
|
264
|
+
# its a ruby value
|
265
|
+
|
266
|
+
if mapper[[value.class, type]]
|
267
|
+
coercedValue = mapper[[value.class, type]]
|
268
|
+
if coercedValue.arity == 1
|
269
|
+
coercedValue = coercedValue.call(value)
|
270
|
+
else
|
271
|
+
coercedValue = coercedValue.call(value, type)
|
272
|
+
end
|
273
|
+
else
|
274
|
+
raise "Unknown Coercion map: (#{value}, #{type}) (#{value.inspect}, [#{value.class}, #{type.inspect}]; Please file a bug on this."
|
275
|
+
end
|
276
|
+
# Ruby String :D
|
277
|
+
elsif value.class == String && type.enum?
|
278
|
+
if value[0] == value[0].downcase
|
279
|
+
puts "WHOA Value is not #{value}"
|
280
|
+
#TODO: does this need proper snake casing when upcasting?
|
281
|
+
value = value.upcase
|
282
|
+
end
|
283
|
+
coercedValue = type.ruby_class.valueOf(value)
|
284
|
+
elsif value.respond_to?(:java_class) && value.java_class == Java::java.net.URL.java_class && type == Java::java.lang.String.java_class
|
285
|
+
# TODO: HACK!
|
286
|
+
dputs "COnverting url to string"
|
287
|
+
coercedValue = value.to_s
|
288
|
+
else
|
289
|
+
raise "!! Non-normal coerce (#{value}, #{type}) (#{value.inspect}, #{type.inspect})"
|
290
|
+
end
|
291
|
+
return coercedValue;
|
292
|
+
end
|
293
|
+
|
294
|
+
# /**
|
295
|
+
# * Invokes the static getter method for the given property.
|
296
|
+
# *
|
297
|
+
# * @param target
|
298
|
+
# * The object to which the property is attached.
|
299
|
+
# *
|
300
|
+
# * @param sourceType
|
301
|
+
# * The class that defines the property.
|
302
|
+
# *
|
303
|
+
# * @param key
|
304
|
+
# * The property name.
|
305
|
+
# *
|
306
|
+
# * @return
|
307
|
+
# * The value returned by the method, or <tt>nil</tt> if no such method
|
308
|
+
# * exists.
|
309
|
+
# */
|
310
|
+
# @SuppressWarnings("unchecked")
|
311
|
+
def self.get3(target, sourceType, key)
|
312
|
+
value = nil;
|
313
|
+
|
314
|
+
targetType = target.java_class();
|
315
|
+
getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
316
|
+
|
317
|
+
if (getterMethod != nil)
|
318
|
+
begin
|
319
|
+
value = MethodUtil.invoke(getterMethod, nil, [target ] );
|
320
|
+
rescue InvocationTargetException => exception
|
321
|
+
raise RuntimeException.new(exception);
|
322
|
+
rescue IllegalAccessException => exception
|
323
|
+
raise RuntimeException.new(exception);
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
return value;
|
328
|
+
end
|
329
|
+
|
330
|
+
# /**
|
331
|
+
# * Invokes a static setter method for the given property. If the value is
|
332
|
+
# * <tt>nil</tt> or there is no explicit setter for a given type, the
|
333
|
+
# * {@link #coerce(Object, Class)end method is used to attempt to convert the
|
334
|
+
# * value to the actual property type (defined by the return value of the
|
335
|
+
# * getter method).
|
336
|
+
# *
|
337
|
+
# * @param target
|
338
|
+
# * The object to which the property is or will be attached.
|
339
|
+
# *
|
340
|
+
# * @param sourceType
|
341
|
+
# * The class that defines the property.
|
342
|
+
# *
|
343
|
+
# * @param key
|
344
|
+
# * The property name.
|
345
|
+
# *
|
346
|
+
# * @param value
|
347
|
+
# * The property.new value.
|
348
|
+
# *
|
349
|
+
# * @throws PropertyNotFoundException
|
350
|
+
# * If the given static property does not exist or is read-only.
|
351
|
+
# */
|
352
|
+
def self.put3(target, sourceType, key, value)
|
353
|
+
targetType = nil
|
354
|
+
if target.respond_to? :java_class
|
355
|
+
targetType = target.java_class();
|
356
|
+
elsif target.is_a? String
|
357
|
+
targetType = java.lang.String.java_class
|
358
|
+
else
|
359
|
+
raise "Shoots!"
|
360
|
+
end
|
361
|
+
|
362
|
+
setterMethod = nil;
|
363
|
+
if (value != nil)
|
364
|
+
valueClass = nil
|
365
|
+
|
366
|
+
if value.respond_to? :java_class
|
367
|
+
valueClass = value.java_class();
|
368
|
+
elsif value.is_a? String
|
369
|
+
valueClass = java.lang.String.java_class
|
370
|
+
else
|
371
|
+
raise "Shoots TWICE!"
|
372
|
+
end
|
373
|
+
setterMethod = getStaticSetterMethod(sourceType, key, valueClass, targetType);
|
374
|
+
end
|
375
|
+
|
376
|
+
if (setterMethod == nil)
|
377
|
+
# Get the property type and attempt to coerce the value to it
|
378
|
+
propertyType = getType(sourceType, key, targetType);
|
379
|
+
|
380
|
+
if (propertyType != nil)
|
381
|
+
setterMethod = getStaticSetterMethod(sourceType, key, propertyType, targetType);
|
382
|
+
value = coerce(value, propertyType);
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
if (setterMethod == nil)
|
387
|
+
raise PropertyNotFoundException.new("Static property \"" + key + "\" does not exist" + " or is read-only.");
|
388
|
+
end
|
389
|
+
|
390
|
+
# Invoke the setter
|
391
|
+
begin
|
392
|
+
rputs target, "#{sourceType.ruby_class.inspect}.set#{key[0].upcase}#{key[1..-1]}(self, #{jit_export(value, value, targetType, key, "#{sourceType.ruby_class.inspect}.#{key}=")})"
|
393
|
+
getStaticSetterMethod(sourceType, key, valueClass, targetType, true).call(target.java_object, value);
|
394
|
+
rescue InvocationTargetException => exception
|
395
|
+
raise "RuntimeException.new(exception);"
|
396
|
+
rescue IllegalAccessException => exception
|
397
|
+
raise " RuntimeException.new(exception);"
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
# /**
|
402
|
+
# * Tests the existence of a static property.
|
403
|
+
# *
|
404
|
+
# * @param sourceType
|
405
|
+
# * The class that defines the property.
|
406
|
+
# *
|
407
|
+
# * @param key
|
408
|
+
# * The property name.
|
409
|
+
# *
|
410
|
+
# * @param targetType
|
411
|
+
# * The type of the object to which the property applies.
|
412
|
+
# *
|
413
|
+
# * @return
|
414
|
+
# * <tt>true</tt> if the property exists; <tt>false</tt>, otherwise.
|
415
|
+
# */
|
416
|
+
def self.isDefined( sourceType, key, targetType)
|
417
|
+
return (getStaticGetterMethod(sourceType, key, targetType) != nil);
|
418
|
+
end
|
419
|
+
|
420
|
+
# /**
|
421
|
+
# * Returns the type of a static property.
|
422
|
+
# *
|
423
|
+
# * @param sourceType
|
424
|
+
# * The class that defines the property.
|
425
|
+
# *
|
426
|
+
# * @param key
|
427
|
+
# * The property name.
|
428
|
+
# *
|
429
|
+
# * @param targetType
|
430
|
+
# * The type of the object to which the property applies.
|
431
|
+
# */
|
432
|
+
def self.getType(sourceType, key, targetType)
|
433
|
+
getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
434
|
+
return (getterMethod == nil) ? nil : getterMethod.return_type();
|
435
|
+
end
|
436
|
+
|
437
|
+
# /**
|
438
|
+
# * Returns the generic type of a static property.
|
439
|
+
# *
|
440
|
+
# * @param sourceType
|
441
|
+
# * The class that defines the property.
|
442
|
+
# *
|
443
|
+
# * @param key
|
444
|
+
# * The property name.
|
445
|
+
# *
|
446
|
+
# * @param targetType
|
447
|
+
# * The type of the object to which the property applies.
|
448
|
+
# */
|
449
|
+
def self.getGenericType( sourceType, key, targetType)
|
450
|
+
Method getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
451
|
+
return (getterMethod == nil) ? nil : getterMethod.getGenericReturnType();
|
452
|
+
end
|
453
|
+
|
454
|
+
# /**
|
455
|
+
# * Determines the type of a list item.
|
456
|
+
# *
|
457
|
+
# * @param listType
|
458
|
+
# */
|
459
|
+
def self.getListItemType(listType)
|
460
|
+
itemType = getGenericListItemType(listType);
|
461
|
+
|
462
|
+
if (itemType.is_a? ParameterizedType)
|
463
|
+
itemType = (itemType).getRawType();
|
464
|
+
end
|
465
|
+
return itemType;
|
466
|
+
end
|
467
|
+
|
468
|
+
# /**
|
469
|
+
# * Determines the type of a map value.
|
470
|
+
# *
|
471
|
+
# * @param listType
|
472
|
+
# */
|
473
|
+
def self.getMapValueType( mapType)
|
474
|
+
valueType = getGenericMapValueType(mapType);
|
475
|
+
|
476
|
+
if (valueType.is_a? ParameterizedType)
|
477
|
+
valueType = (valueType).getRawType();
|
478
|
+
end
|
479
|
+
|
480
|
+
return valueType;
|
481
|
+
end
|
482
|
+
|
483
|
+
# /**
|
484
|
+
# * Determines the type of a list item.
|
485
|
+
# *
|
486
|
+
# * @param listType
|
487
|
+
# */
|
488
|
+
def self.getGenericListItemType(listType)
|
489
|
+
itemType = nil;
|
490
|
+
|
491
|
+
parentType = listType;
|
492
|
+
while (parentType != nil)
|
493
|
+
if (parentType.is_a? ParameterizedType)
|
494
|
+
parameterizedType = parentType;
|
495
|
+
rawType = parameterizedType.getRawType();
|
496
|
+
if (List.java_class.assignable_from?(rawType))
|
497
|
+
itemType = parameterizedType.getActualTypeArguments()[0];
|
498
|
+
end
|
499
|
+
|
500
|
+
break;
|
501
|
+
end
|
502
|
+
|
503
|
+
classType = parentType;
|
504
|
+
genericInterfaces = classType.generic_interfaces();
|
505
|
+
|
506
|
+
genericInterfaces.each do |genericInterface|
|
507
|
+
if (genericInterface.is_a? ParameterizedType)
|
508
|
+
parameterizedType = genericInterface;
|
509
|
+
interfaceType = parameterizedType.getRawType();
|
510
|
+
if (List.java_class.assignable_from?(interfaceType.java_class)) || (List.java_class.assignable_from?(interfaceType.java_object))
|
511
|
+
itemType = parameterizedType.getActualTypeArguments()[0];
|
512
|
+
break;
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
if (itemType != nil)
|
518
|
+
break;
|
519
|
+
end
|
520
|
+
|
521
|
+
parentType = classType.generic_superclass();
|
522
|
+
end
|
523
|
+
|
524
|
+
if (itemType != nil && itemType.is_a?(java.lang.reflect.TypeVariable))
|
525
|
+
itemType = Java::java.lang.Object.java_class;
|
526
|
+
end
|
527
|
+
|
528
|
+
return itemType;
|
529
|
+
end
|
530
|
+
|
531
|
+
# /**
|
532
|
+
# * Determines the type of a map value.
|
533
|
+
# *
|
534
|
+
# * @param mapType
|
535
|
+
# */
|
536
|
+
def self.getGenericMapValueType( mapType)
|
537
|
+
valueType = nil;
|
538
|
+
|
539
|
+
parentType = mapType;
|
540
|
+
while (parentType != nil)
|
541
|
+
if (parentType.is_a? ParameterizedType)
|
542
|
+
parameterizedType = parentType;
|
543
|
+
rawType = parameterizedType.getRawType();
|
544
|
+
|
545
|
+
if (java.util.Map.java_class.assignable_from?(rawType))
|
546
|
+
valueType = parameterizedType.getActualTypeArguments()[1];
|
547
|
+
end
|
548
|
+
|
549
|
+
break;
|
550
|
+
end
|
551
|
+
|
552
|
+
classType = parentType;
|
553
|
+
genericInterfaces = classType.getGenericInterfaces();
|
554
|
+
|
555
|
+
genericInterfaces.each do |genericInterface|
|
556
|
+
|
557
|
+
if (genericInterface.is_a? ParameterizedType)
|
558
|
+
parameterizedType = genericInterface;
|
559
|
+
interfaceType = parameterizedType.getRawType();
|
560
|
+
|
561
|
+
if (java.util.Map.java_class.assignable_from?(interfaceType))
|
562
|
+
valueType = parameterizedType.getActualTypeArguments()[1];
|
563
|
+
break;
|
564
|
+
end
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
if (valueType != nil)
|
569
|
+
break;
|
570
|
+
end
|
571
|
+
|
572
|
+
parentType = classType.getGenericSuperclass();
|
573
|
+
end
|
574
|
+
|
575
|
+
if valueType != nil && valueType.is_a?(TypeVariable)
|
576
|
+
valueType = Java::java.lang.Object.java_class;
|
577
|
+
end
|
578
|
+
|
579
|
+
return valueType;
|
580
|
+
end
|
581
|
+
|
582
|
+
# /**
|
583
|
+
# * Returns the value of a named constant.
|
584
|
+
# *
|
585
|
+
# * @param type
|
586
|
+
# * The type that defines the constant.
|
587
|
+
# *
|
588
|
+
# * @param name
|
589
|
+
# * The name of the constant.
|
590
|
+
# */
|
591
|
+
def self.getConstantValue( type, name)
|
592
|
+
if (type == nil)
|
593
|
+
raise IllegalArgumentException.new();
|
594
|
+
end
|
595
|
+
|
596
|
+
if (name == nil)
|
597
|
+
raise IllegalArgumentException.new();
|
598
|
+
end
|
599
|
+
|
600
|
+
field = nil
|
601
|
+
begin
|
602
|
+
field = FieldUtil.getField(type, name);
|
603
|
+
rescue NoSuchFieldException => exception
|
604
|
+
raise IllegalArgumentException.new(exception);
|
605
|
+
end
|
606
|
+
|
607
|
+
int fieldModifiers = field.modifiers();
|
608
|
+
if ((fieldModifiers & Modifier.STATIC) == 0 || (fieldModifiers & Modifier.FINAL) == 0)
|
609
|
+
raise IllegalArgumentException.new("Field is not a constant.");
|
610
|
+
end
|
611
|
+
|
612
|
+
value = nil
|
613
|
+
begin
|
614
|
+
value = field.get(nil);
|
615
|
+
rescue IllegalAccessException => exception
|
616
|
+
raise IllegalArgumentException.new(exception);
|
617
|
+
end
|
618
|
+
|
619
|
+
return value;
|
620
|
+
end
|
621
|
+
|
622
|
+
def self.getStaticGetterMethod( sourceType, key, targetType)
|
623
|
+
if (sourceType == nil)
|
624
|
+
raise ArgumentError.new();
|
625
|
+
end
|
626
|
+
|
627
|
+
if (key == nil)
|
628
|
+
raise ArgumentError.new();
|
629
|
+
end
|
630
|
+
|
631
|
+
method = nil;
|
632
|
+
|
633
|
+
if (targetType != nil)
|
634
|
+
key = key[0].upcase + key[1..-1];
|
635
|
+
|
636
|
+
getMethodName = GET_PREFIX + key;
|
637
|
+
isMethodName = IS_PREFIX + key;
|
638
|
+
|
639
|
+
begin
|
640
|
+
method = MethodUtil.getMethod(sourceType, getMethodName, [ targetType ]);
|
641
|
+
rescue NoSuchMethodException => exception
|
642
|
+
# No-op
|
643
|
+
end
|
644
|
+
|
645
|
+
if (method == nil)
|
646
|
+
begin
|
647
|
+
method = MethodUtil.getMethod(sourceType, isMethodName, [targetType ]);
|
648
|
+
rescue NoSuchMethodException => exception
|
649
|
+
# No-op
|
650
|
+
end
|
651
|
+
end
|
652
|
+
|
653
|
+
# Check for interfaces
|
654
|
+
if (method == nil)
|
655
|
+
interfaces = targetType.interfaces();
|
656
|
+
interfaces.length.times do |i|
|
657
|
+
begin
|
658
|
+
method = MethodUtil.getMethod(sourceType, getMethodName, [ interfaces[i] ]);
|
659
|
+
rescue NoSuchMethodException => exception
|
660
|
+
# No-op
|
661
|
+
end
|
662
|
+
|
663
|
+
if (method == nil)
|
664
|
+
begin
|
665
|
+
method = MethodUtil.getMethod(sourceType, isMethodName, [interfaces[i]] );
|
666
|
+
rescue NoSuchMethodException => exception
|
667
|
+
# No-op
|
668
|
+
end
|
669
|
+
end
|
670
|
+
|
671
|
+
if (method != nil)
|
672
|
+
break;
|
673
|
+
end
|
674
|
+
end
|
675
|
+
end
|
676
|
+
|
677
|
+
if (method == nil)
|
678
|
+
method = getStaticGetterMethod(sourceType, key, targetType.superclass());
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
return method;
|
683
|
+
end
|
684
|
+
|
685
|
+
def self.getStaticSetterMethod( sourceType, key,
|
686
|
+
valueType, targetType, rubify=false)
|
687
|
+
if (sourceType == nil)
|
688
|
+
raise "NULL PTR"
|
689
|
+
end
|
690
|
+
|
691
|
+
if (key == nil)
|
692
|
+
raise "NULL PTR"
|
693
|
+
end
|
694
|
+
|
695
|
+
if (valueType == nil)
|
696
|
+
dputs caller
|
697
|
+
dp sourceType, key, valueType, targetType, rubify
|
698
|
+
raise "NULL PTR"
|
699
|
+
end
|
700
|
+
|
701
|
+
method = nil;
|
702
|
+
|
703
|
+
if (targetType != nil)
|
704
|
+
key = key[0].upcase + key[1..-1];
|
705
|
+
|
706
|
+
setMethodName = SET_PREFIX + key;
|
707
|
+
begin
|
708
|
+
unless rubify
|
709
|
+
method = MethodUtil.getMethod(sourceType, setMethodName,[ targetType, valueType ]);
|
710
|
+
else
|
711
|
+
method = sourceType.ruby_class.method(setMethodName)
|
712
|
+
end
|
713
|
+
rescue NoSuchMethodException => exception
|
714
|
+
# No-op
|
715
|
+
end
|
716
|
+
|
717
|
+
# Check for interfaces
|
718
|
+
if (method == nil)
|
719
|
+
interfaces = targetType.interfaces();
|
720
|
+
interfaces.length.times do |i|
|
721
|
+
begin
|
722
|
+
method = MethodUtil.getMethod(sourceType, setMethodName, [ interfaces[i], valueType ]);
|
723
|
+
rescue NoSuchMethodException => exception
|
724
|
+
# No-op
|
725
|
+
end
|
726
|
+
|
727
|
+
if (method != nil)
|
728
|
+
break;
|
729
|
+
end
|
730
|
+
end
|
731
|
+
end
|
732
|
+
|
733
|
+
if (method == nil)
|
734
|
+
method = getStaticSetterMethod(sourceType, key, valueType, targetType.superclass());
|
735
|
+
end
|
736
|
+
end
|
737
|
+
|
738
|
+
return method;
|
739
|
+
end
|
740
|
+
|
741
|
+
def self.toAllCaps(value)
|
742
|
+
if (value == nil)
|
743
|
+
|
744
|
+
raise "NULL PTR"
|
745
|
+
end
|
746
|
+
|
747
|
+
allCapsBuilder = Java.java.lang.StringBuilder.new();
|
748
|
+
|
749
|
+
value.length.times do |i|
|
750
|
+
c = value[(i)];
|
751
|
+
|
752
|
+
if (c.upcase == c)
|
753
|
+
allCapsBuilder.append('_');
|
754
|
+
end
|
755
|
+
|
756
|
+
allCapsBuilder.append(c.upcase);
|
757
|
+
end
|
758
|
+
|
759
|
+
return allCapsBuilder.toString();
|
760
|
+
end
|
761
|
+
|
762
|
+
def self.for(names)
|
763
|
+
if names.is_a? java.lang.Object or (names.is_a? Java::JavaObject and (names = names.to_java))
|
764
|
+
RubyWrapperBeanAdapter.new(names)
|
765
|
+
else
|
766
|
+
RubyObjectWrapperBeanAdapter.new(names)
|
767
|
+
end
|
768
|
+
end
|
769
|
+
end
|