8014797: rename Java.toJavaArray/toJavaScriptArray to Java.to/from, respectively
Reviewed-by: jlaskey, sundar
This commit is contained in:
parent
32261c12b2
commit
34bc5ff07f
@ -616,26 +616,26 @@ print(a[0]);
|
||||
</pre>
|
||||
<p>
|
||||
It is also possible to convert between JavaScript and Java arrays.
|
||||
Given a JavaScript array and a Java type, <code>Java.toJavaArray</code> returns a Java array with the same initial contents, and with the specified component type.
|
||||
Given a JavaScript array and a Java type, <code>Java.to</code> returns a Java array with the same initial contents, and with the specified array type.
|
||||
</p>
|
||||
<pre><code>
|
||||
var anArray = [1, "13", false]
|
||||
var javaIntArray = Java.toJavaArray(anArray, "int")
|
||||
var javaIntArray = Java.to(anArray, "int[]")
|
||||
print(javaIntArray[0]) // prints 1
|
||||
print(javaIntArray[1]) // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
|
||||
print(javaIntArray[2]) // prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
|
||||
</code></pre>
|
||||
<p>
|
||||
You can use either a string or a type object returned from <code>Java.type()</code> to specify the component type of the array.
|
||||
You can use either a string or a type object returned from <code>Java.type()</code> to specify the type of the array.
|
||||
You can also omit the array type, in which case a <code>Object[]</code> will be created.
|
||||
</p>
|
||||
<p>
|
||||
Given a Java array or Collection, <code>Java.toJavaScriptArray</code> returns a JavaScript array with a shallow copy of its contents. Note that in most cases, you can use Java arrays and lists natively in Nashorn; in cases where for some reason you need to have an actual JavaScript native array (e.g. to work with the array comprehensions functions), you will want to use this method.
|
||||
Given a Java array or Collection, <code>Java.from</code> returns a JavaScript array with a shallow copy of its contents. Note that in most cases, you can use Java arrays and lists natively in Nashorn; in cases where for some reason you need to have an actual JavaScript native array (e.g. to work with the array comprehensions functions), you will want to use this method.
|
||||
</p>
|
||||
<pre><code>
|
||||
var File = Java.type("java.io.File");
|
||||
var listCurDir = new File(".").listFiles();
|
||||
var jsList = Java.toJavaScriptArray(listCurDir);
|
||||
var jsList = Java.from(listCurDir);
|
||||
print(jsList);
|
||||
</code></pre>
|
||||
<hr>
|
||||
|
@ -40,7 +40,7 @@ print(a[0]);
|
||||
|
||||
// convert a script array to Java array
|
||||
var anArray = [1, "13", false];
|
||||
var javaIntArray = Java.toJavaArray(anArray, "int");
|
||||
var javaIntArray = Java.to(anArray, "int[]");
|
||||
print(javaIntArray[0]);// prints 1
|
||||
print(javaIntArray[1]); // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
|
||||
print(javaIntArray[2]);// prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
|
||||
@ -48,5 +48,5 @@ print(javaIntArray[2]);// prints 0, as boolean false was converted to number 0 a
|
||||
// convert a Java array to a JavaScript array
|
||||
var File = Java.type("java.io.File");
|
||||
var listCurDir = new File(".").listFiles();
|
||||
var jsList = Java.toJavaScriptArray(listCurDir);
|
||||
var jsList = Java.from(listCurDir);
|
||||
print(jsList);
|
||||
|
@ -88,7 +88,7 @@ Object.defineProperty(this, "sprintf", {
|
||||
}
|
||||
}
|
||||
|
||||
array = Java.toJavaArray(array);
|
||||
array = Java.to(array);
|
||||
return Packages.jdk.nashorn.api.scripting.ScriptUtils.format(format, array);
|
||||
}
|
||||
});
|
||||
|
@ -240,39 +240,52 @@ public final class NativeJava {
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a JavaScript array and a Java type, returns a Java array with the same initial contents, and with the
|
||||
* specified component type. Example:
|
||||
* Given a script object and a Java type, converts the script object into the desired Java type. Currently it only
|
||||
* performs shallow creation of Java arrays, but might be extended for other types in the future. Example:
|
||||
* <pre>
|
||||
* var anArray = [1, "13", false]
|
||||
* var javaIntArray = Java.toJavaArray(anArray, "int")
|
||||
* var javaIntArray = Java.to(anArray, "int[]")
|
||||
* print(javaIntArray[0]) // prints 1
|
||||
* print(javaIntArray[1]) // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
|
||||
* print(javaIntArray[2]) // prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
|
||||
* </pre>
|
||||
* @param self not used
|
||||
* @param objArray the JavaScript array. Can be null.
|
||||
* @param objType either a {@link #type(Object, Object) type object} or a String describing the component type of
|
||||
* the Java array to create. Can not be null. If undefined, Object is assumed (allowing the argument to be omitted).
|
||||
* @return a Java array with the copy of JavaScript array's contents, converted to the appropriate Java component
|
||||
* type. Returns null if objArray is null.
|
||||
* @param objArray the script object. Can be null.
|
||||
* @param objType either a {@link #type(Object, Object) type object} or a String describing the type of the Java
|
||||
* object to create. Can not be null. If undefined, a "default" conversion is presumed (allowing the argument to be
|
||||
* omitted).
|
||||
* @return a Java object whose value corresponds to the original script object's value. Specifically, for array
|
||||
* target types, returns a Java array of the same type with contents converted to the array's component type. Does
|
||||
* not recursively convert for multidimensional arrays.
|
||||
* type. Returns null if scriptObject is null.
|
||||
* @throws ClassNotFoundException if the class described by objType is not found
|
||||
*/
|
||||
@Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
|
||||
public static Object toJavaArray(final Object self, final Object objArray, final Object objType) throws ClassNotFoundException {
|
||||
final StaticClass componentType =
|
||||
objType instanceof StaticClass ?
|
||||
(StaticClass)objType :
|
||||
objType == UNDEFINED ?
|
||||
StaticClass.forClass(Object.class) :
|
||||
type(objType);
|
||||
|
||||
public static Object to(final Object self, final Object objArray, final Object objType) throws ClassNotFoundException {
|
||||
if (objArray == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Class<?> componentType;
|
||||
if(objType == UNDEFINED) {
|
||||
componentType = Object.class;
|
||||
} else {
|
||||
final StaticClass arrayType;
|
||||
if(objType instanceof StaticClass) {
|
||||
arrayType = (StaticClass)objType;
|
||||
} else {
|
||||
arrayType = type(objType);
|
||||
}
|
||||
final Class<?> arrayClass = arrayType.getRepresentedClass();
|
||||
if(!arrayClass.isArray()) {
|
||||
throw typeError("to.expects.array.type", arrayClass.getName());
|
||||
}
|
||||
componentType = arrayClass.getComponentType();
|
||||
}
|
||||
|
||||
Global.checkObject(objArray);
|
||||
|
||||
return ((ScriptObject)objArray).getArray().asArrayOfType(componentType.getRepresentedClass());
|
||||
return ((ScriptObject)objArray).getArray().asArrayOfType(componentType);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -283,7 +296,7 @@ public final class NativeJava {
|
||||
* <pre>
|
||||
* var File = Java.type("java.io.File")
|
||||
* var listHomeDir = new File("~").listFiles()
|
||||
* var jsListHome = Java.toJavaScriptArray(listHomeDir)
|
||||
* var jsListHome = Java.from(listHomeDir)
|
||||
* var jpegModifiedDates = jsListHome
|
||||
* .filter(function(val) { return val.getName().endsWith(".jpg") })
|
||||
* .map(function(val) { return val.lastModified() })
|
||||
@ -294,7 +307,7 @@ public final class NativeJava {
|
||||
* null.
|
||||
*/
|
||||
@Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
|
||||
public static Object toJavaScriptArray(final Object self, final Object objArray) {
|
||||
public static Object from(final Object self, final Object objArray) {
|
||||
if (objArray == null) {
|
||||
return null;
|
||||
} else if (objArray instanceof Collection) {
|
||||
|
@ -125,6 +125,7 @@ type.error.no.constructor.matches.args=Can not construct {0} with the passed arg
|
||||
type.error.no.method.matches.args=Can not invoke method {0} with the passed arguments; they do not match any of its method signatures.
|
||||
type.error.method.not.constructor=Java method {0} can't be used as a constructor.
|
||||
type.error.env.not.object=$ENV must be an Object.
|
||||
type.error.to.expects.array.type=Java.to() expects an array target type. {0} is not an array type.
|
||||
range.error.inappropriate.array.length=inappropriate array length: {0}
|
||||
range.error.invalid.fraction.digits=fractionDigits argument to {0} must be in [0, 20]
|
||||
range.error.invalid.precision=precision argument toPrecision() must be in [1, 21]
|
||||
|
@ -47,7 +47,7 @@ function f1() {
|
||||
// (NoTypeArrayData)
|
||||
var empty = {};
|
||||
empty.length = 10;
|
||||
Java.toJavaArray(empty);
|
||||
Java.to(empty);
|
||||
delete empty[0];
|
||||
Array.prototype.slice.call(empty, 0, 1);
|
||||
Array.prototype.pop.call(empty);
|
||||
@ -63,7 +63,7 @@ function f1() {
|
||||
function f2() {
|
||||
// DeletedArrayFilter
|
||||
var deleted = [,1,,2,,3,,4,,];
|
||||
assertEq(2, Java.toJavaArray(deleted)[3]);
|
||||
assertEq(2, Java.to(deleted)[3]);
|
||||
assertEq(undefined, deleted.pop());
|
||||
assertEq(4, deleted.pop());
|
||||
deleted.unshift(5);
|
||||
@ -78,7 +78,7 @@ function f2() {
|
||||
function f3() {
|
||||
// DeletedRangeArrayFilter
|
||||
var delrange = [1,2,3,,,,,,,,,,];
|
||||
Java.toJavaArray(delrange);
|
||||
Java.to(delrange);
|
||||
delrange.unshift(4);
|
||||
p.apply(null, delrange);
|
||||
print(delrange.slice(1,3), delrange.slice(2,6));
|
||||
@ -88,7 +88,7 @@ function f3() {
|
||||
function f4() {
|
||||
// NumberArrayData
|
||||
var num = [1.1,2.2,3.3,4.4,5.5];
|
||||
Java.toJavaArray(num);
|
||||
Java.to(num);
|
||||
assertEq(2, num[3] >>> 1);
|
||||
assertEq(5, num[4] | 0);
|
||||
assertEq(5.5, num.pop());
|
||||
@ -104,7 +104,7 @@ function f4() {
|
||||
function f5() {
|
||||
// ObjectArrayData
|
||||
var obj = [2,"two",3.14,"pi",14,"fourteen"];
|
||||
Java.toJavaArray(obj);
|
||||
Java.to(obj);
|
||||
assertEq(-12.86, obj[2] - 16);
|
||||
assertEq(7, obj[4] >>> 1);
|
||||
obj.unshift("one");
|
||||
@ -131,14 +131,14 @@ function f6() {
|
||||
sparse.length = 1024*1024;
|
||||
sparse.push(sparse.length);
|
||||
delete sparse[sparse.length-1];
|
||||
//print(Java.toJavaArray(sparse).length);
|
||||
//print(Java.to(sparse).length);
|
||||
(function(){}).apply(null, sparse);
|
||||
}
|
||||
|
||||
function f7() {
|
||||
// UndefinedArrayFilter
|
||||
var undef = [1,2,3,4,5,undefined,7,8,9,19];
|
||||
Java.toJavaArray(undef);
|
||||
Java.to(undef);
|
||||
assertEq(4, undef[8] >>> 1);
|
||||
var tmp = undef[9] >>> 1;
|
||||
undef[8] = tmp;
|
||||
@ -154,8 +154,8 @@ function f7() {
|
||||
|
||||
function f8() {
|
||||
// LongArrayData
|
||||
var j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
|
||||
Java.toJavaArray(j);
|
||||
var j = Java.from(Java.to([23,37,42,86,47], "long[]"));
|
||||
Java.to(j);
|
||||
p.apply(null, j);
|
||||
assertEq(43, j[3] >>> 1);
|
||||
assertEq(36, j[4] - 11);
|
||||
@ -164,12 +164,12 @@ function f8() {
|
||||
assertEq(7, j.shift());
|
||||
assertEq(47, j.pop());
|
||||
j.push("asdf");
|
||||
j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
|
||||
j = Java.from(Java.to([23,37,42,86,47], "long[]"));
|
||||
j.length = 3;
|
||||
j[0] = 13;
|
||||
j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
|
||||
j = Java.from(Java.to([23,37,42,86,47], "long[]"));
|
||||
delete j[0];
|
||||
j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
|
||||
j = Java.from(Java.to([23,37,42,86,47], "long[]"));
|
||||
j.length = 20;
|
||||
j[0] = 13.37;
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ var x; // used for undefined
|
||||
var testCount = 0;
|
||||
|
||||
function testF(inputValue, type, testFn) {
|
||||
var x = Java.toJavaArray([inputValue], type)[0];
|
||||
var x = Java.to([inputValue], type + "[]")[0];
|
||||
if(!testFn(x)) {
|
||||
throw ("unexpected value: " + x)
|
||||
}
|
||||
@ -130,7 +130,7 @@ test({ valueOf: function() { return "42"; }, toString: function() { return "43"
|
||||
|
||||
function assertCantConvert(sourceType, targetType) {
|
||||
try {
|
||||
Java.toJavaArray([new Java.type(sourceType)()], targetType)
|
||||
Java.to([new Java.type(sourceType)()], targetType + "[]")
|
||||
throw "no TypeError encountered"
|
||||
} catch(e) {
|
||||
if(!(e instanceof TypeError)) {
|
||||
@ -164,7 +164,7 @@ var intArray = new (Java.type("int[]"))(3)
|
||||
intArray[0] = 1234;
|
||||
intArray[1] = 42;
|
||||
intArray[2] = 5;
|
||||
var jsIntArray = Java.toJavaScriptArray(intArray)
|
||||
var jsIntArray = Java.from(intArray)
|
||||
assert(jsIntArray instanceof Array);
|
||||
assert(jsIntArray[0] === 1234);
|
||||
assert(jsIntArray[1] === 42);
|
||||
@ -179,7 +179,7 @@ assert(intArray[2] === 6);
|
||||
var byteArray = new (Java.type("byte[]"))(2)
|
||||
byteArray[0] = -128;
|
||||
byteArray[1] = 127;
|
||||
var jsByteArray = Java.toJavaScriptArray(byteArray)
|
||||
var jsByteArray = Java.from(byteArray)
|
||||
assert(jsByteArray instanceof Array);
|
||||
assert(jsByteArray[0] === -128);
|
||||
assert(jsByteArray[1] === 127);
|
||||
@ -187,7 +187,7 @@ assert(jsByteArray[1] === 127);
|
||||
var shortArray = new (Java.type("short[]"))(2)
|
||||
shortArray[0] = -32768;
|
||||
shortArray[1] = 32767;
|
||||
var jsShortArray = Java.toJavaScriptArray(shortArray)
|
||||
var jsShortArray = Java.from(shortArray)
|
||||
assert(jsShortArray instanceof Array);
|
||||
assert(jsShortArray[0] === -32768);
|
||||
assert(jsShortArray[1] === 32767);
|
||||
@ -195,7 +195,7 @@ assert(jsShortArray[1] === 32767);
|
||||
var floatArray = new (Java.type("float[]"))(2)
|
||||
floatArray[0] = java.lang.Float.MIN_VALUE;
|
||||
floatArray[1] = java.lang.Float.MAX_VALUE;
|
||||
var jsFloatArray = Java.toJavaScriptArray(floatArray)
|
||||
var jsFloatArray = Java.from(floatArray)
|
||||
assert(jsFloatArray instanceof Array);
|
||||
assert(jsFloatArray[0] == java.lang.Float.MIN_VALUE);
|
||||
assert(jsFloatArray[1] == java.lang.Float.MAX_VALUE);
|
||||
@ -204,7 +204,7 @@ var charArray = new (Java.type("char[]"))(3)
|
||||
charArray[0] = "a";
|
||||
charArray[1] = "b";
|
||||
charArray[2] = "1";
|
||||
var jsCharArray = Java.toJavaScriptArray(charArray)
|
||||
var jsCharArray = Java.from(charArray)
|
||||
assert(jsCharArray instanceof Array);
|
||||
assert(jsCharArray[0] === 97);
|
||||
assert(jsCharArray[1] === 98);
|
||||
@ -213,7 +213,7 @@ assert(jsCharArray[2] === 49);
|
||||
var booleanArray = new (Java.type("boolean[]"))(2)
|
||||
booleanArray[0] = true;
|
||||
booleanArray[1] = false;
|
||||
var jsBooleanArray = Java.toJavaScriptArray(booleanArray)
|
||||
var jsBooleanArray = Java.from(booleanArray)
|
||||
assert(jsBooleanArray instanceof Array);
|
||||
assert(jsBooleanArray[0] === true);
|
||||
assert(jsBooleanArray[1] === false);
|
||||
|
@ -53,8 +53,7 @@ function runScriptEngine(opts, name) {
|
||||
// set new standard err
|
||||
System.setErr(newErr);
|
||||
System.setOut(newOut);
|
||||
var strType = Java.type("java.lang.String");
|
||||
var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
|
||||
var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
|
||||
var reader = new java.io.FileReader(name);
|
||||
engine.eval(reader);
|
||||
newErr.flush();
|
||||
|
@ -47,8 +47,7 @@ function runScriptEngine(opts, code) {
|
||||
try {
|
||||
// set new standard err
|
||||
System.setErr(newErr);
|
||||
var strType = Java.type("java.lang.String");
|
||||
var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
|
||||
var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
|
||||
engine.eval(code);
|
||||
newErr.flush();
|
||||
return new java.lang.String(baos.toByteArray());
|
||||
|
@ -85,8 +85,7 @@ function runScriptEngine(opts, code) {
|
||||
try {
|
||||
// set new standard err
|
||||
System.setErr(newErr);
|
||||
var strType = Java.type("java.lang.String");
|
||||
var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
|
||||
var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
|
||||
engine.eval(code);
|
||||
newErr.flush();
|
||||
return new java.lang.String(baos.toByteArray());
|
||||
|
Loading…
Reference in New Issue
Block a user