1 10 package org.mmbase.bridge.jsp.taglib.containers; 11 12 import org.mmbase.bridge.jsp.taglib.util.Attribute; 13 import org.mmbase.bridge.jsp.taglib.*; 14 15 import org.mmbase.bridge.*; 16 import org.mmbase.bridge.util.Queries; 17 import org.mmbase.storage.search.SearchQuery; 18 19 import java.util.*; 20 import javax.servlet.jsp.JspTagException ; 21 23 24 31 public class QueryNextBatchesTag extends StringListTag implements QueryContainerReferrer { 32 34 35 protected Attribute container = Attribute.NULL; 36 protected Attribute indexOffsetOffset = Attribute.NULL; 37 protected Attribute maxtotal = Attribute.NULL; 38 39 protected int indexOffSet = 0; 40 41 public void setIndexoffset(String i ) throws JspTagException { 42 indexOffsetOffset = getAttribute(i); 43 } 44 45 public void setContainer(String c) throws JspTagException { 46 container = getAttribute(c); 47 } 48 49 public void setMaxtotal(String m) throws JspTagException { 50 maxtotal = getAttribute(m); 51 } 52 53 public int getIndexOffset() { 54 return indexOffSet; 55 } 56 57 58 59 protected List getList() throws JspTagException { 60 QueryContainer c = (QueryContainer) findParentTag(QueryContainer.class, (String ) container.getValue(this)); 61 Query query = c.getQuery(); 62 int offset = query.getOffset(); 63 int maxNumber = query.getMaxNumber(); 64 if (maxNumber == SearchQuery.DEFAULT_MAX_NUMBER) { 65 throw new JspTagException ("No max-number set. Cannot batch results (use mm:maxnumber first)"); 66 } 67 if (offset % maxNumber != 0) { throw new JspTagException ("Offset (" + offset + ") is not a multipible of max-number (" + maxNumber + "): Cannot batch results."); 69 } 70 71 int totalSize = Queries.count(query); 72 73 indexOffSet = offset / maxNumber + 1 + indexOffsetOffset.getInt(this, 0); 74 List resultList = new ArrayList(); 75 76 int maxTotalSize = maxtotal.getInt(this, -1); 77 78 int maxSize; 80 if (maxTotalSize > 0) { 81 maxSize = (maxTotalSize - 1) / 2; int numberOfPreviousBatches = offset / maxNumber; 83 int availableForPrevious = maxTotalSize / 2; if (numberOfPreviousBatches < availableForPrevious) { maxSize += (availableForPrevious - numberOfPreviousBatches); 86 } 87 88 int max = getMaxNumber(); 89 if (max > 0 && maxSize > max) maxSize = max; 90 91 } else { 92 maxSize = getMaxNumber(); 93 } 94 95 96 while (offset + maxNumber < totalSize) { 97 offset += maxNumber; 98 resultList.add(new Integer (offset)); 99 if (maxSize > 0 && resultList.size() == maxSize) break; 100 } 101 return resultList; 102 } 103 104 } 105 | Popular Tags |