import java.util.*;
 
public class Test {
 
    int myint = 123;
    double mydouble = 3.14159265;
    String mystring = "my string";
    static String ourstring = "our string";
    static boolean embedded = false;
    int array[] = {1,2,3};
    Vector v;

    public Test() {
 

	v = new Vector();
	v.addElement("Hello");
	printfields();
	Vector x = perlTryVec(v);
	x.addElement("World");
	Vector y = perlTryVec(x);
	if (!embedded) System.err.println("Thank you, perlTryVec!");

	if (!embedded) System.err.println(retchars());
	if (!embedded) System.err.println("Thank you, retchars!");

	String[] s = retstrings();
	if (!embedded) System.err.println(s[0] + s[1] + s[2] + s[3]);
	if (!embedded) System.err.println("Thank you, retstrings!");

	Object[] o = retobjects(v, x, y);
	if (!embedded) System.err.println(o[1]);
	if (!embedded) System.err.println(o[3]);
	if (!embedded) System.err.println(o[4]);
	if (!embedded) System.err.println("Thank you, retobjects!");

	passarray(s);

	if (!embedded) System.err.println(s[0] + s[1] + s[2] + s[3]);
	if (!embedded) System.err.println("Thank you, passarray!");

	printfields();
	if (!embedded) System.err.println("Thank you, printfields!");
	setfields();
	if (!embedded) System.err.println("Thank you, setfields!");
	printfields();
	if (!embedded) System.err.println("Thank you, printfields!");
    }
 
    perl Vector perlTryVec(Vector v) throws RuntimeException {{
	print "v is: $v\n";
	print "v isa: ", ref $v,"\n";

	print "In perlTryVec() - Vector size is: ", $v->size([],['int']), "\n";
	@foo = times;
	$size ||= getmeth('size', [], ['int']);
	for ($i = 10000; $i; --$i) {
	    $x = $v->$size();
	}
	@bar = times;
	printf "%5.2fu %5.2fs\n", $bar[0] - $foo[0], $bar[1] - $foo[1];
	return $v;
    }}

    perl char[] retchars() {{
	print "In retchars()\n";
	return [65,66,67];
    }}

    perl String[] retstrings() {{
	print "In retstrings()\n";
	return [1,2,3,"many"];
    }}
 
    perl Object[] retobjects(Vector v, Vector x, Vector y) {{
	print "In retstrings()\n";
	return [$v, $x, $y, "this is only a test", 123];
    }}

    perl void passarray(String[] s) {{
	print "In passarray()\n";
	print "s = $s\n";
	$t = GetObjectArrayElement($s,3);
	print "t = $t\n";
	$x = GetStringUTFChars($t);
	print "$x\n";
	$t = SetObjectArrayElement($s,3,NewStringUTF("infinity"));
    }}
 
    perl void printfields() {{

	$| = 1;
	eval {print $self->v->toString____s(), "\n";};
	print $@ if $@;

	print $self->myint, "\n";
	print $self->mydouble, "\n";
	print $self->mystring, "\n";
	print JPL::Test->ourstring, "\n";

	@nums = GetIntArrayElements($self->array());
	print "@nums\n";

	@nums = unpack("i*", scalar GetIntArrayElements($self->array()));
	print "@nums\n";
    }}

    perl void setfields() {{
	$self->myint(321);
	$self->mydouble(2.7182918);
	$self->mystring("MY STRING!!!");
	JPL::Test->ourstring("OUR STRING!!!");
    }}

    public static void main(String[] argv) {
	if (java.lang.reflect.Array.getLength(argv) > 0 &&
	  argv[0].equals("-nothanks"))
	    embedded = true;
	Test f = new Test();
	if (!embedded) System.err.println("Thank you, Test!");
    }
}
