1 31 32 package org.opencms.workplace.commons; 33 34 import org.opencms.file.CmsGroup; 35 import org.opencms.file.CmsObject; 36 import org.opencms.file.CmsProperty; 37 import org.opencms.file.CmsPropertyDefinition; 38 import org.opencms.file.CmsResource; 39 import org.opencms.file.CmsResourceFilter; 40 import org.opencms.jsp.CmsJspActionElement; 41 import org.opencms.main.CmsException; 42 import org.opencms.main.CmsIllegalArgumentException; 43 import org.opencms.main.CmsLog; 44 import org.opencms.main.OpenCms; 45 import org.opencms.security.CmsAccessControlEntry; 46 import org.opencms.security.CmsPermissionSet; 47 import org.opencms.security.I_CmsPrincipal; 48 import org.opencms.util.CmsStringUtil; 49 import org.opencms.widgets.CmsCalendarWidget; 50 import org.opencms.workplace.CmsMultiDialog; 51 import org.opencms.workplace.CmsWorkplace; 52 import org.opencms.workplace.CmsWorkplaceSettings; 53 54 import java.text.ParseException ; 55 import java.util.ArrayList ; 56 import java.util.Collection ; 57 import java.util.HashMap ; 58 import java.util.Iterator ; 59 import java.util.List ; 60 import java.util.Map ; 61 62 import javax.servlet.http.HttpServletRequest ; 63 import javax.servlet.http.HttpServletResponse ; 64 import javax.servlet.jsp.JspException ; 65 import javax.servlet.jsp.PageContext ; 66 67 import org.apache.commons.logging.Log; 68 69 85 public class CmsAvailability extends CmsMultiDialog { 86 87 88 public static final String DIALOG_TYPE = "availability"; 89 90 91 public static final String PARAM_ENABLE_NOTIFICATION = "enablenotification"; 92 93 94 public static final String PARAM_EXPIREDATE = "expiredate"; 95 96 97 public static final String PARAM_LEAVEEXPIRE = "leaveexpire"; 98 99 100 public static final String PARAM_LEAVERELEASE = "leaverelease"; 101 102 103 public static final String PARAM_MODIFY_SIBLINGS = "modifysiblings"; 104 105 106 public static final String PARAM_NOTIFICATION_INTERVAL = "notificationinterval"; 107 108 109 public static final String PARAM_RECURSIVE = "recursive"; 110 111 112 public static final String PARAM_RELEASEDATE = "releasedate"; 113 114 115 public static final String PARAM_RESETEXPIRE = "resetexpire"; 116 117 118 public static final String PARAM_RESETRELEASE = "resetrelease"; 119 120 121 private static final Log LOG = CmsLog.getLog(CmsAvailability.class); 122 123 private String m_paramEnablenotification; 124 private String m_paramExpiredate; 125 private String m_paramLeaveexpire; 126 private String m_paramModifysiblings; 127 private String m_paramNotificationinterval; 128 private String m_paramRecursive; 129 private String m_paramReleasedate; 130 private String m_paramResetexpire; 131 private String m_paramResetrelease; 132 133 138 public CmsAvailability(CmsJspActionElement jsp) { 139 140 super(jsp); 141 } 142 143 150 public CmsAvailability(PageContext context, HttpServletRequest req, HttpServletResponse res) { 151 152 this(new CmsJspActionElement(context, req, res)); 153 } 154 155 162 protected String getLocalizedType(int flags) { 163 164 if ((flags & CmsAccessControlEntry.ACCESS_FLAGS_USER) > 0) { 165 return key(Messages.GUI_LABEL_USER_0); 166 } else { 167 return key(Messages.GUI_LABEL_GROUP_0); 168 } 169 } 170 171 175 public void actionCloseDialog() throws JspException { 176 177 getSettings().getFrameUris().put("body", CmsWorkplace.VFS_PATH_VIEWS + "explorer/explorer_fs.jsp"); 179 super.actionCloseDialog(); 180 } 181 182 187 public void actionUpdate() throws JspException { 188 189 getJsp().getRequest().setAttribute(SESSION_WORKPLACE_CLASS, this); 191 192 try { 193 if (performDialogOperation()) { 194 actionCloseDialog(); 196 } else { 197 getJsp().include(FILE_DIALOG_SCREEN_WAIT); 199 } 200 } catch (Throwable e) { 201 includeErrorpage(this, e); 202 } 203 } 204 205 210 public String buildCheckboxEnableNotification() { 211 212 String propVal = null; 213 if (!isMultiOperation()) { 214 try { 216 propVal = getCms().readPropertyObject( 217 getParamResource(), 218 CmsPropertyDefinition.PROPERTY_ENABLE_NOTIFICATION, 219 false).getValue(); 220 } catch (CmsException e) { 221 if (LOG.isInfoEnabled()) { 222 LOG.info(e.getLocalizedMessage()); 223 } 224 } 225 226 } 227 if (CmsStringUtil.isEmpty(propVal)) { 228 propVal = CmsStringUtil.FALSE; 229 } 230 StringBuffer result = new StringBuffer (512); 231 result.append("<input type=\"checkbox\" style=\"text-align:left\" name=\""); 232 result.append(PARAM_ENABLE_NOTIFICATION); 233 if (Boolean.valueOf(propVal).booleanValue()) { 234 result.append("\" checked=\"checked"); 235 } 236 result.append("\" value=\"true\">"); 237 return result.toString(); 238 } 239 240 247 public String buildCheckboxModifySiblings() { 248 249 StringBuffer result = new StringBuffer (254); 250 try { 251 if (isMultiOperation() || getCms().readSiblings(getParamResource(), CmsResourceFilter.ALL).size() > 1) { 252 result.append("<tr>\n<td style=\"white-space:nowrap;\">"); 253 result.append(key(Messages.GUI_AVAILABILITY_MODIFY_SIBLINGS_0)); 254 result.append("</td>\n<td class=\"maxwidth\" style=\"padding-left: 5px;\">\n"); 255 result.append("<input type=\"checkbox\" name=\""); 256 result.append(PARAM_MODIFY_SIBLINGS); 257 result.append("\" value=\"true\" style=\"text-align:left\">\n</td>\n<td> </td></tr>"); 258 } 259 } catch (CmsException e) { 260 if (LOG.isInfoEnabled()) { 261 LOG.info(e); 262 } 263 } 264 return result.toString(); 265 } 266 267 272 public String buildCheckRecursive() { 273 274 StringBuffer result = new StringBuffer (256); 275 276 if (isOperationOnFolder()) { 278 result.append(dialogBlockStart(key(Messages.GUI_AVAILABILITY_NOTIFICATION_SUBRES_0))); 279 result.append("<table border=\"0\">"); 280 result.append("<tr>\n\t<td style=\"white-space:nowrap;\">"); 281 result.append(key(Messages.GUI_TOUCH_MODIFY_SUBRESOURCES_0)); 282 result.append("</td><td class=\"maxwidth\" style=\"padding-left: 5px;\"><input type=\"checkbox\" style=\"text-align:left\" name=\""); 283 result.append(PARAM_RECURSIVE); 284 result.append("\" value=\"true\"> </td>\n<td> </td></tr>\n"); 285 result.append("</table>"); 286 result.append(dialogBlockEnd()); 287 result.append(dialogSpacer()); 288 } 289 return result.toString(); 290 } 291 292 297 public String buildInputNotificationInterval() { 298 299 String propVal = null; 300 if (!isMultiOperation()) { 301 try { 302 propVal = getCms().readPropertyObject( 303 getParamResource(), 304 CmsPropertyDefinition.PROPERTY_NOTIFICATION_INTERVAL, 305 false).getValue(); 306 } catch (CmsException e) { 307 if (LOG.isInfoEnabled()) { 308 LOG.info(e.getLocalizedMessage()); 309 } 310 } 311 } 312 if (CmsStringUtil.isEmpty(propVal)) { 313 propVal = ""; 314 } 315 StringBuffer result = new StringBuffer (); 316 317 result.append("<input class=\"maxwidth\" type=\"text\" name=\""); 318 result.append(CmsAvailability.PARAM_NOTIFICATION_INTERVAL); 319 result.append("\" value=\""); 320 result.append(propVal); 321 result.append("\">"); 322 return result.toString(); 323 } 324 325 330 public String buildResponsibleList() { 331 332 if (isMultiOperation()) { 333 return ""; 335 } else { 336 StringBuffer result = new StringBuffer (512); 338 result.append("<tr><td colspan=\"3\">"); 339 List parentResources = new ArrayList (); 340 Map responsibles = new HashMap (); 341 CmsObject cms = getCms(); 342 String resourceSitePath = cms.getRequestContext().removeSiteRoot(getParamResource()); 343 try { 344 parentResources = cms.readPath(getParamResource(), CmsResourceFilter.IGNORE_EXPIRATION); 346 } catch (CmsException e) { 347 if (LOG.isInfoEnabled()) { 349 LOG.info(e.getLocalizedMessage()); 350 } 351 } 352 Iterator i = parentResources.iterator(); 353 while (i.hasNext()) { 354 CmsResource resource = (CmsResource)i.next(); 355 try { 356 String sitePath = cms.getRequestContext().removeSiteRoot(resource.getRootPath()); 357 Iterator entries = cms.getAccessControlEntries(sitePath, false).iterator(); 358 while (entries.hasNext()) { 359 CmsAccessControlEntry ace = (CmsAccessControlEntry)entries.next(); 360 if (ace.isResponsible()) { 361 I_CmsPrincipal principal = cms.lookupPrincipal(ace.getPrincipal()); 362 responsibles.put(principal, resourceSitePath.equals(sitePath) ? null : sitePath); 363 } 364 } 365 } catch (CmsException e) { 366 if (LOG.isInfoEnabled()) { 368 LOG.info(e.getLocalizedMessage()); 369 } 370 } 371 } 372 373 if (responsibles.size() == 0) { 374 result.append(key(Messages.GUI_AVAILABILITY_NO_RESPONSIBLES_0)); 376 } else { 377 result.append(dialogToggleStart(key(Messages.GUI_AVAILABILITY_RESPONSIBLES_0), "responsibles", false)); 379 Collection parentFolders = new ArrayList (responsibles.values()); 380 parentFolders.remove(null); 381 if (parentFolders.size() > 0) { 382 result.append("<table border=\"0\">\n<tr>\n\t<td>"); 383 result.append(key(Messages.GUI_PERMISSION_SELECT_VIEW_0)); 384 result.append("</td>\n<td><input type=\"button\" onclick=\"toggleInheritInfo();\" value=\""); 385 result.append(key(Messages.GUI_LABEL_DETAILS_0)); 386 result.append("\" id=\"button\"/></td></tr></table>"); 387 } 388 result.append(dialogWhiteBoxStart()); 389 i = responsibles.keySet().iterator(); 390 for (int j = 0; i.hasNext(); j++) { 391 I_CmsPrincipal principal = (I_CmsPrincipal)i.next(); 392 String image = "user.png"; 393 String localizedType = getLocalizedType(CmsAccessControlEntry.ACCESS_FLAGS_USER); 394 if (principal instanceof CmsGroup) { 395 image = "group.png"; 396 localizedType = getLocalizedType(CmsAccessControlEntry.ACCESS_FLAGS_GROUP); 397 } 398 result.append("<div class=\"dialogrow\"><img SRC=\""); 399 result.append(getSkinUri()); 400 result.append("commons/"); 401 result.append(image); 402 result.append("\" class=\"noborder\" width=\"16\" height=\"16\" alt=\""); 403 result.append(localizedType); 404 result.append("\" title=\""); 405 result.append(localizedType); 406 result.append("\"> <span class=\"textbold\">"); 407 result.append(principal.getName()); 408 result.append("</span><div class=\"hide\" id=\"inheritinfo"); 409 result.append(j); 410 result.append("\"><div class=\"dialogpermissioninherit\">"); 411 String resourceName = ((String )responsibles.get(principal)); 412 if (CmsStringUtil.isNotEmpty(resourceName)) { 413 result.append(key(Messages.GUI_PERMISSION_INHERITED_FROM_1, new Object [] {resourceName})); 414 } 415 result.append("</div></div></div>\n"); 416 } 417 result.append(dialogWhiteBoxEnd()); 418 result.append("</div>\n"); 419 result.append("</td></tr>"); 420 } 421 return result.toString(); 422 } 423 } 424 425 432 public String calendarIncludes() { 433 434 return CmsCalendarWidget.calendarIncludes(getLocale()); 435 } 436 437 452 public String calendarInit( 453 String inputFieldId, 454 String triggerButtonId, 455 String align, 456 boolean singleClick, 457 boolean weekNumbers, 458 boolean mondayFirst, 459 String dateStatusFunc, 460 boolean showTime) { 461 462 return CmsCalendarWidget.calendarInit( 463 getMessages(), 464 inputFieldId, 465 triggerButtonId, 466 align, 467 singleClick, 468 weekNumbers, 469 mondayFirst, 470 dateStatusFunc, 471 showTime); 472 } 473 474 479 public String getCurrentDateTime() { 480 481 return CmsCalendarWidget.getCalendarLocalizedTime(getLocale(), getMessages(), System.currentTimeMillis()); 483 } 484 485 490 public String getCurrentExpireDate() { 491 492 if (isMultiOperation()) { 494 return CmsTouch.DEFAULT_DATE_STRING; 495 } else { 496 try { 497 CmsResource res = getCms().readResource(getParamResource(), CmsResourceFilter.IGNORE_EXPIRATION); 498 if (res.getDateExpired() == CmsResource.DATE_EXPIRED_DEFAULT) { 499 return CmsTouch.DEFAULT_DATE_STRING; 500 } else { 501 return CmsCalendarWidget.getCalendarLocalizedTime(getLocale(), getMessages(), res.getDateExpired()); 502 } 503 } catch (CmsException e) { 504 return CmsCalendarWidget.getCalendarLocalizedTime( 505 getLocale(), 506 getMessages(), 507 System.currentTimeMillis()); 508 } 509 } 510 } 511 512 517 public String getCurrentReleaseDate() { 518 519 if (isMultiOperation()) { 521 return CmsTouch.DEFAULT_DATE_STRING; 522 } else { 523 try { 524 CmsResource res = getCms().readResource(getParamResource(), CmsResourceFilter.IGNORE_EXPIRATION); 525 if (res.getDateReleased() == CmsResource.DATE_RELEASED_DEFAULT) { 526 return CmsTouch.DEFAULT_DATE_STRING; 527 } else { 528 return CmsCalendarWidget.getCalendarLocalizedTime(getLocale(), getMessages(), res.getDateReleased()); 529 } 530 } catch (CmsException e) { 531 return CmsCalendarWidget.getCalendarLocalizedTime( 532 getLocale(), 533 getMessages(), 534 System.currentTimeMillis()); 535 } 536 } 537 } 538 539 546 public String getParamEnablenotification() { 547 548 return m_paramEnablenotification; 549 } 550 551 557 public String getParamExpiredate() { 558 559 return m_paramExpiredate; 560 } 561 562 567 public String getParamLeaveexpire() { 568 569 return m_paramLeaveexpire; 570 } 571 572 578 public String getParamModifysiblings() { 579 580 return m_paramModifysiblings; 581 } 582 583 589 public String getParamNotificationinterval() { 590 591 return m_paramNotificationinterval; 592 } 593 594 603 public String getParamRecursive() { 604 605 return m_paramRecursive; 606 } 607 608 616 public String getParamReleasedate() { 617 618 return m_paramReleasedate; 619 } 620 621 626 public String getParamResetexpire() { 627 628 return m_paramResetexpire; 629 } 630 631 636 public String getParamResetrelease() { 637 638 return m_paramResetrelease; 639 } 640 641 646 public void setParamEnablenotification(String value) { 647 648 m_paramEnablenotification = value; 649 } 650 651 656 public void setParamExpiredate(String value) { 657 658 m_paramExpiredate = value; 659 } 660 661 666 public void setParamLeaveexpire(String paramLeaveexpire) { 667 668 m_paramLeaveexpire = paramLeaveexpire; 669 } 670 671 676 public void setParamModifysiblings(String value) { 677 678 m_paramModifysiblings = value; 679 } 680 681 686 public void setParamNotificationinterval(String value) { 687 688 m_paramNotificationinterval = value; 689 } 690 691 696 public void setParamRecursive(String value) { 697 698 m_paramRecursive = value; 699 } 700 701 706 public void setParamReleasedate(String value) { 707 708 m_paramReleasedate = value; 709 } 710 711 716 public void setParamResetexpire(String paramResetexpire) { 717 718 m_paramResetexpire = paramResetexpire; 719 } 720 721 726 public void setParamResetrelease(String paramResetrelease) { 727 728 m_paramResetrelease = paramResetrelease; 729 } 730 731 734 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 735 736 fillParamValues(request); 738 739 if (!checkResourcePermissions(CmsPermissionSet.ACCESS_WRITE, false)) { 741 setParamAction(DIALOG_CANCEL); 743 } 744 745 setParamDialogtype(DIALOG_TYPE); 747 748 if (DIALOG_TYPE.equals(getParamAction())) { 750 setAction(ACTION_OK); 751 } else if (DIALOG_WAIT.equals(getParamAction())) { 752 setAction(ACTION_WAIT); 753 } else if (DIALOG_CANCEL.equals(getParamAction())) { 754 setAction(ACTION_CANCEL); 755 } else { 756 setAction(ACTION_DEFAULT); 757 setDialogTitle( 759 Messages.GUI_AVAILABILITY_NOTIFICATION_SETTINGS_1, 760 Messages.GUI_AVAILABILITY_NOTIFICATION_MULTI_2); 761 } 762 } 763 764 770 protected boolean performDialogOperation() throws CmsException { 771 772 boolean isFolder = isOperationOnFolder(); 774 if ((isMultiOperation() || isFolder) && !DIALOG_WAIT.equals(getParamAction())) { 776 return false; 778 } 779 780 long releaseDate = CmsResource.DATE_RELEASED_DEFAULT; 782 boolean resetReleaseDate = Boolean.valueOf(getParamResetrelease()).booleanValue(); 783 boolean leaveReleaseDate = false; 784 if (!resetReleaseDate) { 785 try { 786 if ((CmsStringUtil.isNotEmptyOrWhitespaceOnly(getParamReleasedate())) 787 && (!getParamReleasedate().startsWith(CmsTouch.DEFAULT_DATE_STRING))) { 788 releaseDate = CmsCalendarWidget.getCalendarDate(getMessages(), getParamReleasedate(), true); 789 } else { 790 leaveReleaseDate = true; 791 } 792 } catch (ParseException e) { 793 throw new CmsException( 794 Messages.get().container(Messages.ERR_PARSE_RELEASEDATE_1, getParamReleasedate()), 795 e); 796 } 797 } 798 799 long expireDate = CmsResource.DATE_EXPIRED_DEFAULT; 801 boolean resetExpireDate = Boolean.valueOf(getParamResetexpire()).booleanValue(); 802 boolean leaveExpireDate = false; 803 if (!resetExpireDate) { 804 try { 805 if ((CmsStringUtil.isNotEmptyOrWhitespaceOnly(getParamExpiredate())) 806 && (!getParamExpiredate().startsWith(CmsTouch.DEFAULT_DATE_STRING))) { 807 expireDate = CmsCalendarWidget.getCalendarDate(getMessages(), getParamExpiredate(), true); 808 } else { 809 leaveExpireDate = true; 810 } 811 } catch (ParseException e) { 812 throw new CmsException( 813 Messages.get().container(Messages.ERR_PARSE_EXPIREDATE_1, getParamExpiredate()), 814 e); 815 } 816 } 817 818 boolean modifyRecursive = Boolean.valueOf(getParamRecursive()).booleanValue(); 820 821 boolean modifySiblings = Boolean.valueOf(getParamModifysiblings()).booleanValue(); 823 824 Iterator i = getResourceList().iterator(); 826 while (i.hasNext()) { 827 String resName = (String )i.next(); 828 try { 829 performSingleResource( 830 resName, 831 releaseDate, 832 expireDate, 833 leaveReleaseDate, 834 leaveExpireDate, 835 modifyRecursive, 836 modifySiblings); 837 } catch (CmsException e) { 838 addMultiOperationException(e); 840 } 841 } 842 checkMultiOperationException(Messages.get(), Messages.ERR_AVAILABILITY_MULTI_0); 843 844 return true; 845 } 846 847 859 protected void performSingleResource( 860 String resName, 861 long releaseDate, 862 long expireDate, 863 boolean leaveRelease, 864 boolean leaveExpire, 865 boolean modifyRecursive, 866 boolean modifySiblings) throws CmsException { 867 868 List resources = new ArrayList (); 869 if (modifySiblings) { 870 resources = getCms().readSiblings(resName, CmsResourceFilter.IGNORE_EXPIRATION); 872 } else { 873 resources.add(getCms().readResource(resName, CmsResourceFilter.IGNORE_EXPIRATION)); 875 } 876 Iterator i = resources.iterator(); 877 while (i.hasNext()) { 878 CmsResource resource = (CmsResource)i.next(); 879 String resourcePath = getCms().getRequestContext().removeSiteRoot(resource.getRootPath()); 880 checkLock(resourcePath); 882 if (!leaveRelease && !leaveExpire) { 883 if (expireDate < releaseDate) { 884 throw new CmsIllegalArgumentException(Messages.get().container( 885 Messages.ERR_AVAILABILITY_BAD_TIMEWINDOW_0)); 886 } 887 } 888 if (! leaveRelease) { 890 getCms().setDateReleased(resourcePath, releaseDate, modifyRecursive); 891 } 892 if (! leaveExpire) { 893 getCms().setDateExpired(resourcePath, expireDate, modifyRecursive); 894 } 895 writeProperty( 897 resourcePath, 898 CmsPropertyDefinition.PROPERTY_NOTIFICATION_INTERVAL, 899 getParamNotificationinterval()); 900 writeProperty( 901 resourcePath, 902 CmsPropertyDefinition.PROPERTY_ENABLE_NOTIFICATION, 903 getParamEnablenotification()); 904 } 905 } 906 907 915 protected void writeProperty(String resourcePath, String propertyName, String propertyValue) throws CmsException { 916 917 if (CmsStringUtil.isEmpty(propertyValue)) { 918 propertyValue = CmsProperty.DELETE_VALUE; 919 } 920 921 CmsProperty newProp = new CmsProperty(); 922 newProp.setName(propertyName); 923 CmsProperty oldProp = getCms().readPropertyObject(resourcePath, propertyName, false); 924 if (oldProp.isNullProperty()) { 925 if (OpenCms.getWorkplaceManager().isDefaultPropertiesOnStructure()) { 927 newProp.setStructureValue(propertyValue); 928 } else { 929 newProp.setResourceValue(propertyValue); 930 } 931 } else { 932 if (oldProp.getStructureValue() != null) { 933 newProp.setStructureValue(propertyValue); 934 newProp.setResourceValue(oldProp.getResourceValue()); 935 } else { 936 newProp.setResourceValue(propertyValue); 937 } 938 } 939 940 newProp.setAutoCreatePropertyDefinition(true); 941 942 String oldStructureValue = oldProp.getStructureValue(); 943 String newStructureValue = newProp.getStructureValue(); 944 if (CmsStringUtil.isEmpty(oldStructureValue)) { 945 oldStructureValue = CmsProperty.DELETE_VALUE; 946 } 947 if (CmsStringUtil.isEmpty(newStructureValue)) { 948 newStructureValue = CmsProperty.DELETE_VALUE; 949 } 950 951 String oldResourceValue = oldProp.getResourceValue(); 952 String newResourceValue = newProp.getResourceValue(); 953 if (CmsStringUtil.isEmpty(oldResourceValue)) { 954 oldResourceValue = CmsProperty.DELETE_VALUE; 955 } 956 if (CmsStringUtil.isEmpty(newResourceValue)) { 957 newResourceValue = CmsProperty.DELETE_VALUE; 958 } 959 960 if (!oldResourceValue.equals(newResourceValue) || !oldStructureValue.equals(newStructureValue)) { 962 getCms().writePropertyObject(resourcePath, newProp); 963 } 964 } 965 } | Popular Tags |