View Javadoc

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   * Filter the contents of a list based on some criteria.
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          // We need to define our own "null", since there may be real
22          // nulls in a list. Funky, eh.
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       * Constructor, taking the filter implementation that will be used to
74       * filter the list.
75       *
76       * @param filter the filter implementation that will be used to filter the
77       *        list.
78       */
79      public ListFilter(Filter filter)
80      {
81          this.filter = filter;
82      }
83  
84      /**
85       * Filter the contents of a list. Returns a new list with the filtered
86       * objects removed. Does not change the list passed in.
87       *
88       * @param list the list to filter
89       * @return a new list with the filtered objects removed.
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      * Filter the contents of an iterator. Returns an iterator that will only
106      * return un-filtered members of the supplied iterator.
107      */
108     public Iterator filterIterator(Iterator iterator)
109     {
110         return new FilteredIterator(iterator);
111     }
112 }