jrubyfx-fxmlloader-master 0.4.master.2015.9.30-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.
@@ -0,0 +1,800 @@
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
+ begin
29
+ # Attempt to load a javafx class
30
+ Java.javafx.application.Application
31
+ rescue LoadError, NameError
32
+ puts "JRubyFX and JavaFX runtime not found. Please load this file from JRubyFX"
33
+ exit -2
34
+ end
35
+
36
+ java_import 'javafx.fxml.JavaFXBuilderFactory'
37
+ java_import 'java.lang.InstantiationException', 'java.lang.IllegalAccessException'
38
+
39
+ java_import *%w[
40
+ java.io.IOException
41
+ java.io.InputStream
42
+ java.io.InputStreamReader
43
+ java.lang.ClassNotFoundException
44
+ java.lang.reflect.InvocationTargetException
45
+ java.lang.reflect.Modifier
46
+ java.lang.reflect.ParameterizedType
47
+ java.net.URL
48
+ java.nio.charset.Charset
49
+ java.util.AbstractMap
50
+ java.util.List
51
+ java.util.ResourceBundle
52
+
53
+ javafx.beans.DefaultProperty
54
+ javafx.beans.property.Property
55
+ javafx.beans.value.ChangeListener
56
+ javafx.beans.value.ObservableValue
57
+ javafx.collections.FXCollections
58
+ javafx.collections.ListChangeListener
59
+ javafx.collections.MapChangeListener
60
+ javafx.collections.ObservableList
61
+ javafx.collections.ObservableMap
62
+ javafx.event.Event
63
+ javafx.event.EventHandler
64
+ javafx.event.EventType
65
+ javafx.util.Builder
66
+ javafx.util.BuilderFactory
67
+ javafx.util.Callback
68
+
69
+ javax.script.Bindings
70
+ javax.script.ScriptContext
71
+ javax.script.ScriptEngine
72
+ javax.script.ScriptEngineManager
73
+ javax.script.ScriptException
74
+ javax.script.SimpleBindings
75
+ javax.xml.stream.XMLInputFactory
76
+ javax.xml.stream.XMLStreamConstants
77
+ javax.xml.stream.XMLStreamException
78
+ javax.xml.stream.XMLStreamReader
79
+ javax.xml.stream.util.StreamReaderDelegate
80
+
81
+ com.sun.javafx.beans.IDProperty
82
+ java.net.MalformedURLException
83
+ java.security.AccessController
84
+ java.security.PrivilegedAction
85
+ java.util.Locale
86
+ java.lang.NoSuchMethodException
87
+ java.util.StringTokenizer
88
+ sun.reflect.misc.ConstructorUtil
89
+ sun.reflect.misc.FieldUtil
90
+ sun.reflect.misc.MethodUtil
91
+ sun.reflect.misc.ReflectUtil]
92
+
93
+ class LoadException < Exception
94
+ def initialize(stuff)
95
+ super
96
+ end
97
+ end
98
+ $DEBUG_IT_FXML = false
99
+ def dp(*args)
100
+ p *args if $DEBUG_IT_FXML
101
+ end
102
+ def dputs(*args)
103
+ puts *args if $DEBUG_IT_FXML
104
+ end
105
+ def dprint(*args)
106
+ print *args if $DEBUG_IT_FXML
107
+ end
108
+ # TODO: clean this up
109
+ $RB_PREFIX = ""
110
+ def rnest(num)
111
+ if num > 0
112
+ $RB_PREFIX += " "
113
+ else
114
+ $RB_PREFIX = $RB_PREFIX[0...-1]
115
+ end
116
+ end
117
+ $RB_MAPPER = {}
118
+ $RB_CMAPPER = {}
119
+ $RB_IDMAPPER = {}
120
+ $RB_NShowMAPPER = {}
121
+ $last_elt = nil
122
+
123
+ def rno_show(elt)
124
+ $RB_NShowMAPPER[elt]=true
125
+ end
126
+ def rno_show?(elt)
127
+ !!$RB_NShowMAPPER[elt]
128
+ end
129
+
130
+ def rmap_wrap(elt)
131
+ if elt.kind_of? Java::ComSunJavafxCollections::ObservableListWrapper
132
+ SecretHashCompararator.new(elt)
133
+ else
134
+ elt
135
+ end
136
+ end
137
+ def rputs(elt, args)
138
+ if $DEBUG_IT_FXML_RB
139
+ if elt == nil
140
+ elt = $last_elt
141
+ else
142
+ $last_elt = elt = rmap_wrap(elt)
143
+ end
144
+ unless $RB_MAPPER[elt]
145
+ $RB_MAPPER[elt] = ""
146
+ end
147
+ $RB_MAPPER[elt] << $RB_PREFIX
148
+ $RB_MAPPER[elt] << args
149
+ $RB_MAPPER[elt] << "\n"
150
+ end
151
+ end
152
+
153
+ def rfx_id(elt, val=nil)
154
+ elt = rmap_wrap elt
155
+ if val
156
+ $RB_IDMAPPER[elt] = val
157
+ else
158
+ $RB_IDMAPPER[elt]
159
+ end
160
+ end
161
+ def rfx_id_set?(elt)
162
+ elt = rmap_wrap elt
163
+ !$RB_MAPPER[elt] or $RB_MAPPER[elt].include? "instance_variable_get(#{("@" + rfx_id(elt)).to_sym.inspect})"
164
+ end
165
+ def rmorph(old, new)
166
+ elt = rmap_wrap elt
167
+ $RB_MAPPER[new] = "build(FxmlBuilderBuilder, #{($RB_CMAPPER[old]||{}).inspect}, #{old.wrapped_class.ruby_class.inspect}) do\n"
168
+ end
169
+
170
+ def rctor(elt, k, v)
171
+ if $DEBUG_IT_FXML_RB
172
+ elt = rmap_wrap elt
173
+ $RB_CMAPPER[elt] = {} unless $RB_CMAPPER[elt]
174
+ $RB_CMAPPER[elt][k] = v
175
+ end
176
+ end
177
+ def rget(elt, action=:nuke_from_standard_orbit_captain)
178
+ elt = rmap_wrap elt
179
+ tmp = $RB_MAPPER[elt]
180
+ tmp.strip! if tmp
181
+ $RB_MAPPER[elt] = rfx_id(elt) ? "__local_fxml_controller.instance_variable_get(#{("@" + rfx_id(elt)).to_sym.inspect})" : nil
182
+
183
+ tmp
184
+ end
185
+ $RB_SCRIPT_ENGINE_MAPPINGS = {}
186
+ def rputs_script(sem, lang)
187
+ $RB_SCRIPT_ENGINE_MAPPINGS[sem] = lang
188
+ end
189
+
190
+ def rget_sem(sem)
191
+ $RB_SCRIPT_ENGINE_MAPPINGS[sem]
192
+ end
193
+
194
+ def rsem_out
195
+ if $RB_SCRIPT_ENGINE_MAPPINGS != {}
196
+ ["(__local_sem_inst = Java.javax.script.ScriptEngineManager.new).setBindings(javax.script.SimpleBindings.new(__local_namespace))",
197
+ *$RB_SCRIPT_ENGINE_MAPPINGS.map{|sem, lang|
198
+ "(__local_sem_lang_inst_#{lang} = __local_sem_inst.getEngineByName(#{lang.inspect}))" +
199
+ ".setBindings(__local_sem_inst.getBindings(), javax.script.ScriptContext.ENGINE_SCOPE)"
200
+ }
201
+ ].join("\n")
202
+ end
203
+ end
204
+
205
+ class SecretHashCompararator
206
+ attr_accessor :obj
207
+ def initialize(obj)
208
+ @obj = obj
209
+ end
210
+ def hash
211
+ @obj.object_id
212
+ end
213
+ def eql?(rhs)
214
+ self == rhs
215
+ end
216
+ def ==(rhs)
217
+ @obj.object_id == rhs.object_id or (rhs.is_a? SecretHashCompararator and @obj.object_id == rhs.hash)
218
+ end
219
+ end
220
+
221
+ class FxmlBuilderBuilder # the builder builder (builds builders)
222
+ @@bf = Java::javafx.fxml.JavaFXBuilderFactory.new(JRuby.runtime.jruby_class_loader)
223
+ def self.new(arg_map, builder_type)
224
+ builder = @@bf.getBuilder(builder_type)
225
+ arg_map.each do |k, v|
226
+ builder.put(k, v) # DON't use []= or we have to wrap it
227
+ end
228
+ builder.build
229
+ end
230
+ end
231
+
232
+ class FactoryBuilderBuilder # builder to build factories
233
+ def self.new(type, factory)
234
+ type = type.java_class
235
+ factoryMethod = nil
236
+ begin
237
+ factoryMethod = MethodUtil.getMethod(type, factory, []);
238
+ rescue NoSuchMethodException => exception
239
+ raise LoadException.new(exception);
240
+ end
241
+
242
+ begin
243
+ return MethodUtil.invoke(factoryMethod, nil, []);
244
+ rescue IllegalAccessException => exception
245
+ raise LoadException.new(exception);
246
+ rescue InvocationTargetException => exception
247
+ raise LoadException.new(exception);
248
+ end
249
+ end
250
+ end
251
+
252
+ # Override to safely get ruby class of non-java_class objects
253
+ class Class
254
+ def ruby_class
255
+ self
256
+ end
257
+ end
258
+
259
+ FXL = java_import('javafx.fxml.FXMLLoader')[0]
260
+ class FxmlLoader
261
+ attr_accessor :location, :root, :template, :builderFactory, :namespace, :staticLoad, :current, :controllerFactory, :charset
262
+ attr_accessor :scriptEngine
263
+ attr_reader :controller
264
+ FX_NAMESPACE_VERSION="1"
265
+ @@fxml_jit_info = {}
266
+ def initialize(url=nil, ctrlr=nil, resourcs=nil, buildFactory=nil, charset=nil, loaders=nil)
267
+ @location = url
268
+ @builderFactory = buildFactory || JavaFXBuilderFactory.new(JRuby.runtime.jruby_class_loader)
269
+ @template = false
270
+ @namespace = FXCollections.observableHashMap()
271
+ self.controller = ctrlr
272
+ @packages = []
273
+ @classes = {}
274
+ @root = nil
275
+ @charset = charset || Charset.forName(FXL::DEFAULT_CHARSET_NAME)
276
+ end
277
+
278
+ def controller=(controller)
279
+ @controller = controller
280
+ unless controller
281
+ @namespace.delete(FXL::CONTROLLER_KEYWORD)
282
+ else
283
+ @namespace[FXL::CONTROLLER_KEYWORD] = controller
284
+ end
285
+ end
286
+
287
+ # either :no_jit, or a number above 0 representing the number of times before jitting a fxml file
288
+ def load(jruby_exts = {jruby_ext: {}})
289
+ @jruby_ext = {jit: 0}.merge(jruby_exts[:jruby_ext])
290
+ # TODO: actually open it properly
291
+ unless jit_info = @@fxml_jit_info[file_path = @location.to_s]
292
+ validate = true
293
+ validate = @jruby_ext[:jit_validate] if @jruby_ext.has_key? :jit_validate
294
+ jit_info = @@fxml_jit_info[file_path] = FxmlJitInfo.new(file_path, @jruby_ext[:jit], @jruby_ext[:jit_save_to], @jruby_ext[:jit_cache], validate, @jruby_ext[:jit_opts])
295
+ end
296
+ inputStream = @location.open_stream
297
+ if @template
298
+ @root = nil
299
+ else
300
+ clearImports
301
+ end
302
+
303
+ @namespace[FXL::LOCATION_KEY] = @location
304
+ @namespace[FXL::RESOURCES_KEY] = @resources
305
+
306
+ @script_engine = nil
307
+
308
+ difx = $DEBUG_IT_FXML_RB # TODO: hack to make this somewhat better at recursion
309
+ # if we have it cached, use the jitted method
310
+ if jit_info.compiled?
311
+ begin
312
+ return :dont_load if @jruby_ext[:dont_load]
313
+ $DEBUG_IT_FXML_RB = jit_info.should_jit?
314
+ res = jit_info.__build_via_jit(@controller, @namespace, @jruby_ext)
315
+ $DEBUG_IT_FXML_RB = difx # restore
316
+ return res
317
+ rescue Exception, java.lang.Throwable
318
+ puts "JIT compiled method for #{@location.to_s} FAILED with error:"
319
+ puts $!
320
+ puts $!.backtrace
321
+ puts "Reverting to normal parsing..."
322
+ jit_info.jit_settings = :no_jit
323
+ jit_info.decompile
324
+ end
325
+ end
326
+
327
+ $DEBUG_IT_FXML_RB = jit_info.should_jit?
328
+
329
+ begin
330
+ xmlInputFactory = XMLInputFactory.newFactory
331
+ xmlInputFactory.setProperty("javax.xml.stream.isCoalescing", true)
332
+
333
+ # Some stream readers incorrectly report an empty string as the prefix
334
+ # for the default namespace; correct this as needed
335
+ inputStreamReader = InputStreamReader.new(inputStream, @charset);
336
+ @xmlStreamReader = SRDelegateClass.new(xmlInputFactory.createXMLStreamReader(inputStreamReader))
337
+ rescue XMLStreamException => e
338
+ raise LoadException.new(e)
339
+ end
340
+
341
+ # Parse the XML stream
342
+ begin
343
+ while @xmlStreamReader.hasNext()
344
+ event = @xmlStreamReader.next();
345
+ case event
346
+ when XMLStreamConstants::PROCESSING_INSTRUCTION
347
+ processProcessingInstruction
348
+ when XMLStreamConstants::COMMENT
349
+ processComment
350
+ when XMLStreamConstants::START_ELEMENT
351
+ processStartElement
352
+ when XMLStreamConstants::END_ELEMENT
353
+ processEndElement
354
+ when XMLStreamConstants::CHARACTERS
355
+ processCharacters
356
+ end
357
+ end
358
+ rescue XMLStreamException => exception
359
+ raise Exception.new(exception)
360
+ end
361
+ if @controller
362
+ # TODO: initialize should be called here
363
+ # Inject controller fields
364
+ @controller.instance_variable_set("@" + FXL::LOCATION_KEY, @location)
365
+ @controller.instance_variable_set("@" + FXL::RESOURCES_KEY, @resources)
366
+ end
367
+ if $DEBUG_IT_FXML_RB
368
+ code = "#{rsem_out}\n#{rget @root}"
369
+ jit_info.compile(code)
370
+ end
371
+ $RB_CMAPPER = {}
372
+ $RB_IDMAPPER = {}
373
+ $RB_MAPPER = {}
374
+ $RB_PREFIX = ""
375
+ $RB_NShowMAPPER = {}
376
+ $last_elt = nil
377
+ $RB_SCRIPT_ENGINE_MAPPINGS = {}
378
+
379
+ @xmlStreamReader = nil
380
+ $DEBUG_IT_FXML_RB = difx # restore
381
+ return @root
382
+ end
383
+
384
+ def clearImports
385
+ @packages.clear
386
+ @classes.clear
387
+ end
388
+
389
+ def processProcessingInstruction
390
+ piTarget = @xmlStreamReader.getPITarget().strip
391
+ if piTarget == FXL::LANGUAGE_PROCESSING_INSTRUCTION
392
+ processLanguage
393
+ elsif piTarget == FXL::IMPORT_PROCESSING_INSTRUCTION
394
+ processImport
395
+ end
396
+ end
397
+
398
+ def processLanguage
399
+ if @scriptEngine
400
+ raise LoadException.new("Page language already set.")
401
+ end
402
+
403
+ language = @xmlStreamReader.getPIData()
404
+
405
+ if @loadListener
406
+ @loadListener.readLanguageProcessingInstruction(language)
407
+ end
408
+
409
+ unless staticLoad
410
+ scriptEngineManager = getScriptEngineManager()
411
+ @scriptEngine = scriptEngineManager.getEngineByName(language)
412
+ rputs_script @scriptEngine, language
413
+ @scriptEngine.setBindings(scriptEngineManager.getBindings(), ScriptContext.ENGINE_SCOPE)
414
+ end
415
+ end
416
+
417
+ def processImport
418
+ target = @xmlStreamReader.getPIData().strip
419
+
420
+ if @loadListener
421
+ @loadListener.readImportProcessingInstruction(target)
422
+ end
423
+
424
+ if target.end_with?(".*")
425
+ importPackage(target[0,target.length - 2])
426
+ else
427
+ importClass(target)
428
+ end
429
+ end
430
+
431
+ def processComment
432
+ @loadListener.readComment(@xmlStreamReader.text) if @loadListener
433
+ end
434
+
435
+ def processStartElement()
436
+ # Create the element
437
+ createElement();
438
+
439
+ # Process the start tag
440
+ @current.processStartElement();
441
+
442
+ # Set the root value
443
+ unless @root
444
+ @root = @current.value;
445
+ rputs @root, "__local_jruby_ext[:on_root_set].call(self) if __local_jruby_ext[:on_root_set]"
446
+ @jruby_ext[:on_root_set].call(@root) if @jruby_ext[:on_root_set]
447
+ end
448
+ end
449
+
450
+ def createElement()
451
+ prefix = @xmlStreamReader.getPrefix();
452
+ localName = @xmlStreamReader.getLocalName();
453
+
454
+ if !prefix
455
+ i = localName.rindex('.')
456
+
457
+ if localName[(i ? i : -1) + 1] == localName[(i ? i : -1) + 1].downcase
458
+ name = localName[((i ? i : -1) + 1)..-1]
459
+
460
+ if (i == nil)
461
+ # This is an instance property
462
+ if @loadListener
463
+ @loadListener.beginPropertyElement(name, nil)
464
+ end
465
+
466
+ @current = PropertyElement.new(@current, @xmlStreamReader, @loadListener, self, name, nil)
467
+ else
468
+ # This is a static property
469
+ sourceType = getType(localName[0, i]);
470
+ if sourceType
471
+ if @loadListener
472
+ @loadListener.beginPropertyElement(name, sourceType);
473
+ end
474
+
475
+ @current = PropertyElement.new(@current, @xmlStreamReader, @loadListener, self,name, sourceType)
476
+ elsif (@staticLoad)
477
+ # The source type was not recognized
478
+ if @loadListener
479
+ @loadListener.beginUnknownStaticPropertyElement(localName);
480
+ end
481
+
482
+ @current = FXL::UnknownStaticPropertyElement.new
483
+ else
484
+ raise LoadException.new(localName + " is not a valid property.");
485
+ end
486
+ end
487
+ else
488
+ if (@current == nil && @root)
489
+ raise LoadException.new("Root value already specified.");
490
+ end
491
+
492
+ type = getType(localName);
493
+ prefixz = @xmlStreamReader.getLocation().getLineNumber().to_s + ": "
494
+ numz = 1
495
+ pppn = @current
496
+ while pppn
497
+ numz+=1
498
+ pppn = pppn.parent
499
+ end
500
+ prefixz = (" " * numz) + prefixz
501
+
502
+ if type
503
+ if @loadListener
504
+ @loadListener.beginInstanceDeclarationElement(type);
505
+ end
506
+ @current = InstanceDeclarationElement.new(@current, @xmlStreamReader, @loadListener, self, type)
507
+ elsif (@staticLoad)
508
+ # The type was not recognized
509
+ if @loadListener
510
+ @loadListener.beginUnknownTypeElement(localName);
511
+ end
512
+
513
+ @current = UnknownTypeElement.new(@current, @xmlStreamReader, @loadListener, self)
514
+ else
515
+ raise LoadException.new(localName + " is not a valid type.");
516
+ end
517
+ end
518
+ elsif prefix == FXL::FX_NAMESPACE_PREFIX
519
+ if localName == FXL::INCLUDE_TAG
520
+ if @loadListener
521
+ @loadListener.beginIncludeElement()
522
+ end
523
+ @current = IncludeElement.new(@current, @xmlStreamReader, @loadListener, self)
524
+ elsif localName == FXL::REFERENCE_TAG
525
+ if @loadListener
526
+ @loadListener.beginReferenceElement
527
+ end
528
+
529
+ @current = ReferenceElement.new(@current, @xmlStreamReader, @loadListener, self)
530
+ elsif localName == FXL::COPY_TAG
531
+ if @loadListener
532
+ @loadListener.beginCopyElement();
533
+ end
534
+
535
+ @current = CopyElement.new(@current, @xmlStreamReader, @loadListener, self)
536
+ elsif localName == FXL::ROOT_TAG
537
+ if @loadListener
538
+ @loadListener.beginRootElement();
539
+ end
540
+
541
+ @current = RootElement.new(@current, @xmlStreamReader, @loadListener, self)
542
+ elsif localName == FXL::SCRIPT_TAG
543
+ if @loadListener
544
+ @loadListener.beginScriptElement();
545
+ end
546
+
547
+ @current = ScriptElement.new(@current, @xmlStreamReader, @loadListener, self)
548
+ elsif localName == FXL::DEFINE_TAG
549
+ if @loadListener
550
+ @loadListener.beginDefineElement();
551
+ end
552
+
553
+ @current = DefineElement.new(@current, @xmlStreamReader, @loadListener, self)
554
+ else
555
+ raise LoadException.new(prefix + ":" + localName + " is not a valid element.");
556
+ end
557
+ else
558
+ raise LoadException.new("Unexpected namespace prefix: " + prefix + ".");
559
+ end
560
+ end
561
+
562
+ def processEndElement()
563
+ @current.processEndElement();
564
+ if @loadListener
565
+ @loadListener.endElement(@current.value);
566
+ end
567
+
568
+ # Move up the stack
569
+ @current = @current.parent;
570
+ end
571
+
572
+ def processCharacters()
573
+ # Process the characters
574
+ if (!@xmlStreamReader.isWhiteSpace())
575
+ @current.processCharacters();
576
+ end
577
+ end
578
+
579
+ def importPackage(name)
580
+ @packages << name
581
+ end
582
+
583
+ def importClass(name)
584
+ begin
585
+ loadType(name, true);
586
+ rescue ClassNotFoundException => exception
587
+ raise LoadException.new(exception);
588
+ end
589
+ end
590
+
591
+ def getType(name)
592
+ type = nil
593
+
594
+ if name[0] == name[0].downcase
595
+ # This is a fully-qualified class name
596
+ begin
597
+ type = loadType(name, false);
598
+ rescue ClassNotFoundException => exception
599
+ # No-op
600
+ end
601
+ else
602
+ # This is an unqualified class name
603
+ type = @classes[name];
604
+
605
+ unless type
606
+ # The class has not been loaded yet; look it up
607
+ @packages.each do |packageName|
608
+ begin
609
+ type = loadTypeForPackage(packageName, name);
610
+ rescue ClassNotFoundException => exception
611
+ # No-op
612
+ end
613
+ break if type
614
+ end
615
+ unless type
616
+ # check for ruby
617
+ # TODO: this should require an import or something perhaps? need to think more about this?
618
+ begin
619
+ type = name.constantize_by(".")
620
+ rescue
621
+ # No-op
622
+ end
623
+ end
624
+ @classes[name] = type if type
625
+ end
626
+ end
627
+
628
+ return type;
629
+ end
630
+
631
+ def loadType(name, cache)
632
+ i = name.index('.');
633
+ n = name.length;
634
+ while (i &&
635
+ i < n &&
636
+ name[i + 1] == name[i + 1].downcase)
637
+ i = name.index('.', i + 1);
638
+ end
639
+
640
+ if (i == nil || i == n)
641
+ raise ClassNotFoundException.new();
642
+ end
643
+
644
+ packageName = name[0, i];
645
+ className = name[(i + 1)..-1];
646
+
647
+ type = loadTypeForPackage(packageName, className);
648
+
649
+ if (cache)
650
+ @classes[className] = type
651
+ end
652
+
653
+ return type;
654
+ end
655
+
656
+
657
+ def getScriptEngineManager()
658
+ unless @scriptEngineManager
659
+ @scriptEngineManager = Java.javax.script.ScriptEngineManager.new
660
+ @scriptEngineManager.setBindings(SimpleBindings.new(@namespace))
661
+ end
662
+
663
+ return @scriptEngineManager;
664
+ end
665
+
666
+ def loadTypeForPackage(packageName, className=nil)
667
+ packageName = (packageName + "." + className.gsub('.', '$')) if className
668
+ begin
669
+ return JavaUtilities.get_proxy_class(packageName).java_class.to_java
670
+ rescue NameError => ex
671
+ # probably ruby class
672
+ begin
673
+ return packageName.constantize_by(".")
674
+ rescue
675
+ raise ClassNotFoundException.new(packageName) # nope, not our issue anymore
676
+ end
677
+ end
678
+ end
679
+ def compareJFXVersions(rtVer, nsVer)
680
+
681
+ retVal = 0;
682
+
683
+ if (rtVer == nil || "" == (rtVer) || nsVer == nil || "" == (nsVer))
684
+ return retVal;
685
+ end
686
+
687
+ if (rtVer == (nsVer))
688
+ return retVal;
689
+ end
690
+
691
+ # version string can contain '-'
692
+ dashIndex = rtVer.index("-");
693
+ dashIndex = -1 unless dashIndex
694
+ if (dashIndex > 0)
695
+
696
+ rtVer = rtVer[0, dashIndex]
697
+ end
698
+
699
+ # or "_"
700
+ underIndex = rtVer.index("_");
701
+ underIndex = -1 unless underIndex
702
+ if (underIndex > 0)
703
+
704
+ rtVer = rtVer[0, underIndex]
705
+ end
706
+
707
+ # do not try to compare if the string is not valid version format
708
+ if (!rtVer.match(/^(\d+)(\.\d+)*$/) || !nsVer.match(/^(\d+)(\.\d+)*$/))
709
+ return retVal;
710
+ end
711
+
712
+ nsVerTokenizer = StringTokenizer.new(nsVer, ".");
713
+ rtVerTokenizer = StringTokenizer.new(rtVer, ".");
714
+ nsDigit = 0
715
+ rtDigit = 0;
716
+ rtVerEnd = false;
717
+
718
+ while (nsVerTokenizer.hasMoreTokens() && retVal == 0)
719
+ nsDigit = nsVerTokenizer.nextToken().to_i
720
+ if (rtVerTokenizer.hasMoreTokens())
721
+ rtDigit = rtVerTokenizer.nextToken().to_i
722
+ retVal = rtDigit - nsDigit;
723
+ else
724
+ rtVerEnd = true;
725
+ break;
726
+ end
727
+ end
728
+
729
+ if (rtVerTokenizer.hasMoreTokens() && retVal == 0)
730
+ rtDigit = rtVerTokenizer.nextToken().to_i
731
+ if (rtDigit > 0)
732
+ retVal = 1;
733
+ end
734
+ end
735
+
736
+ if (rtVerEnd)
737
+ if (nsDigit > 0)
738
+ retVal = -1;
739
+ else
740
+ while (nsVerTokenizer.hasMoreTokens())
741
+ nsDigit = nsVerTokenizer.nextToken().to_i
742
+ if (nsDigit > 0)
743
+ retVal = -1;
744
+ break;
745
+ end
746
+ end
747
+ end
748
+ end
749
+
750
+ return retVal;
751
+ end
752
+ end
753
+
754
+ class SRDelegateClass < StreamReaderDelegate
755
+ def getPrefix()
756
+
757
+ prefix = super
758
+
759
+ if prefix && prefix.length == 0
760
+ prefix = nil
761
+ end
762
+ return prefix;
763
+ end
764
+
765
+ def getAttributePrefix(index)
766
+ prefix = super
767
+
768
+ if prefix && prefix.length == 0
769
+ prefix = nil
770
+ end
771
+ return prefix;
772
+ end
773
+ end
774
+
775
+ require_relative 'fxmlloader/j8_expression_value'
776
+ require_relative 'fxmlloader/elts'
777
+ require_relative 'fxmlloader/value_elts'
778
+ require_relative 'fxmlloader/real_elts'
779
+ require_relative 'fxmlloader/rrba'
780
+ require_relative 'fxmlloader/rorba'
781
+ require_relative 'fxmlloader/fxml_jit_info'
782
+ require_relative 'FXMLLoader-j8.jar'
783
+
784
+ java_import 'org.jruby.jfx8.KeyPath'
785
+ java_import 'org.jruby.jfx8.Expression'
786
+
787
+
788
+ class RRBAdapters < org.jruby.jfx8.RubyBeanAdapter
789
+ def get(names, key)
790
+ RubyWrapperBeanAdapter.for(names)[key]
791
+ end
792
+ def set(names, key, value)
793
+ RubyWrapperBeanAdapter.for(names)[key] = value
794
+ end
795
+ def contains(names, key)
796
+ RubyWrapperBeanAdapter.for(names).has_key? key
797
+ end
798
+ end
799
+
800
+ org.jruby.jfx8.RubyBeanAdapter.load_ruby_space RRBAdapters.new