001/* 002 * Copyright 2015 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.web.explorer; 017 018import java.util.ArrayList; 019import java.util.List; 020import java.util.Map; 021import java.util.Set; 022 023import org.apache.avalon.framework.service.ServiceException; 024import org.apache.avalon.framework.service.ServiceManager; 025import org.apache.cocoon.components.ContextHelper; 026import org.apache.cocoon.environment.Request; 027import org.apache.commons.lang.StringUtils; 028 029import org.ametys.plugins.explorer.ExplorerNode; 030import org.ametys.plugins.explorer.resources.Resource; 031import org.ametys.plugins.repository.AmetysObject; 032import org.ametys.runtime.config.Config; 033import org.ametys.runtime.i18n.I18nizableText; 034import org.ametys.web.repository.page.Page; 035import org.ametys.web.repository.site.SiteManager; 036 037 038/** 039 * This DAO overrides {@link org.ametys.cms.explorer.ExplorerResourcesDAO} to handle shared explorer resources and page attachments. 040 */ 041public class ExplorerResourcesDAO extends org.ametys.cms.explorer.ExplorerResourcesDAO 042{ 043 /** Site manager */ 044 protected SiteManager _siteManager; 045 046 @Override 047 public void service(ServiceManager manager) throws ServiceException 048 { 049 super.service(manager); 050 _siteManager = (SiteManager) manager.lookup(SiteManager.ROLE); 051 } 052 053 @Override 054 public List<ExplorerNode> getResourcesRootNodes() 055 { 056 Request request = ContextHelper.getRequest(_context); 057 String siteName = (String) request.getAttribute("siteName"); 058 059 List<ExplorerNode> rootNodes = new ArrayList<>(); 060 061 // Site root 062 if (StringUtils.isNotEmpty(siteName)) 063 { 064 AmetysObject resourcesRootAO = _siteManager.getSite(siteName).getRootResources(); 065 if (resourcesRootAO instanceof ExplorerNode) 066 { 067 rootNodes.add((ExplorerNode) resourcesRootAO); 068 } 069 } 070 071 // Shared root 072 boolean useShared = Config.getInstance().getValue("resources.shared.folder"); 073 if (useShared) 074 { 075 ExplorerNode sharedRoot = _resolver.resolveByPath(ResourceHelper.SHARED_RESOURCE_PATH + "/all"); 076 rootNodes.add(sharedRoot); 077 } 078 079 return rootNodes; 080 } 081 082 @Override 083 public Map<String, Object> getDefaultInfoAsRootNode(ExplorerNode rootNode) 084 { 085 if (rootNode.getPath().startsWith(ResourceHelper.SHARED_RESOURCE_PATH)) 086 { 087 return getSharedRootNodeInfo(rootNode); 088 } 089 return super.getDefaultInfoAsRootNode(rootNode); 090 } 091 092 /** 093 * Get the necessary info for the shared root node. 094 * Can be used to construct a root node for a tree (client side). 095 * @param sharedRoot The shared root node 096 * @return A map which contains a set of default info (such as id, applicationId, path, type etc...) 097 */ 098 public Map<String, Object> getSharedRootNodeInfo(ExplorerNode sharedRoot) 099 { 100 Map<String, Object> result = super.getDefaultInfoAsRootNode(sharedRoot); 101 102 String name = "shared-resources-" + sharedRoot.getName(); 103 result.put("name", name); 104 result.put("cls", "shared-root"); 105 result.put("iconCls", "ametysicon-folder249 decorator-ametysicon-world91"); 106 result.put("text", _i18nUtils.translate(new I18nizableText("plugin.web", "PLUGINS_WEB_EXPLORER_SHARED"))); 107 result.put("path", "/dummy/" + name); 108 result.put("isShared", true); 109 return result; 110 } 111 112 @Override 113 public Map<String, Object> getResourceProperties(Resource resource) 114 { 115 Map<String, Object> infos = super.getResourceProperties(resource); 116 117 boolean isShared = ResourceHelper.isShared(resource); 118 infos.put("isShared", isShared); 119 120 if (isShared) 121 { 122 String sharedRoot = ResourceHelper.getSharedRootName(resource); 123 infos.put("sharedRoot", sharedRoot); 124 } 125 126 if (_getParentPage(resource) != null) 127 { 128 infos.put("rootOwnerType", "page"); 129 } 130 131 return infos; 132 } 133 134 @Override 135 public Map<String, Object> getExplorerNodeProperties(ExplorerNode node) 136 { 137 Map<String, Object> infos = super.getExplorerNodeProperties(node); 138 139 boolean isShared = ResourceHelper.isShared(node); 140 infos.put("isShared", isShared); 141 142 if (isShared) 143 { 144 String sharedRoot = ResourceHelper.getSharedRootName(node); 145 infos.put("sharedRoot", sharedRoot); 146 } 147 148 if (_getParentPage(node) != null) 149 { 150 infos.put("rootOwnerType", "page"); 151 } 152 153 return infos; 154 } 155 156 @Override 157 protected Set<String> getUserRights(ExplorerNode node) 158 { 159 Page parentPage = _getParentPage(node); 160 if (parentPage != null) 161 { 162 return _rightManager.getUserRights(_currentUserProvider.getUser(), parentPage); 163 } 164 165 return super.getUserRights(node); 166 } 167 168 /** 169 * Get the parent page of a resource or collection 170 * @param ao The resource or collection 171 * @return the parent page or null if the object is not part of page attachments 172 */ 173 protected Page _getParentPage (AmetysObject ao) 174 { 175 AmetysObject parent = ao.getParent(); 176 while (parent != null) 177 { 178 if (parent instanceof Page) 179 { 180 return (Page) parent; 181 } 182 parent = parent.getParent(); 183 } 184 return null; 185 } 186}