View Javadoc

1   package com.atlassian.core.util.collection;
2   
3   import com.atlassian.core.util.ObjectUtils;
4   import org.apache.commons.collections.CollectionUtils;
5   
6   import java.util.ArrayList;
7   import java.util.Collection;
8   import java.util.Collections;
9   import java.util.List;
10  
11  /**
12   * A replacement for UtilMisc.toList(). <p/> Most methods here are not null safe
13   */
14  public class EasyList
15  {
16  
17      /**
18       * Creates a list with one null value. Occasionally useful.
19       * @return a list with one null value.
20       */
21      public static List buildNull()
22      {
23          List list = createList(1);
24          list.add(null);
25          return list;
26      }
27  
28      public static List build(Object[] array)
29      {
30          List list = createList(array.length);
31  
32          for (int i = 0; i < array.length; i++)
33          {
34              Object o = array[i];
35              list.add(o);
36          }
37  
38          return list;
39      }
40  
41      public static List buildNonNull(Object[] array)
42      {
43          List list;
44          if (array != null && array.length > 0)
45          {
46              list = createList(array.length);
47              for (int i = 0; i < array.length; i++)
48              {
49                  Object o = array[i];
50                  if (ObjectUtils.isNotEmpty(o))
51                  {
52                      list.add(o);
53                  }
54              }
55          }
56          else
57          {
58              list = Collections.EMPTY_LIST;
59          }
60  
61          return list;
62      }
63  
64      public static List buildNonNull(Collection c)
65      {
66          List list;
67          if (c != null && !c.isEmpty())
68          {
69              list = build(CollectionUtils.predicatedCollection(c, ObjectUtils.getIsSetPredicate()));
70          }
71          else
72          {
73              list = Collections.EMPTY_LIST;
74          }
75  
76          return list;
77      }
78  
79      public static List buildNonNull(Object o)
80      {
81          if (ObjectUtils.isNotEmpty(o))
82          {
83              return build(o);
84          }
85          else
86          {
87              return build();
88          }
89      }
90  
91      public static List build()
92      {
93          return Collections.EMPTY_LIST;
94      }
95  
96      public static List build(Object o1)
97      {
98          List list = createList(1);
99  
100         list.add(o1);
101 
102         return list;
103     }
104 
105     public static List build(Object o1, Object o2)
106     {
107         List list = createList(2);
108 
109         list.add(o1);
110         list.add(o2);
111 
112         return list;
113     }
114 
115     public static List build(Object o1, Object o2, Object o3)
116     {
117         List list = createList(3);
118 
119         list.add(o1);
120         list.add(o2);
121         list.add(o3);
122 
123         return list;
124     }
125 
126     public static List build(Object o1, Object o2, Object o3, Object o4)
127     {
128         List list = createList(4);
129 
130         list.add(o1);
131         list.add(o2);
132         list.add(o3);
133         list.add(o4);
134 
135         return list;
136     }
137 
138     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5)
139     {
140         List list = createList(5);
141 
142         list.add(o1);
143         list.add(o2);
144         list.add(o3);
145         list.add(o4);
146         list.add(o5);
147 
148         return list;
149     }
150 
151     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6)
152     {
153         List list = createList(6);
154 
155         list.add(o1);
156         list.add(o2);
157         list.add(o3);
158         list.add(o4);
159         list.add(o5);
160         list.add(o6);
161 
162         return list;
163     }
164 
165     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7)
166     {
167         List list = createList(7);
168 
169         list.add(o1);
170         list.add(o2);
171         list.add(o3);
172         list.add(o4);
173         list.add(o5);
174         list.add(o6);
175         list.add(o7);
176 
177         return list;
178     }
179 
180     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8)
181     {
182         List list = createList(8);
183 
184         list.add(o1);
185         list.add(o2);
186         list.add(o3);
187         list.add(o4);
188         list.add(o5);
189         list.add(o6);
190         list.add(o7);
191         list.add(o8);
192 
193         return list;
194     }
195 
196     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9)
197     {
198         List list = createList(9);
199 
200         list.add(o1);
201         list.add(o2);
202         list.add(o3);
203         list.add(o4);
204         list.add(o5);
205         list.add(o6);
206         list.add(o7);
207         list.add(o8);
208         list.add(o9);
209 
210         return list;
211     }
212 
213     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10)
214     {
215         List list = createList(10);
216 
217         list.add(o1);
218         list.add(o2);
219         list.add(o3);
220         list.add(o4);
221         list.add(o5);
222         list.add(o6);
223         list.add(o7);
224         list.add(o8);
225         list.add(o9);
226         list.add(o10);
227 
228         return list;
229     }
230 
231     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11)
232     {
233         List list = createList(11);
234 
235         list.add(o1);
236         list.add(o2);
237         list.add(o3);
238         list.add(o4);
239         list.add(o5);
240         list.add(o6);
241         list.add(o7);
242         list.add(o8);
243         list.add(o9);
244         list.add(o10);
245         list.add(o11);
246 
247         return list;
248     }
249 
250     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10,
251         Object o11, Object o12)
252     {
253         List list = createList(12);
254 
255         list.add(o1);
256         list.add(o2);
257         list.add(o3);
258         list.add(o4);
259         list.add(o5);
260         list.add(o6);
261         list.add(o7);
262         list.add(o8);
263         list.add(o9);
264         list.add(o10);
265         list.add(o11);
266         list.add(o12);
267 
268         return list;
269     }
270 
271     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10,
272         Object o11, Object o12, Object o13)
273     {
274         List list = createList(13);
275 
276         list.add(o1);
277         list.add(o2);
278         list.add(o3);
279         list.add(o4);
280         list.add(o5);
281         list.add(o6);
282         list.add(o7);
283         list.add(o8);
284         list.add(o9);
285         list.add(o10);
286         list.add(o11);
287         list.add(o12);
288         list.add(o13);
289 
290         return list;
291     }
292 
293     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10,
294         Object o11, Object o12, Object o13, Object o14)
295     {
296         List list = createList(14);
297 
298         list.add(o1);
299         list.add(o2);
300         list.add(o3);
301         list.add(o4);
302         list.add(o5);
303         list.add(o6);
304         list.add(o7);
305         list.add(o8);
306         list.add(o9);
307         list.add(o10);
308         list.add(o11);
309         list.add(o12);
310         list.add(o13);
311         list.add(o14);
312 
313         return list;
314     }
315 
316     public static List build(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10,
317         Object o11, Object o12, Object o13, Object o14, Object o15, Object o16, Object o17, Object o18, Object o19, Object o20, Object o21,
318         Object o22, Object o23, Object o24, Object o25, Object o26)
319     {
320         List list = createList(26);
321 
322         list.add(o1);
323         list.add(o2);
324         list.add(o3);
325         list.add(o4);
326         list.add(o5);
327         list.add(o6);
328         list.add(o7);
329         list.add(o8);
330         list.add(o9);
331         list.add(o10);
332         list.add(o11);
333         list.add(o12);
334         list.add(o13);
335         list.add(o14);
336         list.add(o15);
337         list.add(o16);
338         list.add(o17);
339         list.add(o18);
340         list.add(o19);
341         list.add(o20);
342         list.add(o21);
343         list.add(o22);
344         list.add(o23);
345         list.add(o24);
346         list.add(o25);
347         list.add(o26);
348 
349         return list;
350     }
351 
352     public static List build(Collection collection)
353     {
354         if (collection == null) return null;
355         return new ArrayList(collection);
356     }
357 
358     public static List createList(int size)
359     {
360         return new ArrayList(size);
361     }
362 
363     /**
364      * Merge a maximum of three lists.
365      * Null lists passed in will be ignored.
366      *
367      * @param a The first list.
368      * @param b The second list.
369      * @param c The third list.
370      * @return A merged list containing the objects of all three passed in lists.
371      */
372     public static List mergeLists(List a, List b, List c)
373     {
374         List d = EasyList.createList(0);
375         if (a != null)
376         {
377             d.addAll(a);
378         }
379         if (b != null)
380         {
381             d.addAll(b);
382         }
383         if (c != null)
384         {
385             d.addAll(c);
386         }
387         return d;
388     }
389 
390     /**
391      * Splits a list into a number of sublists of the correct length. Note this will create a 'shallow' split, in other
392      * words if you set/remove on the sublists, this will modify the parent list as well (same vice versa). Therefore,
393      * DO NOT publish the result of this method to clients as the you will be publishing read/write access to your
394      * underlying data and the results will be unpredictable, especially in a multi-threaded context.
395      * 
396      * @param list
397      *            The list to split
398      * @param sublength
399      *            Length of the sublists
400      * @return A list of lists of the correct length
401      */
402     public static List shallowSplit(List list, int sublength)
403     {
404         // if we have any remainder, then we will add one to our division to correctly size the result list
405         int overflow = ((list.size() % sublength) > 0) ? 1 : 0;
406         List result = new ArrayList((list.size() / sublength) + overflow);
407         int i = 0;
408         while (i < list.size())
409         {
410             int endIndex = (i + sublength) > list.size() ? list.size() : i + sublength;
411             result.add(list.subList(i, endIndex));
412             i += sublength;
413         }
414 
415         return result;
416     }
417 }