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.repository.page.actions; 017 018import java.util.Arrays; 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; 031import org.apache.commons.lang3.StringUtils; 032 033import org.ametys.cms.FilterNameHelper; 034import org.ametys.core.cocoon.JSonReader; 035import org.ametys.plugins.repository.AmetysObjectResolver; 036import org.ametys.plugins.repository.ModifiableTraversableAmetysObject; 037import org.ametys.web.repository.page.ModifiablePage; 038import org.ametys.web.repository.page.Page; 039import org.ametys.web.repository.page.Page.PageType; 040import org.ametys.web.repository.page.PageDAO; 041import org.ametys.web.repository.page.PagesContainer; 042import org.ametys.web.repository.site.Site; 043 044/** 045 * Get available templates for a page, a list of pages or a not-yet existing page 046 * 047 */ 048public class GetPageTemplatesAction extends ServiceableAction 049{ 050 private PageDAO _pageDAO; 051 private AmetysObjectResolver _resolver; 052 053 @Override 054 public void service(ServiceManager smanager) throws ServiceException 055 { 056 super.service(smanager); 057 _pageDAO = (PageDAO) smanager.lookup(PageDAO.ROLE); 058 _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE); 059 } 060 061 public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception 062 { 063 Request request = ObjectModelHelper.getRequest(objectModel); 064 Map<String, Object> templates = new HashMap<>(); 065 066 @SuppressWarnings("unchecked") 067 Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT); 068 069 String pageId = (String) jsParameters.get("pageId"); 070 String[] pageIds = (String[]) jsParameters.get("pages"); 071 String parentId = (String) jsParameters.get("parentId"); 072 073 if (StringUtils.isNotEmpty(pageId)) 074 { 075 // Get available template for a page 076 List<Map<String, Object>> pageTemplates = _pageDAO.getAvailableTemplates(pageId); 077 templates.put("templates", pageTemplates); 078 } 079 else if (pageIds != null) 080 { 081 List<Map<String, Object>> pageTemplates = _pageDAO.getAvailableTemplates(Arrays.asList(pageIds)); 082 templates.put("templates", pageTemplates); 083 } 084 else if (StringUtils.isNotEmpty(parentId)) 085 { 086 // Get available template for a not yet existing page 087 PagesContainer parent = _resolver.resolveById(parentId); 088 String pageTitle = (String) jsParameters.get("title"); 089 090 // Create page temporarily 091 Page page = _createPage(parent, pageTitle); 092 093 List<Map<String, Object>> pageTemplates = _pageDAO.getAvailableTemplates(page.getId()); 094 templates.put("templates", pageTemplates); 095 096 // Cancel page creation 097 page.getSitemap().revertChanges(); 098 } 099 100 request.setAttribute(JSonReader.OBJECT_TO_READ, templates); 101 102 return EMPTY_MAP; 103 } 104 105 private Page _createPage (PagesContainer parent, String pageTitle) 106 { 107 Site site = parent.getSite(); 108 String originalPageName = FilterNameHelper.filterName(pageTitle); 109 110 String pageName = originalPageName; 111 int index = 2; 112 while (parent.hasChild(pageName)) 113 { 114 pageName = originalPageName + "-" + index++; 115 } 116 117 ModifiablePage page = ((ModifiableTraversableAmetysObject) parent).createChild(pageName, "ametys:defaultPage"); 118 119 page.setTitle(pageTitle); 120 page.setType(PageType.NODE); 121 page.setSiteName(site.getName()); 122 page.setSitemapName(page.getSitemap().getName()); 123 124 return page; 125 } 126 127}