2e829c5fffc2d375df45e96917e154eb5ea1597c
[mir.git] / source / mir / entity / EntityBrowser.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31
32 package mir.entity;\r
33 \r
34 import mir.storage.StorageObject;
35 import mir.storage.StorageObjectFailure;
36 import mir.util.RewindableIterator;
37 \r
38 public class EntityBrowser implements RewindableIterator {\r
39 \r
40   private StorageObject storage;\r
41   private String whereClause;\r
42   private String orderByClause;\r
43   private int batchSize;\r
44   private int toFetch;\r
45   private EntityList currentBatch;\r
46 \r
47   private int skip;\r
48   private int limit;\r
49 \r
50   private int batchPosition;\r
51   private int positionInBatch;\r
52 \r
53   public EntityBrowser(StorageObject aStorage, String aWhereClause, String anOrderByClause,\r
54                        int aBatchSize, int aLimit, int aSkip) throws StorageObjectFailure {\r
55 \r
56     storage=aStorage;\r
57     whereClause=aWhereClause;\r
58     orderByClause=anOrderByClause;\r
59     batchSize=aBatchSize;\r
60     skip=aSkip;\r
61     limit=aLimit;\r
62 \r
63     rewind();\r
64   }\r
65 \r
66   public EntityBrowser(StorageObject aStorage,\r
67           String aWhereClause, String anOrderByClause,\r
68           int aBatchSize) throws StorageObjectFailure {\r
69     this(aStorage, aWhereClause, anOrderByClause, aBatchSize, -1, 0);\r
70   }\r
71 \r
72   public void readCurrentBatch(int aSkip) throws StorageObjectFailure {\r
73     currentBatch = storage.selectByWhereClause(whereClause, orderByClause, aSkip, batchSize);\r
74     batchPosition = aSkip;\r
75     positionInBatch = 0;\r
76   }\r
77 \r
78   public void rewind() {\r
79     try {\r
80       readCurrentBatch(skip);\r
81     }\r
82     catch (Throwable t) {\r
83       throw new RuntimeException(t.getMessage());\r
84     }\r
85   }\r
86 \r
87   public boolean hasNext() {\r
88     try {\r
89       if (limit>-1 && batchPosition+positionInBatch>=skip+limit)\r
90         return false;\r
91 \r
92       if (positionInBatch>=currentBatch.size() && currentBatch.hasNextBatch()) {\r
93         readCurrentBatch(batchPosition+positionInBatch);\r
94       }\r
95 \r
96       return (positionInBatch<currentBatch.size());\r
97     }\r
98     catch (Throwable t) {\r
99       throw new RuntimeException(t.getMessage());\r
100     }\r
101   }\r
102 \r
103   public Object next() {\r
104     try {\r
105       if (hasNext()) {\r
106         Entity result = currentBatch.elementAt(positionInBatch);\r
107         positionInBatch=positionInBatch+1;\r
108 \r
109         return result;\r
110       }\r
111       else {\r
112         return null;\r
113       }\r
114     }\r
115     catch (Throwable t) {\r
116       throw new RuntimeException(t.getMessage());\r
117     }\r
118   }\r
119 \r
120   public void remove() {\r
121     throw new UnsupportedOperationException();\r
122   }\r
123 }