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.repository;
017
018import java.util.Iterator;
019import java.util.Map;
020
021import org.apache.avalon.framework.parameters.Parameters;
022import org.apache.avalon.framework.service.ServiceException;
023import org.apache.avalon.framework.service.ServiceManager;
024import org.apache.avalon.framework.thread.ThreadSafe;
025import org.apache.cocoon.ResourceNotFoundException;
026import org.apache.cocoon.acting.ServiceableAction;
027import org.apache.cocoon.environment.ObjectModelHelper;
028import org.apache.cocoon.environment.PermanentRedirector;
029import org.apache.cocoon.environment.Redirector;
030import org.apache.cocoon.environment.Request;
031import org.apache.cocoon.environment.Response;
032import org.apache.cocoon.environment.SourceResolver;
033
034import org.ametys.cms.transformation.xslt.ResolveURIComponent;
035import org.ametys.plugins.repository.AmetysObjectResolver;
036import org.ametys.web.URIPrefixHandler;
037import org.ametys.web.renderingcontext.RenderingContext;
038import org.ametys.web.renderingcontext.RenderingContextHandler;
039import org.ametys.web.repository.page.Page;
040import org.ametys.web.repository.page.Page.PageType;
041import org.ametys.web.transformation.xslt.AmetysXSLTHelper;
042
043/**
044 * Redirect NODE and LINK pages in preview mode.
045 */
046public class PreviewRedirectAction extends ServiceableAction implements ThreadSafe
047{
048    private AmetysObjectResolver _resolver;
049    private RenderingContextHandler _renderingContextHandler;
050    private URIPrefixHandler _prefixHandler;
051    
052    @Override
053    public void service(ServiceManager serviceManager) throws ServiceException
054    {
055        super.service(serviceManager);
056        _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
057        _renderingContextHandler = (RenderingContextHandler) serviceManager.lookup(RenderingContextHandler.ROLE);
058        _prefixHandler = (URIPrefixHandler) manager.lookup(URIPrefixHandler.ROLE);
059    }
060
061    @Override
062    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
063    {
064        Request request = ObjectModelHelper.getRequest(objectModel);
065        Response response = ObjectModelHelper.getResponse(objectModel);
066        Page page = (Page) request.getAttribute(Page.class.getName());
067        
068        // if we are in the back-office, or if the page has contents, do not redirect to anything
069        if (_renderingContextHandler.getRenderingContext() == RenderingContext.BACK || page.getType() == PageType.CONTAINER)
070        {
071            return EMPTY_MAP;
072        }
073        else if (page.getType() == PageType.LINK)
074        {
075            String url = page.getURL();
076            switch (page.getURLType())
077            {
078                case PAGE:
079                    Page redirectPage = _resolver.resolveById(url);
080                    String redirectUrl;
081                    
082                    if (_renderingContextHandler.getRenderingContext() == RenderingContext.FRONT)
083                    {
084                        redirectUrl = ResolveURIComponent.resolve("page", redirectPage.getId());
085                    }
086                    else
087                    {
088                        redirectUrl = _prefixHandler.getAbsoluteUriPrefix(redirectPage.getSiteName()) + "/" + redirectPage.getSitemapName() + "/" + redirectPage.getPathInSitemap() + ".html";
089                    }
090                    
091                    if (redirector instanceof PermanentRedirector)
092                    {
093                        ((PermanentRedirector) redirector).permanentRedirect(false, redirectUrl);
094                        response.setHeader("Cache-Control", "no-cache");
095                    }
096                    else
097                    {
098                        redirector.redirect(false, redirectUrl);
099                    }
100                    
101                    break;
102                case WEB:
103                    if (redirector instanceof PermanentRedirector)
104                    {
105                        ((PermanentRedirector) redirector).permanentRedirect(false, url);
106                        response.setHeader("Cache-Control", "no-cache");
107                    }
108                    else
109                    {
110                        redirector.redirect(false, url);
111                    }
112                    
113                    break;
114                default :
115                    throw new IllegalArgumentException("Unknown page type: " + page.getURLType());
116            }
117        }
118        else if (page.getType() == PageType.NODE)
119        {
120            Page current = page;
121            while (current.getType() == PageType.NODE)
122            {
123                Iterator<? extends Page> childPages = current.getChildrenPages().iterator();
124                
125                if (!childPages.hasNext())
126                {
127                    // should never occur
128                    throw new ResourceNotFoundException("No concrete child page for Node page " + current.getPath());
129                }
130                
131                current = childPages.next();
132            }
133            
134            String site = (String) request.getAttribute("site");
135            String sitemap = (String) request.getAttribute("sitemapLanguage");
136            String editionMode = "";
137            if (AmetysXSLTHelper.isEditionMode())
138            {
139                editionMode = "edition/";
140            }
141            
142            String url = _prefixHandler.getAbsoluteUriPrefix(site) + "/" + editionMode + sitemap + "/" + current.getPathInSitemap() + ".html";
143            
144            if (redirector instanceof PermanentRedirector)
145            {
146                ((PermanentRedirector) redirector).permanentRedirect(false, url);
147                response.setHeader("Cache-Control", "no-cache");
148            }
149            else
150            {
151                redirector.redirect(false, url);
152            }
153        }
154        
155        return EMPTY_MAP;
156    }
157}