samples/BufferArray.java

Fri, 05 Jun 2015 12:38:53 +0200

author
mhaupt
date
Fri, 05 Jun 2015 12:38:53 +0200
changeset 1398
2f1b9f4daec1
parent 1028
d79265f2fa92
permissions
-rw-r--r--

8080087: Nashorn $ENV.PWD is originally undefined
Summary: On Windows, the PWD environment variable does not exist and cannot be imported in scripting mode, so it is set explicitly.
Reviewed-by: lagergren, sundar

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 *
aoqi@0 4 * Redistribution and use in source and binary forms, with or without
aoqi@0 5 * modification, are permitted provided that the following conditions
aoqi@0 6 * are met:
aoqi@0 7 *
aoqi@0 8 * - Redistributions of source code must retain the above copyright
aoqi@0 9 * notice, this list of conditions and the following disclaimer.
aoqi@0 10 *
aoqi@0 11 * - Redistributions in binary form must reproduce the above copyright
aoqi@0 12 * notice, this list of conditions and the following disclaimer in the
aoqi@0 13 * documentation and/or other materials provided with the distribution.
aoqi@0 14 *
aoqi@0 15 * - Neither the name of Oracle nor the names of its
aoqi@0 16 * contributors may be used to endorse or promote products derived
aoqi@0 17 * from this software without specific prior written permission.
aoqi@0 18 *
aoqi@0 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
aoqi@0 20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
aoqi@0 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
aoqi@0 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
aoqi@0 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
aoqi@0 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
aoqi@0 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
aoqi@0 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
aoqi@0 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
aoqi@0 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
aoqi@0 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
aoqi@0 30 */
aoqi@0 31
lagergren@1028 32 import java.nio.DoubleBuffer;
aoqi@0 33 import jdk.nashorn.api.scripting.AbstractJSObject;
aoqi@0 34
aoqi@0 35 /**
aoqi@0 36 * Simple class demonstrating pluggable script object
aoqi@0 37 * implementation. By implementing jdk.nashorn.api.scripting.JSObject
aoqi@0 38 * (or extending AbstractJSObject which implements it), you
aoqi@0 39 * can supply a friendly script object. Nashorn will call
aoqi@0 40 * 'magic' methods on such a class on 'obj.foo, obj.foo = 33,
aoqi@0 41 * obj.bar()' etc. from script.
aoqi@0 42 *
aoqi@0 43 * In this example, Java nio DoubleBuffer object is wrapped
aoqi@0 44 * as a friendly script object that provides indexed acces
aoqi@0 45 * to buffer content and also support array-like "length"
aoqi@0 46 * readonly property to retrieve buffer's capacity. This class
aoqi@0 47 * also demonstrates a function valued property called "buf".
aoqi@0 48 * On 'buf' method, we return the underlying nio buffer object
aoqi@0 49 * that is being wrapped.
aoqi@0 50 */
aoqi@0 51 public class BufferArray extends AbstractJSObject {
aoqi@0 52 // underlying nio buffer
aoqi@0 53 private final DoubleBuffer buf;
aoqi@0 54
lagergren@1028 55 /**
lagergren@1028 56 * Constructor
lagergren@1028 57 * @param size initial size
lagergren@1028 58 */
lagergren@1028 59 public BufferArray(final int size) {
aoqi@0 60 buf = DoubleBuffer.allocate(size);
aoqi@0 61 }
aoqi@0 62
lagergren@1028 63 /**
lagergren@1028 64 * Constructur
lagergren@1028 65 * @param buf {@link DoubleBuffer} to link to
lagergren@1028 66 */
lagergren@1028 67 public BufferArray(final DoubleBuffer buf) {
aoqi@0 68 this.buf = buf;
aoqi@0 69 }
aoqi@0 70
aoqi@0 71 // called to check if indexed property exists
aoqi@0 72 @Override
lagergren@1028 73 public boolean hasSlot(final int index) {
aoqi@0 74 return index > 0 && index < buf.capacity();
aoqi@0 75 }
aoqi@0 76
aoqi@0 77 // get the value from that index
aoqi@0 78 @Override
lagergren@1028 79 public Object getSlot(final int index) {
aoqi@0 80 return buf.get(index);
aoqi@0 81 }
aoqi@0 82
aoqi@0 83 // set the value at that index
aoqi@0 84 @Override
lagergren@1028 85 public void setSlot(final int index, final Object value) {
aoqi@0 86 buf.put(index, ((Number)value).doubleValue());
aoqi@0 87 }
aoqi@0 88
aoqi@0 89 // do you have a property of that given name?
aoqi@0 90 @Override
lagergren@1028 91 public boolean hasMember(final String name) {
aoqi@0 92 return "length".equals(name) || "buf".equals(name);
aoqi@0 93 }
aoqi@0 94
aoqi@0 95 // get the value of that named property
aoqi@0 96 @Override
lagergren@1028 97 public Object getMember(final String name) {
aoqi@0 98 switch (name) {
aoqi@0 99 case "length":
aoqi@0 100 return buf.capacity();
aoqi@0 101 case "buf":
aoqi@0 102 // return a 'function' value for this property
aoqi@0 103 return new AbstractJSObject() {
aoqi@0 104 @Override
lagergren@1028 105 public Object call(final Object thiz, final Object... args) {
aoqi@0 106 return BufferArray.this.buf;
aoqi@0 107 }
aoqi@0 108
aoqi@0 109 // yes, I'm a function !
aoqi@0 110 @Override
aoqi@0 111 public boolean isFunction() {
aoqi@0 112 return true;
aoqi@0 113 }
aoqi@0 114 };
lagergren@1028 115 default:
lagergren@1028 116 break;
aoqi@0 117 }
aoqi@0 118 return null;
aoqi@0 119 }
aoqi@0 120 }

mercurial