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.HashMap; 019import java.util.List; 020import java.util.Map; 021 022import org.apache.avalon.framework.parameters.Parameters; 023import org.apache.avalon.framework.service.ServiceException; 024import org.apache.avalon.framework.service.ServiceManager; 025import org.apache.cocoon.acting.ServiceableAction; 026import org.apache.cocoon.environment.ObjectModelHelper; 027import org.apache.cocoon.environment.Redirector; 028import org.apache.cocoon.environment.Request; 029import org.apache.cocoon.environment.SourceResolver; 030import org.apache.commons.lang3.StringUtils; 031 032import org.ametys.cms.FilterNameHelper; 033import org.ametys.core.cocoon.JSonReader; 034import org.ametys.plugins.repository.AmetysObjectResolver; 035import org.ametys.plugins.repository.ModifiableTraversableAmetysObject; 036import org.ametys.web.repository.page.ModifiablePage; 037import org.ametys.web.repository.page.Page; 038import org.ametys.web.repository.page.Page.PageType; 039import org.ametys.web.repository.page.PageDAO; 040import org.ametys.web.repository.page.PagesContainer; 041import org.ametys.web.repository.site.Site; 042import org.ametys.web.skin.SkinTemplate; 043import org.ametys.web.skin.SkinsManager; 044 045/** 046 * Get available content types for a page or a not-yet existing page 047 * 048 */ 049public class GetAvailableContentTypes extends ServiceableAction 050{ 051 private PageDAO _pageDAO; 052 private AmetysObjectResolver _resolver; 053 private SkinsManager _skinsManager; 054 055 @Override 056 public void service(ServiceManager smanager) throws ServiceException 057 { 058 super.service(smanager); 059 _pageDAO = (PageDAO) smanager.lookup(PageDAO.ROLE); 060 _resolver = (AmetysObjectResolver) smanager.lookup(AmetysObjectResolver.ROLE); 061 _skinsManager = (SkinsManager) smanager.lookup(SkinsManager.ROLE); 062 } 063 064 @Override 065 public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception 066 { 067 Request request = ObjectModelHelper.getRequest(objectModel); 068 Map<String, Object> contentTypes = new HashMap<>(); 069 070 @SuppressWarnings("unchecked") 071 Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT); 072 073 String pageId = (String) jsParameters.get("pageId"); 074 String parentId = (String) jsParameters.get("parentId"); 075 String zoneName = (String) jsParameters.get("zone"); 076 077 if (StringUtils.isNotEmpty(pageId)) 078 { 079 // Get available template for a page 080 List<Map<String, Object>> ctypes = _pageDAO.getAvailableContentTypes(pageId, zoneName); 081 contentTypes.put("content-types", ctypes); 082 } 083 else if (StringUtils.isNotEmpty(parentId)) 084 { 085 String pageTitle = (String) jsParameters.get("title"); 086 String template = (String) jsParameters.get("template"); 087 088 // Get available content types for a not yet existing page 089 PagesContainer parent = _resolver.resolveById(parentId); 090 091 // Create page temporarily 092 Page page = _createPage(parent, pageTitle, template); 093 094 List<Map<String, Object>> ctypes = _pageDAO.getAvailableContentTypes(page.getId(), zoneName); 095 contentTypes.put("content-types", ctypes); 096 097 // Cancel page creation 098 page.getSitemap().revertChanges(); 099 } 100 101 request.setAttribute(JSonReader.OBJECT_TO_READ, contentTypes); 102 103 return EMPTY_MAP; 104 } 105 106 private Page _createPage(PagesContainer parent, String pageTitle, String template) 107 { 108 Site site = parent.getSite(); 109 String originalPageName = FilterNameHelper.filterName(pageTitle); 110 111 String pageName = originalPageName; 112 int index = 2; 113 while (parent.hasChild(pageName)) 114 { 115 pageName = originalPageName + "-" + index++; 116 } 117 118 ModifiablePage page = ((ModifiableTraversableAmetysObject) parent).createChild(pageName, "ametys:defaultPage"); 119 120 page.setTitle(pageTitle); 121 page.setType(PageType.NODE); 122 page.setSiteName(site.getName()); 123 page.setSitemapName(page.getSitemap().getName()); 124 125 126 String skinId = page.getSite().getSkinId(); 127 SkinTemplate tpl = _skinsManager.getSkin(skinId).getTemplate(template); 128 if (tpl == null) 129 { 130 throw new IllegalStateException("Template '" + template + "' does not exist on skin '" + skinId + "'"); 131 } 132 133 // Set temporary the template to get available content types 134 page.setType(PageType.CONTAINER); 135 page.setTemplate(template); 136 137 return page; 138 } 139 140}