1 16 17 18 package org.apache.velocity.tools.view.tools; 19 20 21 import java.util.ArrayList ; 22 import java.util.Collections ; 23 import java.util.List ; 24 25 import javax.servlet.http.HttpServletRequest ; 26 import javax.servlet.http.HttpSession ; 27 28 import org.apache.velocity.tools.view.context.ViewContext; 29 import org.apache.velocity.tools.view.tools.ViewTool; 30 31 32 140 public abstract class AbstractSearchTool implements ViewTool 141 { 142 143 144 145 public static final int DEFAULT_ITEMS_PER_PAGE = 10; 146 147 148 public static final int DEFAULT_SLIP_SIZE = 20; 149 150 151 protected static final String STORED_RESULTS_KEY = 152 StoredResults.class.getName(); 153 154 private List results; 155 private Object criteria; 156 private int index = 0; 157 private int slipSize = DEFAULT_SLIP_SIZE; 158 private int itemsPerPage = DEFAULT_ITEMS_PER_PAGE; 159 160 protected HttpSession session; 161 162 163 170 public void init(Object obj) 171 { 172 ViewContext context = (ViewContext)obj; 173 HttpServletRequest request = context.getRequest(); 174 session = request.getSession(false); 175 setup(request); 176 } 177 178 179 196 public abstract void setup(HttpServletRequest request); 197 198 199 200 201 202 206 public void reset() 207 { 208 results = null; 209 criteria = null; 210 index = 0; 211 itemsPerPage = DEFAULT_ITEMS_PER_PAGE; 212 } 213 214 215 220 public void setCriteria(Object criteria) 221 { 222 this.criteria = criteria; 223 this.results = null; 224 } 225 226 227 232 public void setIndex(int index) 233 { 234 if (index < 0) 235 { 236 237 index = 0; 238 } 239 this.index = index; 240 } 241 242 243 248 public void setItemsPerPage(int itemsPerPage) 249 { 250 if (itemsPerPage < 1) 251 { 252 253 itemsPerPage = DEFAULT_ITEMS_PER_PAGE; 254 } 255 this.itemsPerPage = itemsPerPage; 256 } 257 258 259 266 public void setSlipSize(int slipSize) 267 { 268 if (slipSize < 2) 269 { 270 271 slipSize = DEFAULT_SLIP_SIZE; 272 } 273 this.slipSize = slipSize; 274 } 275 276 277 278 279 280 287 public Object getCriteria() 288 { 289 return criteria; 290 } 291 292 293 298 public int getItemsPerPage() 299 { 300 return itemsPerPage; 301 } 302 303 304 311 public int getSlipSize() 312 { 313 return slipSize; 314 } 315 316 317 322 public int getIndex() 323 { 324 return index; 325 } 326 327 328 333 public boolean hasResults() 334 { 335 return !getResults().isEmpty(); 336 } 337 338 339 345 public List getResults() 346 { 347 if (results == null) 348 { 349 results = retrieveResults(); 350 } 351 return results; 352 } 353 354 355 363 public Integer getNextIndex() 364 { 365 int next = index + itemsPerPage; 366 if (next < getResults().size()) 367 { 368 return new Integer (next); 369 } 370 return null; 371 } 372 373 374 382 public Integer getPrevIndex() 383 { 384 int prev = Math.min(index, getResults().size()) - itemsPerPage; 385 if (index > 0) 386 { 387 return new Integer (Math.max(0, prev)); 388 } 389 return null; 390 } 391 392 393 397 public int getPagesAvailable() 398 { 399 return (int)Math.ceil(getResults().size() / (double)itemsPerPage); 400 } 401 402 403 408 public List getPage() 409 { 410 411 if (!hasResults()) 412 { 413 return null; 414 } 415 416 int start = Math.min(getResults().size() - 1, index); 417 int end = Math.min(getResults().size(), index + itemsPerPage); 418 return getResults().subList(start, end); 419 } 420 421 422 430 public Integer getPageNumber(int i) 431 { 432 if (!hasResults()) 433 { 434 return null; 435 } 436 return new Integer (1 + i / itemsPerPage); 437 } 438 439 440 447 public Integer getPageNumber() 448 { 449 return getPageNumber(index); 450 } 451 452 453 463 public String getPageDescription() 464 { 465 StringBuffer out = new StringBuffer (); 466 int first = index + 1; 467 int total = getResults().size(); 468 if (first >= total) 469 { 470 out.append(total); 471 out.append(" of "); 472 out.append(total); 473 } 474 else 475 { 476 int last = Math.min(index + itemsPerPage, total); 477 out.append(first); 478 out.append(" - "); 479 out.append(last); 480 out.append(" of "); 481 out.append(total); 482 } 483 return out.toString(); 484 } 485 486 487 503 public List getSlip() 504 { 505 506 int totalPgs = getPagesAvailable(); 507 if (totalPgs <= 1) 508 { 509 return Collections.EMPTY_LIST; 510 } 511 512 513 int curPg = getPageNumber().intValue() - 1; 514 515 516 int adjSlipSize = slipSize - 1; 517 518 521 int slipStart = Math.max(0, (curPg - (adjSlipSize / 2))); 522 523 524 int slipEnd = Math.min(totalPgs, (slipStart + adjSlipSize)); 525 526 528 if (slipEnd - slipStart < adjSlipSize) 529 { 530 slipStart = Math.max(0, slipEnd - adjSlipSize); 531 } 532 533 534 List slip = new ArrayList ((slipEnd - slipStart) + 1); 535 for (int i=slipStart; i < slipEnd; i++) 536 { 537 slip.add(new Integer (i * itemsPerPage)); 538 } 539 return slip; 540 } 541 542 543 544 545 546 551 private List retrieveResults() 552 { 553 554 if (criteria == null) 555 { 556 return Collections.EMPTY_LIST; 557 } 558 559 560 StoredResults sr = getStoredResults(); 561 562 564 if (sr != null && criteria.equals(sr.getCriteria())) 565 { 566 return sr.getList(); 567 } 568 569 570 List list = executeQuery(criteria); 571 if (list == null) 572 { 573 list = Collections.EMPTY_LIST; 574 } 575 576 577 setStoredResults(new StoredResults(criteria, list)); 578 return list; 579 } 580 581 582 583 584 585 599 protected abstract List executeQuery(Object criteria); 600 601 602 608 protected StoredResults getStoredResults() 609 { 610 if (session != null) 611 { 612 return (StoredResults)session.getAttribute(STORED_RESULTS_KEY); 613 } 614 return null; 615 } 616 617 618 628 protected void setStoredResults(StoredResults results) 629 { 630 if (session != null) 631 { 632 session.setAttribute(STORED_RESULTS_KEY, results); 633 } 634 } 635 636 637 638 639 640 650 public class StoredResults implements java.io.Serializable 651 { 652 653 private transient Object crit; 654 private transient List list; 655 656 662 public StoredResults(Object crit, List list) 663 { 664 this.crit = crit; 665 this.list = list; 666 } 667 668 671 public Object getCriteria() 672 { 673 return crit; 674 } 675 676 679 public List getList() 680 { 681 return list; 682 } 683 684 } 685 686 687 } 688 | Popular Tags |