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}