1 23 24 package org.dbforms.taglib; 25 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 29 import org.dbforms.config.Constants; 30 import org.dbforms.config.DbFormsConfigRegistry; 31 import org.dbforms.config.Field; 32 import org.dbforms.config.FieldValue; 33 import org.dbforms.config.FieldValues; 34 import org.dbforms.config.Table; 35 36 import org.dbforms.util.KeyValuePair; 37 import org.dbforms.util.MessageResources; 38 import org.dbforms.util.ParseUtil; 39 import org.dbforms.util.StringUtil; 40 import org.dbforms.util.Util; 41 42 import java.text.SimpleDateFormat ; 43 44 import java.util.List ; 45 46 import javax.servlet.http.HttpServletRequest ; 47 import javax.servlet.jsp.JspException ; 48 import javax.servlet.jsp.PageContext ; 49 50 51 52 60 public class DbFilterValueTag extends DbBaseHandlerTag implements DataContainer, 61 javax.servlet.jsp.tagext.TryCatchFinally { 62 63 private static String FLT_VALUETYPE_DATE = "date"; 64 65 66 private static String FLT_VALUETYPE_NUMERIC = "numeric"; 67 68 69 private static String FLT_VALUETYPE_SELECT = "select"; 70 71 72 private static String FLT_VALUETYPE_TEXT = "text"; 73 74 75 private static String FLT_VALUETYPE_TIMESTAMP = "timestamp"; 76 private static Log logCat = LogFactory.getLog(DbFilterValueTag.class 77 .getName()); 78 79 80 private transient State state; 81 82 85 public DbFilterValueTag() { 86 super(); 87 state = new State(); 88 } 89 90 95 public void setCustomEntry(String string) { 96 state.customEntry = string; 97 } 98 99 100 108 public void setEmbeddedData(List embeddedData) { 109 state.embeddedData = embeddedData; 110 } 111 112 113 118 public void setJsCalendarDateFormat(String string) { 119 state.jsCalendarDateFormat = string; 120 } 121 122 123 128 public String getJsCalendarDateFormat() { 129 return state.jsCalendarDateFormat; 130 } 131 132 133 138 public void setLabel(String string) { 139 state.label = string; 140 } 141 142 143 148 public String getLabel() { 149 return state.label; 150 } 151 152 153 158 public void setSearchAlgo(String value) { 159 state.searchAlgo = value; 160 } 161 162 163 168 public String getSearchAlgo() { 169 return state.searchAlgo; 170 } 171 172 173 178 public void setSelectedIndex(String string) { 179 state.selectedIndex = string; 180 } 181 182 183 188 public void setSize(String string) { 189 state.size = string; 190 } 191 192 193 200 public void setState(PageContext pg, 201 DbFilterConditionTag parent, 202 State state) { 203 setPageContext(pg); 204 setParent(parent); 205 this.state = state; 206 } 207 208 209 214 public void setStyleClass(String string) { 215 state.styleClass = string; 216 } 217 218 219 261 public void setType(String string) { 262 state.type = string; 263 } 264 265 266 271 public void setUseJsCalendar(String string) { 272 state.useJsCalendar = string; 273 } 274 275 276 281 public String getUseJsCalendar() { 282 return state.useJsCalendar; 283 } 284 285 286 289 public void doCatch(Throwable t) throws Throwable { 290 throw t; 291 } 292 293 294 299 public void doFinally() { 300 state = new State(); 301 super.doFinally(); 302 } 303 304 305 310 public int doStartTag() throws JspException { 311 init(); 312 313 return EVAL_BODY_BUFFERED; 314 } 315 316 317 328 protected static FieldValue[] readValuesFromRequest(HttpServletRequest request, 329 int tableId, 330 int conditionId) { 331 FieldValues values = new FieldValues(); 332 333 for (int valueId = 0; true; ++valueId) { 334 String paramValue = DbFilterConditionTag.getConditionName(tableId, 337 conditionId) 338 + DbFilterTag.FLT_VALUE + valueId; 339 String paramType = DbFilterConditionTag.getConditionName(tableId, 340 conditionId) 341 + DbFilterTag.FLT_VALUETYPE + valueId; 342 String searchAlgoType = DbFilterConditionTag.getConditionName(tableId, 343 conditionId) 344 + DbFilterTag.FLT_SEARCHALGO + valueId; 345 346 String value = ParseUtil.getParameter(request, paramValue); 347 String valueType = ParseUtil.getParameter(request, paramType); 348 349 String aSearchAlgorithm = ParseUtil.getParameter(request, 350 searchAlgoType); 351 int algorithm = Constants.SEARCH_ALGO_SHARP; 352 353 if (!Util.isNull(aSearchAlgorithm)) { 354 if (aSearchAlgorithm.startsWith("weakStartEnd")) { 355 algorithm = Constants.SEARCH_ALGO_WEAK_START_END; 356 } else if (aSearchAlgorithm.startsWith("weakStart")) { 357 algorithm = Constants.SEARCH_ALGO_WEAK_START; 358 } else if (aSearchAlgorithm.startsWith("weakEnd")) { 359 algorithm = Constants.SEARCH_ALGO_WEAK_END; 360 } else if (aSearchAlgorithm.startsWith("weak")) { 361 algorithm = Constants.SEARCH_ALGO_WEAK; 362 } 363 } 364 365 valueType = Util.isNull(valueType) ? FLT_VALUETYPE_TEXT 366 : valueType; 367 368 if (value != null) { 369 Field f = new Field(); 371 f.setName(paramValue); 372 f.setId(valueId); 373 f.setFieldType(valueType); 374 375 Table table = null; 376 377 try { 378 table = DbFormsConfigRegistry.instance() 379 .lookup() 380 .getTable(tableId); 381 } catch (Exception e) { 382 logCat.error("readValuesFromRequest", e); 383 } 384 385 f.setTable(table); 386 387 FieldValue fv = new FieldValue(f, value); 388 fv.setLocale(MessageResources.getLocale(request)); 389 fv.setSearchAlgorithm(algorithm); 390 values.put(fv); 391 } else { 392 break; 394 } 395 } 396 397 return values.toArray(); 398 } 399 400 401 406 protected Object getFieldObject() { 407 FieldValue fv = new FieldValue(getField(), state.value); 408 fv.setLocale(MessageResources.getLocale((HttpServletRequest ) pageContext 409 .getRequest())); 410 411 return fv.getFieldValueAsObject(); 412 } 413 414 415 420 protected State getState() { 421 return state; 422 } 423 424 425 433 protected StringBuffer render() throws JspException { 434 StringBuffer buf = new StringBuffer (); 435 436 Field f = new Field(); 437 f.setName(state.label); 438 f.setId(state.valueId); 439 f.setFieldType(state.type); 440 f.setTable(getParentForm().getTable()); 441 setField(f); 442 443 if (state.label != null) { 444 buf.append("<b>" + state.label + "</b>\n"); 445 } 446 447 if (state.type.equalsIgnoreCase(FLT_VALUETYPE_TEXT) 448 || state.type.equalsIgnoreCase(FLT_VALUETYPE_NUMERIC)) { 449 renderTextElement(buf); 450 } else if (state.type.equalsIgnoreCase(FLT_VALUETYPE_DATE) 451 || state.type.equalsIgnoreCase(FLT_VALUETYPE_TIMESTAMP)) { 452 renderDateElement(buf); 453 } else if (FLT_VALUETYPE_SELECT.equalsIgnoreCase(state.type) 454 && (state.embeddedData != null)) { 455 renderSelectElement(buf); 456 } else { 457 throw new JspException ("type not correct"); 458 } 459 460 return buf; 461 } 462 463 464 private String getSearchAlgoType() { 465 return ((DbFilterConditionTag) getParent()).getConditionName() 466 + DbFilterTag.FLT_SEARCHALGO + state.valueId; 467 } 468 469 470 private String getValueName() { 471 return ((DbFilterConditionTag) getParent()).getConditionName() 472 + DbFilterTag.FLT_VALUE + state.valueId; 473 } 474 475 476 private String getValueType() { 477 return ((DbFilterConditionTag) getParent()).getConditionName() 478 + DbFilterTag.FLT_VALUETYPE + state.valueId; 479 } 480 481 482 493 private String generateTagString(String value, 494 String description, 495 boolean selected) { 496 StringBuffer tagBuf = new StringBuffer (); 497 tagBuf.append("<option value=\""); 498 tagBuf.append(value); 499 tagBuf.append("\""); 500 501 if (selected) { 502 tagBuf.append(" selected=\"selected\""); 503 } 504 505 tagBuf.append(">"); 506 tagBuf.append(description.trim()); 507 tagBuf.append("</option>"); 508 509 return tagBuf.toString(); 510 } 511 512 513 516 private void init() { 517 if (state.type == null) { 520 state.type = "text"; 521 } 522 523 if (state.styleClass == null) { 524 state.styleClass = ""; 525 } 526 527 state.valueId = ((DbFilterConditionTag) getParent()).addValue(this); 528 state.value = ParseUtil.getParameter((HttpServletRequest ) pageContext 529 .getRequest(), getValueName()); 530 531 if (state.value == null) { 532 state.value = ""; 533 } 534 535 state.embeddedData = null; 538 } 539 540 541 546 private void renderDateElement(StringBuffer buf) { 547 renderTextElement(buf); 548 549 if ("true".equals(state.useJsCalendar)) { 553 buf.append(" <a HREF=\"javascript:doNothing()\" ") 554 .append(" onclick=\""); 555 556 setPattern(state.jsCalendarDateFormat); 557 state.jsCalendarDateFormat = ((SimpleDateFormat ) getFormatter()) 558 .toPattern(); 559 560 if (state.jsCalendarDateFormat != null) { 562 buf.append("calDateFormat='" + state.jsCalendarDateFormat + "';"); 563 } 564 565 buf.append("setDateField(document.dbform['") 566 .append(getValueName()) 567 .append("']);") 568 .append(" top.newWin = window.open('") 569 .append(((HttpServletRequest ) pageContext.getRequest()) 570 .getContextPath()) 571 .append("/jscal/calendar.html','cal','width=270,height=280')\">") 572 .append("<img SRC=\"") 573 .append(((HttpServletRequest ) pageContext.getRequest()) 574 .getContextPath()) 575 .append("/jscal/calendar.gif\" width=\"32\" height=\"32\" ") 576 .append(" border=0 alt=\"Click on the Calendar to activate the Pop-Up Calendar Window.\">") 577 .append("</img>") 578 .append("</a>"); 579 } 580 } 581 582 583 588 private void renderSelectElement(StringBuffer buf) { 589 String sizestr = ""; 590 591 if (state.size != null) { 592 sizestr = "size=\"" + state.size + "\" "; 593 } 594 595 buf.append("<select name=\"" + getValueName() + "\" " + sizestr 596 + " class=\"" + state.styleClass + "\">\n"); 597 598 if ((state.customEntry != null) 599 && (state.customEntry.trim() 600 .length() > 0)) { 601 String aKey = org.dbforms.util.StringUtil.getEmbeddedStringWithoutDots(state.customEntry, 602 0, 603 ','); 604 String aValue = org.dbforms.util.StringUtil 605 .getEmbeddedStringWithoutDots(state.customEntry, 1, ','); 606 boolean isSelected = false; 607 608 if ((state.selectedIndex == null) 609 || (state.selectedIndex.trim() 610 .length() == 0)) { 611 isSelected = "true".equals(StringUtil.getEmbeddedStringWithoutDots(state.customEntry, 612 2, 613 ',')); 614 } 615 616 buf.append(generateTagString(aKey, aValue, isSelected)); 617 } 618 619 int embeddedDataSize = state.embeddedData.size(); 620 621 for (int i = 0; i < embeddedDataSize; i++) { 622 KeyValuePair aKeyValuePair = (KeyValuePair) state.embeddedData.get(i); 623 String aKey = aKeyValuePair.getKey(); 624 String aValue = aKeyValuePair.getValue(); 625 626 boolean isSelected = aKey.equals(state.value); 629 buf.append(generateTagString(aKey, aValue, isSelected)); 630 } 631 632 buf.append("</select>\n"); 633 } 634 635 636 641 private void renderTextElement(StringBuffer buf) { 642 String sizestr = ""; 643 644 if (state.size != null) { 645 sizestr = "size=\"" + state.size + "\" "; 646 } 647 648 buf.append("<input type=\"text\" name=\"" + getValueName() 649 + "\" value=\"" + this.getFormattedFieldValue() + "\"" 650 + sizestr + " class=\"" + state.styleClass + "\"/>\n"); 651 buf.append("<input type=\"hidden\" name=\"" + getValueType() 652 + "\" value=\"" + state.type.toLowerCase() + "\"/>\n"); 653 654 if (!Util.isNull(state.searchAlgo)) { 655 buf.append("<input type=\"hidden\" name=\"" + getSearchAlgoType() 656 + "\" value=\"" + state.searchAlgo + "\"/>\n"); 657 } 658 } 659 660 668 protected static class State { 669 673 protected List embeddedData = null; 674 675 676 protected String customEntry = null; 677 678 679 protected String jsCalendarDateFormat = null; 680 681 682 protected String label = null; 683 684 687 protected String searchAlgo = null; 688 689 690 protected String selectedIndex = null; 691 692 693 protected String size = null; 694 695 696 protected String styleClass = null; 697 698 699 protected String type = null; 700 701 702 protected String useJsCalendar = null; 703 704 705 protected String value = null; 706 707 708 protected int valueId = -1; 709 } 710 } 711 | Popular Tags |