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}