Mon, 09 Nov 2015 13:45:10 -0800
Merge
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 | } |