KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > thoughtworks > xstream > converters > collections > ArrayConverter


1 package com.thoughtworks.xstream.converters.collections;
2
3 import com.thoughtworks.xstream.alias.ClassMapper;
4 import com.thoughtworks.xstream.converters.MarshallingContext;
5 import com.thoughtworks.xstream.converters.UnmarshallingContext;
6 import com.thoughtworks.xstream.io.HierarchicalStreamReader;
7 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
8
9 import java.lang.reflect.Array JavaDoc;
10 import java.util.Iterator JavaDoc;
11 import java.util.LinkedList JavaDoc;
12 import java.util.List JavaDoc;
13
14 /**
15  * Converts an array of objects or primitives to XML, using
16  * a nested child element for each item.
17  *
18  * @author Joe Walnes
19  */

20 public class ArrayConverter extends AbstractCollectionConverter {
21
22     public ArrayConverter(ClassMapper classMapper, String JavaDoc classAttributeIdentifier) {
23         super(classMapper, classAttributeIdentifier);
24     }
25
26     public boolean canConvert(Class JavaDoc type) {
27         return type.isArray();
28     }
29
30     public void marshal(Object JavaDoc source, HierarchicalStreamWriter writer, MarshallingContext context) {
31         int length = Array.getLength(source);
32         for (int i = 0; i < length; i++) {
33             Object JavaDoc item = Array.get(source, i);
34             writeItem(item, context, writer);
35         }
36     }
37
38     public Object JavaDoc unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
39         // read the items from xml into a list
40
List JavaDoc items = new LinkedList JavaDoc();
41         while (reader.hasMoreChildren()) {
42             reader.moveDown();
43             Object JavaDoc item = readItem(reader, context, null); // TODO: arg, what should replace null?
44
items.add(item);
45             reader.moveUp();
46         }
47         // now convertAnother the list into an array
48
// (this has to be done as a separate list as the array size is not
49
// known until all items have been read)
50
Object JavaDoc array = Array.newInstance(context.getRequiredType().getComponentType(), items.size());
51         int i = 0;
52         for (Iterator JavaDoc iterator = items.iterator(); iterator.hasNext();) {
53             Object JavaDoc item = (Object JavaDoc) iterator.next();
54             Array.set(array, i, item);
55             i++;
56         }
57         return array;
58     }
59 }
60
Popular Tags