KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > jsp > taglib > containers > QueryPreviousBatchesTag


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.bridge.jsp.taglib.containers;
11
12 import java.util.*;
13
14 import javax.servlet.jsp.JspTagException JavaDoc;
15
16 import org.mmbase.bridge.Query;
17 import org.mmbase.bridge.util.Queries;
18 import org.mmbase.bridge.jsp.taglib.StringListTag;
19 import org.mmbase.bridge.jsp.taglib.util.Attribute;
20 import org.mmbase.storage.search.SearchQuery;
21 import org.mmbase.util.logging.*;
22
23 /**
24  * A way to make paging-mechanisms. Considers 'offset' and 'maxnumber' of surrounding query.
25  *
26  * @author Michiel Meeuwissen
27  * @since MMBase-1.7
28  * @version $Id: QueryPreviousBatchesTag.java,v 1.7 2006/04/11 22:58:36 michiel Exp $
29  */

30 public class QueryPreviousBatchesTag extends StringListTag implements QueryContainerReferrer {
31     private static final Logger log = Logging.getLoggerInstance(QueryPreviousBatchesTag.class);
32
33     protected Attribute container = Attribute.NULL;
34     protected Attribute indexOffsetOffset = Attribute.NULL;
35     protected Attribute maxtotal = Attribute.NULL;
36
37     public void setContainer(String JavaDoc c) throws JspTagException JavaDoc {
38         container = getAttribute(c);
39     }
40
41     public void setMaxtotal(String JavaDoc m) throws JspTagException JavaDoc {
42         maxtotal = getAttribute(m);
43     }
44
45     public void setIndexoffset(String JavaDoc i ) throws JspTagException JavaDoc {
46         indexOffsetOffset = getAttribute(i);
47     }
48
49     protected int indexOffset = 0;
50
51     protected void truncateList() throws JspTagException JavaDoc {
52         if (max != Attribute.NULL) {
53             int m = getMaxNumber();
54             if (m > 0 && m < returnList.size()) {
55                 indexOffset += (returnList.size() - m);
56                 log.error("Setting index offset to " + indexOffset);
57                 returnList = returnList.subList(returnList.size() - m, returnList.size());
58                 
59             }
60         }
61     }
62
63     public int getIndexOffset() {
64         return indexOffset;
65     }
66
67
68     protected List getList() throws JspTagException JavaDoc {
69         QueryContainer c = (QueryContainer) findParentTag(QueryContainer.class, (String JavaDoc) container.getValue(this));
70         Query query = c.getQuery();
71         int offset = query.getOffset();
72         int maxNumber = query.getMaxNumber();
73         if (maxNumber == SearchQuery.DEFAULT_MAX_NUMBER) {
74             throw new JspTagException JavaDoc("No max-number set. Cannot batch results (use mm:maxnumber first)");
75         }
76         if (offset % maxNumber != 0) { // be paranoid, perhaps not necessary, but guarantees less queries in case of url-hacking (if 'offset' is used on url)
77
throw new JspTagException JavaDoc("Offset (" + offset + ") is not a multipible of max-number (" + maxNumber + "): Cannot batch results.");
78         }
79
80
81         int maxTotalSize = maxtotal.getInt(this, -1);
82
83         int maxSize; // the size of this list.
84

85         if (maxTotalSize > 0) {
86             maxSize = maxTotalSize / 2; // first guess
87

88             int totalSize = Queries.count(query);
89             int nextSize = totalSize - offset - maxNumber;
90             int numberOfNextBatches = nextSize/ maxNumber; // number of complete pages
91
if (nextSize % maxNumber > 0) numberOfNextBatches++; // last page may be incomplete
92
int availableForNext = (maxTotalSize - 1) / 2; // // == maxSize in QueryNextBatches
93
if (numberOfNextBatches < availableForNext) { // nextbatches will not use all
94
maxSize += (availableForNext - numberOfNextBatches);
95             }
96
97             int max = getMaxNumber();
98             if (max > 0 && maxSize > max) maxSize = max;
99
100         } else {
101             maxSize = getMaxNumber();
102         }
103
104
105         List result = new ArrayList();
106
107         while (offset > 0) {
108             offset -= maxNumber;
109             if (offset < 0) offset = 0;
110             result.add(0, new Integer JavaDoc(offset));
111             if (maxSize > 0 && result.size() == maxSize) break;
112         }
113         if (offset > 0) {
114             indexOffset = offset / maxNumber + indexOffsetOffset.getInt(this, 0);
115         } else {
116             indexOffset = indexOffsetOffset.getInt(this, 0);
117         }
118
119         return result;
120     }
121
122 }
123
Popular Tags