1 31 32 package org.opencms.jsp; 33 34 import org.opencms.file.CmsFile; 35 import org.opencms.file.CmsObject; 36 import org.opencms.file.CmsResource; 37 import org.opencms.file.CmsResourceFilter; 38 import org.opencms.file.collectors.I_CmsResourceCollector; 39 import org.opencms.flex.CmsFlexController; 40 import org.opencms.i18n.CmsEncoder; 41 import org.opencms.i18n.CmsLocaleManager; 42 import org.opencms.main.CmsException; 43 import org.opencms.main.CmsIllegalArgumentException; 44 import org.opencms.main.OpenCms; 45 import org.opencms.util.CmsMacroResolver; 46 import org.opencms.util.CmsStringUtil; 47 import org.opencms.workplace.editors.directedit.CmsDirectEditButtonSelection; 48 import org.opencms.workplace.editors.directedit.CmsDirectEditMode; 49 import org.opencms.workplace.editors.directedit.CmsDirectEditParams; 50 import org.opencms.xml.I_CmsXmlDocument; 51 import org.opencms.xml.content.CmsXmlContentFactory; 52 53 import java.util.Iterator ; 54 import java.util.List ; 55 import java.util.Locale ; 56 57 import javax.servlet.jsp.JspException ; 58 import javax.servlet.jsp.PageContext ; 59 import javax.servlet.jsp.tagext.BodyTagSupport ; 60 import javax.servlet.jsp.tagext.Tag ; 61 62 72 public class CmsJspTagContentLoad extends BodyTagSupport implements I_CmsXmlContentContainer { 73 74 75 private static final long serialVersionUID = 981176995635225294L; 76 77 78 private CmsObject m_cms; 79 80 81 private String m_collector; 82 83 84 private String m_collectorName; 85 86 87 private String m_collectorParam; 88 89 90 private List m_collectorResult; 91 92 93 private I_CmsXmlDocument m_content; 94 95 96 private CmsContentInfoBean m_contentInfoBean; 97 98 105 private Locale m_contentLocale; 106 107 108 private CmsFlexController m_controller; 109 110 111 private CmsDirectEditButtonSelection m_directEditFollowButtons; 112 113 114 private String m_directEditLinkForNew; 115 116 117 private CmsDirectEditMode m_directEditMode; 118 119 120 private boolean m_directEditOpen; 121 122 123 private boolean m_isFirstLoop; 124 125 126 private Locale m_locale; 127 128 129 private String m_pageIndex; 130 131 132 private String m_pageNavLength; 133 134 135 private String m_pageSize; 136 137 138 private String m_param; 139 140 141 private boolean m_preload; 142 143 144 private String m_property; 145 146 147 private String m_resourceName; 148 149 152 public CmsJspTagContentLoad() { 153 154 super(); 155 } 156 157 169 public CmsJspTagContentLoad( 170 I_CmsXmlContentContainer container, 171 PageContext context, 172 String collectorName, 173 String collectorParam, 174 Locale locale, 175 boolean editable) 176 throws JspException { 177 178 this(container, context, collectorName, collectorParam, null, null, locale, editable); 179 } 180 181 195 public CmsJspTagContentLoad( 196 I_CmsXmlContentContainer container, 197 PageContext context, 198 String collectorName, 199 String collectorParam, 200 String pageIndex, 201 String pageSize, 202 Locale locale, 203 boolean editable) 204 throws JspException { 205 206 this( 207 container, 208 context, 209 collectorName, 210 collectorParam, 211 pageIndex, 212 pageSize, 213 locale, 214 CmsDirectEditMode.valueOf(editable)); 215 } 216 217 231 public CmsJspTagContentLoad( 232 I_CmsXmlContentContainer container, 233 PageContext context, 234 String collectorName, 235 String collectorParam, 236 String pageIndex, 237 String pageSize, 238 Locale locale, 239 CmsDirectEditMode editMode) 240 throws JspException { 241 242 setCollector(collectorName); 243 setParam(collectorParam); 244 setPageIndex(pageIndex); 245 setPageSize(pageSize); 246 m_locale = locale; 247 m_contentLocale = locale; 248 m_directEditMode = editMode; 249 m_preload = false; 250 251 setPageContext(context); 252 init(container); 253 } 254 255 263 protected static String getResourceName(CmsObject cms, I_CmsXmlContentContainer contentContainer) { 264 265 if ((contentContainer != null) && (contentContainer.getResourceName() != null)) { 266 return contentContainer.getResourceName(); 267 } else if (cms != null) { 268 return cms.getRequestContext().getUri(); 269 } else { 270 return null; 271 } 272 } 273 274 282 private static List limitCollectorResult(CmsContentInfoBean contentInfoBean, List collectorResult) { 283 284 List result = null; 285 int pageCount = -1; 286 287 if (contentInfoBean.getPageSize() > 0) { 288 289 pageCount = collectorResult.size() / contentInfoBean.getPageSize(); 290 if ((collectorResult.size() % contentInfoBean.getPageSize()) != 0) { 291 pageCount++; 292 } 293 294 contentInfoBean.setPageCount(pageCount); 295 296 int startIndex = (contentInfoBean.getPageIndex() - 1) * contentInfoBean.getPageSize(); 297 int endIndex = contentInfoBean.getPageIndex() * contentInfoBean.getPageSize(); 298 if (endIndex > collectorResult.size()) { 299 endIndex = collectorResult.size(); 300 } 301 302 result = collectorResult.subList(startIndex, endIndex); 303 } else { 304 305 result = collectorResult; 306 if (collectorResult.size() > 0) { 307 contentInfoBean.setPageCount(1); 308 } 309 } 310 311 return result; 312 } 313 314 317 public int doAfterBody() throws JspException { 318 319 if (hasMoreContent()) { 321 return EVAL_BODY_AGAIN; 323 } 324 release(); 326 return SKIP_BODY; 328 } 329 330 333 public int doEndTag() { 334 335 release(); 337 return EVAL_PAGE; 338 } 339 340 343 public int doStartTag() throws JspException , CmsIllegalArgumentException { 344 345 Tag ancestor = findAncestorWithClass(this, I_CmsXmlContentContainer.class); 347 I_CmsXmlContentContainer container = null; 348 if (ancestor != null) { 349 container = (I_CmsXmlContentContainer)ancestor; 351 if (!container.isPreloader()) { 353 container = null; 355 } 356 } 357 358 init(container); 360 361 hasMoreContent(); 362 363 return EVAL_BODY_INCLUDE; 364 } 365 366 371 public String getCollector() { 372 373 return m_collector; 374 } 375 376 379 public String getCollectorName() { 380 381 return m_collectorName; 382 } 383 384 387 public String getCollectorParam() { 388 389 return m_collectorParam; 390 } 391 392 395 public List getCollectorResult() { 396 397 return m_collectorResult; 398 } 399 400 405 public String getEditable() { 406 407 return m_directEditMode != null ? m_directEditMode.toString() : ""; 408 } 409 410 415 public String getLocale() { 416 417 return (m_locale != null) ? m_locale.toString() : ""; 418 } 419 420 425 public String getPageIndex() { 426 427 return m_pageIndex; 428 } 429 430 435 public String getPageNavLength() { 436 437 return m_pageNavLength; 438 } 439 440 445 public String getPageSize() { 446 447 return m_pageSize; 448 } 449 450 455 public String getParam() { 456 457 return m_param; 458 } 459 460 465 public String getPreload() { 466 467 return String.valueOf(m_preload); 468 } 469 470 475 public String getProperty() { 476 477 return m_property; 478 } 479 480 483 public String getResourceName() { 484 485 return m_resourceName; 486 } 487 488 491 public I_CmsXmlDocument getXmlDocument() { 492 493 return m_content; 494 } 495 496 499 public String getXmlDocumentElement() { 500 501 return null; 503 } 504 505 508 public Locale getXmlDocumentLocale() { 509 510 return m_contentLocale; 511 } 512 513 516 public boolean hasMoreContent() throws JspException { 517 518 if (m_isFirstLoop) { 519 m_isFirstLoop = false; 520 } else { 521 if (m_directEditOpen) { 522 CmsJspTagEditable.endDirectEdit(pageContext); 524 m_directEditOpen = false; 525 } 526 } 527 528 if (m_preload) { 529 return false; 531 } 532 533 boolean hasMoreContent = m_collectorResult.size() > 0; 535 if (hasMoreContent) { 536 try { 538 doLoadNextFile(); 539 } catch (CmsException e) { 540 m_controller.setThrowable(e, m_resourceName); 541 throw new JspException (e); 542 } 543 544 if (m_directEditMode.isEnabled() && (m_resourceName != null)) { 546 547 CmsDirectEditButtonSelection directEditButtons; 549 if (m_directEditFollowButtons == null) { 550 if (m_directEditLinkForNew == null) { 552 directEditButtons = CmsDirectEditButtonSelection.EDIT; 554 m_directEditFollowButtons = directEditButtons; 556 } else { 557 directEditButtons = CmsDirectEditButtonSelection.EDIT_DELETE_NEW; 559 m_directEditFollowButtons = CmsDirectEditButtonSelection.EDIT_DELETE; 561 } 562 } else { 563 directEditButtons = m_directEditFollowButtons; 565 } 566 567 m_directEditOpen = CmsJspTagEditable.startDirectEdit(pageContext, new CmsDirectEditParams( 568 m_resourceName, 569 directEditButtons, 570 m_directEditMode, 571 m_directEditLinkForNew)); 572 } 573 574 } else { 575 m_locale = null; 577 } 578 579 return hasMoreContent; 580 } 581 582 585 public boolean isPreloader() { 586 587 return m_preload; 588 } 589 590 593 public void release() { 594 595 m_cms = null; 596 m_collector = null; 597 m_collectorName = null; 598 m_collectorParam = null; 599 m_collectorResult = null; 600 m_content = null; 601 m_contentInfoBean = null; 602 m_contentLocale = null; 603 m_controller = null; 604 m_directEditLinkForNew = null; 605 m_directEditFollowButtons = null; 606 m_directEditOpen = false; 607 m_directEditMode = null; 608 m_isFirstLoop = false; 609 m_locale = null; 610 m_pageIndex = null; 611 m_pageNavLength = null; 612 m_pageSize = null; 613 m_param = null; 614 m_preload = false; 615 m_property = null; 616 m_resourceName = null; 617 super.release(); 618 } 619 620 625 public void setCollector(String collector) { 626 627 m_collector = collector; 628 } 629 630 635 public void setEditable(String mode) { 636 637 m_directEditMode = CmsDirectEditMode.valueOf(mode); 638 } 639 640 645 public void setLocale(String locale) { 646 647 if (CmsStringUtil.isEmpty(locale)) { 648 m_locale = null; 649 m_contentLocale = null; 650 } else { 651 m_locale = CmsLocaleManager.getLocale(locale); 652 m_contentLocale = m_locale; 653 } 654 } 655 656 661 public void setPageIndex(String pageIndex) { 662 663 m_pageIndex = pageIndex; 664 } 665 666 671 public void setPageNavLength(String pageNavLength) { 672 673 m_pageNavLength = pageNavLength; 674 } 675 676 681 public void setPageSize(String pageSize) { 682 683 m_pageSize = pageSize; 684 } 685 686 691 public void setParam(String param) { 692 693 m_param = param; 694 } 695 696 704 public void setPreload(String preload) { 705 706 m_preload = Boolean.valueOf(preload).booleanValue(); 707 } 708 709 714 public void setProperty(String property) { 715 716 m_property = property; 717 } 718 719 724 protected void doLoadNextFile() throws CmsException { 725 726 CmsResource resource = getNextResource(); 728 if (resource == null) { 729 m_resourceName = null; 730 m_content = null; 731 return; 732 } 733 734 m_resourceName = m_cms.getSitePath(resource); 736 737 CmsFile file = null; 740 if (resource instanceof CmsFile) { 741 file = (CmsFile)resource; 743 if ((file.getContents() == null) || (file.getContents().length <= 0)) { 744 file = null; 746 } 747 } 748 if (file == null) { 749 file = m_cms.readFile(m_resourceName, CmsResourceFilter.ALL); 751 } 752 753 m_content = CmsXmlContentFactory.unmarshal(m_cms, file); 755 756 m_contentLocale = m_locale; 758 if (!m_content.hasLocale(m_contentLocale)) { 759 Iterator it = OpenCms.getLocaleManager().getDefaultLocales().iterator(); 760 while (it.hasNext()) { 761 Locale locale = (Locale )it.next(); 762 if (m_content.hasLocale(locale)) { 763 m_contentLocale = locale; 765 break; 766 } 767 } 768 } 769 } 770 771 776 protected CmsContentInfoBean getContentInfoBean() { 777 778 return m_contentInfoBean; 779 } 780 781 788 protected void init(I_CmsXmlContentContainer container) throws JspException { 789 790 int pageAttribCount = 0; 792 pageAttribCount += CmsStringUtil.isNotEmpty(m_pageSize) ? 1 : 0; 793 pageAttribCount += CmsStringUtil.isNotEmpty(m_pageIndex) ? 1 : 0; 794 795 if ((pageAttribCount > 0) && (pageAttribCount < 2)) { 796 throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_TAG_CONTENTLOAD_INDEX_SIZE_0)); 797 } 798 799 I_CmsXmlContentContainer usedContainer; 800 if (container == null) { 801 usedContainer = this; 803 if (CmsStringUtil.isEmpty(m_collector)) { 804 throw new CmsIllegalArgumentException(Messages.get().container( 806 Messages.ERR_TAG_CONTENTLOAD_MISSING_COLLECTOR_0)); 807 } 808 if (CmsStringUtil.isEmpty(m_param)) { 809 throw new CmsIllegalArgumentException(Messages.get().container( 811 Messages.ERR_TAG_CONTENTLOAD_MISSING_PARAM_0)); 812 } 813 } else { 814 usedContainer = container; 816 } 817 818 if (m_preload) { 819 m_directEditMode = CmsDirectEditMode.FALSE; 821 } else if (m_directEditMode == null) { 822 m_directEditMode = CmsDirectEditMode.FALSE; 824 } 825 826 m_controller = CmsFlexController.getController(pageContext.getRequest()); 828 m_cms = m_controller.getCmsObject(); 829 830 String resourcename = getResourceName(m_cms, usedContainer); 832 833 CmsMacroResolver resolver = CmsMacroResolver.newInstance().setCmsObject(m_cms).setJspPageContext(pageContext).setResourceName( 835 resourcename).setKeepEmptyMacros(true); 836 837 if (container == null) { 839 m_collectorName = resolver.resolveMacros(getCollector()); 841 m_collectorParam = resolver.resolveMacros(getParam()); 843 m_collectorResult = null; 844 } else { 845 m_collectorName = usedContainer.getCollectorName(); 847 m_collectorParam = usedContainer.getCollectorParam(); 848 m_collectorResult = usedContainer.getCollectorResult(); 849 if (m_locale == null) { 850 m_locale = usedContainer.getXmlDocumentLocale(); 852 } 853 } 854 855 if (m_locale == null) { 856 m_locale = m_cms.getRequestContext().getLocale(); 858 } 859 860 try { 861 I_CmsResourceCollector collector = OpenCms.getResourceManager().getContentCollector(m_collectorName); 863 if (collector == null) { 864 throw new CmsException(Messages.get().container(Messages.ERR_COLLECTOR_NOT_FOUND_1, m_collectorName)); 865 } 866 if (m_collectorResult == null) { 868 m_collectorResult = collector.getResults(m_cms, m_collectorName, m_collectorParam); 869 } 870 871 m_contentInfoBean = new CmsContentInfoBean(); 872 m_contentInfoBean.setPageSizeAsString(resolver.resolveMacros(m_pageSize)); 873 m_contentInfoBean.setPageIndexAsString(resolver.resolveMacros(m_pageIndex)); 874 m_contentInfoBean.setPageNavLengthAsString(resolver.resolveMacros(m_pageNavLength)); 875 m_contentInfoBean.setResultSize(m_collectorResult.size()); 876 m_contentInfoBean.setLocale(m_locale.toString()); 877 m_contentInfoBean.initResultIndex(); 878 879 if (!m_preload) { 880 882 m_collectorResult = CmsJspTagContentLoad.limitCollectorResult(m_contentInfoBean, m_collectorResult); 883 m_contentInfoBean.initPageNavIndexes(); 884 885 String createParam = collector.getCreateParam(m_cms, m_collectorName, m_collectorParam); 886 if (createParam != null) { 887 m_directEditLinkForNew = CmsEncoder.encode(m_collectorName + "|" + createParam); 889 } 890 } 891 892 } catch (CmsException e) { 893 m_controller.setThrowable(e, m_cms.getRequestContext().getUri()); 894 throw new JspException (e); 895 } 896 897 m_directEditOpen = false; 899 m_directEditFollowButtons = null; 900 901 m_isFirstLoop = true; 903 } 904 905 910 private CmsResource getNextResource() { 911 912 if ((m_collectorResult != null) && (m_collectorResult.size() > 0)) { 913 914 m_contentInfoBean.incResultIndex(); 915 return (CmsResource)m_collectorResult.remove(0); 916 } 917 918 return null; 919 } 920 } | Popular Tags |