jrubyfx-fxmlloader 0.2-java → 0.3-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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)
|