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}