1 31 32 package org.opencms.workplace.explorer; 33 34 import org.opencms.file.CmsFolder; 35 import org.opencms.file.CmsObject; 36 import org.opencms.file.CmsProject; 37 import org.opencms.file.CmsProperty; 38 import org.opencms.file.CmsPropertyDefinition; 39 import org.opencms.file.CmsResource; 40 import org.opencms.file.CmsResourceFilter; 41 import org.opencms.file.types.I_CmsResourceType; 42 import org.opencms.i18n.CmsMessages; 43 import org.opencms.jsp.CmsJspActionElement; 44 import org.opencms.main.CmsException; 45 import org.opencms.main.CmsLog; 46 import org.opencms.main.OpenCms; 47 import org.opencms.security.CmsPermissionSet; 48 import org.opencms.site.CmsSite; 49 import org.opencms.site.CmsSiteManager; 50 import org.opencms.workplace.CmsWorkplace; 51 import org.opencms.workplace.CmsWorkplaceSettings; 52 53 import java.util.ArrayList ; 54 import java.util.Iterator ; 55 import java.util.List ; 56 import java.util.Locale ; 57 import java.util.StringTokenizer ; 58 59 import javax.servlet.http.HttpServletRequest ; 60 61 import org.apache.commons.logging.Log; 62 63 79 public class CmsTree extends CmsWorkplace { 80 81 82 public static final String PARAM_INCLUDEFILES = "includefiles"; 83 84 85 public static final String PARAM_LASTKNOWN = "lastknown"; 86 87 88 public static final String PARAM_RESOURCE = "resource"; 89 90 91 public static final String PARAM_ROOTLOADED = "rootloaded"; 92 93 94 public static final String PARAM_SHOWSITESELECTOR = "showsiteselector"; 95 96 97 public static final String PARAM_TREESITE = "treesite"; 98 99 100 public static final String PARAM_TYPE = "type"; 101 102 103 private static final Log LOG = CmsLog.getLog(CmsTree.class); 104 105 106 private static final String TYPE_COPY = "copy"; 107 108 109 private static final String TYPE_PAGELINK = "pagelink"; 110 111 112 private static final String TYPE_PREFERENCES = "preferences"; 113 114 115 private static final String TYPE_SIBLING = "sibling"; 116 117 118 private static final String TYPE_VFSWIDGET = "vfswidget"; 119 120 121 private boolean m_includeFiles; 122 123 124 private boolean m_newTree; 125 126 127 private String m_rootFolder; 128 129 130 private boolean m_showSiteSelector; 131 132 133 private String m_startFolder; 134 135 136 private String m_targetFolder; 137 138 139 private String m_treeType; 140 141 146 public CmsTree(CmsJspActionElement jsp) { 147 148 super(jsp); 149 } 150 151 159 public static String initTree(CmsObject cms, String encoding, String skinUri) { 160 161 StringBuffer retValue = new StringBuffer (512); 162 String servletUrl = OpenCms.getSystemInfo().getOpenCmsContext(); 163 164 Locale locale = cms.getRequestContext().getLocale(); 167 CmsMessages messages = OpenCms.getWorkplaceManager().getMessages(locale); 168 169 retValue.append("function initTreeResources() {\n"); 170 retValue.append("\tinitResources(\""); 171 retValue.append(encoding); 172 retValue.append("\", \""); 173 retValue.append(PATH_WORKPLACE); 174 retValue.append("\", \""); 175 retValue.append(skinUri); 176 retValue.append("\", \""); 177 retValue.append(servletUrl); 178 retValue.append("\");\n"); 179 180 List allResTypes = OpenCms.getResourceManager().getResourceTypes(); 182 for (int i = 0; i < allResTypes.size(); i++) { 183 I_CmsResourceType type = (I_CmsResourceType)allResTypes.get(i); 185 int curTypeId = type.getTypeId(); 186 String curTypeName = type.getTypeName(); 187 CmsExplorerTypeSettings settings = OpenCms.getWorkplaceManager().getExplorerTypeSetting(curTypeName); 189 CmsPermissionSet permissions = settings.getAccess().getPermissions(cms); 191 if (permissions.requiresWritePermission()) { 192 retValue.append("\taddResourceType("); 194 retValue.append(curTypeId); 195 retValue.append(", \""); 196 retValue.append(curTypeName); 197 retValue.append("\",\t\""); 198 retValue.append(messages.key(settings.getKey())); 199 retValue.append("\",\t\"filetypes/"); 200 retValue.append(settings.getIcon()); 201 retValue.append("\");\n"); 202 } 203 } 204 205 retValue.append("}\n\n"); 206 retValue.append("initTreeResources();\n"); 207 208 return retValue.toString(); 209 } 210 211 216 public String getRootFolder() { 217 218 if (m_rootFolder == null) { 219 String folder = "/"; 220 if (getTreeType() == null && getSettings().getUserSettings().getRestrictExplorerView()) { 221 folder = getSettings().getUserSettings().getStartFolder(); 222 } 223 try { 224 getCms().readFolder(folder, CmsResourceFilter.IGNORE_EXPIRATION); 225 } catch (CmsException e) { 226 if (LOG.isInfoEnabled()) { 227 LOG.info(e); 228 } 229 folder = "/"; 230 } 231 m_rootFolder = folder; 232 } 233 return m_rootFolder; 234 } 235 236 242 public String getSiteSelector(String htmlAttributes) { 243 244 List options = new ArrayList (); 245 List values = new ArrayList (); 246 int selectedIndex = 0; 247 String preSelection = getSettings().getTreeSite(getTreeType()); 248 if (preSelection == null) { 249 if ("".equals(getCms().getRequestContext().getSiteRoot())) { 250 preSelection = ""; 252 } else { 253 preSelection = CmsSiteManager.getCurrentSite(getCms()).getSiteRoot(); 255 } 256 getSettings().setTreeSite(getTreeType(), preSelection); 258 } 259 260 boolean includeRootSite = true; 261 boolean showSiteUrls = false; 262 if (TYPE_PAGELINK.equals(getTreeType())) { 263 includeRootSite = false; 265 showSiteUrls = true; 266 } 267 List sites = CmsSiteManager.getAvailableSites(getCms(), includeRootSite); 268 269 Iterator i = sites.iterator(); 270 int pos = 0; 271 while (i.hasNext()) { 272 CmsSite site = (CmsSite)i.next(); 273 values.add(site.getSiteRoot()); 274 String curOption = site.getTitle(); 275 if (showSiteUrls) { 276 curOption = site.getUrl() + " (" + curOption + ")"; 278 if (getCms().getRequestContext().getSiteRoot().equals(site.getSiteRoot())) { 279 curOption = "*" + curOption; 281 } 282 } 283 284 if (site.getSiteRoot().equals(preSelection)) { 285 selectedIndex = pos; 287 } 288 options.add(curOption); 289 pos++; 290 } 291 292 return buildSelect(htmlAttributes, options, values, selectedIndex); 293 } 294 295 300 public String getTree() { 301 302 StringBuffer result = new StringBuffer (2048); 303 String targetFolder = getTargetFolder(); 304 String startFolder = getStartFolder(); 305 List targetFolderList = new ArrayList (); 306 boolean grey; 307 List resources = new ArrayList (); 308 CmsFolder folder = null; 309 String oldSiteRoot = getCms().getRequestContext().getSiteRoot(); 310 boolean restoreSiteRoot = false; 311 312 if (targetFolder != null) { 313 StringTokenizer T = new StringTokenizer (targetFolder, "|"); 315 while (T.hasMoreTokens()) { 316 String currentFolder = T.nextToken().trim(); 317 targetFolderList.add(currentFolder); 318 } 319 } else { 320 targetFolderList.add(null); 321 } 322 323 Iterator targets = targetFolderList.iterator(); 324 try { 325 326 while (targets.hasNext()) { 327 String currentTargetFolder = (String )targets.next(); 329 330 if ("channelselector".equals(getTreeType())) { 331 restoreSiteRoot = true; 333 getCms().getRequestContext().saveSiteRoot(); 334 getCms().getRequestContext().setSiteRoot(CmsResource.VFS_FOLDER_CHANNELS); 335 } else if (getSettings().getTreeSite(getTreeType()) != null) { 336 restoreSiteRoot = true; 338 getCms().getRequestContext().saveSiteRoot(); 339 if (newTree() && currentTargetFolder == null) { 340 currentTargetFolder = "/"; 341 } 342 getCms().getRequestContext().setSiteRoot(getSettings().getTreeSite(getTreeType())); 343 try { 344 getCms().readFolder(currentTargetFolder, CmsResourceFilter.ONLY_VISIBLE_NO_DELETED); 346 } catch (CmsException e) { 347 if (LOG.isInfoEnabled()) { 349 LOG.info(e); 350 } 351 currentTargetFolder = "/"; 352 } 353 } 354 355 357 try { 358 folder = getCms().readFolder(currentTargetFolder, CmsResourceFilter.ONLY_VISIBLE_NO_DELETED); 359 } catch (CmsException e) { 360 return printError(e); 362 } 363 364 if ((startFolder == null) || (!currentTargetFolder.startsWith(startFolder))) { 365 try { 367 if (includeFiles()) { 368 resources.addAll(getCms().getResourcesInFolder( 369 currentTargetFolder, 370 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 371 } else { 372 resources.addAll(getCms().getSubFolders( 373 currentTargetFolder, 374 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 375 } 376 } catch (CmsException e) { 377 return printError(e); 379 } 380 } else { 381 try { 383 if (includeFiles()) { 384 resources.addAll(getCms().getResourcesInFolder( 385 startFolder, 386 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 387 } else { 388 resources.addAll(getCms().getSubFolders( 389 startFolder, 390 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 391 } 392 StringTokenizer tok = new StringTokenizer ( 393 currentTargetFolder.substring(startFolder.length()), 394 "/"); 395 while (tok.hasMoreTokens()) { 396 startFolder += tok.nextToken() + "/"; 397 if (includeFiles()) { 398 resources.addAll(getCms().getResourcesInFolder( 399 startFolder, 400 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 401 } else { 402 resources.addAll(getCms().getSubFolders( 403 startFolder, 404 CmsResourceFilter.ONLY_VISIBLE_NO_DELETED)); 405 } 406 } 407 } catch (CmsException e) { 408 return printError(e); 410 } 411 } 412 } 413 414 result.append("function init() {\n"); 415 416 if (newTree()) { 417 result.append("parent.initTree();\n"); 419 result.append(getRootNode()); 420 } 421 422 List projectResources; 424 try { 425 projectResources = getCms().readProjectResources(getCms().getRequestContext().currentProject()); 426 } catch (CmsException e) { 427 if (LOG.isInfoEnabled()) { 429 LOG.info(e); 430 } 431 projectResources = new ArrayList (); 432 } 433 434 Iterator i = resources.iterator(); 436 while (i.hasNext()) { 437 CmsResource resource = (CmsResource)i.next(); 438 grey = !CmsProject.isInsideProject(projectResources, resource); 439 if ((!grey) && (!getSettings().getResourceTypes().containsKey(new Integer (resource.getTypeId())))) { 440 grey = true; 441 } 442 443 result.append(getNode( 444 resource.getRootPath(), 445 resource.getName(), 446 resource.getTypeId(), 447 resource.isFolder(), 448 resource.getState(), 449 grey)); 450 } 451 452 if (includeFiles()) { 453 result.append("parent.setIncludeFiles(true);\n"); 454 } 455 if (getTreeType() != null) { 456 result.append("parent.setTreeType(\""); 458 result.append(getTreeType()); 459 result.append("\");\n"); 460 String curSite = getSettings().getTreeSite(getTreeType()); 461 if (curSite != null) { 462 result.append("parent.setSitePrefix(\""); 464 result.append(getSitePrefix(curSite, oldSiteRoot)); 465 result.append("\");\n"); 466 } 467 } 468 result.append("parent.setRootFolder(\""); 470 result.append(getRootFolder()); 471 result.append("\");\n"); 472 473 if (newTree()) { 474 result.append("parent.showTree(parent.tree_display.document, \""); 476 result.append(folder.getRootPath().hashCode()); 477 result.append("\");\n"); 478 } else { 479 if (resources.size() == 0) { 481 result.append("parent.setNoChilds(\""); 483 result.append(folder.getRootPath().hashCode()); 484 result.append("\");\n"); 485 } 486 result.append("parent.showLoadedNodes(parent.tree_display.document,\""); 487 result.append(folder.getRootPath().hashCode()); 488 result.append("\");\n"); 489 } 490 491 result.append("}\n"); 492 } finally { 493 if (restoreSiteRoot) { 494 getCms().getRequestContext().restoreSiteRoot(); 495 } 496 } 497 return result.toString(); 498 } 499 500 506 public String getTreeType() { 507 508 return m_treeType; 509 } 510 511 516 public boolean includeFiles() { 517 518 return m_includeFiles; 519 } 520 521 526 public String initTree() { 527 528 return initTree(getCms(), getEncoding(), getSkinUri()); 529 } 530 531 536 public boolean showSiteSelector() { 537 538 return m_showSiteSelector; 539 } 540 541 544 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 545 546 setIncludeFiles(Boolean.valueOf(request.getParameter(PARAM_INCLUDEFILES)).booleanValue()); 547 boolean rootloaded = Boolean.valueOf(request.getParameter(PARAM_ROOTLOADED)).booleanValue(); 548 String resource = request.getParameter(PARAM_RESOURCE); 549 setTreeType(request.getParameter(PARAM_TYPE)); 550 String treeSite = request.getParameter(PARAM_TREESITE); 551 computeSiteSelector(request); 552 553 String currentResource; 554 if (getTreeType() == null) { 555 currentResource = getSettings().getExplorerResource(); 556 } else { 557 currentResource = getSettings().getTreeResource(getTreeType()); 559 } 560 561 String lastknown = request.getParameter(PARAM_LASTKNOWN); 562 if (resource != null) { 564 resource = CmsResource.getFolderPath(resource); 565 } 566 if ((lastknown != null) && (!lastknown.endsWith("/"))) { 567 lastknown += "/"; 568 } 569 570 String rootFolder = getRootFolder(); 571 if (rootFolder.equals(resource) && !rootFolder.equals(currentResource) && (lastknown == null) && !rootloaded) { 572 lastknown = getRootFolder(); 574 resource = CmsResource.getFolderPath(currentResource); 575 setNewTree(true); 576 } else if (rootFolder.equals(resource)) { 577 setNewTree(!rootloaded); 579 } else { 580 setNewTree(false); 581 } 582 583 if (getTreeType() != null) { 584 getSettings().setTreeResource(getTreeType(), resource); 585 if (treeSite != null) { 586 getSettings().setTreeSite(getTreeType(), treeSite); 587 } 588 } 589 590 setTargetFolder(resource); 591 setStartFolder(lastknown); 592 } 593 594 601 private void computeSiteSelector(HttpServletRequest request) { 602 603 boolean selectorForType = TYPE_SIBLING.equals(getTreeType()) 604 || TYPE_COPY.equals(getTreeType()) 605 || TYPE_PAGELINK.equals(getTreeType()) 606 || TYPE_PREFERENCES.equals(getTreeType()); 607 boolean showFromRequest = Boolean.valueOf(request.getParameter(PARAM_SHOWSITESELECTOR)).booleanValue(); 608 if (selectorForType || showFromRequest) { 609 int siteCount = CmsSiteManager.getAvailableSites(getCms(), true).size(); 611 setShowSiteSelector(siteCount > 1); 612 return; 613 } 614 setShowSiteSelector(false); 615 } 616 617 629 private String getNode(String path, String title, int type, boolean folder, int state, boolean grey) { 630 631 StringBuffer result = new StringBuffer (64); 632 String parent = CmsResource.getParentFolder(path); 633 result.append("parent.aC(\""); 634 result.append(title); 636 result.append("\","); 637 result.append(type); 639 result.append(","); 640 if (folder) { 642 result.append(1); 643 } else { 644 result.append(0); 645 } 646 result.append(","); 647 result.append(path.hashCode()); 649 result.append(","); 650 result.append((parent != null) ? parent.hashCode() : 0); 652 result.append(","); 653 result.append(state); 655 result.append(","); 656 if (grey) { 658 result.append(1); 659 } else { 660 result.append(0); 661 } 662 result.append(");\n"); 663 return result.toString(); 664 } 665 666 671 private String getRootNode() { 672 673 CmsResource resource = null; 674 String title = null; 675 String folder = getRootFolder(); 676 try { 677 resource = getCms().readFolder(folder, CmsResourceFilter.IGNORE_EXPIRATION); 678 CmsProperty titleProperty = getCms().readPropertyObject(folder, CmsPropertyDefinition.PROPERTY_TITLE, false); 680 681 if (titleProperty == null || titleProperty.isNullProperty()) { 682 getCms().getSitePath(resource); 683 title = resource.getRootPath(); 684 } else { 685 title = titleProperty.getValue(); 686 } 687 } catch (CmsException e) { 688 if (LOG.isInfoEnabled()) { 690 LOG.info(e); 691 } 692 } 693 return getNode(resource.getRootPath(), title, resource.getTypeId(), true, resource.getState(), false); 694 } 695 696 706 private String getSitePrefix(String prefix, String storedSiteRoot) { 707 708 if (TYPE_PAGELINK.equals(getTreeType())) { 709 if (!storedSiteRoot.equals(prefix)) { 711 CmsSite site = CmsSiteManager.getSite(prefix); 713 prefix = getCms().getRequestContext().removeSiteRoot(prefix); 714 prefix = site.getUrl() + OpenCms.getSystemInfo().getOpenCmsContext() + prefix; 715 } else { 716 prefix = ""; 718 } 719 720 } else if (TYPE_COPY.equals(getTreeType()) 721 || TYPE_SIBLING.equals(getTreeType()) 722 || TYPE_VFSWIDGET.equals(getTreeType())) { 723 if (storedSiteRoot.equals(prefix)) { 725 prefix = ""; 726 } 727 } else if (TYPE_PREFERENCES.equals(getTreeType())) { 728 prefix = ""; 729 } 730 731 return prefix; 732 } 733 734 739 private String getStartFolder() { 740 741 return m_startFolder; 742 } 743 744 749 private String getTargetFolder() { 750 751 return m_targetFolder; 752 } 753 754 760 private boolean newTree() { 761 762 return m_newTree; 763 } 764 765 771 private String printError(Throwable t) { 772 773 StringBuffer result = new StringBuffer (1024); 774 result.append("/*\n"); 775 result.append(t.getMessage()); 776 result.append("\n*/\n"); 777 result.append("function init() {\n"); 778 result.append("}\n"); 779 return result.toString(); 780 } 781 782 787 private void setIncludeFiles(boolean includeFiles) { 788 789 m_includeFiles = includeFiles; 790 } 791 792 797 private void setNewTree(boolean newTree) { 798 799 m_newTree = newTree; 800 } 801 802 807 private void setShowSiteSelector(boolean showSiteSelector) { 808 809 m_showSiteSelector = showSiteSelector; 810 } 811 812 817 private void setStartFolder(String startFolder) { 818 819 m_startFolder = startFolder; 820 } 821 822 827 private void setTargetFolder(String targetFolder) { 828 829 m_targetFolder = targetFolder; 830 } 831 832 837 private void setTreeType(String type) { 838 839 m_treeType = type; 840 } 841 }
| Popular Tags
|