View Javadoc
1   package org.exolab.castor.mapping.loader.collection.handler;
2   
3   import java.lang.reflect.Array;
4   import java.util.Enumeration;
5   
6   import org.exolab.castor.mapping.CollectionHandler;
7   import org.exolab.castor.mapping.loader.CollectionHandlers;
8   import org.exolab.castor.mapping.loader.J1CollectionHandlers.ArrayEnumerator;
9   
10  public final class ArrayCollectionHandler<T> implements CollectionHandler<T> {
11    public Object add(Object collection, T object) {
12      if (collection == null) {
13  
14        // If the collection is of primitive type, the instantiation
15        // (if it was null) is handled in the FieldHandlerImpl. We
16        // can rely here that we deal only with array of object.
17        Object newArray = Array.newInstance(object.getClass(), 1);
18        Array.set(newArray, 0, object);
19        return newArray;
20      }
21  
22      Class<?> type = collection.getClass();
23      if (!type.isArray()) {
24        String err = "J1CollectionHandlers.array#add: type "
25            + "mismatch, expecting an array, instead received: ";
26        err += type.getName();
27        throw new IllegalArgumentException(err);
28      }
29  
30      type = type.getComponentType();
31  
32      Object newArray = Array.newInstance(type, Array.getLength(collection) + 1);
33  
34      for (int i = 0; i < Array.getLength(collection); ++i)
35        Array.set(newArray, i, Array.get(collection, i));
36  
37      Array.set(newArray, Array.getLength(collection), object);
38  
39      return newArray;
40  
41    }
42  
43    public Enumeration<T> elements(Object collection) {
44      if (collection == null)
45        return new CollectionHandlers.EmptyEnumerator<T>();
46      return new ArrayEnumerator<T>(collection);
47    }
48  
49    public int size(Object collection) {
50      if (collection == null)
51        return 0;
52      return Array.getLength(collection);
53    }
54  
55    public Object clear(Object collection) {
56      if (collection == null) {
57        return null;
58      }
59      Class<?> type = collection.getClass();
60      if (!type.isArray()) {
61        String err = "J1CollectionHandlers.array#add: type "
62            + "mismatch, expecting an array, instead received: ";
63        err += type.getName();
64        throw new IllegalArgumentException(err);
65      }
66      type = type.getComponentType();
67      return Array.newInstance(type, 0);
68    }
69  
70    public String toString() {
71      return "Object[]";
72    }
73  }