1 /**
2 * Licensed under the Artistic License; you may not use this file
3 * except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://displaytag.sourceforge.net/license.html
7 *
8 * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
9 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11 */
12 package org.displaytag.util;
13
14 import java.util.ArrayList;
15 import java.util.Iterator;
16 import java.util.List;
17
18 import org.apache.commons.collections.IteratorUtils;
19
20
21 /**
22 * Utility methods for collection handling.
23 * @author Fabrizio Giustina
24 * @version $Revision: 1081 $ ($Author: fgiust $)
25 */
26 public final class CollectionUtil
27 {
28
29 /**
30 * Don't instantiate a CollectionUtil.
31 */
32 private CollectionUtil()
33 {
34 // unused
35 }
36
37 /**
38 * Create a list of objects taken from the given iterator and crop the resulting list according to the startIndex
39 * and numberOfItems parameters.
40 * @param iterator Iterator
41 * @param startIndex int starting index
42 * @param numberOfItems int number of items to keep in the list
43 * @return List with values taken from the given object, cropped according to startIndex and numberOfItems
44 * parameters
45 */
46 private static List getSubList(Iterator iterator, int startIndex, int numberOfItems)
47 {
48
49 List croppedList = new ArrayList(numberOfItems);
50
51 int skippedRecordCount = 0;
52 int copiedRecordCount = 0;
53 while (iterator.hasNext())
54 {
55
56 Object object = iterator.next();
57
58 if (++skippedRecordCount <= startIndex)
59 {
60 continue;
61 }
62
63 croppedList.add(object);
64
65 if ((numberOfItems != 0) && (++copiedRecordCount >= numberOfItems))
66 {
67 break;
68 }
69 }
70
71 return croppedList;
72
73 }
74
75 /**
76 * create an iterator on a given object (Collection, Enumeration, array, single Object) and crop the resulting list
77 * according to the startIndex and numberOfItems parameters.
78 * @param iterableObject Collection, Enumeration or array to crop
79 * @param startIndex int starting index
80 * @param numberOfItems int number of items to keep in the list
81 * @return List with values taken from the given object, cropped according the startIndex and numberOfItems
82 * parameters
83 */
84 public static List getListFromObject(Object iterableObject, int startIndex, int numberOfItems)
85 {
86 if (iterableObject instanceof List)
87 {
88 // easier, use sublist
89 List list = ((List) iterableObject);
90
91 // check for partial lists
92 int lastRecordExclusive = numberOfItems <= 0 ? list.size() : startIndex + numberOfItems;
93 if (lastRecordExclusive > list.size())
94 {
95 lastRecordExclusive = list.size();
96 }
97
98 if (startIndex < list.size())
99 {
100 return list.subList(startIndex, lastRecordExclusive);
101 }
102 }
103
104 // use an iterator
105 Iterator iterator = IteratorUtils.getIterator(iterableObject);
106 return getSubList(iterator, startIndex, numberOfItems);
107 }
108 }