jrubyfx-fxmlloader 0.2-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/LICENSE +25 -0
- data/README +5 -0
- data/Rakefile +71 -0
- data/lib/FXMLLoader-j8.jar +0 -0
- data/lib/fxmlloader/elts.rb +564 -0
- data/lib/fxmlloader/j8_expression_value.rb +243 -0
- data/lib/fxmlloader/real_elts.rb +697 -0
- data/lib/fxmlloader/rorba.rb +133 -0
- data/lib/fxmlloader/rrba.rb +1007 -0
- data/lib/fxmlloader/value_elts.rb +267 -0
- data/lib/jrubyfx-fxmlloader.rb +724 -0
- metadata +57 -0
@@ -0,0 +1,133 @@
|
|
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
|
+
#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
|
+
#/**
|
53
|
+
# * Exposes Java Bean properties of an object via the {@link Mapend interface.
|
54
|
+
# * A call to {@link Map#get(Object)end invokes the getter for the corresponding
|
55
|
+
# * property, and a call to {@link Map#put(Object, Object)end invokes the
|
56
|
+
# * property's setter. Appending a "Property" suffix to the key returns the
|
57
|
+
# * corresponding property model.
|
58
|
+
# */
|
59
|
+
class RubyObjectWrapperBeanAdapter
|
60
|
+
# private final Object @bean;
|
61
|
+
|
62
|
+
|
63
|
+
@@globalMethodCache = {}
|
64
|
+
|
65
|
+
GET_PREFIX = "get"
|
66
|
+
IS_PREFIX = "is"
|
67
|
+
SET_PREFIX = "set"
|
68
|
+
PROPERTY_SUFFIX = "Property"
|
69
|
+
|
70
|
+
VALUE_OF_METHOD_NAME = "valueOf"
|
71
|
+
|
72
|
+
# static
|
73
|
+
# contextClassLoader = Thread.currentThread().getContextClassLoader();
|
74
|
+
#
|
75
|
+
# if (contextClassLoader == nil)
|
76
|
+
# raise ArgumentError.new();
|
77
|
+
# end
|
78
|
+
# end
|
79
|
+
|
80
|
+
#Creates a Bean.new adapter.
|
81
|
+
#
|
82
|
+
#@param @bean
|
83
|
+
#The Bean object to wrap.
|
84
|
+
def initialize(bean)
|
85
|
+
@bean = bean
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def getBean()
|
90
|
+
return @bean;
|
91
|
+
end
|
92
|
+
|
93
|
+
def [](key)
|
94
|
+
return @bean.send("get#{key[0].upcase}#{key[1..-1]}")
|
95
|
+
end
|
96
|
+
|
97
|
+
def []=(key, value)
|
98
|
+
dputs "calling setterrorab"
|
99
|
+
if (key == nil)
|
100
|
+
raise "NULL PTR"
|
101
|
+
end
|
102
|
+
ty = getType(key)
|
103
|
+
co = coerce(value, ty)
|
104
|
+
@bean.send("set#{key[0].upcase}#{key[1..-1]}", co);
|
105
|
+
return nil;
|
106
|
+
end
|
107
|
+
|
108
|
+
def read_only?(key)
|
109
|
+
if (key == nil)
|
110
|
+
raise "NULL PTR"
|
111
|
+
end
|
112
|
+
@bean.methods.include? "set#{key[0].upcase}#{key[1..-1]}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def getType(key)
|
116
|
+
if (key == nil)
|
117
|
+
raise ArgumentError.new();
|
118
|
+
end
|
119
|
+
@bean.send(key + "GetType")
|
120
|
+
end
|
121
|
+
|
122
|
+
def getPropertyModel(key)
|
123
|
+
if (key == nil)
|
124
|
+
raise ArgumentError.new();
|
125
|
+
end
|
126
|
+
|
127
|
+
return @bean.send("#{key}Property")
|
128
|
+
end
|
129
|
+
|
130
|
+
def coerce(value, type)
|
131
|
+
RubyWrapperBeanAdapter.coerce(value, type)
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,1007 @@
|
|
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
|
+
# private final Object @bean;
|
36
|
+
|
37
|
+
|
38
|
+
@@globalMethodCache = {}
|
39
|
+
|
40
|
+
GET_PREFIX = "get"
|
41
|
+
IS_PREFIX = "is"
|
42
|
+
SET_PREFIX = "set"
|
43
|
+
PROPERTY_SUFFIX = "Property"
|
44
|
+
|
45
|
+
VALUE_OF_METHOD_NAME = "valueOf"
|
46
|
+
|
47
|
+
# static
|
48
|
+
# contextClassLoader = Thread.currentThread().getContextClassLoader();
|
49
|
+
#
|
50
|
+
# if (contextClassLoader == nil)
|
51
|
+
# raise ArgumentError.new();
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
|
55
|
+
#Creates a Bean.new adapter.
|
56
|
+
#
|
57
|
+
#@param @bean
|
58
|
+
#The Bean object to wrap.
|
59
|
+
def initialize(bean)
|
60
|
+
@bean = bean;
|
61
|
+
|
62
|
+
type = @bean.java_class
|
63
|
+
|
64
|
+
while (type != Java.java.lang.Object.java_class && !@@globalMethodCache.has_key?(type))
|
65
|
+
@@globalMethodCache[type] = getClassMethodCache(type)
|
66
|
+
type = type.superclass();
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def getClassMethodCache(type)
|
71
|
+
classMethodCache = {}
|
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
|
86
|
+
|
87
|
+
namedMethods << (method)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
return classMethodCache;
|
92
|
+
end
|
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;
|
102
|
+
end
|
103
|
+
|
104
|
+
def getMethod(name, *parameterTypes)
|
105
|
+
type = @bean.java_class();
|
106
|
+
|
107
|
+
method = nil;
|
108
|
+
while (type != Java::java.lang.Object.java_class)
|
109
|
+
classMethodCache = @@globalMethodCache[(type)] || {}
|
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
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
if (method != nil)
|
122
|
+
break;
|
123
|
+
end
|
124
|
+
type = type.superclass();
|
125
|
+
end
|
126
|
+
|
127
|
+
return method;
|
128
|
+
end
|
129
|
+
|
130
|
+
def getGetterMethod( key)
|
131
|
+
getterMethod = getMethod(getMethodName(GET_PREFIX, key));
|
132
|
+
|
133
|
+
if (getterMethod == nil)
|
134
|
+
getterMethod = getMethod(getMethodName(IS_PREFIX, key));
|
135
|
+
end
|
136
|
+
|
137
|
+
return getterMethod;
|
138
|
+
end
|
139
|
+
|
140
|
+
def getSetterMethod( key)
|
141
|
+
type = getType(key);
|
142
|
+
|
143
|
+
if (type == nil)
|
144
|
+
raise UnsupportedOperationException.new("Cannot determine type for property.");
|
145
|
+
end
|
146
|
+
|
147
|
+
return getMethod(getMethodName(SET_PREFIX, key), type)
|
148
|
+
end
|
149
|
+
|
150
|
+
def getMethodName(prefix, key)
|
151
|
+
return prefix + key[0].upcase + key[1..-1];
|
152
|
+
end
|
153
|
+
|
154
|
+
def [](key)
|
155
|
+
key = key.to_s
|
156
|
+
getterMethod = key.end_with?(PROPERTY_SUFFIX) ? getMethod(key) : getGetterMethod(key);
|
157
|
+
|
158
|
+
value = nil
|
159
|
+
if (getterMethod != nil)
|
160
|
+
begin
|
161
|
+
value = getterMethod.invoke @bean
|
162
|
+
rescue IllegalAccessException => exception
|
163
|
+
raise RuntimeException.new(exception);
|
164
|
+
rescue InvocationTargetException => exception
|
165
|
+
raise RuntimeException.new(exception);
|
166
|
+
end
|
167
|
+
else
|
168
|
+
value = nil;
|
169
|
+
end
|
170
|
+
|
171
|
+
return value;
|
172
|
+
end
|
173
|
+
|
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
|
+
def []=(key, value)
|
195
|
+
dputs "calling setter"
|
196
|
+
if (key == nil)
|
197
|
+
raise "NULL PTR"
|
198
|
+
end
|
199
|
+
|
200
|
+
setterMethod = getSetterMethod(key);
|
201
|
+
|
202
|
+
if (setterMethod == nil)
|
203
|
+
dputs caller
|
204
|
+
dputs "error in []=!"
|
205
|
+
dp key, value, @bean
|
206
|
+
raise PropertyNotFoundException.new("Property \"" + key + "\" does not exist" + " or is read-only.");
|
207
|
+
end
|
208
|
+
begin
|
209
|
+
ty = getType(key)
|
210
|
+
co = coerce(value, ty)
|
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"
|
238
|
+
end
|
239
|
+
|
240
|
+
return getType(key.to_s) != nil;
|
241
|
+
end
|
242
|
+
|
243
|
+
def entrySet()
|
244
|
+
raise UnsupportedOperationException.new();
|
245
|
+
end
|
246
|
+
|
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
|
+
def read_only?(key)
|
257
|
+
if (key == nil)
|
258
|
+
raise "NULL PTR"
|
259
|
+
end
|
260
|
+
dputs "checking for readonly-ness of #{key}:"
|
261
|
+
dp getSetterMethod(key)
|
262
|
+
return getSetterMethod(key) == nil;
|
263
|
+
end
|
264
|
+
|
265
|
+
# /**
|
266
|
+
# * Returns the property model for the given property.
|
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]
|
281
|
+
end
|
282
|
+
|
283
|
+
# /**
|
284
|
+
# * Returns the type of a property.
|
285
|
+
# *
|
286
|
+
# * @param key
|
287
|
+
# * The property name.
|
288
|
+
# */
|
289
|
+
def getType(key)
|
290
|
+
if (key == nil)
|
291
|
+
raise ArgumentError.new();
|
292
|
+
end
|
293
|
+
|
294
|
+
getterMethod = getGetterMethod(key);
|
295
|
+
|
296
|
+
return (getterMethod == nil) ? nil : getterMethod.return_type();
|
297
|
+
end
|
298
|
+
|
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
|
317
|
+
|
318
|
+
def coerce(value, type)
|
319
|
+
RubyWrapperBeanAdapter.coerce(value, type)
|
320
|
+
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
|
+
|
345
|
+
coercedValue = nil;
|
346
|
+
if (value == nil)
|
347
|
+
# Null values can only be coerced to nil
|
348
|
+
coercedValue = nil;
|
349
|
+
elsif (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))
|
350
|
+
# Value doesn't require coercion
|
351
|
+
coercedValue = value;
|
352
|
+
elsif !value.respond_to?(:java_class) && !type.enum?
|
353
|
+
# its a ruby value
|
354
|
+
dir = ->(x){x}
|
355
|
+
to_x = ->(x){->(o){o.send(x)}}
|
356
|
+
to_dbl = ->(x){java.lang.Double.valueOf(x.to_s)}
|
357
|
+
to_bool = ->(x){java.lang.Boolean.valueOf(x.to_s)}
|
358
|
+
value_of = ->(x){type.ruby_class.valueOf(x.to_s)}
|
359
|
+
# TODO: Java::double[].java_class.component_type
|
360
|
+
mapper = {
|
361
|
+
[String, java.lang.String.java_class] => dir,
|
362
|
+
[Fixnum, java.lang.Integer.java_class] => dir,
|
363
|
+
[Float, java.lang.Double.java_class] => dir,
|
364
|
+
[Float, Java::double.java_class] => dir,
|
365
|
+
[String, Java::double.java_class] => to_dbl,
|
366
|
+
[String, java.lang.Double.java_class] => to_dbl,
|
367
|
+
[String, Java::int.java_class] => to_x.call(:to_i),
|
368
|
+
[String,java.lang.Integer.java_class] => to_x.call(:to_i),
|
369
|
+
[String, Java::boolean.java_class] => to_bool,
|
370
|
+
[String, Java::javafx.scene.paint.Paint.java_class] => value_of,
|
371
|
+
[String, Java::java.lang.Object.java_class] => ->(x){x},
|
372
|
+
[String, Java::double[].java_class] => ->(x){x.split(/[, ]+/).map(&:to_f)}
|
373
|
+
}
|
374
|
+
if mapper[[value.class, type]]
|
375
|
+
coercedValue = mapper[[value.class, type]].call(value)
|
376
|
+
else
|
377
|
+
dputs "!! Non-normal RUBY coerce (#{value}, #{type}) (#{value.inspect}, [#{value.class}, #{type.inspect}])"
|
378
|
+
raise "Unknown Coercion map: (#{value}, #{type}) (#{value.inspect}, [#{value.class}, #{type.inspect}]; Please file a bug on this."
|
379
|
+
end
|
380
|
+
# Ruby String :D
|
381
|
+
elsif value.class == String && type.enum?
|
382
|
+
if value[0] == value[0].downcase
|
383
|
+
puts "WHOA Value is not #{value}"
|
384
|
+
#TODO: does this need proper snake casing when upcasting?
|
385
|
+
value = value.upcase
|
386
|
+
end
|
387
|
+
coercedValue = type.ruby_class.valueOf(value)
|
388
|
+
elsif value.respond_to?(:java_class) && value.java_class == Java::java.net.URL.java_class && type == Java::java.lang.String.java_class
|
389
|
+
# TODO: HACK!
|
390
|
+
dputs "COnverting url to string"
|
391
|
+
coercedValue = value.to_s
|
392
|
+
else
|
393
|
+
dputs "!! Non-normal coerce (#{value}, #{type}) (#{value.inspect}, #{type.inspect})"
|
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
|
506
|
+
end
|
507
|
+
dputs "Coerced #{value.class} into a #{coercedValue.class} for #{type}"
|
508
|
+
dp value, coercedValue
|
509
|
+
return coercedValue;
|
510
|
+
end
|
511
|
+
|
512
|
+
# /**
|
513
|
+
# * Invokes the static getter method for the given property.
|
514
|
+
# *
|
515
|
+
# * @param target
|
516
|
+
# * The object to which the property is attached.
|
517
|
+
# *
|
518
|
+
# * @param sourceType
|
519
|
+
# * The class that defines the property.
|
520
|
+
# *
|
521
|
+
# * @param key
|
522
|
+
# * The property name.
|
523
|
+
# *
|
524
|
+
# * @return
|
525
|
+
# * The value returned by the method, or <tt>nil</tt> if no such method
|
526
|
+
# * exists.
|
527
|
+
# */
|
528
|
+
# @SuppressWarnings("unchecked")
|
529
|
+
def self.get3(target, sourceType, key)
|
530
|
+
value = nil;
|
531
|
+
|
532
|
+
targetType = target.java_class();
|
533
|
+
getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
534
|
+
|
535
|
+
if (getterMethod != nil)
|
536
|
+
begin
|
537
|
+
value = MethodUtil.invoke(getterMethod, nil, [target ] );
|
538
|
+
rescue InvocationTargetException => exception
|
539
|
+
raise RuntimeException.new(exception);
|
540
|
+
rescue IllegalAccessException => exception
|
541
|
+
raise RuntimeException.new(exception);
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
545
|
+
return value;
|
546
|
+
end
|
547
|
+
|
548
|
+
# /**
|
549
|
+
# * Invokes a static setter method for the given property. If the value is
|
550
|
+
# * <tt>nil</tt> or there is no explicit setter for a given type, the
|
551
|
+
# * {@link #coerce(Object, Class)end method is used to attempt to convert the
|
552
|
+
# * value to the actual property type (defined by the return value of the
|
553
|
+
# * getter method).
|
554
|
+
# *
|
555
|
+
# * @param target
|
556
|
+
# * The object to which the property is or will be attached.
|
557
|
+
# *
|
558
|
+
# * @param sourceType
|
559
|
+
# * The class that defines the property.
|
560
|
+
# *
|
561
|
+
# * @param key
|
562
|
+
# * The property name.
|
563
|
+
# *
|
564
|
+
# * @param value
|
565
|
+
# * The property.new value.
|
566
|
+
# *
|
567
|
+
# * @throws PropertyNotFoundException
|
568
|
+
# * If the given static property does not exist or is read-only.
|
569
|
+
# */
|
570
|
+
def self.put3(target, sourceType, key, value)
|
571
|
+
targetType = nil
|
572
|
+
if target.respond_to? :java_class
|
573
|
+
targetType = target.java_class();
|
574
|
+
elsif target.is_a? String
|
575
|
+
targetType = java.lang.String.java_class
|
576
|
+
else
|
577
|
+
dp target, sourceType, key, value
|
578
|
+
raise "Shoots!"
|
579
|
+
end
|
580
|
+
|
581
|
+
setterMethod = nil;
|
582
|
+
if (value != nil)
|
583
|
+
valueClass = nil
|
584
|
+
|
585
|
+
if value.respond_to? :java_class
|
586
|
+
valueClass = value.java_class();
|
587
|
+
elsif value.is_a? String
|
588
|
+
valueClass = java.lang.String.java_class
|
589
|
+
else
|
590
|
+
dp target, sourceType, key, value
|
591
|
+
raise "Shoots TWICE!"
|
592
|
+
end
|
593
|
+
setterMethod = getStaticSetterMethod(sourceType, key, valueClass, targetType);
|
594
|
+
end
|
595
|
+
|
596
|
+
if (setterMethod == nil)
|
597
|
+
# Get the property type and attempt to coerce the value to it
|
598
|
+
propertyType = getType(sourceType, key, targetType);
|
599
|
+
|
600
|
+
if (propertyType != nil)
|
601
|
+
setterMethod = getStaticSetterMethod(sourceType, key, propertyType, targetType);
|
602
|
+
value = coerce(value, propertyType);
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
if (setterMethod == nil)
|
607
|
+
raise PropertyNotFoundException.new("Static property \"" + key + "\" does not exist" + " or is read-only.");
|
608
|
+
end
|
609
|
+
|
610
|
+
# Invoke the setter
|
611
|
+
begin
|
612
|
+
getStaticSetterMethod(sourceType, key, valueClass, targetType, true).call(target.java_object, value);
|
613
|
+
rescue InvocationTargetException => exception
|
614
|
+
raise "RuntimeException.new(exception);"
|
615
|
+
rescue IllegalAccessException => exception
|
616
|
+
raise " RuntimeException.new(exception);"
|
617
|
+
end
|
618
|
+
end
|
619
|
+
|
620
|
+
# /**
|
621
|
+
# * Tests the existence of a static property.
|
622
|
+
# *
|
623
|
+
# * @param sourceType
|
624
|
+
# * The class that defines the property.
|
625
|
+
# *
|
626
|
+
# * @param key
|
627
|
+
# * The property name.
|
628
|
+
# *
|
629
|
+
# * @param targetType
|
630
|
+
# * The type of the object to which the property applies.
|
631
|
+
# *
|
632
|
+
# * @return
|
633
|
+
# * <tt>true</tt> if the property exists; <tt>false</tt>, otherwise.
|
634
|
+
# */
|
635
|
+
def self.isDefined( sourceType, key, targetType)
|
636
|
+
return (getStaticGetterMethod(sourceType, key, targetType) != nil);
|
637
|
+
end
|
638
|
+
|
639
|
+
# /**
|
640
|
+
# * Returns the type of a static property.
|
641
|
+
# *
|
642
|
+
# * @param sourceType
|
643
|
+
# * The class that defines the property.
|
644
|
+
# *
|
645
|
+
# * @param key
|
646
|
+
# * The property name.
|
647
|
+
# *
|
648
|
+
# * @param targetType
|
649
|
+
# * The type of the object to which the property applies.
|
650
|
+
# */
|
651
|
+
def self.getType(sourceType, key, targetType)
|
652
|
+
getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
653
|
+
return (getterMethod == nil) ? nil : getterMethod.return_type();
|
654
|
+
end
|
655
|
+
|
656
|
+
# /**
|
657
|
+
# * Returns the generic type of a static property.
|
658
|
+
# *
|
659
|
+
# * @param sourceType
|
660
|
+
# * The class that defines the property.
|
661
|
+
# *
|
662
|
+
# * @param key
|
663
|
+
# * The property name.
|
664
|
+
# *
|
665
|
+
# * @param targetType
|
666
|
+
# * The type of the object to which the property applies.
|
667
|
+
# */
|
668
|
+
def self.getGenericType( sourceType, key, targetType)
|
669
|
+
Method getterMethod = getStaticGetterMethod(sourceType, key, targetType);
|
670
|
+
return (getterMethod == nil) ? nil : getterMethod.getGenericReturnType();
|
671
|
+
end
|
672
|
+
|
673
|
+
# /**
|
674
|
+
# * Determines the type of a list item.
|
675
|
+
# *
|
676
|
+
# * @param listType
|
677
|
+
# */
|
678
|
+
def self.getListItemType(listType)
|
679
|
+
itemType = getGenericListItemType(listType);
|
680
|
+
|
681
|
+
if (itemType.is_a? ParameterizedType)
|
682
|
+
itemType = (itemType).getRawType();
|
683
|
+
end
|
684
|
+
dputs "Listem item type is for "
|
685
|
+
dp listType, itemType
|
686
|
+
return itemType;
|
687
|
+
end
|
688
|
+
|
689
|
+
# /**
|
690
|
+
# * Determines the type of a map value.
|
691
|
+
# *
|
692
|
+
# * @param listType
|
693
|
+
# */
|
694
|
+
def self.getMapValueType( mapType)
|
695
|
+
valueType = getGenericMapValueType(mapType);
|
696
|
+
|
697
|
+
if (valueType.is_a? ParameterizedType)
|
698
|
+
valueType = (valueType).getRawType();
|
699
|
+
end
|
700
|
+
|
701
|
+
return valueType;
|
702
|
+
end
|
703
|
+
|
704
|
+
# /**
|
705
|
+
# * Determines the type of a list item.
|
706
|
+
# *
|
707
|
+
# * @param listType
|
708
|
+
# */
|
709
|
+
def self.getGenericListItemType(listType)
|
710
|
+
itemType = nil;
|
711
|
+
|
712
|
+
parentType = listType;
|
713
|
+
dputs "searching for generic #{listType}"
|
714
|
+
while (parentType != nil)
|
715
|
+
dputs "Still not nill"
|
716
|
+
dp parentType
|
717
|
+
if (parentType.is_a? ParameterizedType)
|
718
|
+
dputs "Parametratized type!"
|
719
|
+
parameterizedType = parentType;
|
720
|
+
rawType = parameterizedType.getRawType();
|
721
|
+
dp rawType, parameterizedType
|
722
|
+
if (List.java_class.assignable_from?(rawType))
|
723
|
+
itemType = parameterizedType.getActualTypeArguments()[0];
|
724
|
+
dputs "OOOOOHHH item type is #{itemType}"
|
725
|
+
dp itemType
|
726
|
+
end
|
727
|
+
|
728
|
+
break;
|
729
|
+
end
|
730
|
+
|
731
|
+
classType = parentType;
|
732
|
+
dputs "checinhg generic interfaces"
|
733
|
+
genericInterfaces = classType.generic_interfaces();
|
734
|
+
|
735
|
+
genericInterfaces.each do |genericInterface|
|
736
|
+
dputs "serarcing ingeraface"
|
737
|
+
dp genericInterface
|
738
|
+
if (genericInterface.is_a? ParameterizedType)
|
739
|
+
parameterizedType = genericInterface;
|
740
|
+
interfaceType = parameterizedType.getRawType();
|
741
|
+
dputs "checking"
|
742
|
+
dp parameterizedType, interfaceType
|
743
|
+
if (List.java_class.assignable_from?(interfaceType.java_class)) || (List.java_class.assignable_from?(interfaceType.java_object))
|
744
|
+
itemType = parameterizedType.getActualTypeArguments()[0];
|
745
|
+
dputs "found it at "
|
746
|
+
dp parameterizedType, interfaceType, itemType
|
747
|
+
dp itemType.bounds
|
748
|
+
break;
|
749
|
+
end
|
750
|
+
end
|
751
|
+
end
|
752
|
+
|
753
|
+
if (itemType != nil)
|
754
|
+
break;
|
755
|
+
end
|
756
|
+
|
757
|
+
parentType = classType.generic_superclass();
|
758
|
+
end
|
759
|
+
|
760
|
+
if (itemType != nil && itemType.is_a?(java.lang.reflect.TypeVariable))
|
761
|
+
dputs 'aww shucks'
|
762
|
+
dp itemType
|
763
|
+
itemType = Java::java.lang.Object.java_class;
|
764
|
+
end
|
765
|
+
|
766
|
+
return itemType;
|
767
|
+
end
|
768
|
+
|
769
|
+
# /**
|
770
|
+
# * Determines the type of a map value.
|
771
|
+
# *
|
772
|
+
# * @param mapType
|
773
|
+
# */
|
774
|
+
def self.getGenericMapValueType( mapType)
|
775
|
+
valueType = nil;
|
776
|
+
|
777
|
+
parentType = mapType;
|
778
|
+
while (parentType != nil)
|
779
|
+
if (parentType.is_a? ParameterizedType)
|
780
|
+
parameterizedType = parentType;
|
781
|
+
rawType = parameterizedType.getRawType();
|
782
|
+
|
783
|
+
if (java.util.Map.java_class.assignable_from?(rawType))
|
784
|
+
valueType = parameterizedType.getActualTypeArguments()[1];
|
785
|
+
end
|
786
|
+
|
787
|
+
break;
|
788
|
+
end
|
789
|
+
|
790
|
+
classType = parentType;
|
791
|
+
genericInterfaces = classType.getGenericInterfaces();
|
792
|
+
|
793
|
+
genericInterfaces.each do |genericInterface|
|
794
|
+
|
795
|
+
if (genericInterface.is_a? ParameterizedType)
|
796
|
+
parameterizedType = genericInterface;
|
797
|
+
interfaceType = parameterizedType.getRawType();
|
798
|
+
|
799
|
+
if (java.util.Map.java_class.assignable_from?(interfaceType))
|
800
|
+
valueType = parameterizedType.getActualTypeArguments()[1];
|
801
|
+
break;
|
802
|
+
end
|
803
|
+
end
|
804
|
+
end
|
805
|
+
|
806
|
+
if (valueType != nil)
|
807
|
+
break;
|
808
|
+
end
|
809
|
+
|
810
|
+
parentType = classType.getGenericSuperclass();
|
811
|
+
end
|
812
|
+
|
813
|
+
if valueType != nil && valueType.is_a?(TypeVariable)
|
814
|
+
valueType = Java::java.lang.Object.java_class;
|
815
|
+
end
|
816
|
+
|
817
|
+
return valueType;
|
818
|
+
end
|
819
|
+
|
820
|
+
# /**
|
821
|
+
# * Returns the value of a named constant.
|
822
|
+
# *
|
823
|
+
# * @param type
|
824
|
+
# * The type that defines the constant.
|
825
|
+
# *
|
826
|
+
# * @param name
|
827
|
+
# * The name of the constant.
|
828
|
+
# */
|
829
|
+
def self.getConstantValue( type, name)
|
830
|
+
if (type == nil)
|
831
|
+
raise IllegalArgumentException.new();
|
832
|
+
end
|
833
|
+
|
834
|
+
if (name == nil)
|
835
|
+
raise IllegalArgumentException.new();
|
836
|
+
end
|
837
|
+
|
838
|
+
field = nil
|
839
|
+
begin
|
840
|
+
field = FieldUtil.getField(type, name);
|
841
|
+
rescue NoSuchFieldException => exception
|
842
|
+
raise IllegalArgumentException.new(exception);
|
843
|
+
end
|
844
|
+
|
845
|
+
int fieldModifiers = field.modifiers();
|
846
|
+
if ((fieldModifiers & Modifier.STATIC) == 0 || (fieldModifiers & Modifier.FINAL) == 0)
|
847
|
+
raise IllegalArgumentException.new("Field is not a constant.");
|
848
|
+
end
|
849
|
+
|
850
|
+
value = nil
|
851
|
+
begin
|
852
|
+
value = field.get(nil);
|
853
|
+
rescue IllegalAccessException => exception
|
854
|
+
raise IllegalArgumentException.new(exception);
|
855
|
+
end
|
856
|
+
|
857
|
+
return value;
|
858
|
+
end
|
859
|
+
|
860
|
+
def self.getStaticGetterMethod( sourceType, key, targetType)
|
861
|
+
if (sourceType == nil)
|
862
|
+
raise ArgumentError.new();
|
863
|
+
end
|
864
|
+
|
865
|
+
if (key == nil)
|
866
|
+
raise ArgumentError.new();
|
867
|
+
end
|
868
|
+
|
869
|
+
method = nil;
|
870
|
+
|
871
|
+
if (targetType != nil)
|
872
|
+
key = key[0].upcase + key[1..-1];
|
873
|
+
|
874
|
+
getMethodName = GET_PREFIX + key;
|
875
|
+
isMethodName = IS_PREFIX + key;
|
876
|
+
|
877
|
+
begin
|
878
|
+
method = MethodUtil.getMethod(sourceType, getMethodName, [ targetType ]);
|
879
|
+
rescue NoSuchMethodException => exception
|
880
|
+
# No-op
|
881
|
+
end
|
882
|
+
|
883
|
+
if (method == nil)
|
884
|
+
begin
|
885
|
+
method = MethodUtil.getMethod(sourceType, isMethodName, [targetType ]);
|
886
|
+
rescue NoSuchMethodException => exception
|
887
|
+
# No-op
|
888
|
+
end
|
889
|
+
end
|
890
|
+
|
891
|
+
# Check for interfaces
|
892
|
+
if (method == nil)
|
893
|
+
interfaces = targetType.interfaces();
|
894
|
+
interfaces.length.times do |i|
|
895
|
+
begin
|
896
|
+
method = MethodUtil.getMethod(sourceType, getMethodName, [ interfaces[i] ]);
|
897
|
+
rescue NoSuchMethodException => exception
|
898
|
+
# No-op
|
899
|
+
end
|
900
|
+
|
901
|
+
if (method == nil)
|
902
|
+
begin
|
903
|
+
method = MethodUtil.getMethod(sourceType, isMethodName, [interfaces[i]] );
|
904
|
+
rescue NoSuchMethodException => exception
|
905
|
+
# No-op
|
906
|
+
end
|
907
|
+
end
|
908
|
+
|
909
|
+
if (method != nil)
|
910
|
+
break;
|
911
|
+
end
|
912
|
+
end
|
913
|
+
end
|
914
|
+
|
915
|
+
if (method == nil)
|
916
|
+
method = getStaticGetterMethod(sourceType, key, targetType.superclass());
|
917
|
+
end
|
918
|
+
end
|
919
|
+
|
920
|
+
return method;
|
921
|
+
end
|
922
|
+
|
923
|
+
def self.getStaticSetterMethod( sourceType, key,
|
924
|
+
valueType, targetType, rubify=false)
|
925
|
+
if (sourceType == nil)
|
926
|
+
raise "NULL PTR"
|
927
|
+
end
|
928
|
+
|
929
|
+
if (key == nil)
|
930
|
+
raise "NULL PTR"
|
931
|
+
end
|
932
|
+
|
933
|
+
if (valueType == nil)
|
934
|
+
dputs caller
|
935
|
+
dp sourceType, key, valueType, targetType, rubify
|
936
|
+
raise "NULL PTR"
|
937
|
+
end
|
938
|
+
|
939
|
+
method = nil;
|
940
|
+
|
941
|
+
if (targetType != nil)
|
942
|
+
key = key[0].upcase + key[1..-1];
|
943
|
+
|
944
|
+
setMethodName = SET_PREFIX + key;
|
945
|
+
begin
|
946
|
+
unless rubify
|
947
|
+
method = MethodUtil.getMethod(sourceType, setMethodName,[ targetType, valueType ]);
|
948
|
+
else
|
949
|
+
method = sourceType.ruby_class.method(setMethodName)
|
950
|
+
end
|
951
|
+
rescue NoSuchMethodException => exception
|
952
|
+
# No-op
|
953
|
+
end
|
954
|
+
|
955
|
+
# Check for interfaces
|
956
|
+
if (method == nil)
|
957
|
+
interfaces = targetType.interfaces();
|
958
|
+
interfaces.length.times do |i|
|
959
|
+
begin
|
960
|
+
method = MethodUtil.getMethod(sourceType, setMethodName, [ interfaces[i], valueType ]);
|
961
|
+
rescue NoSuchMethodException => exception
|
962
|
+
# No-op
|
963
|
+
end
|
964
|
+
|
965
|
+
if (method != nil)
|
966
|
+
break;
|
967
|
+
end
|
968
|
+
end
|
969
|
+
end
|
970
|
+
|
971
|
+
if (method == nil)
|
972
|
+
method = getStaticSetterMethod(sourceType, key, valueType, targetType.superclass());
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
976
|
+
return method;
|
977
|
+
end
|
978
|
+
|
979
|
+
def self.toAllCaps(value)
|
980
|
+
if (value == nil)
|
981
|
+
|
982
|
+
raise "NULL PTR"
|
983
|
+
end
|
984
|
+
|
985
|
+
allCapsBuilder = Java.java.lang.StringBuilder.new();
|
986
|
+
|
987
|
+
value.length.times do |i|
|
988
|
+
c = value[(i)];
|
989
|
+
|
990
|
+
if (c.upcase == c)
|
991
|
+
allCapsBuilder.append('_');
|
992
|
+
end
|
993
|
+
|
994
|
+
allCapsBuilder.append(c.upcase);
|
995
|
+
end
|
996
|
+
|
997
|
+
return allCapsBuilder.toString();
|
998
|
+
end
|
999
|
+
|
1000
|
+
def self.for(names)
|
1001
|
+
if names.is_a? java.lang.Object
|
1002
|
+
RubyWrapperBeanAdapter.new(names)
|
1003
|
+
else
|
1004
|
+
RubyObjectWrapperBeanAdapter.new(names)
|
1005
|
+
end
|
1006
|
+
end
|
1007
|
+
end
|