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