1 package org.apache.ojb.broker.accesslayer;
2
3 /* Copyright 2003-2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 import org.apache.ojb.broker.PersistenceBrokerException;
19 import org.apache.ojb.broker.query.Query;
20
21 /**
22 * PagingIterator is wrapper around an OJBIterator to support startAt endAt
23 * positions. The PagingIterator returns rows <b>including</b> startAt
24 * and <b>including</b> endAt.
25 *
26 * startAt = 1, endAt = 11 returns rows 1 to 11 if available
27 * if endAt == Query.NO_END_AT_INDEX endAt is set to the last available row
28 *
29 * @author <a href="mailto:jbraeuchi@gmx.ch">Jakob Braeuchi</a>
30 * @version $Id: PagingIterator.java,v 1.1 2007-08-24 22:17:30 ewestfal Exp $
31 */
32 public class PagingIterator implements OJBIterator
33 {
34 private final OJBIterator m_iterator;
35 private int m_startAt;
36 private int m_endAt;
37 private int m_rowLimit;
38 private int m_fullSize;
39 private int m_currentCursorPosition; // position of the wrapped iterator
40
41 /**
42 * Constructor
43 * @param anIterator wrapped Iterator
44 * @param startAt (first row is 1)
45 * @param endAt (Query.NO_END_AT_INDEX stands for all available rows)
46 */
47 public PagingIterator(OJBIterator anIterator, int startAt, int endAt)
48 {
49 super();
50
51 if (endAt != Query.NO_START_AT_INDEX && startAt > endAt)
52 {
53 throw new PersistenceBrokerException("startAt must be less than endAt.");
54 }
55
56 m_iterator = anIterator;
57 m_fullSize = m_iterator.size();
58
59 if (startAt == Query.NO_START_AT_INDEX)
60 {
61 m_startAt = 1;
62 }
63 else
64 {
65 m_startAt = startAt;
66 }
67
68 if (endAt == Query.NO_END_AT_INDEX)
69 {
70 m_endAt = m_fullSize;
71 }
72 else
73 {
74 m_endAt = Math.min(endAt, m_fullSize);
75 }
76
77 m_rowLimit = Math.max(0, m_endAt - m_startAt + 1);
78 m_currentCursorPosition = m_startAt - 1;
79
80 m_iterator.absolute(m_currentCursorPosition);
81 }
82
83 /**
84 * @see org.apache.ojb.broker.accesslayer.OJBIterator#size()
85 */
86 public int size() throws PersistenceBrokerException
87 {
88 if (m_fullSize < m_rowLimit)
89 {
90 return m_fullSize;
91 }
92 else
93 {
94 return m_rowLimit;
95 }
96 }
97
98 /**
99 * @see org.apache.ojb.broker.accesslayer.OJBIterator#fullSize()
100 */
101 public int fullSize() throws PersistenceBrokerException
102 {
103 return m_fullSize;
104 }
105
106 /**
107 * @see org.apache.ojb.broker.accesslayer.OJBIterator#absolute(int)
108 */
109 public boolean absolute(int row) throws PersistenceBrokerException
110 {
111 int newPosition = (m_startAt - 1) + row;
112
113 if (newPosition < m_startAt)
114 {
115 newPosition = Math.max(m_endAt + row, m_startAt - 1);
116 }
117
118 if (newPosition > m_endAt)
119 {
120 newPosition = m_endAt;
121 }
122
123 m_currentCursorPosition = newPosition;
124 return m_iterator.absolute(newPosition);
125 }
126
127 /**
128 * @see org.apache.ojb.broker.accesslayer.OJBIterator#relative(int)
129 */
130 public boolean relative(int row) throws PersistenceBrokerException
131 {
132 return absolute(m_currentCursorPosition - (m_startAt - 1) + row);
133 }
134
135 /**
136 * @see org.apache.ojb.broker.accesslayer.OJBIterator#releaseDbResources()
137 */
138 public void releaseDbResources()
139 {
140 m_iterator.releaseDbResources();
141 }
142
143 /**
144 * remove is not supported
145 */
146 public void remove()
147 {
148 throw new UnsupportedOperationException("remove not supported by PagingIterator");
149 }
150
151 /**
152 * @see java.util.Iterator#hasNext()
153 */
154 public boolean hasNext()
155 {
156 if (m_currentCursorPosition < m_endAt)
157 {
158 return true;
159 }
160 else
161 {
162 releaseDbResources();
163 return false;
164 }
165
166 }
167
168 /**
169 * @see java.util.Iterator#next()
170 */
171 public Object next()
172 {
173 m_currentCursorPosition++;
174 return m_iterator.next();
175 }
176
177 /**
178 * @see org.apache.ojb.broker.accesslayer.OJBIterator#disableLifeCycleEvents()
179 */
180 public void disableLifeCycleEvents()
181 {
182 m_iterator.disableLifeCycleEvents();
183 }
184 }