1 package org.perl.inline.java ; 2 3 import java.util.* ; 4 import java.lang.reflect.Array ; 5 6 7 class InlineJavaArray { 8 private InlineJavaClass ijc ; 9 10 InlineJavaArray(InlineJavaClass _ijc)11 InlineJavaArray(InlineJavaClass _ijc){ 12 ijc = _ijc ; 13 } 14 15 CreateArray(Class c, StringTokenizer st)16 Object CreateArray(Class c, StringTokenizer st) throws InlineJavaException { 17 StringBuffer sb = new StringBuffer(st.nextToken()) ; 18 sb.replace(0, 1, "") ; 19 sb.replace(sb.length() - 1, sb.length(), "") ; 20 21 StringTokenizer st2 = new StringTokenizer(sb.toString(), ",") ; 22 ArrayList al = new ArrayList() ; 23 while (st2.hasMoreTokens()){ 24 al.add(al.size(), st2.nextToken()) ; 25 } 26 27 int size = al.size() ; 28 int dims[] = new int[size] ; 29 for (int i = 0 ; i < size ; i++){ 30 dims[i] = Integer.parseInt((String)al.get(i)) ; 31 InlineJavaUtils.debug(4, "array dimension: " + (String)al.get(i)) ; 32 } 33 34 Object array = null ; 35 try { 36 array = Array.newInstance(c, dims) ; 37 38 ArrayList args = new ArrayList() ; 39 while (st.hasMoreTokens()){ 40 args.add(args.size(), st.nextToken()) ; 41 } 42 43 // Now we need to fill it. Since we have an arbitrary number 44 // of dimensions, we can do this recursively. 45 46 PopulateArray(array, c, dims, args) ; 47 } 48 catch (IllegalArgumentException e){ 49 throw new InlineJavaException("Arguments to array constructor for class " + c.getName() + " are incompatible: " + e.getMessage()) ; 50 } 51 52 return array ; 53 } 54 55 PopulateArray(Object array, Class elem, int dims[], ArrayList args)56 void PopulateArray (Object array, Class elem, int dims[], ArrayList args) throws InlineJavaException { 57 if (dims.length > 1){ 58 int nb_args = args.size() ; 59 int nb_sub_dims = dims[0] ; 60 int nb_args_per_sub_dim = nb_args / nb_sub_dims ; 61 62 int sub_dims[] = new int[dims.length - 1] ; 63 for (int i = 1 ; i < dims.length ; i++){ 64 sub_dims[i - 1] = dims[i] ; 65 } 66 67 for (int i = 0 ; i < nb_sub_dims ; i++){ 68 // We want the args from i*nb_args_per_sub_dim -> 69 ArrayList sub_args = new ArrayList() ; 70 for (int j = (i * nb_args_per_sub_dim) ; j < ((i + 1) * nb_args_per_sub_dim) ; j++){ 71 sub_args.add(sub_args.size(), (String)args.get(j)) ; 72 } 73 PopulateArray(((Object [])array)[i], elem, sub_dims, sub_args) ; 74 } 75 } 76 else{ 77 String msg = "In creation of array of " + elem.getName() + ": " ; 78 try { 79 for (int i = 0 ; i < dims[0] ; i++){ 80 String arg = (String)args.get(i) ; 81 82 Object o = ijc.CastArgument(elem, arg) ; 83 Array.set(array, i, o) ; 84 if (o != null){ 85 InlineJavaUtils.debug(4, "setting array element " + String.valueOf(i) + " to " + o.toString()) ; 86 } 87 else{ 88 InlineJavaUtils.debug(4, "setting array element " + String.valueOf(i) + " to " + o) ; 89 } 90 } 91 } 92 catch (InlineJavaCastException e){ 93 throw new InlineJavaCastException(msg + e.getMessage()) ; 94 } 95 catch (InlineJavaException e){ 96 throw new InlineJavaException(msg + e.getMessage()) ; 97 } 98 } 99 } 100 } 101