All: there's a new feature in Java SE 6 Update 10 which might be of
interest to subscribers of this list.
If you host a Java applet on a web page, the JavaScript engine can
operate upon it: call methods, fetch fields, operate upon other objects
returned from previous method invocations, etc.
We wanted to enable language developers and users on the Java platform
such as yourselves to write applets in non-Java languages like JRuby,
Jython, Groovy, Scala, Fan, Clojure, JavaFX Script, etc., and still be
able to script these applets from the JavaScript engine in the web browser.
Java SE 6 Update 10 exposes some new interfaces from the Java Plug-In's
LiveConnect implementation that allows a non-Java language runtime to
hook in to the dispatch sequence for JavaScript operations coming in
from the web browser.
This lets you, the language developer, use your language to write
applets, and call into those applets from the web page. Essentially, you
define a mapping from your language to JavaScript syntax.
To give the basic idea, here's an example written in JavaFX Script. The
.fx file looks like this:
var color = Color.YELLOW;
public function setColor(red: Number,
green: Number,
blue: Number) : Void {
color = Color { red: red, green: green, blue: blue };
}
public function run(args: String[]) {
Stage {
scene: Scene {
fill: Color.DARKGRAY
content: [
Circle {
centerX : 125
centerY : 125
radius: 100
fill: bind color
}
]
}
}
}
and we can operate upon it from the web page using JavaScript functions
like these (assume it is hosted in an applet whose ID is "app"):
function makeRed() {
try {
app.script.setColor(1.0, 0.0, 0.0);
} catch (e) {
reportException(e);
}
}
function makeBlue() {
try {
app.script.setColor(0.0, 0.0, 1.0);
} catch (e) {
reportException(e);
}
}
Note the use of the synthetic "script" field attached to the applet,
which provides access to the script-level scope. This field is
synthesized by the JavaFX runtime using the new APIs in the Java Plug-In.
More complex examples are possible. Here's JavaScript which dives into a
scene graph (similar structure to the one above) and modifies the color
directly:
function makeRed() {
try {
app.stage.scene.content[0].fill =
app.Packages.javafx.scene.paint.Color.RED;
} catch (e) {
reportException(e);
}
}
function makeBlue() {
try {
app.stage.scene.content[0].fill =
app.Packages.javafx.scene.paint.Color.BLUE;
} catch (e) {
reportException(e);
}
}
This example uses the built-in per-applet Packages keyword to access the
javafx.scene.paint namespace.
Complex data type conversions are possible. The JavaFX runtime uses the
new APIs to define conversion operations between JavaScript arrays and
JavaFX sequences. Here's a JavaFX function from another example which
takes in two sequences of numbers and makes a Timeline animation out of
them:
public function animate(times: Number[],
xyCoords: Number[]) {
var t = Timeline {
keyFrames: for (i in [0..(sizeof times - 1)]) {
KeyFrame {
time: Duration.valueOf(times[i]);
values: [
x => xyCoords[2*i],
y => xyCoords[2*i+1],
]
}
}
}
if (timeline != null) {
timeline.stop();
}
timeline = t;
timeline.play();
}
The function above can be called from JavaScript as follows:
function clockwise() {
try {
app.script.animate([250, 500, 750, 1000],
[225, 225,
25, 225,
25, 25,
225, 25]);
} catch (e) {
reportException(e);
}
}
function counterclockwise() {
try {
app.script.animate([250, 500, 750, 1000],
[25, 25,
25, 225,
225, 225,
225, 25]);
} catch (e) {
reportException(e);
}
}
We think these new APIs offer a lot of interesting interoperability
possibilities for dynamic language implementors on the JVM. They tie
into the meta-object protocol work being done by Attila Szegedi and
others, and while they aren't currently related, it would be interesting
to see if unification is possible.
The documentation (including javadoc) for the new APIs is available here:
https://jdk6.dev.java.net/plugin2/liveconnect/#NON_JAVA_LIVECONNECT
but of course the most useful thing is example code. The first and
proof-of-concept implementation of these interfaces has been done for
JavaFX Script. Roughly 90% of the code is in the open-source repository
for the JavaFX compiler at https://openjfx-compiler.dev.java.net/, under
the directory src/share/classes/com/sun/javafx/runtime/liveconnect/ .
The only pieces missing are those which instantiate and register the
delegates; these necessarily went into a different (currently non-open)
repository but are pretty straightforward.
If you have any feedback on this new functionality please post it to the
list. We're hoping this opens up new interesting possibilities for web
application development on the JVM.
Thanks,
-Ken
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "JVM
Languages" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/jvm-languages?hl=en
-~----------~----~----~----~------~----~------~--~---