jrubyfx-fxmlloader 0.2-java → 0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/README +15 -3
- data/Rakefile +1 -1
- data/lib/FXMLLoader-j8.jar +0 -0
- data/lib/fxmlloader/elts.rb +68 -59
- data/lib/fxmlloader/fxml_jit_info.rb +158 -0
- data/lib/fxmlloader/j8_expression_value.rb +148 -101
- data/lib/fxmlloader/real_elts.rb +195 -184
- data/lib/fxmlloader/rorba.rb +3 -29
- data/lib/fxmlloader/rrba.rb +161 -399
- data/lib/fxmlloader/value_elts.rb +13 -23
- data/lib/jrubyfx-fxmlloader.rb +240 -124
- metadata +6 -5
data/lib/fxmlloader/rorba.rb
CHANGED
@@ -24,31 +24,6 @@
|
|
24
24
|
*/
|
25
25
|
=end
|
26
26
|
|
27
|
-
#package com.sun.javafx.fxml;
|
28
|
-
#
|
29
|
-
#import java.lang.reflect.InvocationTargetException;
|
30
|
-
#import java.lang.reflect.Method;
|
31
|
-
#import java.lang.reflect.Modifier;
|
32
|
-
#import java.lang.reflect.ParameterizedType;
|
33
|
-
#import java.lang.reflect.Type;
|
34
|
-
#import java.lang.reflect.TypeVariable;
|
35
|
-
#import java.math.BigDecimal;
|
36
|
-
#import java.math.BigInteger;
|
37
|
-
#import java.util.AbstractMap;
|
38
|
-
#import java.util.Arrays;
|
39
|
-
#import java.util.HashMap;
|
40
|
-
#import java.util.LinkedList;
|
41
|
-
#import java.util.List;
|
42
|
-
#import java.util.Map;
|
43
|
-
#import java.util.Set;
|
44
|
-
#
|
45
|
-
#import java.lang.reflect.*;
|
46
|
-
#
|
47
|
-
#import javafx.@beans.value.ObservableValue;
|
48
|
-
#import sun.reflect.misc.FieldUtil;
|
49
|
-
#import sun.reflect.misc.MethodUtil;
|
50
|
-
#import sun.reflect.misc.ReflectUtil;
|
51
|
-
|
52
27
|
#/**
|
53
28
|
# * Exposes Java Bean properties of an object via the {@link Mapend interface.
|
54
29
|
# * A call to {@link Map#get(Object)end invokes the getter for the corresponding
|
@@ -93,9 +68,8 @@ class RubyObjectWrapperBeanAdapter
|
|
93
68
|
def [](key)
|
94
69
|
return @bean.send("get#{key[0].upcase}#{key[1..-1]}")
|
95
70
|
end
|
96
|
-
|
71
|
+
|
97
72
|
def []=(key, value)
|
98
|
-
dputs "calling setterrorab"
|
99
73
|
if (key == nil)
|
100
74
|
raise "NULL PTR"
|
101
75
|
end
|
@@ -111,14 +85,14 @@ class RubyObjectWrapperBeanAdapter
|
|
111
85
|
end
|
112
86
|
@bean.methods.include? "set#{key[0].upcase}#{key[1..-1]}"
|
113
87
|
end
|
114
|
-
|
88
|
+
|
115
89
|
def getType(key)
|
116
90
|
if (key == nil)
|
117
91
|
raise ArgumentError.new();
|
118
92
|
end
|
119
93
|
@bean.send(key + "GetType")
|
120
94
|
end
|
121
|
-
|
95
|
+
|
122
96
|
def getPropertyModel(key)
|
123
97
|
if (key == nil)
|
124
98
|
raise ArgumentError.new();
|
data/lib/fxmlloader/rrba.rb
CHANGED
@@ -32,10 +32,8 @@
|
|
32
32
|
# * corresponding property model.
|
33
33
|
# */
|
34
34
|
class RubyWrapperBeanAdapter
|
35
|
-
# private final Object @bean;
|
36
35
|
|
37
|
-
|
38
|
-
@@globalMethodCache = {}
|
36
|
+
@@method_cache = {}
|
39
37
|
|
40
38
|
GET_PREFIX = "get"
|
41
39
|
IS_PREFIX = "is"
|
@@ -44,337 +42,235 @@ class RubyWrapperBeanAdapter
|
|
44
42
|
|
45
43
|
VALUE_OF_METHOD_NAME = "valueOf"
|
46
44
|
|
47
|
-
|
48
|
-
# contextClassLoader = Thread.currentThread().getContextClassLoader();
|
49
|
-
#
|
50
|
-
# if (contextClassLoader == nil)
|
51
|
-
# raise ArgumentError.new();
|
52
|
-
# end
|
53
|
-
# end
|
45
|
+
OBJECT_PUBLIC_METHODS = Object.new.public_methods
|
54
46
|
|
55
|
-
#Creates a Bean.new adapter.
|
56
|
-
#
|
57
47
|
#@param @bean
|
58
48
|
#The Bean object to wrap.
|
59
49
|
def initialize(bean)
|
60
|
-
@bean = bean
|
61
|
-
|
50
|
+
@bean = bean
|
62
51
|
type = @bean.java_class
|
63
|
-
|
64
|
-
while
|
65
|
-
|
66
|
-
type = type.superclass
|
67
|
-
end
|
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
68
|
end
|
69
69
|
|
70
|
-
def
|
71
|
-
|
70
|
+
def build_cache_for(type)
|
71
|
+
class_methods = {}
|
72
72
|
|
73
|
-
ReflectUtil.checkPackageAccess(type)
|
74
|
-
declaredMethods = type.declared_instance_methods();
|
75
|
-
declaredMethods.each do |method|
|
76
|
-
modifiers = method.modifiers();
|
77
|
-
|
78
|
-
if (Modifier.public?(modifiers) && !Modifier.static?(modifiers))
|
79
|
-
name = method.name();
|
80
|
-
namedMethods = classMethodCache[name]
|
81
|
-
|
82
|
-
if (namedMethods == nil)
|
83
|
-
namedMethods = []
|
84
|
-
classMethodCache[name] = namedMethods
|
85
|
-
end
|
73
|
+
ReflectUtil.checkPackageAccess(type) # TODO: do I want this ?
|
86
74
|
|
87
|
-
|
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
|
88
84
|
end
|
89
85
|
end
|
90
86
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
# /**
|
95
|
-
# * Returns the Bean object this adapter wraps.
|
96
|
-
# *
|
97
|
-
# * @return
|
98
|
-
# * The Bean object, or <tt>nil</tt> if no Bean has been set.
|
99
|
-
# */
|
100
|
-
def getBean()
|
101
|
-
return @bean;
|
87
|
+
@@method_cache[type] = class_methods
|
88
|
+
return java_methods
|
102
89
|
end
|
103
90
|
|
104
|
-
def getMethod(name, *
|
105
|
-
type = @bean.java_class
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
namedMethods = classMethodCache[name]
|
112
|
-
if (namedMethods != nil)
|
113
|
-
for namedMethod in namedMethods
|
114
|
-
if (namedMethod.name() == (name) && namedMethod.parameter_types() == parameterTypes)
|
115
|
-
method = namedMethod;
|
116
|
-
break;
|
117
|
-
end
|
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
|
118
97
|
end
|
119
98
|
end
|
120
|
-
|
121
|
-
if (method != nil)
|
122
|
-
break;
|
123
|
-
end
|
124
|
-
type = type.superclass();
|
99
|
+
type = type.superclass
|
125
100
|
end
|
126
|
-
|
127
|
-
return method;
|
101
|
+
return nil
|
128
102
|
end
|
129
103
|
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
getterMethod = getMethod(getMethodName(IS_PREFIX, key));
|
135
|
-
end
|
136
|
-
|
137
|
-
return getterMethod;
|
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)
|
138
108
|
end
|
139
109
|
|
140
|
-
def
|
141
|
-
type = getType(key)
|
142
|
-
|
143
|
-
|
144
|
-
raise UnsupportedOperationException.new("Cannot determine type for property.");
|
145
|
-
end
|
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
|
146
114
|
|
147
|
-
|
115
|
+
def method_name(prefix, key)
|
116
|
+
return prefix + camelize(key)
|
148
117
|
end
|
149
118
|
|
150
|
-
def
|
151
|
-
|
119
|
+
def camelize(key)
|
120
|
+
key[0].upcase + key[1..-1]
|
152
121
|
end
|
153
122
|
|
154
123
|
def [](key)
|
155
124
|
key = key.to_s
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
166
135
|
end
|
167
|
-
|
168
|
-
|
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
|
169
143
|
end
|
170
|
-
|
171
|
-
return value;
|
172
144
|
end
|
173
145
|
|
174
|
-
# /**
|
175
|
-
# * Invokes a setter method for the given property. The
|
176
|
-
# * {@link #coerce(Object, Class)end method is used as needed to attempt to
|
177
|
-
# * convert a given value to the property type, as defined by the return
|
178
|
-
# * value of the getter method.
|
179
|
-
# *
|
180
|
-
# * @param key
|
181
|
-
# * The property name.
|
182
|
-
# *
|
183
|
-
# * @param value
|
184
|
-
# * The property.new value.
|
185
|
-
# *
|
186
|
-
# * @return
|
187
|
-
# * Returns <tt>nil</tt>, since returning the previous value would require
|
188
|
-
# * an unnecessary call to the getter method.
|
189
|
-
# *
|
190
|
-
# * @throws PropertyNotFoundException
|
191
|
-
# * If the given property does not exist or is read-only.
|
192
|
-
# */
|
193
|
-
# @Override
|
194
146
|
def []=(key, value)
|
195
|
-
|
196
|
-
if (key == nil)
|
197
|
-
raise "NULL PTR"
|
198
|
-
end
|
147
|
+
raise "NULL PTR" unless key
|
199
148
|
|
200
|
-
|
149
|
+
setter = method_name(SET_PREFIX, key)
|
201
150
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
setterMethod.invoke(@bean, co );
|
212
|
-
rescue IllegalAccessException => exception
|
213
|
-
dp "issues1"
|
214
|
-
dp exception
|
215
|
-
raise "RuntimeException.new(exception);"
|
216
|
-
rescue InvocationTargetException => exception
|
217
|
-
dp "issues2"
|
218
|
-
dp exception
|
219
|
-
raise R"untimeException.new(exception);"
|
220
|
-
end
|
221
|
-
dputs "eone"
|
222
|
-
return nil;
|
223
|
-
end
|
224
|
-
|
225
|
-
# /**
|
226
|
-
# * Verifies the existence of a property.
|
227
|
-
# *
|
228
|
-
# * @param key
|
229
|
-
# * The property name.
|
230
|
-
# *
|
231
|
-
# * @return
|
232
|
-
# * <tt>true</tt> if the property exists; <tt>false</tt>, otherwise.
|
233
|
-
# */
|
234
|
-
# @Override
|
235
|
-
def has_key?( key)
|
236
|
-
if (key == nil)
|
237
|
-
raise "NULL PTR"
|
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)
|
238
160
|
end
|
239
|
-
|
240
|
-
return getType(key.to_s) != nil;
|
161
|
+
co
|
241
162
|
end
|
242
163
|
|
243
|
-
def
|
244
|
-
raise
|
164
|
+
def has_key?(key)
|
165
|
+
raise "NULL PTR" unless key
|
166
|
+
getType(key.to_s)
|
245
167
|
end
|
246
168
|
|
247
|
-
# /**
|
248
|
-
# * Tests the mutability of a property.
|
249
|
-
# *
|
250
|
-
# * @param key
|
251
|
-
# * The property name.
|
252
|
-
# *
|
253
|
-
# * @return
|
254
|
-
# * <tt>true</tt> if the property is read-only; <tt>false</tt>, otherwise.
|
255
|
-
# */
|
256
169
|
def read_only?(key)
|
257
|
-
|
258
|
-
raise "NULL PTR"
|
259
|
-
end
|
260
|
-
dputs "checking for readonly-ness of #{key}:"
|
261
|
-
dp getSetterMethod(key)
|
262
|
-
return getSetterMethod(key) == nil;
|
170
|
+
setter(key) == nil
|
263
171
|
end
|
264
172
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
# * @param key
|
269
|
-
# * The property name.
|
270
|
-
# *
|
271
|
-
# * @return
|
272
|
-
# * The named property model, or <tt>nil</tt> if no such property exists.
|
273
|
-
# */
|
274
|
-
# @SuppressWarnings("unchecked")
|
275
|
-
def getPropertyModel( key)
|
276
|
-
if (key == nil)
|
277
|
-
raise ArgumentError.new();
|
278
|
-
end
|
279
|
-
|
280
|
-
return self[key + PROPERTY_SUFFIX]
|
173
|
+
def getPropertyModel(key)
|
174
|
+
raise ArgumentError.new unless key
|
175
|
+
self[key + PROPERTY_SUFFIX]
|
281
176
|
end
|
282
177
|
|
283
|
-
# /**
|
284
|
-
# * Returns the type of a property.
|
285
|
-
# *
|
286
|
-
# * @param key
|
287
|
-
# * The property name.
|
288
|
-
# */
|
289
178
|
def getType(key)
|
290
|
-
|
291
|
-
|
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
|
292
185
|
end
|
293
|
-
|
294
|
-
getterMethod = getGetterMethod(key);
|
295
|
-
|
296
|
-
return (getterMethod == nil) ? nil : getterMethod.return_type();
|
297
186
|
end
|
298
187
|
|
299
|
-
|
300
|
-
# * Returns the generic type of a property.
|
301
|
-
# *
|
302
|
-
# * @param key
|
303
|
-
# * The property name.
|
304
|
-
# */
|
305
|
-
def getGenericType(key)
|
306
|
-
if (key == nil)
|
307
|
-
raise ArgumentError.new();
|
308
|
-
end
|
309
|
-
|
310
|
-
getterMethod = getGetterMethod(key);
|
311
|
-
dputs "GOt getter method for #{key}"
|
312
|
-
dp getterMethod
|
313
|
-
dputs getterMethod
|
314
|
-
|
315
|
-
return (getterMethod == nil) ? nil : getterMethod.return_type
|
316
|
-
end
|
188
|
+
alias :getGenericType :getType
|
317
189
|
|
318
190
|
def coerce(value, type)
|
319
191
|
RubyWrapperBeanAdapter.coerce(value, type)
|
320
192
|
end
|
321
|
-
# /**
|
322
|
-
# * Coerces a value to a given type.
|
323
|
-
# *
|
324
|
-
# * @param value
|
325
|
-
# * @param type
|
326
|
-
# *
|
327
|
-
# * @return
|
328
|
-
# * The coerced value.
|
329
|
-
# */
|
330
|
-
# @SuppressWarnings("unchecked")
|
331
|
-
def self.coerce( value, type)
|
332
|
-
dputs "coercing..."
|
333
|
-
if (type == nil)
|
334
|
-
dputs "WHAT!"
|
335
|
-
raise "ArgumentError.new();"
|
336
|
-
end
|
337
|
-
if (value.class == Java::JavaObject)
|
338
|
-
dputs "de-objectifying it!!!!"
|
339
|
-
dp value.class
|
340
|
-
dp value.java_class
|
341
|
-
dp value.to_java
|
342
|
-
value = value.to_java
|
343
|
-
end
|
344
193
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
elsif
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
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
|
354
221
|
dir = ->(x){x}
|
355
222
|
to_x = ->(x){->(o){o.send(x)}}
|
356
223
|
to_dbl = ->(x){java.lang.Double.valueOf(x.to_s)}
|
357
224
|
to_bool = ->(x){java.lang.Boolean.valueOf(x.to_s)}
|
358
|
-
value_of = ->(x){type.ruby_class.valueOf(x.to_s)}
|
225
|
+
value_of = ->(x, type){type.ruby_class.valueOf(x.to_s)}
|
359
226
|
# TODO: Java::double[].java_class.component_type
|
360
|
-
mapper = {
|
227
|
+
@@mapper = {
|
361
228
|
[String, java.lang.String.java_class] => dir,
|
362
229
|
[Fixnum, java.lang.Integer.java_class] => dir,
|
363
230
|
[Float, java.lang.Double.java_class] => dir,
|
364
231
|
[Float, Java::double.java_class] => dir,
|
232
|
+
[FalseClass, Java::boolean.java_class] => dir,
|
233
|
+
[TrueClass, Java::boolean.java_class] => dir,
|
365
234
|
[String, Java::double.java_class] => to_dbl,
|
366
235
|
[String, java.lang.Double.java_class] => to_dbl,
|
367
236
|
[String, Java::int.java_class] => to_x.call(:to_i),
|
368
237
|
[String,java.lang.Integer.java_class] => to_x.call(:to_i),
|
369
238
|
[String, Java::boolean.java_class] => to_bool,
|
370
239
|
[String, Java::javafx.scene.paint.Paint.java_class] => value_of,
|
371
|
-
[String, Java::
|
240
|
+
[String, Java::javafx.scene.paint.Color.java_class] => value_of,
|
241
|
+
[String, Java::java.lang.Object.java_class] => dir,
|
372
242
|
[String, Java::double[].java_class] => ->(x){x.split(/[, ]+/).map(&:to_f)}
|
373
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
|
+
|
374
266
|
if mapper[[value.class, type]]
|
375
|
-
coercedValue = 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
|
376
273
|
else
|
377
|
-
dputs "!! Non-normal RUBY coerce (#{value}, #{type}) (#{value.inspect}, [#{value.class}, #{type.inspect}])"
|
378
274
|
raise "Unknown Coercion map: (#{value}, #{type}) (#{value.inspect}, [#{value.class}, #{type.inspect}]; Please file a bug on this."
|
379
275
|
end
|
380
276
|
# Ruby String :D
|
@@ -390,122 +286,8 @@ class RubyWrapperBeanAdapter
|
|
390
286
|
dputs "COnverting url to string"
|
391
287
|
coercedValue = value.to_s
|
392
288
|
else
|
393
|
-
|
394
|
-
if (type == java.lang.Boolean.java_class || type == Boolean.TYPE)
|
395
|
-
coercedValue = Boolean.valueOf(value.toString());
|
396
|
-
elsif (type == Character.java_class || type == Character.TYPE)
|
397
|
-
coercedValue = value.toString().charAt(0);
|
398
|
-
elsif (type == Byte.java_class || type == Byte.TYPE)
|
399
|
-
if (value.is_a? Number)
|
400
|
-
coercedValue = (value).byteValue();
|
401
|
-
else
|
402
|
-
coercedValue = Byte.valueOf(value.toString());
|
403
|
-
end
|
404
|
-
elsif (type == Short.java_class || type == Short.TYPE)
|
405
|
-
if (value.is_a? Number)
|
406
|
-
coercedValue = (value).shortValue();
|
407
|
-
else
|
408
|
-
coercedValue = Short.valueOf(value.toString());
|
409
|
-
end
|
410
|
-
elsif (type == Integer.java_class || type == Integer.TYPE)
|
411
|
-
if (value.is_a? Number)
|
412
|
-
coercedValue = (value).intValue();
|
413
|
-
else
|
414
|
-
coercedValue = Integer.valueOf(value.toString());
|
415
|
-
end
|
416
|
-
elsif (type == Long.java_class || type == Long.TYPE)
|
417
|
-
if (value.is_a? Number)
|
418
|
-
coercedValue = (value).longValue();
|
419
|
-
else
|
420
|
-
coercedValue = Long.valueOf(value.toString());
|
421
|
-
end
|
422
|
-
elsif (type == BigInteger.java_class)
|
423
|
-
if (value.is_a? Number)
|
424
|
-
coercedValue = BigInteger.valueOf((value).longValue());
|
425
|
-
else
|
426
|
-
coercedValue = BigInteger.new(value.toString());
|
427
|
-
end
|
428
|
-
elsif (type == Float.java_class || type == Float.TYPE)
|
429
|
-
if (value.is_a? Number)
|
430
|
-
coercedValue = (value).floatValue();
|
431
|
-
else
|
432
|
-
coercedValue = Float.valueOf(value.toString());
|
433
|
-
end
|
434
|
-
elsif (type == Double.java_class || type == Double.TYPE)
|
435
|
-
if (value.is_a? Number)
|
436
|
-
coercedValue = (value).doubleValue();
|
437
|
-
else
|
438
|
-
coercedValue = Double.valueOf(value.toString());
|
439
|
-
end
|
440
|
-
elsif (type == Number.java_class)
|
441
|
-
number = value.toString();
|
442
|
-
if (number.contains("."))
|
443
|
-
coercedValue = Double.valueOf(number);
|
444
|
-
else
|
445
|
-
coercedValue = Long.valueOf(number);
|
446
|
-
end
|
447
|
-
elsif (type == BigDecimal.java_class)
|
448
|
-
if (value.is_a? Number)
|
449
|
-
coercedValue = BigDecimal.valueOf((value).doubleValue());
|
450
|
-
else
|
451
|
-
coercedValue = BigDecimal.new(value.toString());
|
452
|
-
end
|
453
|
-
elsif (type == Class.java_class)
|
454
|
-
begin
|
455
|
-
ReflectUtil.checkPackageAccess(value.toString());
|
456
|
-
coercedValue = Class.forName(
|
457
|
-
value.to_s,
|
458
|
-
false,
|
459
|
-
JRuby.runtime.get_class_loader);
|
460
|
-
rescue ClassNotFoundException => exception
|
461
|
-
raise Exception.new(exception);
|
462
|
-
end
|
463
|
-
else
|
464
|
-
dputs "elsee"
|
465
|
-
valueType = value.java_class();
|
466
|
-
valueOfMethod = nil;
|
467
|
-
|
468
|
-
while (valueOfMethod == nil && valueType != nil)
|
469
|
-
begin
|
470
|
-
dputs "checking access"
|
471
|
-
ReflectUtil.checkPackageAccess(type);
|
472
|
-
valueOfMethod = type.declared_method(VALUE_OF_METHOD_NAME, valueType);
|
473
|
-
rescue NoSuchMethodException => exception
|
474
|
-
# No-op
|
475
|
-
end
|
476
|
-
|
477
|
-
if (valueOfMethod == nil)
|
478
|
-
valueType = valueType.superclass();
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
if (valueOfMethod == nil)
|
483
|
-
raise IllegalArgumentException.new("Unable to coerce " + value + " to " + type + ".");
|
484
|
-
end
|
485
|
-
|
486
|
-
if type.isEnum() && value.is_a?(String) && value[0] == value[0].downcase
|
487
|
-
value = RubyWrapperBeansAdapter.toUpcase value;
|
488
|
-
end
|
489
|
-
|
490
|
-
begin
|
491
|
-
coercedValue = MethodUtil.invoke(valueOfMethod, nil, [ value ]);
|
492
|
-
rescue IllegalAccessException => exception
|
493
|
-
dputs "EAI1"
|
494
|
-
dp exception
|
495
|
-
raise "RuntimeException.new(exception);"
|
496
|
-
rescue InvocationTargetException => exception
|
497
|
-
dputs "ETI1"
|
498
|
-
dp exception
|
499
|
-
raise "RuntimeException.new(exception);"
|
500
|
-
rescue SecurityException => exception
|
501
|
-
dputs "SE1"
|
502
|
-
dp exception
|
503
|
-
raise "RuntimeException.new(exception);"
|
504
|
-
end
|
505
|
-
end
|
289
|
+
raise "!! Non-normal coerce (#{value}, #{type}) (#{value.inspect}, #{type.inspect})"
|
506
290
|
end
|
507
|
-
dputs "Coerced #{value.class} into a #{coercedValue.class} for #{type}"
|
508
|
-
dp value, coercedValue
|
509
291
|
return coercedValue;
|
510
292
|
end
|
511
293
|
|
@@ -574,7 +356,6 @@ class RubyWrapperBeanAdapter
|
|
574
356
|
elsif target.is_a? String
|
575
357
|
targetType = java.lang.String.java_class
|
576
358
|
else
|
577
|
-
dp target, sourceType, key, value
|
578
359
|
raise "Shoots!"
|
579
360
|
end
|
580
361
|
|
@@ -587,7 +368,6 @@ class RubyWrapperBeanAdapter
|
|
587
368
|
elsif value.is_a? String
|
588
369
|
valueClass = java.lang.String.java_class
|
589
370
|
else
|
590
|
-
dp target, sourceType, key, value
|
591
371
|
raise "Shoots TWICE!"
|
592
372
|
end
|
593
373
|
setterMethod = getStaticSetterMethod(sourceType, key, valueClass, targetType);
|
@@ -609,6 +389,7 @@ class RubyWrapperBeanAdapter
|
|
609
389
|
|
610
390
|
# Invoke the setter
|
611
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}=")})"
|
612
393
|
getStaticSetterMethod(sourceType, key, valueClass, targetType, true).call(target.java_object, value);
|
613
394
|
rescue InvocationTargetException => exception
|
614
395
|
raise "RuntimeException.new(exception);"
|
@@ -681,8 +462,6 @@ class RubyWrapperBeanAdapter
|
|
681
462
|
if (itemType.is_a? ParameterizedType)
|
682
463
|
itemType = (itemType).getRawType();
|
683
464
|
end
|
684
|
-
dputs "Listem item type is for "
|
685
|
-
dp listType, itemType
|
686
465
|
return itemType;
|
687
466
|
end
|
688
467
|
|
@@ -710,41 +489,26 @@ class RubyWrapperBeanAdapter
|
|
710
489
|
itemType = nil;
|
711
490
|
|
712
491
|
parentType = listType;
|
713
|
-
dputs "searching for generic #{listType}"
|
714
492
|
while (parentType != nil)
|
715
|
-
dputs "Still not nill"
|
716
|
-
dp parentType
|
717
493
|
if (parentType.is_a? ParameterizedType)
|
718
|
-
dputs "Parametratized type!"
|
719
494
|
parameterizedType = parentType;
|
720
495
|
rawType = parameterizedType.getRawType();
|
721
|
-
dp rawType, parameterizedType
|
722
496
|
if (List.java_class.assignable_from?(rawType))
|
723
497
|
itemType = parameterizedType.getActualTypeArguments()[0];
|
724
|
-
dputs "OOOOOHHH item type is #{itemType}"
|
725
|
-
dp itemType
|
726
498
|
end
|
727
499
|
|
728
500
|
break;
|
729
501
|
end
|
730
502
|
|
731
503
|
classType = parentType;
|
732
|
-
dputs "checinhg generic interfaces"
|
733
504
|
genericInterfaces = classType.generic_interfaces();
|
734
505
|
|
735
506
|
genericInterfaces.each do |genericInterface|
|
736
|
-
dputs "serarcing ingeraface"
|
737
|
-
dp genericInterface
|
738
507
|
if (genericInterface.is_a? ParameterizedType)
|
739
508
|
parameterizedType = genericInterface;
|
740
509
|
interfaceType = parameterizedType.getRawType();
|
741
|
-
dputs "checking"
|
742
|
-
dp parameterizedType, interfaceType
|
743
510
|
if (List.java_class.assignable_from?(interfaceType.java_class)) || (List.java_class.assignable_from?(interfaceType.java_object))
|
744
511
|
itemType = parameterizedType.getActualTypeArguments()[0];
|
745
|
-
dputs "found it at "
|
746
|
-
dp parameterizedType, interfaceType, itemType
|
747
|
-
dp itemType.bounds
|
748
512
|
break;
|
749
513
|
end
|
750
514
|
end
|
@@ -758,8 +522,6 @@ class RubyWrapperBeanAdapter
|
|
758
522
|
end
|
759
523
|
|
760
524
|
if (itemType != nil && itemType.is_a?(java.lang.reflect.TypeVariable))
|
761
|
-
dputs 'aww shucks'
|
762
|
-
dp itemType
|
763
525
|
itemType = Java::java.lang.Object.java_class;
|
764
526
|
end
|
765
527
|
|
@@ -996,9 +758,9 @@ class RubyWrapperBeanAdapter
|
|
996
758
|
|
997
759
|
return allCapsBuilder.toString();
|
998
760
|
end
|
999
|
-
|
761
|
+
|
1000
762
|
def self.for(names)
|
1001
|
-
if names.is_a? java.lang.Object
|
763
|
+
if names.is_a? java.lang.Object or (names.is_a? Java::JavaObject and (names = names.to_java))
|
1002
764
|
RubyWrapperBeanAdapter.new(names)
|
1003
765
|
else
|
1004
766
|
RubyObjectWrapperBeanAdapter.new(names)
|