1 package com.atlassian.core.util.filter;
2
3 import com.atlassian.core.util.filter.Filter;
4
5 import java.util.List;
6 import java.util.Iterator;
7 import java.util.ArrayList;
8
9
10
11
12 public class ListFilter
13 {
14 private Filter filter;
15 private static final Object MYNULL = new Object();
16
17 private class FilteredIterator implements Iterator
18 {
19 private Iterator innerIterator;
20
21
22
23 private Object savedObject = MYNULL;
24
25 public FilteredIterator(Iterator innerIterator)
26 {
27 this.innerIterator = innerIterator;
28 }
29
30 public void remove()
31 {
32 innerIterator.remove();
33 }
34
35 public boolean hasNext()
36 {
37 if (savedObject != MYNULL)
38 return true;
39
40 while (innerIterator.hasNext())
41 {
42 savedObject = innerIterator.next();
43 if (filter.isIncluded(savedObject))
44 return true;
45 }
46 savedObject = MYNULL;
47
48 return false;
49 }
50
51 public Object next()
52 {
53 if (savedObject != MYNULL)
54 return clearSavedObject();
55
56 while (true)
57 {
58 Object o = innerIterator.next();
59 if (filter.isIncluded(o))
60 return o;
61 }
62 }
63
64 private Object clearSavedObject()
65 {
66 Object ret = savedObject;
67 savedObject = MYNULL;
68 return ret;
69 }
70 }
71
72
73
74
75
76
77
78
79 public ListFilter(Filter filter)
80 {
81 this.filter = filter;
82 }
83
84
85
86
87
88
89
90
91 public List filterList(List list)
92 {
93 if (list == null)
94 return list;
95
96 List filteredList = new ArrayList();
97 Iterator i = filterIterator(list.iterator());
98 while (i.hasNext())
99 filteredList.add(i.next());
100
101 return filteredList;
102 }
103
104
105
106
107
108 public Iterator filterIterator(Iterator iterator)
109 {
110 return new FilteredIterator(iterator);
111 }
112 }