| 1 19 20 package za.org.coefficient.util.common; 21 22 import za.org.coefficient.core.Constants; 23 import za.org.coefficient.interfaces.Pager; 24 25 import java.util.ArrayList ; 26 import java.util.HashMap ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 30 36 public class HibernatePager implements Pager, java.io.Serializable { 37 39 private static final String AND = "and"; 40 private static final String OR = "or"; 41 42 44 private ArrayList andVals = new ArrayList (); 45 private ArrayList orVals = new ArrayList (); 46 private ArrayList page = new ArrayList (); 47 private Class pagerClass; 48 private String orderByField; 49 private String userQuery; 50 private StringBuffer andConstraints = new StringBuffer (""); 51 private StringBuffer fromClause = new StringBuffer (""); 52 private StringBuffer orConstraints = new StringBuffer (""); 53 private Object [] userValues; 54 private boolean ascending = true; 55 private boolean hasNext = false; 56 private int currentPageNumber = 1; 57 private int pageSize = Constants.MAX_ELEMENTS_PER_PAGE; 58 private int total = 0; 59 60 62 public HibernatePager() { 63 } 64 65 public HibernatePager(String searchQuery, Object [] values) throws Exception { 66 userQuery = searchQuery; 67 userValues = values; 68 this.initialize(); 69 } 70 71 public HibernatePager(String searchQuery, Object [] values, int pageSize) 72 throws Exception { 73 userQuery = searchQuery; 74 userValues = values; 75 this.pageSize = pageSize; 76 this.initialize(); 77 } 78 79 public HibernatePager(Class pageClass, String orderByField) 80 throws Exception { 81 this.pagerClass = pageClass; 82 this.orderByField = orderByField; 83 this.initialize(); 84 } 85 86 public HibernatePager(Class pageClass, String orderByField, 87 boolean orderByAscending) throws Exception { 88 this.pagerClass = pageClass; 89 this.orderByField = orderByField; 90 this.ascending = orderByAscending; 91 this.initialize(); 92 } 93 94 public HibernatePager(Class pageClass, String orderByField, int pageSize) 95 throws Exception { 96 this.pagerClass = pageClass; 97 this.orderByField = orderByField; 98 this.pageSize = pageSize; 99 this.initialize(); 100 } 101 102 public HibernatePager(Class pageClass, String orderByField, int pageSize, 103 boolean orderByAscending) throws Exception { 104 this.pagerClass = pageClass; 105 this.orderByField = orderByField; 106 this.ascending = orderByAscending; 107 this.pageSize = pageSize; 108 this.initialize(); 109 } 110 111 public HibernatePager(Class pageClass, String orderByField, 112 boolean orderByAscending, HashMap andSearchParams) throws Exception { 113 this.pagerClass = pageClass; 114 this.orderByField = orderByField; 115 this.ascending = orderByAscending; 116 this.setAndSearchParams(andSearchParams); 117 } 118 119 public HibernatePager(Class pageClass, String orderByField, 120 boolean orderByAscending, HashMap andSearchParams, 121 HashMap orSearchParams) throws Exception { 122 this.pagerClass = pageClass; 123 this.orderByField = orderByField; 124 this.ascending = orderByAscending; 125 this.setAndSearchParams(andSearchParams); 126 this.setOrSearchParams(orSearchParams); 127 } 128 129 public HibernatePager(Class pageClass, String orderByField, int pageSize, 130 HashMap andSearchParams) throws Exception { 131 this.pagerClass = pageClass; 132 this.orderByField = orderByField; 133 this.pageSize = pageSize; 134 this.setAndSearchParams(andSearchParams); 135 } 136 137 public HibernatePager(Class pageClass, String orderByField, int pageSize, 138 HashMap andSearchParams, HashMap orSearchParams) throws Exception { 139 this.pagerClass = pageClass; 140 this.orderByField = orderByField; 141 this.pageSize = pageSize; 142 this.setAndSearchParams(andSearchParams); 143 this.setOrSearchParams(orSearchParams); 144 } 145 146 public HibernatePager(Class pageClass, String orderByField, int pageSize, 147 HashMap andSearchParams, boolean orderByAscending) throws Exception { 148 this.pagerClass = pageClass; 149 this.orderByField = orderByField; 150 this.ascending = orderByAscending; 151 this.pageSize = pageSize; 152 this.setAndSearchParams(andSearchParams); 153 } 154 155 public HibernatePager(Class pageClass, String orderByField, int pageSize, 156 HashMap andSearchParams, HashMap orSearchParams, 157 boolean orderByAscending) throws Exception { 158 this.pagerClass = pageClass; 159 this.orderByField = orderByField; 160 this.ascending = orderByAscending; 161 this.pageSize = pageSize; 162 this.setAndSearchParams(andSearchParams); 163 this.setOrSearchParams(orSearchParams); 164 } 165 166 168 180 public void setAndSearchParams(HashMap searchParams) throws Exception { 181 setSearchParams(searchParams, AND); 182 } 183 184 188 public int getCurrentPageNumber() { 189 return currentPageNumber; 190 } 191 192 195 public void setFromClauses(HashMap fromElements) throws Exception { 196 fromClause = new StringBuffer (); 197 if (fromElements != null) { 198 for (Iterator it = fromElements.keySet() 199 .iterator(); it.hasNext();) { 200 String key = (String ) it.next(); 201 String val = (String ) fromElements.get(key); 202 fromClause.append(" , "); 203 fromClause.append(key); 204 if (val != null) { 205 fromClause.append(" in "); 206 fromClause.append(" objs."); 207 fromClause.append(val); 208 } 209 } 210 } 211 this.initialize(); 212 } 213 214 public void setFromWhereAndInitialize(HashMap andSearchParams, 215 HashMap orSearchParams, HashMap fromElements) throws Exception { 216 this.setFromClauses(fromElements); 217 this.setAndSearchParams(andSearchParams); 218 this.setOrSearchParams(orSearchParams); 219 this.initialize(); 220 } 221 222 226 public int getMaxPageNumber() { 227 return (int) (Math.ceil(((double) total) / pageSize)); 228 } 229 230 242 public void setOrSearchParams(HashMap searchParams) throws Exception { 243 setSearchParams(searchParams, OR); 244 } 245 246 public void setPageSize(int pageSize) { 247 this.pageSize = pageSize; 248 } 249 250 public int getPageSize() { 251 return this.pageSize; 252 } 253 254 public void setQuery(String queryString, Object [] values) { 255 userQuery = queryString; 256 userValues = values; 257 this.initialize(); 258 } 259 260 264 public int getTotalNumberOfResults() { 265 return total; 266 } 267 268 272 public List currentPage() { 273 return page; 274 } 275 276 283 public List goToPage(int pageNumber) { 284 if (pageNumber <= (Math.ceil(((double) total) / pageSize))) { 285 this.performQuery(((pageNumber - 1) * pageSize)); 286 currentPageNumber = pageNumber; 287 hasNext = (currentPageNumber * pageSize) < total; 288 } 289 290 return currentPage(); 291 } 292 293 297 public boolean hasNextPage() { 298 return hasNext; 299 } 300 301 305 public boolean hasPreviousPage() { 306 return currentPageNumber != 1; 307 } 308 309 312 public void initialize() { 313 this.performQuery(0); 314 hasNext = (currentPageNumber * pageSize) < total; 315 } 316 317 320 public void next() { 321 if (hasNext) { 322 this.performQuery((currentPageNumber * pageSize)); 323 currentPageNumber++; 324 hasNext = (currentPageNumber * pageSize) < total; 325 } 326 } 327 328 332 public List nextPage() { 333 this.next(); 334 335 return this.currentPage(); 336 } 337 338 341 public void previous() { 342 if (hasPreviousPage()) { 343 page.clear(); 344 performQuery((pageSize * (currentPageNumber - 1)) - pageSize); 345 currentPageNumber--; 346 hasNext = true; 347 } 348 } 349 350 354 public List previousPage() { 355 this.previous(); 356 357 return this.currentPage(); 358 } 359 360 private void setIntoConstraint(boolean and, String addition) { 361 if (and) { 362 andConstraints.append(addition); 363 } else { 364 orConstraints.append(addition); 365 } 366 } 367 368 private void setIntoVals(boolean and, Object val) { 369 if (and) { 370 andVals.add(val); 371 } else { 372 orVals.add(val); 373 } 374 } 375 376 private int getLengthForConstraint(boolean and) { 377 if (and) { 378 return andConstraints.length(); 379 } else { 380 return orConstraints.length(); 381 } 382 } 383 384 private void setSearchParams(HashMap searchParams, String logicalOperator) 385 throws Exception { 386 boolean and = AND.equals(logicalOperator); 387 if (and) { 388 andConstraints = new StringBuffer (""); 389 andVals = new ArrayList (); 390 } else { 391 orConstraints = new StringBuffer (""); 392 orVals = new ArrayList (); 393 } 394 395 if (searchParams != null) { 396 for (Iterator it = searchParams.keySet() 397 .iterator(); it.hasNext();) { 398 String field = (String ) it.next(); 399 Object value = searchParams.get(field); 400 if (getLengthForConstraint(and) != 0) { 401 if (and) { 402 andConstraints.append(" and "); 403 } else { 404 orConstraints.append(" or "); 405 } 406 } 407 boolean not = false; 408 String operator = "like"; 409 if (field.startsWith("!")) { 410 not = true; 411 field = field.substring(1, field.length()); 412 operator = "!="; 413 } else if (field.startsWith("<=")) { 414 operator = "<="; 415 field = field.substring(2, field.length()); 416 } else if (field.startsWith(">=")) { 417 operator = ">="; 418 field = field.substring(2, field.length()); 419 } else if (field.startsWith("<")) { 420 operator = "<"; 421 field = field.substring(1, field.length()); 422 } else if (field.startsWith(">")) { 423 operator = ">"; 424 field = field.substring(1, field.length()); 425 } 426 427 if (value instanceof Boolean ) { 428 if (not) { 429 setIntoConstraint(and, " objs." + field + " != ? "); 430 } else { 431 setIntoConstraint(and, " objs." + field + " = ? "); 432 } 433 setIntoVals(and, value); 434 } else { 435 if (value == null) { 436 if (not) { 437 setIntoConstraint(and, 438 " objs." + field + " is not null "); 439 } else { 440 setIntoConstraint(and, 441 " objs." + field + " is null "); 442 } 443 } else { 444 if(value instanceof String ) { 445 setIntoConstraint(and, 446 " upper(objs." + field + ") " + operator + " ? "); 447 value = ((String )value).toUpperCase(); 448 } else { 449 setIntoConstraint(and, 450 " objs." + field + " " + operator + " ? "); 451 } 452 setIntoVals(and, value); 453 } 454 } 455 } 456 } 457 this.initialize(); 458 } 459 460 private Object [] convertValsToArray() { 461 int i = 0; 462 Object [] oVals = new Object [andVals.size() + orVals.size()]; 463 for (Iterator it = andVals.iterator(); it.hasNext(); i++) { 464 Object val = it.next(); 465 oVals[i] = val; 466 } 467 for (Iterator it = orVals.iterator(); it.hasNext(); i++) { 468 Object val = it.next(); 469 oVals[i] = val; 470 } 471 472 return oVals; 473 } 474 475 private void performQuery(int startElement) { 476 try { 477 Object [] oVals = null; 478 String sql = null; 479 if ((userQuery == null) || (userQuery.length() == 0)) { 480 oVals = convertValsToArray(); 481 StringBuffer query = new StringBuffer ("select objs "); 482 query.append(" from "); 483 query.append(pagerClass.getName()); 484 query.append(" as objs"); 485 if (fromClause.length() != 0) { 486 query.append(fromClause.toString()); 487 } 488 if (andConstraints.length() != 0) { 489 query.append(" where "); 490 query.append(andConstraints.toString()); 491 } 492 if (orConstraints.length() != 0) { 493 if (andConstraints.length() == 0) { 494 query.append(" where "); 495 } else { 496 query.append(" and "); 497 } 498 query.append(" ( "); 499 query.append(orConstraints.toString()); 500 query.append(" ) "); 501 } 502 query.append(" order by objs."); 503 query.append(orderByField); 504 if (!ascending) { 505 query.append(" desc"); 506 } 507 sql = query.toString(); 508 } else { 509 sql = userQuery.toString(); 510 oVals = userValues; 511 } 512 513 total = ((Integer )InvokerFactory.getRemoteInvoker() 514 .invokeMethodOnService("Search", "getPage", 515 new Object []{sql, new Integer (pageSize), 516 new Integer (startElement), 517 oVals, page})).intValue(); 518 } catch (Exception e) { 519 System.err.println( 520 "<< could not execute query from pager for class: " 521 + pagerClass.getName() + " with orderByField: " + orderByField); 522 e.printStackTrace(); 523 } 524 } 525 } 526 | Popular Tags |