001/* 002 * Copyright 2010 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.cocoon; 017 018import java.util.ArrayList; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023import org.apache.avalon.framework.parameters.Parameters; 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.cocoon.acting.ServiceableAction; 027import org.apache.cocoon.environment.ObjectModelHelper; 028import org.apache.cocoon.environment.Redirector; 029import org.apache.cocoon.environment.Request; 030import org.apache.cocoon.environment.SourceResolver; 031 032import org.ametys.core.cocoon.JSonReader; 033import org.ametys.core.right.RightManager; 034import org.ametys.core.user.CurrentUserProvider; 035import org.ametys.plugins.repository.AmetysObject; 036import org.ametys.plugins.repository.AmetysObjectIterable; 037import org.ametys.plugins.repository.AmetysObjectResolver; 038import org.ametys.plugins.repository.TraversableAmetysObject; 039import org.ametys.web.repository.page.Page; 040import org.ametys.web.repository.page.SitemapDAO; 041import org.ametys.web.repository.page.SitemapElement; 042import org.ametys.web.repository.site.Site; 043import org.ametys.web.repository.sitemap.Sitemap; 044 045/** 046 * Get children of a {@link Site}, {@link Sitemap} or {@link SitemapElement} 047 * Waits for the id of the parent ametys object in request parameters. 048 */ 049public class SitemapAction extends ServiceableAction 050{ 051 /** The {@link AmetysObjectResolver} */ 052 protected AmetysObjectResolver _resolver; 053 /** The sitemap DAO */ 054 protected SitemapDAO _sitemapDAO; 055 /** The right manager */ 056 protected RightManager _rightManager; 057 /** The user provider */ 058 protected CurrentUserProvider _currentUserProvider; 059 060 @Override 061 public void service(ServiceManager smanager) throws ServiceException 062 { 063 super.service(smanager); 064 _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE); 065 _sitemapDAO = (SitemapDAO) smanager.lookup(SitemapDAO.ROLE); 066 _rightManager = (RightManager) smanager.lookup(RightManager.ROLE); 067 _currentUserProvider = (CurrentUserProvider) smanager.lookup(CurrentUserProvider.ROLE); 068 } 069 070 public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception 071 { 072 Map<String, Object> result = new HashMap<>(); 073 074 Request request = ObjectModelHelper.getRequest(objectModel); 075 String id = request.getParameter("id"); 076 077 @SuppressWarnings("unchecked") 078 Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT); 079 @SuppressWarnings("unchecked") 080 List<String> rights = (List<String>) jsParameters.get("rights"); 081 082 AmetysObject ao = _resolver.resolveById(id); 083 if (ao instanceof Site) 084 { 085 result.put("sitemaps", sitemaps2json((Site) ao, rights)); 086 } 087 else if (ao instanceof SitemapElement) 088 { 089 result.put("pages", sitemapElement2json((SitemapElement) ao, rights)); 090 } 091 else 092 { 093 result.put("sites", sites2json((TraversableAmetysObject) ao)); 094 } 095 096 request.setAttribute(JSonReader.OBJECT_TO_READ, result); 097 return EMPTY_MAP; 098 } 099 100 /** 101 * Get the JSON object representing all sites 102 * @param ao The parent ametys object 103 * @return the JSON object 104 */ 105 protected List<Map<String, Object>> sites2json (TraversableAmetysObject ao) 106 { 107 List<Map<String, Object>> sites = new ArrayList<>(); 108 109 AmetysObjectIterable< ? extends Site> sitesAO = ao.getChildren(); 110 111 for (Site site : sitesAO) 112 { 113 sites.add(site2json(site)); 114 } 115 116 return sites; 117 } 118 119 /** 120 * Get the JSON object representing a site 121 * @param site the site 122 * @return the JSON object 123 */ 124 protected Map<String, Object> site2json (Site site) 125 { 126 Map<String, Object> jsonObject = new HashMap<>(); 127 128 jsonObject.put("id", site.getId()); 129 jsonObject.put("name", site.getName()); 130 jsonObject.put("title", site.getTitle()); 131 jsonObject.put("type", site.getType()); 132 jsonObject.put("url", site.getUrl()); 133 jsonObject.put("description", site.getDescription()); 134 135 return jsonObject; 136 } 137 138 /** 139 * Get the JSON object representing the sitemaps of a site 140 * @param site the site 141 * @param rights The rights to check. Can be null or empty to ignore user rights. 142 * @return the JSON object 143 */ 144 protected List<Map<String, Object>> sitemaps2json (Site site, List<String> rights) 145 { 146 List<Map<String, Object>> sitemaps = new ArrayList<>(); 147 148 for (Sitemap sitemap : site.getSitemaps()) 149 { 150 sitemaps.add(_sitemapDAO.getSitemapProperties(sitemap, rights)); 151 } 152 153 return sitemaps; 154 } 155 156 /** 157 * Get the JSON object representing child pages of a sitemap element. 158 * @param sitemapElement The sitemap element 159 * @param rights The rights to check. Can be null or empty to ignore user rights. 160 * @return the JSON object 161 */ 162 protected List<Map<String, Object>> sitemapElement2json (SitemapElement sitemapElement, List<String> rights) 163 { 164 List<Map<String, Object>> pages = new ArrayList<>(); 165 166 for (Page page : sitemapElement.getChildrenPages()) 167 { 168 pages.add(_sitemapDAO.getPageProperties(page, rights)); 169 } 170 171 return pages; 172 } 173}