1 /*
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 
26 package jdk.nashorn.api.javaaccess.test;
27 
28 import javax.script.Invocable;
29 import javax.script.ScriptEngine;
30 import javax.script.ScriptException;
31 
32 @SuppressWarnings("javadoc")
33 public class SharedObject {
34 
35     // Public fields
36     public String                 publicString                  = "PublicString";
37     public String[]               publicStringArray             = { "ArrayString[0]", "ArrayString[1]", "ArrayString[2]", "ArrayString[3]" };
38     public Person                 publicObject                  = new Person(256);
39     public Person[]               publicObjectArray             = { new Person(4), new Person(-422), new Person(14) };
40     public boolean                publicBoolean                 = true;
41     public boolean[]              publicBooleanArray            = { true, false, false, true };
42     public Boolean                publicBooleanBox              = true;
43     public long                   publicLong                    = 933333333333333333L;
44     public long[]                 publicLongArray               = { 99012333333333L, -124355555L, 89777777777L };
45     public Long                   publicLongBox                 = 9333333333L;
46     public int                    publicInt                     = 2076543123;
47     public int[]                  publicIntArray                = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
48     public Integer                publicIntBox                  = 20765123;
49     public byte                   publicByte                    = -128;
50     public byte[]                 publicByteArray               = { 1, 2, 4, 8, 16, 32, 64, 127, -128 };
51     public Byte                   publicByteBox                 = 127;
52     public short                  publicShort                   = 32000;
53     public short[]                publicShortArray              = { 3240, 8900, -16789, 1, 12 };
54     public Short                  publicShortBox                = Short.MIN_VALUE;
55     public float                  publicFloat                   = 0.7f;
56     public float[]                publicFloatArray              = { -32.01f, 89.3f, -1.3e8f, 3.1f };
57     public Float                  publicFloatBox                = 1.377e4f;
58     public double                 publicDouble                  = 1.34e20;
59     public double[]               publicDoubleArray             = { 0.75e80, 8e-43, 1.000077, 0.123e10 };
60     public Double                 publicDoubleBox               = 1.4e-19;
61     public char                   publicChar                    = 'A';
62     public char[]                 publicCharArray               = "Hello Nashorn".toCharArray();
63     public Character              publicCharBox                 = 'B';
64     // Public static fields
65     public static String          publicStaticString            = "PublicStaticString";
66     public static String[]        publicStaticStringArray       = { "StaticArrayString[0]", "StaticArrayString[1]", "StaticArrayString[2]", "StaticArrayString[3]" };
67     public static Person          publicStaticObject            = new Person(512);
68     public static Person[]        publicStaticObjectArray       = { new Person(40), new Person(-22), new Person(18) };
69     public static boolean         publicStaticBoolean           = true;
70     public static boolean[]       publicStaticBooleanArray      = { false, false, false, true };
71     public static Boolean         publicStaticBooleanBox        = true;
72     public static long            publicStaticLong              = 13333333333333333L;
73     public static long[]          publicStaticLongArray         = { 19012333333333L, -224355555L, 39777777777L };
74     public static Long            publicStaticLongBox           = 9333333334L;
75     public static int             publicStaticInt               = 207654323;
76     public static int[]           publicStaticIntArray          = { 5, 8, 13, 21, 34 };
77     public static Integer         publicStaticIntBox            = 2075123;
78     public static byte            publicStaticByte              = -12;
79     public static byte[]          publicStaticByteArray         = { 16, 32, 64, 127, -128 };
80     public static Byte            publicStaticByteBox           = 17;
81     public static short           publicStaticShort             = 320;
82     public static short[]         publicStaticShortArray        = { 1240, 900, -1789, 100, 12 };
83     public static Short           publicStaticShortBox          = -16777;
84     public static float           publicStaticFloat             = 7.7e8f;
85     public static float[]         publicStaticFloatArray        = { -131.01f, 189.3f, -31.3e8f, 3.7f };
86     public static Float           publicStaticFloatBox          = 1.37e4f;
87     public static double          publicStaticDouble            = 1.341e20;
88     public static double[]        publicStaticDoubleArray       = { 0.75e80, 0.123e10, 8e-43, 1.000077 };
89     public static Double          publicStaticDoubleBox         = 1.41e-12;
90     public static char            publicStaticChar              = 'C';
91     public static char[]          publicStaticCharArray         = "Nashorn".toCharArray();
92     public static Character       publicStaticCharBox           = 'D';
93     // Public final fields
94     public final String           publicFinalString             = "PublicFinalString";
95     public final String[]         publicFinalStringArray        = { "FinalArrayString[0]", "FinalArrayString[1]", "FinalArrayString[2]", "FinalArrayString[3]" };
96     public final Person           publicFinalObject             = new Person(1024);
97     public final Person[]         publicFinalObjectArray        = { new Person(-900), new Person(1000), new Person(180) };
98     public final boolean          publicFinalBoolean            = true;
99     public final boolean[]        publicFinalBooleanArray       = { false, false, true, false };
100     public final Boolean          publicFinalBooleanBox         = true;
101     public final long             publicFinalLong               = 13353333333333333L;
102     public final long[]           publicFinalLongArray          = { 1901733333333L, -2247355555L, 3977377777L };
103     public final Long             publicFinalLongBox            = 9377333334L;
104     public final int              publicFinalInt                = 20712023;
105     public final int[]            publicFinalIntArray           = { 50, 80, 130, 210, 340 };
106     public final Integer          publicFinalIntBox             = 207512301;
107     public final byte             publicFinalByte               = -7;
108     public final byte[]           publicFinalByteArray          = { 1, 3, 6, 17, -128 };
109     public final Byte             publicFinalByteBox            = 19;
110     public final short            publicFinalShort              = 31220;
111     public final short[]          publicFinalShortArray         = { 12240, 9200, -17289, 1200, 12 };
112     public final Short            publicFinalShortBox           = -26777;
113     public final float            publicFinalFloat              = 7.72e8f;
114     public final float[]          publicFinalFloatArray         = { -131.012f, 189.32f, -31.32e8f, 3.72f };
115     public final Float            publicFinalFloatBox           = 1.372e4f;
116     public final double           publicFinalDouble             = 1.3412e20;
117     public final double[]         publicFinalDoubleArray        = { 0.725e80, 0.12e10, 8e-3, 1.00077 };
118     public final Double           publicFinalDoubleBox          = 1.412e-12;
119     public final char             publicFinalChar               = 'E';
120     public final char[]           publicFinalCharArray          = "Nashorn hello".toCharArray();
121     public final Character        publicFinalCharBox            = 'F';
122     // Public static final fields
123     public static final String    publicStaticFinalString       = "PublicStaticFinalString";
124     public static final String[]  publicStaticFinalStringArray  = { "StaticFinalArrayString[0]", "StaticFinalArrayString[1]", "StaticFinalArrayString[2]", "StaticFinalArrayString[3]" };
125     public static final Person    publicStaticFinalObject       = new Person(2048);
126     public static final Person[]  publicStaticFinalObjectArray  = { new Person(-9), new Person(110), new Person(Integer.MAX_VALUE) };
127     public static final boolean   publicStaticFinalBoolean      = true;
128     public static final boolean[] publicStaticFinalBooleanArray = { false, true, false, false };
129     public static final Boolean   publicStaticFinalBooleanBox   = true;
130     public static final long      publicStaticFinalLong         = 8333333333333L;
131     public static final long[]    publicStaticFinalLongArray    = { 19017383333L, -2247358L, 39773787L };
132     public static final Long      publicStaticFinalLongBox      = 9377388334L;
133     public static final int       publicStaticFinalInt          = 207182023;
134     public static final int[]     publicStaticFinalIntArray     = { 1308, 210, 340 };
135     public static final Integer   publicStaticFinalIntBox       = 2078301;
136     public static final byte      publicStaticFinalByte         = -70;
137     public static final byte[]    publicStaticFinalByteArray    = { 17, -128, 81 };
138     public static final Byte      publicStaticFinalByteBox      = 91;
139     public static final short     publicStaticFinalShort        = 8888;
140     public static final short[]   publicStaticFinalShortArray   = { 8240, 9280, -1289, 120, 812 };
141     public static final Short     publicStaticFinalShortBox     = -26;
142     public static final float     publicStaticFinalFloat        = 0.72e8f;
143     public static final float[]   publicStaticFinalFloatArray   = { -8131.012f, 9.32f, -138.32e8f, 0.72f };
144     public static final Float     publicStaticFinalFloatBox     = 1.2e4f;
145     public static final double    publicStaticFinalDouble       = 1.8e12;
146     public static final double[]  publicStaticFinalDoubleArray  = { 8.725e80, 0.82e10, 18e-3, 1.08077 };
147     public static final Double    publicStaticFinalDoubleBox    = 1.5612e-13;
148     public static final char      publicStaticFinalChar         = 'K';
149     public static final char[]    publicStaticFinalCharArray    = "StaticString".toCharArray();
150     public static final Character publicStaticFinalCharBox      = 'L';
151 
152     // Special vars
153     public volatile boolean       volatileBoolean               = true;
154     public transient boolean      transientBoolean              = true;
155 
156     // For methods testing
157     public boolean                isAccessed                    = false;
158     public volatile boolean       isFinished                    = false;
159 
160     private ScriptEngine engine;
161 
getEngine()162     public ScriptEngine getEngine() {
163         return engine;
164     }
165 
setEngine(final ScriptEngine engine)166     public void setEngine(final ScriptEngine engine) {
167         this.engine = engine;
168     }
169 
voidMethod()170     public void voidMethod() {
171         isAccessed = true;
172     }
173 
booleanMethod(final boolean arg)174     public boolean booleanMethod(final boolean arg) {
175         return !arg;
176     }
177 
booleanBoxingMethod(final Boolean arg)178     public Boolean booleanBoxingMethod(final Boolean arg) {
179         return !arg;
180     }
181 
booleanArrayMethod(final boolean arg[])182     public boolean[] booleanArrayMethod(final boolean arg[]) {
183         final boolean[] res = new boolean[arg.length];
184         for (int i = 0; i < arg.length; i++) {
185             res[i] = !arg[i];
186         }
187         return res;
188     }
189 
intMethod(final int arg)190     public int intMethod(final int arg) {
191         return arg + arg;
192     }
193 
intBoxingMethod(final Integer arg)194     public Integer intBoxingMethod(final Integer arg) {
195         return arg + arg;
196     }
197 
intArrayMethod(final int arg[])198     public int[] intArrayMethod(final int arg[]) {
199         final int[] res = new int[arg.length];
200         for (int i = 0; i < arg.length; i++) {
201             res[i] = arg[i] * 2;
202         }
203         return res;
204     }
205 
longMethod(final long arg)206     public long longMethod(final long arg) {
207         return arg + arg;
208     }
209 
longBoxingMethod(final Long arg)210     public Long longBoxingMethod(final Long arg) {
211         return arg + arg;
212     }
213 
longArrayMethod(final long[] arg)214     public long[] longArrayMethod(final long[] arg) {
215         final long[] res = new long[arg.length];
216         for (int i = 0; i < arg.length; i++) {
217             res[i] = arg[i] * 2;
218         }
219         return res;
220     }
221 
byteMethod(final byte arg)222     public byte byteMethod(final byte arg) {
223         return (byte)(arg + arg);
224     }
225 
byteBoxingMethod(final Byte arg)226     public Byte byteBoxingMethod(final Byte arg) {
227         return (byte)(arg + arg);
228     }
229 
byteArrayMethod(final byte[] arg)230     public byte[] byteArrayMethod(final byte[] arg) {
231         final byte[] res = new byte[arg.length];
232         for (int i = 0; i < arg.length; i++) {
233             res[i] = (byte)(arg[i] * 2);
234         }
235         return res;
236     }
237 
charMethod(final char arg)238     public char charMethod(final char arg) {
239         return Character.toUpperCase(arg);
240     }
241 
charBoxingMethod(final Character arg)242     public Character charBoxingMethod(final Character arg) {
243         return Character.toUpperCase(arg);
244     }
245 
charArrayMethod(final char[] arg)246     public char[] charArrayMethod(final char[] arg) {
247         final char[] res = new char[arg.length];
248         for (int i = 0; i < arg.length; i++) {
249             res[i] = Character.toUpperCase(arg[i]);
250         }
251         return res;
252     }
253 
shortMethod(final short arg)254     public short shortMethod(final short arg) {
255         return (short)(arg + arg);
256     }
257 
shortBoxingMethod(final Short arg)258     public Short shortBoxingMethod(final Short arg) {
259         return (short)(arg + arg);
260     }
261 
shortArrayMethod(final short[] arg)262     public short[] shortArrayMethod(final short[] arg) {
263         final short[] res = new short[arg.length];
264         for (int i = 0; i < arg.length; i++) {
265             res[i] = (short)(arg[i] * 2);
266         }
267         return res;
268     }
269 
floatMethod(final float arg)270     public float floatMethod(final float arg) {
271         return arg + arg;
272     }
273 
floatBoxingMethod(final Float arg)274     public Float floatBoxingMethod(final Float arg) {
275         return arg + arg;
276     }
277 
floatArrayMethod(final float[] arg)278     public float[] floatArrayMethod(final float[] arg) {
279         final float[] res = new float[arg.length];
280         for (int i = 0; i < arg.length; i++) {
281             res[i] = arg[i] * 2;
282         }
283         return res;
284     }
285 
doubleMethod(final double arg)286     public double doubleMethod(final double arg) {
287         return arg + arg;
288     }
289 
doubleBoxingMethod(final Double arg)290     public Double doubleBoxingMethod(final Double arg) {
291         return arg + arg;
292     }
293 
doubleArrayMethod(final double[] arg)294     public double[] doubleArrayMethod(final double[] arg) {
295         final double[] res = new double[arg.length];
296         for (int i = 0; i < arg.length; i++) {
297             res[i] = arg[i] * 2;
298         }
299         return res;
300     }
301 
stringMethod(final String str)302     public String stringMethod(final String str) {
303         return str + str;
304     }
305 
stringArrayMethod(final String[] arr)306     public String[] stringArrayMethod(final String[] arr) {
307         final int l = arr.length;
308         final String[] res = new String[l];
309         for (int i = 0; i < l; i++) {
310             res[i] = arr[l - i - 1];
311         }
312         return res;
313     }
314 
objectArrayMethod(final Person[] arr)315     public Person[] objectArrayMethod(final Person[] arr) {
316         final Person[] res = new Person[arr.length];
317         for (int i = 0; i < arr.length; i++) {
318             res[i] = new Person(i + 100);
319         }
320         return res;
321     }
322 
objectMethod(final Person t)323     public Person objectMethod(final Person t) {
324         t.id *= 2;
325         return t;
326     }
327 
twoParamMethod(final long l, final double d)328     public int twoParamMethod(final long l, final double d) {
329         return (int)(l + d);
330     }
331 
threeParamMethod(final short s, final long l, final char c)332     public int threeParamMethod(final short s, final long l, final char c) {
333         return (int)(s + l + c);
334     }
335 
twoObjectParamMethod(final Person arg1, final Person arg2)336     public Person[] twoObjectParamMethod(final Person arg1, final Person arg2) {
337         return new Person[] { arg2, arg1 };
338     }
339 
threeObjectParamMethod(final Person arg1, final Person arg2, final Person arg3)340     public Person[] threeObjectParamMethod(final Person arg1, final Person arg2, final Person arg3) {
341         return new Person[] { arg3, arg2, arg1 };
342     }
343 
eightObjectParamMethod(final Person arg1, final Person arg2, final Person arg3, final Person arg4, final Person arg5, final Person arg6, final Person arg7, final Person arg8)344     public Person[] eightObjectParamMethod(final Person arg1, final Person arg2, final Person arg3, final Person arg4, final Person arg5, final Person arg6, final Person arg7, final Person arg8) {
345         return new Person[] { arg8, arg7, arg6, arg5, arg4, arg3, arg2, arg1 };
346     }
347 
nineObjectParamMethod(final Person arg1, final Person arg2, final Person arg3, final Person arg4, final Person arg5, final Person arg6, final Person arg7, final Person arg8, final Person arg9)348     public Person[] nineObjectParamMethod(final Person arg1, final Person arg2, final Person arg3, final Person arg4, final Person arg5, final Person arg6, final Person arg7, final Person arg8, final Person arg9) {
349         return new Person[] { arg9, arg8, arg7, arg6, arg5, arg4, arg3, arg2, arg1 };
350     }
351 
methodObjectEllipsis(final Person... args)352     public Person[] methodObjectEllipsis(final Person... args) {
353         final int l = args.length;
354         final Person[] res = new Person[l];
355         for (int i = 0; i < l; i++) {
356             res[i] = args[l - i - 1];
357         }
358         return res;
359     }
360 
methodPrimitiveEllipsis(final int... args)361     public Person[] methodPrimitiveEllipsis(final int... args) {
362         final int l = args.length;
363         final Person[] res = new Person[l];
364         for (int i = 0; i < l; i++) {
365             res[i] = new Person(args[i]);
366         }
367         return res;
368     }
369 
methodMixedEllipsis(final Object... args)370     public Object[] methodMixedEllipsis(final Object... args) {
371         return args;
372     }
373 
methodObjectWithEllipsis(final String arg, final int... args)374     public Object[] methodObjectWithEllipsis(final String arg, final int... args) {
375         final Object[] res = new Object[args.length + 1];
376         res[0] = arg;
377         for (int i = 0; i < args.length; i++) {
378             res[i + 1] = args[i];
379         }
380         return res;
381     }
382 
methodPrimitiveWithEllipsis(final int arg, final long... args)383     public Object[] methodPrimitiveWithEllipsis(final int arg, final long... args) {
384         final Object[] res = new Object[args.length + 1];
385         res[0] = arg;
386         for (int i = 0; i < args.length; i++) {
387             res[i + 1] = args[i];
388         }
389         return res;
390     }
391 
methodMixedWithEllipsis(final String arg1, final int arg2, final Object... args)392     public Object[] methodMixedWithEllipsis(final String arg1, final int arg2, final Object... args) {
393         final Object[] res = new Object[args.length + 2];
394         res[0] = arg1;
395         res[1] = arg2;
396         System.arraycopy(args, 0, res, 2, args.length);
397         return res;
398     }
399 
methodStartsThread()400     public void methodStartsThread() {
401         isFinished = false;
402 
403         final Thread t = new Thread(new Runnable() {
404             @Override
405             public void run() {
406                 try {
407                     Thread.sleep(1000);
408                     isFinished = true;
409                 } catch (final InterruptedException e) {
410                     e.printStackTrace();
411                 }
412             }
413         });
414 
415         t.start();
416     }
417 
overloadedMethodDoubleVSint(final int arg)418     public String overloadedMethodDoubleVSint(final int arg) {
419         return "int";
420     }
421 
overloadedMethodDoubleVSint(final double arg)422     public String overloadedMethodDoubleVSint(final double arg) {
423         return "double";
424     }
425 
overloadedMethod(final int arg)426     public int overloadedMethod(final int arg) {
427         return arg*2;
428     }
429 
overloadedMethod(final String arg)430     public int overloadedMethod(final String arg) {
431         return arg.length();
432     }
433 
overloadedMethod(final boolean arg)434     public int overloadedMethod(final boolean arg) {
435         return (arg) ? 1 : 0;
436     }
437 
overloadedMethod(final Person arg)438     public int overloadedMethod(final Person arg) {
439         return arg.id*2;
440     }
441 
firstLevelMethodInt(final int arg)442     public int firstLevelMethodInt(final int arg) throws ScriptException, NoSuchMethodException {
443         return (int) ((Invocable)engine).invokeFunction("secondLevelMethodInt", arg);
444     }
445 
thirdLevelMethodInt(final int arg)446     public int thirdLevelMethodInt(final int arg) {
447         return arg*5;
448     }
449 
firstLevelMethodInteger(final Integer arg)450     public int firstLevelMethodInteger(final Integer arg) throws ScriptException, NoSuchMethodException {
451         return (int) ((Invocable)engine).invokeFunction("secondLevelMethodInteger", arg);
452     }
453 
thirdLevelMethodInteger(final Integer arg)454     public int thirdLevelMethodInteger(final Integer arg) {
455         return arg*10;
456     }
457 
firstLevelMethodObject(final Person p)458     public Person firstLevelMethodObject(final Person p) throws ScriptException, NoSuchMethodException {
459         return (Person) ((Invocable)engine).invokeFunction("secondLevelMethodObject", p);
460     }
461 
thirdLevelMethodObject(final Person p)462     public Person thirdLevelMethodObject(final Person p) {
463         p.id *= 10;
464         return p;
465     }
466 
467 }
468