1 24 package org.riotfamily.pages.mapping; 25 26 import java.io.IOException ; 27 import java.util.Collection ; 28 import java.util.Iterator ; 29 30 import javax.servlet.ServletException ; 31 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 34 import org.riotfamily.common.web.filter.FilterPlugin; 35 import org.riotfamily.common.web.filter.PluginChain; 36 import org.riotfamily.pages.Page; 37 import org.riotfamily.pages.PageLocation; 38 import org.riotfamily.pages.Site; 39 import org.riotfamily.pages.dao.PageDao; 40 import org.riotfamily.riot.security.AccessController; 41 import org.springframework.transaction.PlatformTransactionManager; 42 import org.springframework.transaction.TransactionDefinition; 43 import org.springframework.transaction.TransactionStatus; 44 import org.springframework.transaction.support.DefaultTransactionDefinition; 45 46 58 public class FolderFilterPlugin extends FilterPlugin { 59 60 private static final TransactionDefinition TX_DEF = 61 new DefaultTransactionDefinition(); 62 63 private PageDao pageDao; 64 65 private PageLocationResolver locationResolver; 66 67 private PlatformTransactionManager tx; 68 69 70 public FolderFilterPlugin(PageDao pageDao, 71 PageLocationResolver locationResolver, 72 PlatformTransactionManager tx) { 73 74 this.pageDao = pageDao; 75 this.locationResolver = locationResolver; 76 this.tx = tx; 77 } 78 79 public void doFilter(HttpServletRequest request, 80 HttpServletResponse response, PluginChain pluginChain) 81 throws IOException , ServletException { 82 83 boolean requestHandled = false; 84 String uri = request.getRequestURI(); 85 if (uri.lastIndexOf('.') < uri.lastIndexOf('/')) { 86 TransactionStatus status = tx.getTransaction(TX_DEF); 87 try { 88 Collection indexPages = getIndexPages(request); 89 if (indexPages != null) { 90 requestHandled = true; 91 sendRedirect(indexPages, request, response); 92 } 93 } 94 catch (Exception ex) { 95 tx.rollback(status); 96 throw new ServletException (ex); 97 } 98 tx.commit(status); 99 } 100 if (!requestHandled) { 101 pluginChain.doFilter(request, response); 102 } 103 } 104 105 private boolean isRequestable(Page page) { 106 return page.isEnabled() || AccessController.isAuthenticatedUser(); 107 } 108 109 private Collection getIndexPages(HttpServletRequest request) { 110 Collection childPages = null; 111 PageLocation location = locationResolver.getPageLocation(request); 112 if (location != null) { 113 if ("/".equals(location.getPath())) { 114 Site site = pageDao.getSite(location.getSiteName()); 115 childPages = pageDao.findRootNode(site).getChildPages(location.getLocale()); 116 } 117 else { 118 Page page = pageDao.findPage(location); 119 if (page != null && page.isFolder()) { 120 childPages = page.getChildPages(); 121 } 122 } 123 } 124 return childPages; 125 } 126 127 private void sendRedirect(Collection pages, HttpServletRequest request, 128 HttpServletResponse response) throws IOException { 129 130 String url = getFirstRequestableChildPageUrl(pages); 131 if (url != null) { 132 response.sendRedirect(response.encodeRedirectURL( 133 request.getContextPath() + url)); 134 } 135 else { 136 response.sendError(HttpServletResponse.SC_NOT_FOUND); 137 } 138 } 139 140 private String getFirstRequestableChildPageUrl(Collection pages) { 141 Iterator it = pages.iterator(); 142 while (it.hasNext()) { 143 Page page = (Page) it.next(); 144 if (isRequestable(page)) { 145 return locationResolver.getUrl(page); 146 } 147 } 148 return null; 149 } 150 } 151 | Popular Tags |