1 package com.atlassian.user.search.page;
2
3 import java.util.Iterator;
4 import java.util.List;
5 import java.util.NoSuchElementException;
6
7
8
9
10 @SuppressWarnings("unchecked")
11 public class MergedPager implements Pager
12 {
13 private final Pager leftPager;
14 private final Pager rightPager;
15
16
17
18
19 MergedPager(Pager pager1, Pager rightPager)
20 {
21 this.leftPager = pager1;
22 this.rightPager = rightPager;
23 }
24
25 public boolean isEmpty()
26 {
27 return (leftPager == null || leftPager.isEmpty()) && (rightPager == null || rightPager.isEmpty());
28 }
29
30 public Iterator iterator()
31 {
32 if (leftPager == null && rightPager == null)
33 {
34 return new Iterator()
35 {
36 public void remove()
37 {
38 throw new UnsupportedOperationException("This iterator does not support removal");
39 }
40
41 public boolean hasNext()
42 {
43 return false;
44 }
45
46 public Object next()
47 {
48 throw new NoSuchElementException("Empty iterator");
49 }
50 };
51 }
52 else if (leftPager != null && rightPager != null)
53 {
54 return new Iterator()
55 {
56
57 Iterator iter1 = leftPager.iterator();
58 Iterator iter2 = rightPager.iterator();
59
60 public void remove()
61 {
62 throw new UnsupportedOperationException("This iterator does not support removal");
63 }
64
65 public boolean hasNext()
66 {
67 return (iter1.hasNext() || iter2.hasNext());
68 }
69
70 public Object next()
71 {
72 if (iter1.hasNext())
73 return iter1.next();
74 else if (iter2.hasNext())
75 return iter2.next();
76
77 throw new NoSuchElementException("Exhausted iterator");
78 }
79 };
80 }
81 else if (leftPager == null)
82 return rightPager.iterator();
83 else
84 return leftPager.iterator();
85 }
86
87 public List getCurrentPage()
88 {
89 List currentPage = leftPager.getCurrentPage();
90
91
92 for (Object o : rightPager.getCurrentPage())
93 {
94 if (currentPage.size() < PRELOAD_LIMIT)
95 currentPage.add(o);
96 else
97 break;
98 }
99
100 return currentPage;
101 }
102
103 public void nextPage()
104 {
105 leftPager.nextPage();
106
107 if (leftPager.getCurrentPage().isEmpty())
108 rightPager.nextPage();
109 }
110
111 public boolean onLastPage()
112 {
113 return (leftPager.getCurrentPage().isEmpty() && rightPager.onLastPage());
114 }
115
116 public void skipTo(int index) throws PagerException
117 {
118 leftPager.skipTo(index);
119
120 if (leftPager.getIndex() != index)
121 rightPager.skipTo(index - leftPager.getIndex() - leftPager.getCurrentPage().size());
122 }
123
124
125
126
127 public int getIndex()
128 {
129 return leftPager.getIndex() + rightPager.getIndex();
130 }
131
132 public int getIndexOfFirstItemInCurrentPage()
133 {
134 if (!(leftPager.getCurrentPage().isEmpty()))
135 return leftPager.getIndexOfFirstItemInCurrentPage();
136
137 return leftPager.getIndexOfFirstItemInCurrentPage() + rightPager.getIndexOfFirstItemInCurrentPage();
138 }
139 }